[IA64] Add CONFIG_STACKTRACE_SUPPORT
authorTony Luck <tony.luck@intel.com>
Thu, 23 Sep 2010 20:52:07 +0000 (13:52 -0700)
committerTony Luck <tony.luck@intel.com>
Thu, 23 Sep 2010 20:52:07 +0000 (13:52 -0700)
Several Linux features are dependent on stack trace support. Add
it so they can be enabled.

Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/Kconfig
arch/ia64/kernel/Makefile
arch/ia64/kernel/stacktrace.c [new file with mode: 0644]

index ba22849ee3ec1c268f201553658a5f5931f38fc3..e93f44e62edb76aa74b5cc5f6f35a247dac92a42 100644 (file)
@@ -62,6 +62,9 @@ config NEED_SG_DMA_LENGTH
 config SWIOTLB
        bool
 
+config STACKTRACE_SUPPORT
+       def_bool y
+
 config GENERIC_LOCKBREAK
        def_bool n
 
index db10b1e378b0470ec52828a19e78da43e26d31db..395c2f216dd899ddb6871db79b3f45e4f041d442 100644 (file)
@@ -34,6 +34,7 @@ obj-$(CONFIG_AUDIT)           += audit.o
 obj-$(CONFIG_PCI_MSI)          += msi_ia64.o
 mca_recovery-y                 += mca_drv.o mca_drv_asm.o
 obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o
+obj-$(CONFIG_STACKTRACE)       += stacktrace.o
 
 obj-$(CONFIG_PARAVIRT)         += paravirt.o paravirtentry.o \
                                   paravirt_patch.o
diff --git a/arch/ia64/kernel/stacktrace.c b/arch/ia64/kernel/stacktrace.c
new file mode 100644 (file)
index 0000000..5af2783
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * arch/ia64/kernel/stacktrace.c
+ *
+ * Stack trace management functions
+ *
+ */
+#include <linux/sched.h>
+#include <linux/stacktrace.h>
+#include <linux/module.h>
+
+static void
+ia64_do_save_stack(struct unw_frame_info *info, void *arg)
+{
+       struct stack_trace *trace = arg;
+       unsigned long ip;
+       int skip = trace->skip;
+
+       trace->nr_entries = 0;
+       do {
+               unw_get_ip(info, &ip);
+               if (ip == 0)
+                       break;
+               if (skip == 0) {
+                       trace->entries[trace->nr_entries++] = ip;
+                       if (trace->nr_entries == trace->max_entries)
+                               break;
+               } else
+                       skip--;
+       } while (unw_unwind(info) >= 0);
+}
+
+/*
+ * Save stack-backtrace addresses into a stack_trace buffer.
+ */
+void save_stack_trace(struct stack_trace *trace)
+{
+       unw_init_running(ia64_do_save_stack, trace);
+}
+EXPORT_SYMBOL(save_stack_trace);