|
@@ -110,6 +110,15 @@ static hyp_alternate_select(__deactivate_traps_arch,
|
|
|
|
|
|
static void __hyp_text __deactivate_traps(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
+ /*
|
|
|
+ * If we pended a virtual abort, preserve it until it gets
|
|
|
+ * cleared. See D1.14.3 (Virtual Interrupts) for details, but
|
|
|
+ * the crucial bit is "On taking a vSError interrupt,
|
|
|
+ * HCR_EL2.VSE is cleared to 0."
|
|
|
+ */
|
|
|
+ if (vcpu->arch.hcr_el2 & HCR_VSE)
|
|
|
+ vcpu->arch.hcr_el2 = read_sysreg(hcr_el2);
|
|
|
+
|
|
|
__deactivate_traps_arch()();
|
|
|
write_sysreg(0, hstr_el2);
|
|
|
write_sysreg(read_sysreg(mdcr_el2) & MDCR_EL2_HPMN_MASK, mdcr_el2);
|