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 <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
 
 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))
        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. */
 }