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

[PATCH] ARM: showregs

Fix show_regs() to provide a backtrace. Provide a new __show_regs()
function which implements the common subset of show_regs() and die().
Add prototypes to asm-arm/system.h

Signed-off-by: Russell King <rmk@arm.linux.org.uk>

+17 -14
+11 -4
arch/arm/kernel/process.c
··· 168 168 169 169 EXPORT_SYMBOL(machine_restart); 170 170 171 - void show_regs(struct pt_regs * regs) 171 + void __show_regs(struct pt_regs *regs) 172 172 { 173 - unsigned long flags; 173 + unsigned long flags = condition_codes(regs); 174 174 175 - flags = condition_codes(regs); 176 - 175 + printk("CPU: %d\n", smp_processor_id()); 177 176 print_symbol("PC is at %s\n", instruction_pointer(regs)); 178 177 print_symbol("LR is at %s\n", regs->ARM_lr); 179 178 printk("pc : [<%08lx>] lr : [<%08lx>] %s\n" ··· 210 211 printk("Control: %04X Table: %08X DAC: %08X\n", 211 212 ctrl, transbase, dac); 212 213 } 214 + } 215 + 216 + void show_regs(struct pt_regs * regs) 217 + { 218 + printk("\n"); 219 + printk("Pid: %d, comm: %20s\n", current->pid, current->comm); 220 + __show_regs(regs); 221 + __backtrace(); 213 222 } 214 223 215 224 void show_fpregs(struct user_fp *regs)
+2 -6
arch/arm/kernel/traps.c
··· 31 31 32 32 #include "ptrace.h" 33 33 34 - extern void c_backtrace (unsigned long fp, int pmode); 35 - extern void show_pte(struct mm_struct *mm, unsigned long addr); 36 - 37 34 const char *processor_modes[]= 38 35 { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , 39 36 "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26", ··· 213 216 214 217 printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter); 215 218 print_modules(); 216 - printk("CPU: %d\n", smp_processor_id()); 217 - show_regs(regs); 219 + __show_regs(regs); 218 220 printk("Process %s (pid: %d, stack limit = 0x%p)\n", 219 221 tsk->comm, tsk->pid, tsk->thread_info + 1); 220 222 ··· 478 482 current->pid, current->comm, no); 479 483 dump_instr(regs); 480 484 if (user_mode(regs)) { 481 - show_regs(regs); 485 + __show_regs(regs); 482 486 c_backtrace(regs->ARM_fp, processor_mode(regs)); 483 487 } 484 488 }
+1 -4
include/asm-arm/ptrace.h
··· 142 142 #endif 143 143 144 144 #ifdef __KERNEL__ 145 - extern void show_regs(struct pt_regs *); 146 - 147 - #define predicate(x) (x & 0xf0000000) 145 + #define predicate(x) ((x) & 0xf0000000) 148 146 #define PREDICATE_ALWAYS 0xe0000000 149 - 150 147 #endif 151 148 152 149 #endif /* __ASSEMBLY__ */
+3
include/asm-arm/system.h
··· 99 99 #define tas(ptr) (xchg((ptr),1)) 100 100 101 101 extern asmlinkage void __backtrace(void); 102 + extern asmlinkage void c_backtrace(unsigned long fp, int pmode); 103 + extern void show_pte(struct mm_struct *mm, unsigned long addr); 104 + extern void __show_regs(struct pt_regs *); 102 105 103 106 extern int cpu_architecture(void); 104 107