|
@@ -485,7 +485,23 @@ machine_check_fwnmi:
|
|
EXCEPTION_PROLOG_0(PACA_EXMC)
|
|
EXCEPTION_PROLOG_0(PACA_EXMC)
|
|
machine_check_pSeries_0:
|
|
machine_check_pSeries_0:
|
|
EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
|
EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
|
- EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD)
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the
|
|
|
|
+ * difference that MSR_RI is not enabled, because PACA_EXMC is being
|
|
|
|
+ * used, so nested machine check corrupts it. machine_check_common
|
|
|
|
+ * enables MSR_RI.
|
|
|
|
+ */
|
|
|
|
+ ld r12,PACAKBASE(r13)
|
|
|
|
+ ld r10,PACAKMSR(r13)
|
|
|
|
+ xori r10,r10,MSR_RI
|
|
|
|
+ mfspr r11,SPRN_SRR0
|
|
|
|
+ LOAD_HANDLER(r12, machine_check_common)
|
|
|
|
+ mtspr SPRN_SRR0,r12
|
|
|
|
+ mfspr r12,SPRN_SRR1
|
|
|
|
+ mtspr SPRN_SRR1,r10
|
|
|
|
+ rfid
|
|
|
|
+ b . /* prevent speculative execution */
|
|
|
|
+
|
|
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
|
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
|
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
|
|
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
|
|
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
|
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
|
@@ -977,6 +993,9 @@ machine_check_common:
|
|
RECONCILE_IRQ_STATE(r10, r11)
|
|
RECONCILE_IRQ_STATE(r10, r11)
|
|
ld r3,PACA_EXMC+EX_DAR(r13)
|
|
ld r3,PACA_EXMC+EX_DAR(r13)
|
|
lwz r4,PACA_EXMC+EX_DSISR(r13)
|
|
lwz r4,PACA_EXMC+EX_DSISR(r13)
|
|
|
|
+ /* Enable MSR_RI when finished with PACA_EXMC */
|
|
|
|
+ li r10,MSR_RI
|
|
|
|
+ mtmsrd r10,1
|
|
std r3,_DAR(r1)
|
|
std r3,_DAR(r1)
|
|
std r4,_DSISR(r1)
|
|
std r4,_DSISR(r1)
|
|
bl save_nvgprs
|
|
bl save_nvgprs
|