aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r--arch/arm/kernel/traps.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 79abc4ddc0cf..f68ca0fb0ed7 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -152,11 +152,25 @@ static void dump_instr(struct pt_regs *regs)
152 152
153static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) 153static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
154{ 154{
155 unsigned int fp; 155 unsigned int fp, mode;
156 int ok = 1; 156 int ok = 1;
157 157
158 printk("Backtrace: "); 158 printk("Backtrace: ");
159 fp = regs->ARM_fp; 159
160 if (!tsk)
161 tsk = current;
162
163 if (regs) {
164 fp = regs->ARM_fp;
165 mode = processor_mode(regs);
166 } else if (tsk != current) {
167 fp = thread_saved_fp(tsk);
168 mode = 0x10;
169 } else {
170 asm("mov %0, fp" : "=r" (fp) : : "cc");
171 mode = 0x10;
172 }
173
160 if (!fp) { 174 if (!fp) {
161 printk("no frame pointer"); 175 printk("no frame pointer");
162 ok = 0; 176 ok = 0;
@@ -168,29 +182,19 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
168 printk("\n"); 182 printk("\n");
169 183
170 if (ok) 184 if (ok)
171 c_backtrace(fp, processor_mode(regs)); 185 c_backtrace(fp, mode);
172} 186}
173 187
174void dump_stack(void) 188void dump_stack(void)
175{ 189{
176 __backtrace(); 190 dump_backtrace(NULL, NULL);
177} 191}
178 192
179EXPORT_SYMBOL(dump_stack); 193EXPORT_SYMBOL(dump_stack);
180 194
181void show_stack(struct task_struct *tsk, unsigned long *sp) 195void show_stack(struct task_struct *tsk, unsigned long *sp)
182{ 196{
183 unsigned long fp; 197 dump_backtrace(NULL, tsk);
184
185 if (!tsk)
186 tsk = current;
187
188 if (tsk != current)
189 fp = thread_saved_fp(tsk);
190 else
191 asm("mov %0, fp" : "=r" (fp) : : "cc");
192
193 c_backtrace(fp, 0x10);
194 barrier(); 198 barrier();
195} 199}
196 200