kvm: arm64: Add helper for loading the stage2 setting for a VM
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 26 Sep 2018 16:32:39 +0000 (17:32 +0100)
committerMarc Zyngier <marc.zyngier@arm.com>
Mon, 1 Oct 2018 12:08:41 +0000 (13:08 +0100)
We load the stage2 context of a guest for different operations,
including running the guest and tlb maintenance on behalf of the
guest. As of now only the vttbr is private to the guest, but this
is about to change with IPA per VM. Add a helper to load the stage2
configuration for a VM, which could do the right thing with the
future changes.

Cc: Christoffer Dall <cdall@kernel.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
arch/arm64/include/asm/kvm_hyp.h
arch/arm64/kvm/hyp/switch.c
arch/arm64/kvm/hyp/tlb.c

index 384c343976198dd11ec241b0a958ce855eaba9d7..d1bd1e0f14d7b1f7b6849ad7dd24253d194e1daf 100644 (file)
@@ -155,5 +155,14 @@ void deactivate_traps_vhe_put(void);
 u64 __guest_enter(struct kvm_vcpu *vcpu, struct kvm_cpu_context *host_ctxt);
 void __noreturn __hyp_do_panic(unsigned long, ...);
 
+/*
+ * Must be called from hyp code running at EL2 with an updated VTTBR
+ * and interrupts disabled.
+ */
+static __always_inline void __hyp_text __load_guest_stage2(struct kvm *kvm)
+{
+       write_sysreg(kvm->arch.vttbr, vttbr_el2);
+}
+
 #endif /* __ARM64_KVM_HYP_H__ */
 
index ca46153d79154bae1b0833231245129752484362..9d5ce1a3039ac80bdee1dad0344f30e941686b39 100644 (file)
@@ -198,7 +198,7 @@ void deactivate_traps_vhe_put(void)
 
 static void __hyp_text __activate_vm(struct kvm *kvm)
 {
-       write_sysreg(kvm->arch.vttbr, vttbr_el2);
+       __load_guest_stage2(kvm);
 }
 
 static void __hyp_text __deactivate_vm(struct kvm_vcpu *vcpu)
index 131c7772703c290c3cd27c1a539090928dfc8e73..4dbd9c69a96d097e56fb49a733ea55ea49219c97 100644 (file)
@@ -30,7 +30,7 @@ static void __hyp_text __tlb_switch_to_guest_vhe(struct kvm *kvm)
         * bits. Changing E2H is impossible (goodbye TTBR1_EL2), so
         * let's flip TGE before executing the TLB operation.
         */
-       write_sysreg(kvm->arch.vttbr, vttbr_el2);
+       __load_guest_stage2(kvm);
        val = read_sysreg(hcr_el2);
        val &= ~HCR_TGE;
        write_sysreg(val, hcr_el2);
@@ -39,7 +39,7 @@ static void __hyp_text __tlb_switch_to_guest_vhe(struct kvm *kvm)
 
 static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm *kvm)
 {
-       write_sysreg(kvm->arch.vttbr, vttbr_el2);
+       __load_guest_stage2(kvm);
        isb();
 }