This make the host vcpu's state more accurate and lays the foundations for the configurations being dynamic. Signed-off-by: Andrew Scull <ascull@xxxxxxxxxx> --- 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 kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm