Commit 26d27c01 authored by Sumit Garg's avatar Sumit Garg Committed by Zheng Zengkai
Browse files

arm64: ipi_nmi: Add support for NMI backtrace

maillist inclusion
category: feature
bugzilla: 49593
CVE: NA
Reference: https://www.spinics.net/lists/arm-kernel/msg851005.html



-------------------------------------------------

Enable NMI backtrace support on arm64 using IPI turned as an NMI
leveraging pseudo NMIs support. It is now possible for users to get a
backtrace of a CPU stuck in hard-lockup using magic SYSRQ.

Signed-off-by: default avatarSumit Garg <sumit.garg@linaro.org>
Signed-off-by: default avatarWei Li <liwei391@huawei.com>
Reviewed-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 755a12c0
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6,6 +6,12 @@

#include <asm-generic/irq.h>

#ifdef CONFIG_SMP
extern bool arch_trigger_cpumask_backtrace(const cpumask_t *mask,
					   bool exclude_self);
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
#endif

struct pt_regs;

static inline int nr_legacy_irqs(void)
+16 −2
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@

#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/nmi.h>
#include <linux/smp.h>

#include <asm/nmi.h>
@@ -31,11 +32,24 @@ void arm64_send_nmi(cpumask_t *mask)
	__ipi_send_mask(ipi_nmi_desc, mask);
}

bool arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)
{
	if (!ipi_nmi_desc)
		return false;

	nmi_trigger_cpumask_backtrace(mask, exclude_self, arm64_send_nmi);

	return true;
}

static irqreturn_t ipi_nmi_handler(int irq, void *data)
{
	/* nop, NMI handlers for special features can be added here. */
	irqreturn_t ret = IRQ_NONE;

	if (nmi_cpu_backtrace(get_irq_regs()))
		ret = IRQ_HANDLED;

	return IRQ_NONE;
	return ret;
}

void dynamic_ipi_setup(int cpu)