diff options
Diffstat (limited to 'arch/mips/kernel/crash.c')
| -rw-r--r-- | arch/mips/kernel/crash.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/mips/kernel/crash.c b/arch/mips/kernel/crash.c index d434d5d5ae6e..610f0f3bdb34 100644 --- a/arch/mips/kernel/crash.c +++ b/arch/mips/kernel/crash.c @@ -14,12 +14,22 @@ static int crashing_cpu = -1;  static cpumask_t cpus_in_crash = CPU_MASK_NONE;  #ifdef CONFIG_SMP -static void crash_shutdown_secondary(void *ignore) +static void crash_shutdown_secondary(void *passed_regs)  { -	struct pt_regs *regs; +	struct pt_regs *regs = passed_regs;  	int cpu = smp_processor_id(); -	regs = task_pt_regs(current); +	/* +	 * If we are passed registers, use those.  Otherwise get the +	 * regs from the last interrupt, which should be correct, as +	 * we are in an interrupt.  But if the regs are not there, +	 * pull them from the top of the stack.  They are probably +	 * wrong, but we need something to keep from crashing again. +	 */ +	if (!regs) +		regs = get_irq_regs(); +	if (!regs) +		regs = task_pt_regs(current);  	if (!cpu_online(cpu))  		return;  |