[Blackfin] arch: try to remove condition that causes double fault, by checking curren...
authorRobin Getz <rgetz@blackfin.uclinux.org>
Thu, 24 Apr 2008 19:36:31 +0000 (03:36 +0800)
committerBryan Wu <cooloney@kernel.org>
Thu, 24 Apr 2008 19:36:31 +0000 (03:36 +0800)
Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
arch/blackfin/kernel/traps.c

index de249d6fdd9c07390e3bb2ae4282542448742625..d0f6754220746c49a0f20c55876e1ed2237a850f 100644 (file)
@@ -137,17 +137,30 @@ static void decode_address(char *buf, unsigned long address)
                                /* FLAT does not have its text aligned to the start of
                                 * the map while FDPIC ELF does ...
                                 */
-                               if (current->mm &&
-                                   (address > current->mm->start_code) &&
-                                   (address < current->mm->end_code))
-                                       offset = address - current->mm->start_code;
-                               else
-                                       offset = (address - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT);
-
-                               sprintf(buf, "<0x%p> [ %s + 0x%lx ]",
-                                       (void *)address, name, offset);
+
+                               /* before we can check flat/fdpic, we need to
+                                * make sure current is valid
+                                */
+                               if ((unsigned long)current >= FIXED_CODE_START &&
+                                   !((unsigned long)current & 0x3)) {
+                                       if (current->mm &&
+                                           (address > current->mm->start_code) &&
+                                           (address < current->mm->end_code))
+                                               offset = address - current->mm->start_code;
+                                       else
+                                               offset = (address - vma->vm_start) +
+                                                        (vma->vm_pgoff << PAGE_SHIFT);
+
+                                       sprintf(buf, "<0x%p> [ %s + 0x%lx ]",
+                                               (void *)address, name, offset);
+                               } else
+                                       sprintf(buf, "<0x%p> [ %s vma:0x%lx-0x%lx]",
+                                               (void *)address, name,
+                                               vma->vm_start, vma->vm_end);
+
                                if (!in_atomic)
                                        mmput(mm);
+
                                goto done;
                        }
 
@@ -658,7 +671,8 @@ void dump_bfin_process(struct pt_regs *fp)
        /* Because we are crashing, and pointers could be bad, we check things
         * pretty closely before we use them
         */
-       if (!((unsigned long)current & 0x3) && current->pid) {
+       if ((unsigned long)current >= FIXED_CODE_START &&
+           !((unsigned long)current & 0x3) && current->pid) {
                printk(KERN_NOTICE "CURRENT PROCESS:\n");
                if (current->comm >= (char *)FIXED_CODE_START)
                        printk(KERN_NOTICE "COMM=%s PID=%d\n",