Hi Paolo, Here's the initial set of KVM/arm64 updates for 5.11. The most notable change is the "PSCI relay" at EL2, which is the first "user visible" feature required by the Protected KVM effort. The rest is a mixed bag of architecture compliance (PMU accesses when no PMU is present, cache hierarchy discovery), cleanups (EL2 vector allocation, AArch32 sysreg handling), internal rework (exception injection, EL2 function pointers), and general improvements (advertising CSV3, reduced GICv4 entry latency). Note that this pull request comes with some additional bonuses in the shape of a shared branch with the arm64 tree (arm64/for-next/uaccess), as it was conflicting *very* badly with the new PSCI relay code. I already have a bunch of fixes earmarked for after the merge window, but that is probably something for another year! Happy Christmas (and please pull)! M. The following changes since commit 09162bc32c880a791c6c0668ce0745cf7958f576: Linux 5.10-rc4 (2020-11-15 16:44:31 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git tags/kvmarm-5.11 for you to fetch changes up to 3a514592b698588326924625b6948a10c35fadd5: Merge remote-tracking branch 'origin/kvm-arm64/psci-relay' into kvmarm-master/next (2020-12-09 10:00:24 +0000) ---------------------------------------------------------------- KVM/arm64 updates for Linux 5.11 - PSCI relay at EL2 when "protected KVM" is enabled - New exception injection code - Simplification of AArch32 system register handling - Fix PMU accesses when no PMU is enabled - Expose CSV3 on non-Meltdown hosts - Cache hierarchy discovery fixes - PV steal-time cleanups - Allow function pointers at EL2 - Various host EL2 entry cleanups - Simplification of the EL2 vector allocation ---------------------------------------------------------------- Alexandru Elisei (1): KVM: arm64: Refuse to run VCPU if PMU is not initialized Andrew Jones (2): KVM: arm64: CSSELR_EL1 max is 13 KVM: arm64: selftests: Filter out DEMUX registers David Brazdil (26): KVM: arm64: Add kvm-arm.mode early kernel parameter KVM: arm64: Add ARM64_KVM_PROTECTED_MODE CPU capability psci: Support psci_ops.get_version for v0.1 psci: Split functions to v0.1 and v0.2+ variants psci: Replace psci_function_id array with a struct psci: Add accessor for psci_0_1_function_ids arm64: Make cpu_logical_map() take unsigned int arm64: Extract parts of el2_setup into a macro KVM: arm64: Remove vector_ptr param of hyp-init KVM: arm64: Move hyp-init params to a per-CPU struct KVM: arm64: Init MAIR/TCR_EL2 from params struct KVM: arm64: Add .hyp.data..ro_after_init ELF section KVM: arm64: Support per_cpu_ptr in nVHE hyp code KVM: arm64: Create nVHE copy of cpu_logical_map KVM: arm64: Add SMC handler in nVHE EL2 KVM: arm64: Bootstrap PSCI SMC handler in nVHE EL2 KVM: arm64: Add offset for hyp VA <-> PA conversion KVM: arm64: Forward safe PSCI SMCs coming from host KVM: arm64: Extract __do_hyp_init into a helper function KVM: arm64: Add function to enter host from KVM nVHE hyp code KVM: arm64: Intercept host's CPU_ON SMCs KVM: arm64: Intercept host's CPU_SUSPEND PSCI SMCs KVM: arm64: Intercept host's SYSTEM_SUSPEND PSCI SMCs KVM: arm64: Keep nVHE EL2 vector installed KVM: arm64: Trap host SMCs in protected mode KVM: arm64: Fix EL2 mode availability checks Keqian Zhu (2): KVM: arm64: Some fixes of PV-time interface document KVM: arm64: Use kvm_write_guest_lock when init stolen time Marc Zyngier (47): KVM: arm64: Add kimg_hyp_va() helper KVM: arm64: Turn host HVC handling into a dispatch table KVM: arm64: Don't adjust PC on SError during SMC trap KVM: arm64: Move kvm_vcpu_trap_il_is32bit into kvm_skip_instr32() KVM: arm64: Make kvm_skip_instr() and co private to HYP KVM: arm64: Move PC rollback on SError to HYP KVM: arm64: Move VHE direct sysreg accessors into kvm_host.h KVM: arm64: Add basic hooks for injecting exceptions from EL2 KVM: arm64: Inject AArch64 exceptions from HYP KVM: arm64: Inject AArch32 exceptions from HYP KVM: arm64: Remove SPSR manipulation primitives KVM: arm64: Consolidate exception injection KVM: arm64: Get rid of the AArch32 register mapping code KVM: arm64: Introduce handling of AArch32 TTBCR2 traps KVM: arm64: Move AArch32 exceptions over to AArch64 sysregs KVM: arm64: Add AArch32 mapping annotation KVM: arm64: Map AArch32 cp15 register to AArch64 sysregs KVM: arm64: Map AArch32 cp14 register to AArch64 sysregs KVM: arm64: Drop is_32bit trap attribute KVM: arm64: Drop is_aarch32 trap attribute KVM: arm64: Drop legacy copro shadow register KVM: arm64: Drop kvm_coproc.h KVM: arm64: Patch kimage_voffset instead of loading the EL1 value KVM: arm64: Simplify __kvm_enable_ssbs() KVM: arm64: Avoid repetitive stack access on host EL1 to EL2 exception Merge branch 'kvm-arm64/el2-pc' into kvmarm-master/next Merge branch 'kvm-arm64/copro-no-more' into kvmarm-master/next Merge branch 'kvm-arm64/host-hvc-table' into kvmarm-master/next KVM: arm64: Add kvm_vcpu_has_pmu() helper KVM: arm64: Set ID_AA64DFR0_EL1.PMUVer to 0 when no PMU support KVM: arm64: Refuse illegal KVM_ARM_VCPU_PMU_V3 at reset time KVM: arm64: Inject UNDEF on PMU access when no PMU configured KVM: arm64: Remove PMU RAZ/WI handling KVM: arm64: Remove dead PMU sysreg decoding code KVM: arm64: Gate kvm_pmu_update_state() on the PMU feature KVM: arm64: Get rid of the PMU ready state Merge branch 'kvm-arm64/pmu-undef' into kvmarm-master/next Merge branch 'kvm-arm64/vector-rework' into kvmarm-master/next Merge branch 'kvm-arm64/cache-demux' into kvmarm-master/next Merge branch 'kvm-arm64/misc-5.11' into kvmarm-master/next arm64: Make the Meltdown mitigation state available KVM: arm64: Advertise ID_AA64PFR0_EL1.CSV3=1 if the CPUs are Meltdown-safe Merge remote-tracking branch 'origin/kvm-arm64/csv3' into kvmarm-master/queue Merge remote-tracking branch 'arm64/for-next/uaccess' into HEAD Merge remote-tracking branch 'origin/kvm-arm64/misc-5.11' into kvmarm-master/queue KVM: arm64: Fix nVHE boot on VHE systems Merge remote-tracking branch 'origin/kvm-arm64/psci-relay' into kvmarm-master/next Mark Rutland (18): arm64: uaccess: move uao_* alternatives to asm-uaccess.h arm64: ensure ERET from kthread is illegal arm64: add C wrappers for SET_PSTATE_*() arm64: head.S: rename el2_setup -> init_kernel_el arm64: head.S: cleanup SCTLR_ELx initialization arm64: head.S: always initialize PSTATE arm64: sdei: move uaccess logic to arch/arm64/ arm64: sdei: explicitly simulate PAN/UAO entry arm64: uaccess: rename privileged uaccess routines arm64: uaccess: simplify __copy_user_flushcache() arm64: uaccess: refactor __{get,put}_user arm64: uaccess: split user/kernel routines arm64: uaccess cleanup macro naming arm64: uaccess: remove set_fs() arm64: uaccess: remove addr_limit_user_check() arm64: uaccess: remove redundant PAN toggling arm64: uaccess: remove vestigal UAO support arm64: mark __system_matches_cap as __maybe_unused Shenming Lu (1): KVM: arm64: Delay the polling of the GICR_VPENDBASER.Dirty bit Will Deacon (17): arm64: alternatives: Split up alternative.h arm64: cpufeatures: Add capability for LDAPR instruction arm64: alternatives: Remove READ_ONCE() usage during patch operation arm64: lto: Strengthen READ_ONCE() to acquire when CONFIG_LTO=y KVM: arm64: Remove redundant Spectre-v2 code from kvm_map_vector() KVM: arm64: Tidy up kvm_map_vector() KVM: arm64: Move kvm_get_hyp_vector() out of header file KVM: arm64: Make BP hardening globals static instead KVM: arm64: Move BP hardening helpers into spectre.h KVM: arm64: Re-jig logic when patching hardened hyp vectors KVM: arm64: Allocate hyp vectors statically arm64: spectre: Rename ARM64_HARDEN_EL2_VECTORS to ARM64_SPECTRE_V3A arm64: spectre: Consolidate spectre-v3a detection KVM: arm64: Remove redundant hyp vectors entry KVM: arm64: Move 'struct kvm_arch_memory_slot' out of uapi/ KVM: arm64: Remove kvm_arch_vm_ioctl_check_extension() KVM: arm64: Remove unused __extended_idmap_trampoline() prototype Documentation/admin-guide/kernel-parameters.txt | 10 + Documentation/arm64/memory.rst | 2 +- Documentation/virt/kvm/arm/pvtime.rst | 4 +- arch/arm64/Kconfig | 25 +- arch/arm64/include/asm/alternative-macros.h | 217 ++++++++++++ arch/arm64/include/asm/alternative.h | 267 +------------- arch/arm64/include/asm/asm-uaccess.h | 31 +- arch/arm64/include/asm/cpucaps.h | 8 +- arch/arm64/include/asm/cpufeature.h | 20 +- arch/arm64/include/asm/el2_setup.h | 181 ++++++++++ arch/arm64/include/asm/exec.h | 1 - arch/arm64/include/asm/futex.h | 8 +- arch/arm64/include/asm/insn.h | 3 +- arch/arm64/include/asm/kvm_arm.h | 1 + arch/arm64/include/asm/kvm_asm.h | 17 +- arch/arm64/include/asm/kvm_coproc.h | 38 -- arch/arm64/include/asm/kvm_emulate.h | 70 +--- arch/arm64/include/asm/kvm_host.h | 206 ++++++++--- arch/arm64/include/asm/kvm_hyp.h | 4 +- arch/arm64/include/asm/kvm_mmu.h | 110 +++--- arch/arm64/include/asm/mmu.h | 29 -- arch/arm64/include/asm/percpu.h | 6 + arch/arm64/include/asm/processor.h | 4 +- arch/arm64/include/asm/ptrace.h | 8 +- arch/arm64/include/asm/rwonce.h | 73 ++++ arch/arm64/include/asm/sections.h | 1 + arch/arm64/include/asm/smp.h | 4 +- arch/arm64/include/asm/spectre.h | 65 ++++ arch/arm64/include/asm/sysreg.h | 23 +- arch/arm64/include/asm/thread_info.h | 10 +- arch/arm64/include/asm/uaccess.h | 174 ++++----- arch/arm64/include/asm/virt.h | 26 ++ arch/arm64/include/uapi/asm/kvm.h | 3 - arch/arm64/kernel/alternative.c | 7 +- arch/arm64/kernel/armv8_deprecated.c | 4 +- arch/arm64/kernel/asm-offsets.c | 8 +- arch/arm64/kernel/cpu_errata.c | 19 +- arch/arm64/kernel/cpufeature.c | 88 +++-- arch/arm64/kernel/entry.S | 19 +- arch/arm64/kernel/head.S | 180 +++------- arch/arm64/kernel/image-vars.h | 11 +- arch/arm64/kernel/process.c | 29 +- arch/arm64/kernel/proton-pack.c | 89 ++--- arch/arm64/kernel/sdei.c | 33 +- arch/arm64/kernel/setup.c | 2 +- arch/arm64/kernel/signal.c | 3 - arch/arm64/kernel/sleep.S | 2 +- arch/arm64/kernel/suspend.c | 1 - arch/arm64/kernel/vdso/Makefile | 2 +- arch/arm64/kernel/vdso32/Makefile | 2 +- arch/arm64/kernel/vmlinux.lds.S | 12 +- arch/arm64/kvm/Makefile | 4 +- arch/arm64/kvm/aarch32.c | 232 ------------ arch/arm64/kvm/arm.c | 281 ++++++++++++--- arch/arm64/kvm/guest.c | 29 +- arch/arm64/kvm/handle_exit.c | 24 +- arch/arm64/kvm/hyp/Makefile | 2 +- arch/arm64/kvm/hyp/aarch32.c | 4 +- arch/arm64/kvm/hyp/exception.c | 331 +++++++++++++++++ arch/arm64/kvm/hyp/hyp-entry.S | 71 ++-- arch/arm64/kvm/hyp/include/hyp/adjust_pc.h | 62 ++++ arch/arm64/kvm/hyp/include/hyp/switch.h | 17 + arch/arm64/kvm/hyp/include/nvhe/trap_handler.h | 18 + arch/arm64/kvm/hyp/nvhe/Makefile | 5 +- arch/arm64/kvm/hyp/nvhe/host.S | 58 ++- arch/arm64/kvm/hyp/nvhe/hyp-init.S | 152 +++++--- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 243 ++++++++----- arch/arm64/kvm/hyp/nvhe/hyp-smp.c | 40 +++ arch/arm64/kvm/hyp/nvhe/hyp.lds.S | 1 + arch/arm64/kvm/hyp/nvhe/psci-relay.c | 324 +++++++++++++++++ arch/arm64/kvm/hyp/nvhe/switch.c | 8 +- arch/arm64/kvm/hyp/nvhe/sysreg-sr.c | 11 - arch/arm64/kvm/hyp/smccc_wa.S | 32 -- arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c | 2 + arch/arm64/kvm/hyp/vgic-v3-sr.c | 2 + arch/arm64/kvm/hyp/vhe/Makefile | 2 +- arch/arm64/kvm/hyp/vhe/switch.c | 3 + arch/arm64/kvm/inject_fault.c | 167 +++------ arch/arm64/kvm/mmio.c | 2 +- arch/arm64/kvm/mmu.c | 2 +- arch/arm64/kvm/pmu-emul.c | 19 +- arch/arm64/kvm/pvtime.c | 6 +- arch/arm64/kvm/regmap.c | 224 ------------ arch/arm64/kvm/reset.c | 57 +-- arch/arm64/kvm/sys_regs.c | 390 ++++++++------------- arch/arm64/kvm/sys_regs.h | 9 +- arch/arm64/kvm/va_layout.c | 104 +++++- arch/arm64/kvm/vgic-sys-reg-v3.c | 4 - arch/arm64/kvm/vgic/vgic-v4.c | 12 + arch/arm64/kvm/vgic/vgic.c | 3 + arch/arm64/lib/clear_user.S | 8 +- arch/arm64/lib/copy_from_user.S | 8 +- arch/arm64/lib/copy_in_user.S | 16 +- arch/arm64/lib/copy_to_user.S | 8 +- arch/arm64/lib/mte.S | 6 +- arch/arm64/lib/uaccess_flushcache.c | 4 +- arch/arm64/mm/fault.c | 5 - arch/arm64/mm/proc.S | 2 +- drivers/firmware/arm_sdei.c | 14 - drivers/firmware/psci/psci.c | 126 ++++--- drivers/irqchip/irq-gic-v3-its.c | 12 +- drivers/irqchip/irq-gic-v4.c | 19 + include/kvm/arm_pmu.h | 3 - include/kvm/arm_vgic.h | 1 + include/linux/irqchip/arm-gic-v4.h | 4 + include/linux/psci.h | 9 + tools/testing/selftests/kvm/aarch64/get-reg-list.c | 39 ++- 107 files changed, 3110 insertions(+), 2291 deletions(-) create mode 100644 arch/arm64/include/asm/alternative-macros.h create mode 100644 arch/arm64/include/asm/el2_setup.h delete mode 100644 arch/arm64/include/asm/kvm_coproc.h create mode 100644 arch/arm64/include/asm/rwonce.h delete mode 100644 arch/arm64/kvm/aarch32.c create mode 100644 arch/arm64/kvm/hyp/exception.c create mode 100644 arch/arm64/kvm/hyp/include/hyp/adjust_pc.h create mode 100644 arch/arm64/kvm/hyp/include/nvhe/trap_handler.h create mode 100644 arch/arm64/kvm/hyp/nvhe/hyp-smp.c create mode 100644 arch/arm64/kvm/hyp/nvhe/psci-relay.c delete mode 100644 arch/arm64/kvm/hyp/smccc_wa.S delete mode 100644 arch/arm64/kvm/regmap.c