|
@@ -347,10 +347,12 @@ int crash_shutdown_unregister(crash_shutdown_t handler)
|
|
|
EXPORT_SYMBOL(crash_shutdown_unregister);
|
|
|
|
|
|
static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
|
|
|
+static int crash_shutdown_cpu = -1;
|
|
|
|
|
|
static int handle_fault(struct pt_regs *regs)
|
|
|
{
|
|
|
- longjmp(crash_shutdown_buf, 1);
|
|
|
+ if (crash_shutdown_cpu == smp_processor_id())
|
|
|
+ longjmp(crash_shutdown_buf, 1);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -391,6 +393,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|
|
*/
|
|
|
old_handler = __debugger_fault_handler;
|
|
|
__debugger_fault_handler = handle_fault;
|
|
|
+ crash_shutdown_cpu = smp_processor_id();
|
|
|
for (i = 0; crash_shutdown_handles[i]; i++) {
|
|
|
if (setjmp(crash_shutdown_buf) == 0) {
|
|
|
/*
|
|
@@ -404,6 +407,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|
|
asm volatile("sync; isync");
|
|
|
}
|
|
|
}
|
|
|
+ crash_shutdown_cpu = -1;
|
|
|
__debugger_fault_handler = old_handler;
|
|
|
|
|
|
/*
|