diff options
author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2006-07-25 10:51:36 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2006-09-27 08:37:05 -0400 |
commit | e889d78fd5775d0b466f570928f5b0f0c9f05355 (patch) | |
tree | c85ebfa9ae7fb6d72d6c1ac6f67d64fba92b1145 /arch/mips/kernel | |
parent | e7dee3cea4dcd54744cf68864784c1336a42144f (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')
-rw-r--r-- | arch/mips/kernel/traps.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 368fdb779175..c6f70467e750 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); | |||
79 | */ | 79 | */ |
80 | #define MODULE_RANGE (8*1024*1024) | 80 | #define MODULE_RANGE (8*1024*1024) |
81 | 81 | ||
82 | static void show_trace(unsigned long *stack) | ||
83 | { | ||
84 | const int field = 2 * sizeof(unsigned long); | ||
85 | unsigned long addr; | ||
86 | |||
87 | printk("Call Trace:"); | ||
88 | #ifdef CONFIG_KALLSYMS | ||
89 | printk("\n"); | ||
90 | #endif | ||
91 | while (!kstack_end(stack)) { | ||
92 | addr = *stack++; | ||
93 | if (__kernel_text_address(addr)) { | ||
94 | printk(" [<%0*lx>] ", field, addr); | ||
95 | print_symbol("%s\n", addr); | ||
96 | } | ||
97 | } | ||
98 | printk("\n"); | ||
99 | } | ||
100 | |||
82 | /* | 101 | /* |
83 | * This routine abuses get_user()/put_user() to reference pointers | 102 | * This routine abuses get_user()/put_user() to reference pointers |
84 | * with at least a bit of error checking ... | 103 | * with at least a bit of error checking ... |
@@ -88,6 +107,7 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
88 | const int field = 2 * sizeof(unsigned long); | 107 | const int field = 2 * sizeof(unsigned long); |
89 | long stackdata; | 108 | long stackdata; |
90 | int i; | 109 | int i; |
110 | unsigned long *stack; | ||
91 | 111 | ||
92 | if (!sp) { | 112 | if (!sp) { |
93 | if (task && task != current) | 113 | if (task && task != current) |
@@ -95,6 +115,7 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
95 | else | 115 | else |
96 | sp = (unsigned long *) &sp; | 116 | sp = (unsigned long *) &sp; |
97 | } | 117 | } |
118 | stack = sp; | ||
98 | 119 | ||
99 | printk("Stack :"); | 120 | printk("Stack :"); |
100 | i = 0; | 121 | i = 0; |
@@ -115,32 +136,7 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
115 | i++; | 136 | i++; |
116 | } | 137 | } |
117 | printk("\n"); | 138 | printk("\n"); |
118 | } | 139 | show_trace(stack); |
119 | |||
120 | void show_trace(struct task_struct *task, unsigned long *stack) | ||
121 | { | ||
122 | const int field = 2 * sizeof(unsigned long); | ||
123 | unsigned long addr; | ||
124 | |||
125 | if (!stack) { | ||
126 | if (task && task != current) | ||
127 | stack = (unsigned long *) task->thread.reg29; | ||
128 | else | ||
129 | stack = (unsigned long *) &stack; | ||
130 | } | ||
131 | |||
132 | printk("Call Trace:"); | ||
133 | #ifdef CONFIG_KALLSYMS | ||
134 | printk("\n"); | ||
135 | #endif | ||
136 | while (!kstack_end(stack)) { | ||
137 | addr = *stack++; | ||
138 | if (__kernel_text_address(addr)) { | ||
139 | printk(" [<%0*lx>] ", field, addr); | ||
140 | print_symbol("%s\n", addr); | ||
141 | } | ||
142 | } | ||
143 | printk("\n"); | ||
144 | } | 140 | } |
145 | 141 | ||
146 | /* | 142 | /* |
@@ -150,7 +146,7 @@ void dump_stack(void) | |||
150 | { | 146 | { |
151 | unsigned long stack; | 147 | unsigned long stack; |
152 | 148 | ||
153 | show_trace(current, &stack); | 149 | show_trace(&stack); |
154 | } | 150 | } |
155 | 151 | ||
156 | EXPORT_SYMBOL(dump_stack); | 152 | EXPORT_SYMBOL(dump_stack); |
@@ -270,7 +266,6 @@ void show_registers(struct pt_regs *regs) | |||
270 | printk("Process %s (pid: %d, threadinfo=%p, task=%p)\n", | 266 | printk("Process %s (pid: %d, threadinfo=%p, task=%p)\n", |
271 | current->comm, current->pid, current_thread_info(), current); | 267 | current->comm, current->pid, current_thread_info(), current); |
272 | show_stack(current, (long *) regs->regs[29]); | 268 | show_stack(current, (long *) regs->regs[29]); |
273 | show_trace(current, (long *) regs->regs[29]); | ||
274 | show_code((unsigned int *) regs->cp0_epc); | 269 | show_code((unsigned int *) regs->cp0_epc); |
275 | printk("\n"); | 270 | printk("\n"); |
276 | } | 271 | } |