|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/cpu.h>
|
|
|
#include <linux/seq_file.h>
|
|
|
#include <linux/irq.h>
|
|
|
+#include <linux/nmi.h>
|
|
|
#include <linux/percpu.h>
|
|
|
#include <linux/clockchips.h>
|
|
|
#include <linux/completion.h>
|
|
@@ -72,6 +73,7 @@ enum ipi_msg_type {
|
|
|
IPI_CPU_STOP,
|
|
|
IPI_IRQ_WORK,
|
|
|
IPI_COMPLETION,
|
|
|
+ IPI_CPU_BACKTRACE = 15,
|
|
|
};
|
|
|
|
|
|
static DECLARE_COMPLETION(cpu_running);
|
|
@@ -630,6 +632,12 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|
|
irq_exit();
|
|
|
break;
|
|
|
|
|
|
+ case IPI_CPU_BACKTRACE:
|
|
|
+ irq_enter();
|
|
|
+ nmi_cpu_backtrace(regs);
|
|
|
+ irq_exit();
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
pr_crit("CPU%u: Unknown IPI message 0x%x\n",
|
|
|
cpu, ipinr);
|
|
@@ -724,3 +732,13 @@ static int __init register_cpufreq_notifier(void)
|
|
|
core_initcall(register_cpufreq_notifier);
|
|
|
|
|
|
#endif
|
|
|
+
|
|
|
+static void raise_nmi(cpumask_t *mask)
|
|
|
+{
|
|
|
+ smp_cross_call(mask, IPI_CPU_BACKTRACE);
|
|
|
+}
|
|
|
+
|
|
|
+void arch_trigger_all_cpu_backtrace(bool include_self)
|
|
|
+{
|
|
|
+ nmi_trigger_all_cpu_backtrace(include_self, raise_nmi);
|
|
|
+}
|