This make the host vcpu's state more accurate and lays the foundations
for the configurations being dynamic.

Signed-off-by: Andrew Scull <[email protected]>
---
 arch/arm64/kvm/hyp/nvhe/hyp-main.c |  7 +++++++
 arch/arm64/kvm/hyp/nvhe/switch.c   | 17 +++++------------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c 
b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
index e7601de3b901..3a78fe8b923a 100644
--- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c
+++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
@@ -163,13 +163,20 @@ void __noreturn kvm_hyp_main(void)
 {
        /* Set tpidr_el2 for use by HYP */
        struct kvm_vcpu *host_vcpu;
+       u64 mdcr_el2;
 
        host_vcpu = __hyp_this_cpu_ptr(kvm_host_vcpu);
 
        kvm_init_host_cpu_context(&host_vcpu->arch.ctxt);
 
+       mdcr_el2 = read_sysreg(mdcr_el2);
+       mdcr_el2 &= MDCR_EL2_HPMN_MASK;
+       mdcr_el2 |= MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT;
+
        host_vcpu->arch.flags = KVM_ARM64_HOST_VCPU_FLAGS;
        host_vcpu->arch.workaround_flags = VCPU_WORKAROUND_2_FLAG;
+       host_vcpu->arch.hcr_el2 = HCR_HOST_NVHE_FLAGS;
+       host_vcpu->arch.mdcr_el2 = mdcr_el2;
        host_vcpu->arch.debug_ptr = &host_vcpu->arch.vcpu_debug_state;
 
        /*
diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c
index 629fea722de1..88e7946a35d5 100644
--- a/arch/arm64/kvm/hyp/nvhe/switch.c
+++ b/arch/arm64/kvm/hyp/nvhe/switch.c
@@ -58,14 +58,10 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
        }
 }
 
-static void __deactivate_traps(struct kvm_vcpu *vcpu)
+static void __deactivate_traps(struct kvm_vcpu *host_vcpu, struct kvm_vcpu 
*vcpu)
 {
-       u64 mdcr_el2;
-
        ___deactivate_traps(vcpu);
 
-       mdcr_el2 = read_sysreg(mdcr_el2);
-
        if (cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) {
                u64 val;
 
@@ -85,11 +81,8 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
 
        __deactivate_traps_common();
 
-       mdcr_el2 &= MDCR_EL2_HPMN_MASK;
-       mdcr_el2 |= MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT;
-
-       write_sysreg(mdcr_el2, mdcr_el2);
-       write_sysreg(HCR_HOST_NVHE_FLAGS, hcr_el2);
+       write_sysreg(host_vcpu->arch.mdcr_el2, mdcr_el2);
+       write_sysreg(host_vcpu->arch.hcr_el2, hcr_el2);
        write_sysreg(CPTR_EL2_DEFAULT, cptr_el2);
 }
 
@@ -194,7 +187,7 @@ static void __kvm_vcpu_switch_to_host(struct kvm_vcpu 
*host_vcpu,
        __timer_disable_traps(vcpu);
        __hyp_vgic_save_state(vcpu);
 
-       __deactivate_traps(vcpu);
+       __deactivate_traps(host_vcpu, vcpu);
        __deactivate_vm(vcpu);
 
        __sysreg_restore_state_nvhe(&host_vcpu->arch.ctxt);
@@ -283,7 +276,7 @@ void __noreturn hyp_panic(struct kvm_cpu_context *host_ctxt)
 
        if (vcpu != host_vcpu) {
                __timer_disable_traps(vcpu);
-               __deactivate_traps(vcpu);
+               __deactivate_traps(host_vcpu, vcpu);
                __deactivate_vm(vcpu);
                __sysreg_restore_state_nvhe(&host_vcpu->arch.ctxt);
        }
-- 
2.27.0.389.gc38d7665816-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to