|
@@ -1389,6 +1389,7 @@ machine_check_handle_early:
|
|
|
bl save_nvgprs
|
|
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
|
|
bl machine_check_early
|
|
|
+ std r3,RESULT(r1) /* Save result */
|
|
|
ld r12,_MSR(r1)
|
|
|
#ifdef CONFIG_PPC_P7_NAP
|
|
|
/*
|
|
@@ -1443,10 +1444,32 @@ machine_check_handle_early:
|
|
|
*/
|
|
|
andi. r11,r12,MSR_RI
|
|
|
bne 2f
|
|
|
-1: addi r3,r1,STACK_FRAME_OVERHEAD
|
|
|
- bl unrecoverable_exception
|
|
|
- b 1b
|
|
|
+1: mfspr r11,SPRN_SRR0
|
|
|
+ ld r10,PACAKBASE(r13)
|
|
|
+ LOAD_HANDLER(r10,unrecover_mce)
|
|
|
+ mtspr SPRN_SRR0,r10
|
|
|
+ ld r10,PACAKMSR(r13)
|
|
|
+ /*
|
|
|
+ * We are going down. But there are chances that we might get hit by
|
|
|
+ * another MCE during panic path and we may run into unstable state
|
|
|
+ * with no way out. Hence, turn ME bit off while going down, so that
|
|
|
+ * when another MCE is hit during panic path, system will checkstop
|
|
|
+ * and hypervisor will get restarted cleanly by SP.
|
|
|
+ */
|
|
|
+ li r3,MSR_ME
|
|
|
+ andc r10,r10,r3 /* Turn off MSR_ME */
|
|
|
+ mtspr SPRN_SRR1,r10
|
|
|
+ rfid
|
|
|
+ b .
|
|
|
2:
|
|
|
+ /*
|
|
|
+ * Check if we have successfully handled/recovered from error, if not
|
|
|
+ * then stay on emergency stack and panic.
|
|
|
+ */
|
|
|
+ ld r3,RESULT(r1) /* Load result */
|
|
|
+ cmpdi r3,0 /* see if we handled MCE successfully */
|
|
|
+
|
|
|
+ beq 1b /* if !handled then panic */
|
|
|
/*
|
|
|
* Return from MC interrupt.
|
|
|
* Queue up the MCE event so that we can log it later, while
|
|
@@ -1460,6 +1483,17 @@ machine_check_handle_early:
|
|
|
MACHINE_CHECK_HANDLER_WINDUP
|
|
|
b machine_check_pSeries
|
|
|
|
|
|
+unrecover_mce:
|
|
|
+ /* Invoke machine_check_exception to print MCE event and panic. */
|
|
|
+ addi r3,r1,STACK_FRAME_OVERHEAD
|
|
|
+ bl .machine_check_exception
|
|
|
+ /*
|
|
|
+ * We will not reach here. Even if we did, there is no way out. Call
|
|
|
+ * unrecoverable_exception and die.
|
|
|
+ */
|
|
|
+1: addi r3,r1,STACK_FRAME_OVERHEAD
|
|
|
+ bl .unrecoverable_exception
|
|
|
+ b 1b
|
|
|
/*
|
|
|
* r13 points to the PACA, r9 contains the saved CR,
|
|
|
* r12 contain the saved SRR1, SRR0 is still ready for return
|