aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin
diff options
context:
space:
mode:
authorRobin Getz <robin.getz@analog.com>2009-05-11 14:34:41 -0400
committerMike Frysinger <vapier@gentoo.org>2009-06-12 06:11:45 -0400
commita0cab65642813b7990e1b4b2ab6ad92e171571f4 (patch)
tree9b1f9c50e36e69ef5776a404ac473313f4179794 /arch/blackfin
parentb9a3899d59c3f0fc074573f0eba2419b1e4c0bca (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.c11
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
197asmlinkage void double_fault_c(struct pt_regs *fp) 197asmlinkage 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)