From 9c429860fbe7e20da70941aa000a00e541f45e18 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 17 Apr 2008 14:35:00 +1000 Subject: [PATCH] --- yaml --- r: 91619 b: refs/heads/master c: fd3e0bbc6052ca9747a5332b382584ece83aab6d h: refs/heads/master i: 91617: d33b5d0da14636654f0e3c75ceb9f222406df8fe 91615: f6c89eba5582a43e4630f78f6b9678b15a600b48 v: v3 --- [refs] | 2 +- trunk/arch/powerpc/Kconfig | 4 +++ trunk/arch/powerpc/kernel/Makefile | 1 + trunk/arch/powerpc/kernel/stacktrace.c | 47 ++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 trunk/arch/powerpc/kernel/stacktrace.c diff --git a/[refs] b/[refs] index 3c9ab74e5e60..f4e78e202e15 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ec2b36b9f23cfbbe94d89724b796b44fd57d5221 +refs/heads/master: fd3e0bbc6052ca9747a5332b382584ece83aab6d diff --git a/trunk/arch/powerpc/Kconfig b/trunk/arch/powerpc/Kconfig index 7f2f126d1c2b..ecca20d17a7b 100644 --- a/trunk/arch/powerpc/Kconfig +++ b/trunk/arch/powerpc/Kconfig @@ -49,6 +49,10 @@ config IRQ_PER_CPU bool default y +config STACKTRACE_SUPPORT + bool + default y + config RWSEM_GENERIC_SPINLOCK bool diff --git a/trunk/arch/powerpc/kernel/Makefile b/trunk/arch/powerpc/kernel/Makefile index c1baf9d5903f..5183a9012a08 100644 --- a/trunk/arch/powerpc/kernel/Makefile +++ b/trunk/arch/powerpc/kernel/Makefile @@ -67,6 +67,7 @@ obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o +obj-$(CONFIG_STACKTRACE) += stacktrace.o pci64-$(CONFIG_PPC64) += pci_dn.o isa-bridge.o obj-$(CONFIG_PCI) += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \ diff --git a/trunk/arch/powerpc/kernel/stacktrace.c b/trunk/arch/powerpc/kernel/stacktrace.c new file mode 100644 index 000000000000..e3638eeaaae7 --- /dev/null +++ b/trunk/arch/powerpc/kernel/stacktrace.c @@ -0,0 +1,47 @@ +/* + * Stack trace utility + * + * Copyright 2008 Christoph Hellwig, IBM Corp. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include + +/* + * Save stack-backtrace addresses into a stack_trace buffer. + */ +void save_stack_trace(struct stack_trace *trace) +{ + unsigned long sp; + + asm("mr %0,1" : "=r" (sp)); + + for (;;) { + unsigned long *stack = (unsigned long *) sp; + unsigned long newsp, ip; + + if (!validate_sp(sp, current, STACK_FRAME_OVERHEAD)) + return; + + newsp = stack[0]; + ip = stack[STACK_FRAME_LR_SAVE]; + + if (!trace->skip) + trace->entries[trace->nr_entries++] = ip; + else + trace->skip--; + + if (trace->nr_entries >= trace->max_entries) + return; + + sp = newsp; + } +}