Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ARM] 5381/1: unwind: Reorganise the traps.c code

This patch moves code around in the arch/arm/kernel/traps.c file for
easier integration of the stack unwinding support.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by

Catalin Marinas and committed by
Russell King
67a94c23 a12370f1

+20 -15
+1
arch/arm/include/asm/traps.h
··· 25 25 } 26 26 27 27 extern void __init early_trap_init(void); 28 + extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame); 28 29 29 30 #endif
+19 -15
arch/arm/kernel/traps.c
··· 152 152 153 153 static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) 154 154 { 155 - unsigned int fp; 155 + unsigned int fp, mode; 156 156 int ok = 1; 157 157 158 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 174 if (!fp) { 161 175 printk("no frame pointer"); 162 176 ok = 0; ··· 182 168 printk("\n"); 183 169 184 170 if (ok) 185 - c_backtrace(fp, processor_mode(regs)); 171 + c_backtrace(fp, mode); 186 172 } 187 173 188 174 void dump_stack(void) 189 175 { 190 - __backtrace(); 176 + dump_backtrace(NULL, NULL); 191 177 } 192 178 193 179 EXPORT_SYMBOL(dump_stack); 194 180 195 181 void show_stack(struct task_struct *tsk, unsigned long *sp) 196 182 { 197 - unsigned long fp; 198 - 199 - if (!tsk) 200 - tsk = current; 201 - 202 - if (tsk != current) 203 - fp = thread_saved_fp(tsk); 204 - else 205 - asm("mov %0, fp" : "=r" (fp) : : "cc"); 206 - 207 - c_backtrace(fp, 0x10); 183 + dump_backtrace(NULL, tsk); 208 184 barrier(); 209 185 } 210 186