aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/traps.c
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2007-03-02 10:01:36 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2007-04-21 15:34:34 -0400
commit7ab3f8d595a1b1e5cf8d726b72fd476fe0d0226c (patch)
treed37cf7290d5df5927ff870bfbb40673bead8f00d /arch/arm/kernel/traps.c
parent46fcc86dd71d70211e965102fb69414c90381880 (diff)
[ARM] Add ability to dump exception stacks to kernel backtraces
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r--arch/arm/kernel/traps.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 24095601359b..ba1c1884e68e 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -45,7 +45,18 @@ static int __init user_debug_setup(char *str)
45__setup("user_debug=", user_debug_setup); 45__setup("user_debug=", user_debug_setup);
46#endif 46#endif
47 47
48void dump_backtrace_entry(unsigned long where, unsigned long from) 48static void dump_mem(const char *str, unsigned long bottom, unsigned long top);
49
50static inline int in_exception_text(unsigned long ptr)
51{
52 extern char __exception_text_start[];
53 extern char __exception_text_end[];
54
55 return ptr >= (unsigned long)&__exception_text_start &&
56 ptr < (unsigned long)&__exception_text_end;
57}
58
59void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
49{ 60{
50#ifdef CONFIG_KALLSYMS 61#ifdef CONFIG_KALLSYMS
51 printk("[<%08lx>] ", where); 62 printk("[<%08lx>] ", where);
@@ -55,6 +66,9 @@ void dump_backtrace_entry(unsigned long where, unsigned long from)
55#else 66#else
56 printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from); 67 printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
57#endif 68#endif
69
70 if (in_exception_text(where))
71 dump_mem("Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
58} 72}
59 73
60/* 74/*
@@ -266,7 +280,7 @@ void unregister_undef_hook(struct undef_hook *hook)
266 spin_unlock_irqrestore(&undef_lock, flags); 280 spin_unlock_irqrestore(&undef_lock, flags);
267} 281}
268 282
269asmlinkage void do_undefinstr(struct pt_regs *regs) 283asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
270{ 284{
271 unsigned int correction = thumb_mode(regs) ? 2 : 4; 285 unsigned int correction = thumb_mode(regs) ? 2 : 4;
272 unsigned int instr; 286 unsigned int instr;