@@ -97,20 +97,26 @@ static inline void __activate_traps_common(struct kvm_vcpu *vcpu)
write_sysreg(0, pmselr_el0);
write_sysreg(ARMV8_PMU_USERENR_MASK, pmuserenr_el0);
}
-
- vcpu->arch.mdcr_el2_host = read_sysreg(mdcr_el2);
- write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
}
static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu)
{
- write_sysreg(vcpu->arch.mdcr_el2_host, mdcr_el2);
-
write_sysreg(0, hstr_el2);
if (kvm_arm_support_pmu_v3())
write_sysreg(0, pmuserenr_el0);
}
+static inline void __restore_guest_mdcr_el2(struct kvm_vcpu *vcpu)
+{
+ vcpu->arch.mdcr_el2_host = read_sysreg(mdcr_el2);
+ write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
+}
+
+static inline void __restore_host_mdcr_el2(struct kvm_vcpu *vcpu)
+{
+ write_sysreg(vcpu->arch.mdcr_el2_host, mdcr_el2);
+}
+
static inline void ___activate_traps(struct kvm_vcpu *vcpu)
{
u64 hcr = vcpu->arch.hcr_el2;
@@ -41,6 +41,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
___activate_traps(vcpu);
__activate_traps_common(vcpu);
+ __restore_guest_mdcr_el2(vcpu);
val = vcpu->arch.cptr_el2;
val |= CPTR_EL2_TTA | CPTR_EL2_TAM;
@@ -91,6 +92,7 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
isb();
}
+ __restore_host_mdcr_el2(vcpu);
__deactivate_traps_common(vcpu);
write_sysreg(this_cpu_ptr(&kvm_init_params)->hcr_el2, hcr_el2);
@@ -89,10 +89,12 @@ NOKPROBE_SYMBOL(__deactivate_traps);
void activate_traps_vhe_load(struct kvm_vcpu *vcpu)
{
__activate_traps_common(vcpu);
+ __restore_guest_mdcr_el2(vcpu);
}
void deactivate_traps_vhe_put(struct kvm_vcpu *vcpu)
{
+ __restore_host_mdcr_el2(vcpu);
__deactivate_traps_common(vcpu);
}
To run a guest with SPE, MDCR_EL2 must be configured such that the buffer owning regime is EL1&0. With VHE enabled, the guest runs at EL2 and changing the owning regime to EL1&0 in vcpu_put() would mean creating an extended blackout window for the host. Move the acceses to MDCR_EL2 out of __activate_traps_common() and __deactivate_traps_common() to prepare for executing them later in the run loop in the VHE case. No functional change intended. Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arch/arm64/kvm/hyp/include/hyp/switch.h | 16 +++++++++++----- arch/arm64/kvm/hyp/nvhe/switch.c | 2 ++ arch/arm64/kvm/hyp/vhe/switch.c | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-)