diff options
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 18 |
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 | ||
48 | void dump_backtrace_entry(unsigned long where, unsigned long from) | 48 | static void dump_mem(const char *str, unsigned long bottom, unsigned long top); |
49 | |||
50 | static 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 | |||
59 | void 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 | ||
269 | asmlinkage void do_undefinstr(struct pt_regs *regs) | 283 | asmlinkage 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; |