|
@@ -48,8 +48,8 @@ int crashing_cpu = -1;
|
|
|
static int time_to_dump;
|
|
|
|
|
|
#define CRASH_HANDLER_MAX 3
|
|
|
-/* NULL terminated list of shutdown handles */
|
|
|
-static crash_shutdown_t crash_shutdown_handles[CRASH_HANDLER_MAX+1];
|
|
|
+/* List of shutdown handles */
|
|
|
+static crash_shutdown_t crash_shutdown_handles[CRASH_HANDLER_MAX];
|
|
|
static DEFINE_SPINLOCK(crash_handlers_lock);
|
|
|
|
|
|
static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
|
|
@@ -288,9 +288,14 @@ int crash_shutdown_unregister(crash_shutdown_t handler)
|
|
|
rc = 1;
|
|
|
} else {
|
|
|
/* Shift handles down */
|
|
|
- for (; crash_shutdown_handles[i]; i++)
|
|
|
+ for (; i < (CRASH_HANDLER_MAX - 1); i++)
|
|
|
crash_shutdown_handles[i] =
|
|
|
crash_shutdown_handles[i+1];
|
|
|
+ /*
|
|
|
+ * Reset last entry to NULL now that it has been shifted down,
|
|
|
+ * this will allow new handles to be added here.
|
|
|
+ */
|
|
|
+ crash_shutdown_handles[i] = NULL;
|
|
|
rc = 0;
|
|
|
}
|
|
|
|
|
@@ -346,7 +351,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++) {
|
|
|
+ for (i = 0; crash_shutdown_handles[i] && i < CRASH_HANDLER_MAX; i++) {
|
|
|
if (setjmp(crash_shutdown_buf) == 0) {
|
|
|
/*
|
|
|
* Insert syncs and delay to ensure
|