mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 14:19:09 -04:00
ARM64: smp: Save CPU registers before IPI_CPU_STOP processing
When a kernel panic occurs on one CPU, other CPUs are instructed to stop execution via the IPI_CPU_STOP message. These other CPUs dump their stack, which may not be good enough to reconstruct their context to perform post-mortem analysis. Dump each CPU's context (before it started processing the IPI) into a globally accessible structure and print them on the dmesg/console to allow for easier post-mortem debugging. [eberman@codeaurora.org: make regs_before_stop static] Change-Id: Ifd7589af4327992540196c87f8b640045d7eaf19 Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org> Signed-off-by: Elliot Berman <eberman@codeaurora.org>
This commit is contained in:
parent
9fe2640572
commit
a0f944eb08
1 changed files with 8 additions and 2 deletions
|
|
@ -49,6 +49,7 @@
|
|||
#include <asm/tlbflush.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/virt.h>
|
||||
#include <asm/system_misc.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/ipi.h>
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue