Bare metal machine checks run an "early" handler in real mode which potentially flushes faulting translation structures, among other things, before running the main handler which reports the event.
The main handler runs as a normal interrupt handler, after a "windup" that sets registers back as they were at interrupt entry. CFAR does not get restored by the windup code, so add that. The current handler does not appear to use CFAR anywhere, because the main handler is not run if the MCE happens in kernel-mode and the user-mode message is not a register trace. However it may be useful in some cases or future changes (xmon, panic on mce, etc). Signed-off-by: Nicholas Piggin <npig...@gmail.com> --- arch/powerpc/kernel/exceptions-64s.S | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 61c96502d2a8..ab22af2509d8 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -1205,6 +1205,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) 9: /* Deliver the machine check to host kernel in V mode. */ +BEGIN_FTR_SECTION + ld r10,ORIG_GPR3(r1) + mtspr SPRN_CFAR,r10 +END_FTR_SECTION_IFSET(CPU_FTR_CFAR) MACHINE_CHECK_HANDLER_WINDUP EXCEPTION_PROLOG_0 PACA_EXMC EXCEPTION_PROLOG_1 EXC_STD, PACA_EXMC, 1, 0x200, 1, 1, 0 -- 2.20.1