aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin
diff options
context:
space:
mode:
authorRobin Getz <rgetz@blackfin.uclinux.org>2008-04-24 15:36:31 -0400
committerBryan Wu <cooloney@kernel.org>2008-04-24 15:36:31 -0400
commit7f1c906808a36630990d83d872935c079b76595b (patch)
tree7e29d44cb56fabea3080654480be06c5969b93cc /arch/blackfin
parent4d555630704d3f6c0257dde3e622f9295f221c8b (diff)
[Blackfin] arch: try to remove condition that causes double fault, by checking current before it gets dereferenced
Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org> Signed-off-by: Bryan Wu <cooloney@kernel.org>
Diffstat (limited to 'arch/blackfin')
-rw-r--r--arch/blackfin/kernel/traps.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c
index de249d6fdd9c..d0f675422074 100644
--- a/arch/blackfin/kernel/traps.c
+++ b/arch/blackfin/kernel/traps.c
@@ -137,17 +137,30 @@ static void decode_address(char *buf, unsigned long address)
137 /* FLAT does not have its text aligned to the start of 137 /* FLAT does not have its text aligned to the start of
138 * the map while FDPIC ELF does ... 138 * the map while FDPIC ELF does ...
139 */ 139 */
140 if (current->mm && 140
141 (address > current->mm->start_code) && 141 /* before we can check flat/fdpic, we need to
142 (address < current->mm->end_code)) 142 * make sure current is valid
143 offset = address - current->mm->start_code; 143 */
144 else 144 if ((unsigned long)current >= FIXED_CODE_START &&
145 offset = (address - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT); 145 !((unsigned long)current & 0x3)) {
146 146 if (current->mm &&
147 sprintf(buf, "<0x%p> [ %s + 0x%lx ]", 147 (address > current->mm->start_code) &&
148 (void *)address, name, offset); 148 (address < current->mm->end_code))
149 offset = address - current->mm->start_code;
150 else
151 offset = (address - vma->vm_start) +
152 (vma->vm_pgoff << PAGE_SHIFT);
153
154 sprintf(buf, "<0x%p> [ %s + 0x%lx ]",
155 (void *)address, name, offset);
156 } else
157 sprintf(buf, "<0x%p> [ %s vma:0x%lx-0x%lx]",
158 (void *)address, name,
159 vma->vm_start, vma->vm_end);
160
149 if (!in_atomic) 161 if (!in_atomic)
150 mmput(mm); 162 mmput(mm);
163
151 goto done; 164 goto done;
152 } 165 }
153 166
@@ -658,7 +671,8 @@ void dump_bfin_process(struct pt_regs *fp)
658 /* Because we are crashing, and pointers could be bad, we check things 671 /* Because we are crashing, and pointers could be bad, we check things
659 * pretty closely before we use them 672 * pretty closely before we use them
660 */ 673 */
661 if (!((unsigned long)current & 0x3) && current->pid) { 674 if ((unsigned long)current >= FIXED_CODE_START &&
675 !((unsigned long)current & 0x3) && current->pid) {
662 printk(KERN_NOTICE "CURRENT PROCESS:\n"); 676 printk(KERN_NOTICE "CURRENT PROCESS:\n");
663 if (current->comm >= (char *)FIXED_CODE_START) 677 if (current->comm >= (char *)FIXED_CODE_START)
664 printk(KERN_NOTICE "COMM=%s PID=%d\n", 678 printk(KERN_NOTICE "COMM=%s PID=%d\n",