aboutsummaryrefslogtreecommitdiff
path: root/arch/mips/kernel/traps.c
diff options
context:
space:
mode:
authorAtsushi Nemoto <anemo@mba.ocn.ne.jp>2006-07-25 23:51:36 +0900
committerRalf Baechle <ralf@linux-mips.org>2006-09-27 13:37:05 +0100
commite889d78fd5775d0b466f570928f5b0f0c9f05355 (patch)
treec85ebfa9ae7fb6d72d6c1ac6f67d64fba92b1145 /arch/mips/kernel/traps.c
parente7dee3cea4dcd54744cf68864784c1336a42144f (diff)
[MIPS] Rearrange show_stack, show_trace
Print call-trace in show_stack() (like on other archs). Also make show_trace() static and simplify its argument list. Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/traps.c')
-rw-r--r--arch/mips/kernel/traps.c51
1 files changed, 23 insertions, 28 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index 368fdb77917..c6f70467e75 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -79,6 +79,25 @@ void (*board_bind_eic_interrupt)(int irq, int regset);
*/
#define MODULE_RANGE (8*1024*1024)
+static void show_trace(unsigned long *stack)
+{
+ const int field = 2 * sizeof(unsigned long);
+ unsigned long addr;
+
+ printk("Call Trace:");
+#ifdef CONFIG_KALLSYMS
+ printk("\n");
+#endif
+ while (!kstack_end(stack)) {
+ addr = *stack++;
+ if (__kernel_text_address(addr)) {
+ printk(" [<%0*lx>] ", field, addr);
+ print_symbol("%s\n", addr);
+ }
+ }
+ printk("\n");
+}
+
/*
* This routine abuses get_user()/put_user() to reference pointers
* with at least a bit of error checking ...
@@ -88,6 +107,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)
const int field = 2 * sizeof(unsigned long);
long stackdata;
int i;
+ unsigned long *stack;
if (!sp) {
if (task && task != current)
@@ -95,6 +115,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)
else
sp = (unsigned long *) &sp;
}
+ stack = sp;
printk("Stack :");
i = 0;
@@ -115,32 +136,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)
i++;
}
printk("\n");
-}
-
-void show_trace(struct task_struct *task, unsigned long *stack)
-{
- const int field = 2 * sizeof(unsigned long);
- unsigned long addr;
-
- if (!stack) {
- if (task && task != current)
- stack = (unsigned long *) task->thread.reg29;
- else
- stack = (unsigned long *) &stack;
- }
-
- printk("Call Trace:");
-#ifdef CONFIG_KALLSYMS
- printk("\n");
-#endif
- while (!kstack_end(stack)) {
- addr = *stack++;
- if (__kernel_text_address(addr)) {
- printk(" [<%0*lx>] ", field, addr);
- print_symbol("%s\n", addr);
- }
- }
- printk("\n");
+ show_trace(stack);
}
/*
@@ -150,7 +146,7 @@ void dump_stack(void)
{
unsigned long stack;
- show_trace(current, &stack);
+ show_trace(&stack);
}
EXPORT_SYMBOL(dump_stack);
@@ -270,7 +266,6 @@ void show_registers(struct pt_regs *regs)
printk("Process %s (pid: %d, threadinfo=%p, task=%p)\n",
current->comm, current->pid, current_thread_info(), current);
show_stack(current, (long *) regs->regs[29]);
- show_trace(current, (long *) regs->regs[29]);
show_code((unsigned int *) regs->cp0_epc);
printk("\n");
}