Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46dba4c5 authored by Rohit Vaswani's avatar Rohit Vaswani Committed by Runmin Wang
Browse files

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.

Change-Id: Ifd7589af4327992540196c87f8b640045d7eaf19
Signed-off-by: default avatarRohit Vaswani <rvaswani@codeaurora.org>
[abhimany: resolve trivial merge conflic]
Signed-off-by: default avatarAbhimanyu Kapur <abhimany@codeaurora.org>
Signed-off-by: default avatarKyle Yan <kyan@codeaurora.org>
parent 71ad6b09
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -57,6 +57,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>
@@ -841,15 +842,20 @@ void arch_irq_work_raise(void)
#endif

static DEFINE_RAW_SPINLOCK(stop_lock);

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);
	}
@@ -912,7 +918,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;