|
@@ -485,7 +485,23 @@ machine_check_fwnmi:
|
|
|
EXCEPTION_PROLOG_0(PACA_EXMC)
|
|
|
machine_check_pSeries_0:
|
|
|
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_EXGEN, EXC_STD, 0x300)
|
|
|
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
|
@@ -969,14 +985,17 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
|
|
machine_check_common:
|
|
|
|
|
|
mfspr r10,SPRN_DAR
|
|
|
- std r10,PACA_EXGEN+EX_DAR(r13)
|
|
|
+ std r10,PACA_EXMC+EX_DAR(r13)
|
|
|
mfspr r10,SPRN_DSISR
|
|
|
- stw r10,PACA_EXGEN+EX_DSISR(r13)
|
|
|
+ stw r10,PACA_EXMC+EX_DSISR(r13)
|
|
|
EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
|
|
|
FINISH_NAP
|
|
|
RECONCILE_IRQ_STATE(r10, r11)
|
|
|
- ld r3,PACA_EXGEN+EX_DAR(r13)
|
|
|
- lwz r4,PACA_EXGEN+EX_DSISR(r13)
|
|
|
+ ld r3,PACA_EXMC+EX_DAR(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 r4,_DSISR(r1)
|
|
|
bl save_nvgprs
|