From: Nicholas Piggin Date: Mon, 19 Dec 2016 18:30:07 +0000 (+1000) Subject: powerpc: Mark system reset as an NMI with nmi_enter/exit() X-Git-Tag: v4.14-rc1~913^2~33 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2b4f3ac5642672595ef6f71d1572b32475e94863;p=platform%2Fkernel%2Flinux-rpi.git powerpc: Mark system reset as an NMI with nmi_enter/exit() System reset is a non-maskable interrupt from Linux's point of view (occurs under local_irq_disable()), so it should use nmi_enter/exit. Signed-off-by: Nicholas Piggin Signed-off-by: Michael Ellerman --- diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 2393d3c..6a81a45 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -279,6 +279,14 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) void system_reset_exception(struct pt_regs *regs) { + /* + * Avoid crashes in case of nested NMI exceptions. Recoverability + * is determined by RI and in_nmi + */ + bool nested = in_nmi(); + if (!nested) + nmi_enter(); + /* See if any machine dependent calls */ if (ppc_md.system_reset_exception) { if (ppc_md.system_reset_exception(regs)) @@ -297,6 +305,9 @@ out: if (!(regs->msr & MSR_RI)) panic("Unrecoverable System Reset"); + if (!nested) + nmi_exit(); + /* What should we do here? We could issue a shutdown or hard reset. */ }