]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: arm64: Trap host SMCs in protected mode
authorDavid Brazdil <dbrazdil@google.com>
Wed, 2 Dec 2020 18:41:21 +0000 (18:41 +0000)
committerMarc Zyngier <maz@kernel.org>
Fri, 4 Dec 2020 10:08:36 +0000 (10:08 +0000)
While protected KVM is installed, start trapping all host SMCs.
For now these are simply forwarded to EL3, except PSCI
CPU_ON/CPU_SUSPEND/SYSTEM_SUSPEND which are intercepted and the
hypervisor installed on newly booted cores.

Create new constant HCR_HOST_NVHE_PROTECTED_FLAGS with the new set of HCR
flags to use while the nVHE vector is installed when the kernel was
booted with the protected flag enabled. Switch back to the default HCR
flags when switching back to the stub vector.

Signed-off-by: David Brazdil <dbrazdil@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20201202184122.26046-26-dbrazdil@google.com
arch/arm64/include/asm/kvm_arm.h
arch/arm64/kvm/hyp/nvhe/hyp-init.S
arch/arm64/kvm/hyp/nvhe/switch.c

index 64ce29378467c6988fca7d6bd0792eea9f204b58..4e90c2debf70a9f33bec355911c0620d782ca7bc 100644 (file)
@@ -80,6 +80,7 @@
                         HCR_FMO | HCR_IMO | HCR_PTW )
 #define HCR_VIRT_EXCP_MASK (HCR_VSE | HCR_VI | HCR_VF)
 #define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
+#define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC)
 #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
 
 /* TCR_EL2 Registers bits */
index a2e2515476257afbfa4bec718538dcf3aa52ea26..31b060a4404524720cf5ae05f1e21014a35de0c6 100644 (file)
@@ -88,6 +88,11 @@ SYM_CODE_END(__kvm_hyp_init)
  * x0: struct kvm_nvhe_init_params PA
  */
 SYM_CODE_START_LOCAL(___kvm_hyp_init)
+alternative_if ARM64_KVM_PROTECTED_MODE
+       mov_q   x1, HCR_HOST_NVHE_PROTECTED_FLAGS
+       msr     hcr_el2, x1
+alternative_else_nop_endif
+
        ldr     x1, [x0, #NVHE_INIT_TPIDR_EL2]
        msr     tpidr_el2, x1
 
@@ -230,6 +235,11 @@ reset:
        msr     sctlr_el2, x5
        isb
 
+alternative_if ARM64_KVM_PROTECTED_MODE
+       mov_q   x5, HCR_HOST_NVHE_FLAGS
+       msr     hcr_el2, x5
+alternative_else_nop_endif
+
        /* Install stub vectors */
        adr_l   x5, __hyp_stub_vectors
        msr     vbar_el2, x5
index 8ae8160bc93ab87216429b4f6d4ca3901c6c0fa9..e1f8e0797144ec139ddcab201022f8db16a5a2b9 100644 (file)
@@ -96,7 +96,10 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
        mdcr_el2 |= MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT;
 
        write_sysreg(mdcr_el2, mdcr_el2);
-       write_sysreg(HCR_HOST_NVHE_FLAGS, hcr_el2);
+       if (is_protected_kvm_enabled())
+               write_sysreg(HCR_HOST_NVHE_PROTECTED_FLAGS, hcr_el2);
+       else
+               write_sysreg(HCR_HOST_NVHE_FLAGS, hcr_el2);
        write_sysreg(CPTR_EL2_DEFAULT, cptr_el2);
        write_sysreg(__kvm_hyp_host_vector, vbar_el2);
 }