|
@@ -196,10 +196,7 @@ void __hyp_text __sysreg32_save_state(struct kvm_vcpu *vcpu)
|
|
|
sysreg[DACR32_EL2] = read_sysreg(dacr32_el2);
|
|
|
sysreg[IFSR32_EL2] = read_sysreg(ifsr32_el2);
|
|
|
|
|
|
- if (__fpsimd_enabled())
|
|
|
- sysreg[FPEXC32_EL2] = read_sysreg(fpexc32_el2);
|
|
|
-
|
|
|
- if (vcpu->arch.debug_flags & KVM_ARM64_DEBUG_DIRTY)
|
|
|
+ if (has_vhe() || vcpu->arch.debug_flags & KVM_ARM64_DEBUG_DIRTY)
|
|
|
sysreg[DBGVCR32_EL2] = read_sysreg(dbgvcr32_el2);
|
|
|
}
|
|
|
|
|
@@ -221,7 +218,7 @@ void __hyp_text __sysreg32_restore_state(struct kvm_vcpu *vcpu)
|
|
|
write_sysreg(sysreg[DACR32_EL2], dacr32_el2);
|
|
|
write_sysreg(sysreg[IFSR32_EL2], ifsr32_el2);
|
|
|
|
|
|
- if (vcpu->arch.debug_flags & KVM_ARM64_DEBUG_DIRTY)
|
|
|
+ if (has_vhe() || vcpu->arch.debug_flags & KVM_ARM64_DEBUG_DIRTY)
|
|
|
write_sysreg(sysreg[DBGVCR32_EL2], dbgvcr32_el2);
|
|
|
}
|
|
|
|
|
@@ -246,6 +243,13 @@ void kvm_vcpu_load_sysregs(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
__sysreg_save_user_state(host_ctxt);
|
|
|
|
|
|
+ /*
|
|
|
+ * Load guest EL1 and user state
|
|
|
+ *
|
|
|
+ * We must restore the 32-bit state before the sysregs, thanks
|
|
|
+ * to erratum #852523 (Cortex-A57) or #853709 (Cortex-A72).
|
|
|
+ */
|
|
|
+ __sysreg32_restore_state(vcpu);
|
|
|
__sysreg_restore_user_state(guest_ctxt);
|
|
|
__sysreg_restore_el1_state(guest_ctxt);
|
|
|
|
|
@@ -273,6 +277,7 @@ void kvm_vcpu_put_sysregs(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
__sysreg_save_el1_state(guest_ctxt);
|
|
|
__sysreg_save_user_state(guest_ctxt);
|
|
|
+ __sysreg32_save_state(vcpu);
|
|
|
|
|
|
/* Restore host user state */
|
|
|
__sysreg_restore_user_state(host_ctxt);
|