diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index 5fddc2c27e12..337ee82472a9 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c @@ -49,6 +49,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -835,15 +836,20 @@ void arch_irq_work_raise(void) #endif static DEFINE_RAW_SPINLOCK(stop_lock); + +static DEFINE_PER_CPU(struct pt_regs, regs_before_stop); + /* * ipi_cpu_stop - handle IPI from smp_send_stop() */ -static void ipi_cpu_stop(unsigned int cpu) +static void ipi_cpu_stop(unsigned int cpu, struct pt_regs *regs) { if (system_state == SYSTEM_BOOTING || system_state == SYSTEM_RUNNING) { + per_cpu(regs_before_stop, cpu) = *regs; raw_spin_lock(&stop_lock); pr_crit("CPU%u: stopping\n", cpu); + __show_regs(regs); dump_stack(); raw_spin_unlock(&stop_lock); } @@ -906,7 +912,7 @@ void handle_IPI(int ipinr, struct pt_regs *regs) case IPI_CPU_STOP: irq_enter(); - ipi_cpu_stop(cpu); + ipi_cpu_stop(cpu, regs); irq_exit(); break;