diff options
author | Robin Getz <robin.getz@analog.com> | 2009-05-11 14:34:41 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-06-12 06:11:45 -0400 |
commit | a0cab65642813b7990e1b4b2ab6ad92e171571f4 (patch) | |
tree | 9b1f9c50e36e69ef5776a404ac473313f4179794 /arch/blackfin | |
parent | b9a3899d59c3f0fc074573f0eba2419b1e4c0bca (diff) |
Blackfin: make sure stack is accessible before dumping it
When displaying a crash dump, make sure accessing the stack is safe so
we don't crash at the same time.
Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch/blackfin')
-rw-r--r-- | arch/blackfin/kernel/traps.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index fb5774275889..0d04a4732b1f 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -196,6 +196,11 @@ done: | |||
196 | 196 | ||
197 | asmlinkage void double_fault_c(struct pt_regs *fp) | 197 | asmlinkage void double_fault_c(struct pt_regs *fp) |
198 | { | 198 | { |
199 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON | ||
200 | int j; | ||
201 | trace_buffer_save(j); | ||
202 | #endif | ||
203 | |||
199 | console_verbose(); | 204 | console_verbose(); |
200 | oops_in_progress = 1; | 205 | oops_in_progress = 1; |
201 | #ifdef CONFIG_DEBUG_VERBOSE | 206 | #ifdef CONFIG_DEBUG_VERBOSE |
@@ -220,6 +225,7 @@ asmlinkage void double_fault_c(struct pt_regs *fp) | |||
220 | dump_bfin_process(fp); | 225 | dump_bfin_process(fp); |
221 | dump_bfin_mem(fp); | 226 | dump_bfin_mem(fp); |
222 | show_regs(fp); | 227 | show_regs(fp); |
228 | dump_bfin_trace_buffer(); | ||
223 | } | 229 | } |
224 | #endif | 230 | #endif |
225 | panic("Double Fault - unrecoverable event"); | 231 | panic("Double Fault - unrecoverable event"); |
@@ -832,6 +838,11 @@ void show_stack(struct task_struct *task, unsigned long *stack) | |||
832 | decode_address(buf, (unsigned int)stack); | 838 | decode_address(buf, (unsigned int)stack); |
833 | printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf); | 839 | printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf); |
834 | 840 | ||
841 | if (!access_ok(VERIFY_READ, stack, (unsigned int)endstack - (unsigned int)stack)) { | ||
842 | printk(KERN_NOTICE "Invalid stack pointer\n"); | ||
843 | return; | ||
844 | } | ||
845 | |||
835 | /* First thing is to look for a frame pointer */ | 846 | /* First thing is to look for a frame pointer */ |
836 | for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) { | 847 | for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) { |
837 | if (*addr & 0x1) | 848 | if (*addr & 0x1) |