]> err.no Git - linux-2.6/blobdiff - arch/blackfin/kernel/traps.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6] / arch / blackfin / kernel / traps.c
index 5ab87b0b92ddf7e4300c185b54d67373f3b71e84..792a8416fe10160cc81e2660c553bba5c3db92a0 100644 (file)
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <asm/uaccess.h>
+#include <linux/uaccess.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/kallsyms.h>
+#include <linux/fs.h>
 #include <asm/traps.h>
 #include <asm/cacheflush.h>
 #include <asm/blackfin.h>
-#include <asm/uaccess.h>
 #include <asm/irq_handler.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/kallsyms.h>
+#include <asm/trace.h>
 
 #ifdef CONFIG_KGDB
 # include <linux/debugger.h>
@@ -76,7 +77,7 @@ static int printk_address(unsigned long address)
                if (!modname)
                        modname = delim = "";
                return printk("<0x%p> { %s%s%s%s + 0x%lx }",
-                             (void*)address, delim, modname, delim, symname,
+                             (void *)address, delim, modname, delim, symname,
                              (unsigned long)offset);
 
        }
@@ -119,7 +120,7 @@ static int printk_address(unsigned long address)
 
                                write_unlock_irq(&tasklist_lock);
                                return printk("<0x%p> [ %s + 0x%lx ]",
-                                             (void*)address, name, offset);
+                                             (void *)address, name, offset);
                        }
 
                        vml = vml->next;
@@ -128,19 +129,9 @@ static int printk_address(unsigned long address)
        write_unlock_irq(&tasklist_lock);
 
        /* we were unable to find this address anywhere */
-       return printk("[<0x%p>]", (void*)address);
+       return printk("[<0x%p>]", (void *)address);
 }
 
-#define trace_buffer_save(x) \
-       do { \
-               (x) = bfin_read_TBUFCTL(); \
-               bfin_write_TBUFCTL((x) & ~TBUFEN); \
-       } while (0)
-#define trace_buffer_restore(x) \
-       do { \
-               bfin_write_TBUFCTL((x));        \
-       } while (0)
-
 asmlinkage void trap_c(struct pt_regs *fp)
 {
        int j, sig = 0;
@@ -148,8 +139,15 @@ asmlinkage void trap_c(struct pt_regs *fp)
        unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE;
 
 #ifdef CONFIG_KGDB
-# define CHK_DEBUGGER_TRAP() do { CHK_DEBUGGER(trapnr, sig, info.si_code, fp,); } while (0)
-# define CHK_DEBUGGER_TRAP_MAYBE() do { if (kgdb_connected) CHK_DEBUGGER_TRAP(); } while (0)
+# define CHK_DEBUGGER_TRAP() \
+       do { \
+               CHK_DEBUGGER(trapnr, sig, info.si_code, fp, ); \
+       } while (0)
+# define CHK_DEBUGGER_TRAP_MAYBE() \
+       do { \
+               if (kgdb_connected) \
+                       CHK_DEBUGGER_TRAP(); \
+       } while (0)
 #else
 # define CHK_DEBUGGER_TRAP() do { } while (0)
 # define CHK_DEBUGGER_TRAP_MAYBE() do { } while (0)
@@ -196,15 +194,14 @@ asmlinkage void trap_c(struct pt_regs *fp)
 #else
        /* 0x02 - User Defined, Caught by default */
 #endif
-       /* 0x03  - Atomic test and set */
+       /* 0x03 - User Defined, userspace stack overflow */
        case VEC_EXCPT03:
                info.si_code = SEGV_STACKFLOW;
                sig = SIGSEGV;
                printk(KERN_EMERG EXC_0x03);
                CHK_DEBUGGER_TRAP();
                break;
-       /* 0x04 - spinlock - handled by _ex_spinlock,
-               getting here is an error */
+       /* 0x04 - User Defined, Caught by default */
        /* 0x05 - User Defined, Caught by default */
        /* 0x06 - User Defined, Caught by default */
        /* 0x07 - User Defined, Caught by default */
@@ -297,7 +294,8 @@ asmlinkage void trap_c(struct pt_regs *fp)
                info.si_code = ILL_CPLB_MULHIT;
 #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
                sig = SIGSEGV;
-               printk(KERN_EMERG "\n\nNULL pointer access (probably)\n");
+               printk(KERN_EMERG "\n"
+                       KERN_EMERG "NULL pointer access (probably)\n");
 #else
                sig = SIGILL;
                printk(KERN_EMERG EXC_0x27);
@@ -418,7 +416,9 @@ asmlinkage void trap_c(struct pt_regs *fp)
                if (current->mm) {
                        fp->pc = current->mm->start_code;
                } else {
-                       printk(KERN_EMERG "I can't return to memory that doesn't exist - bad things happen\n");
+                       printk(KERN_EMERG
+                               "I can't return to memory that doesn't exist"
+                               " - bad things happen\n");
                        panic("Help - I've fallen and can't get up\n");
                }
        }
@@ -522,38 +522,47 @@ EXPORT_SYMBOL(dump_stack);
 void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
 {
        if (current->pid) {
-               printk("\nCURRENT PROCESS:\n\n");
-               printk("COMM=%s PID=%d\n", current->comm, current->pid);
+               printk(KERN_EMERG "\n" KERN_EMERG "CURRENT PROCESS:\n"
+                       KERN_EMERG "\n");
+               printk(KERN_EMERG "COMM=%s PID=%d\n",
+                       current->comm, current->pid);
        } else {
                printk
-                   ("\nNo Valid pid - Either things are really messed up, or you are in the kernel\n");
+                   (KERN_EMERG "\n" KERN_EMERG
+                    "No Valid pid - Either things are really messed up,"
+                    " or you are in the kernel\n");
        }
 
        if (current->mm) {
-               printk("TEXT = 0x%p-0x%p  DATA = 0x%p-0x%p\n"
-                      "BSS = 0x%p-0x%p   USER-STACK = 0x%p\n\n",
-                      (void*)current->mm->start_code,
-                      (void*)current->mm->end_code,
-                      (void*)current->mm->start_data,
-                      (void*)current->mm->end_data,
-                      (void*)current->mm->end_data,
-                      (void*)current->mm->brk,
-                      (void*)current->mm->start_stack);
+               printk(KERN_EMERG "TEXT = 0x%p-0x%p  DATA = 0x%p-0x%p\n"
+                      KERN_EMERG "BSS = 0x%p-0x%p   USER-STACK = 0x%p\n"
+                      KERN_EMERG "\n",
+                      (void *)current->mm->start_code,
+                      (void *)current->mm->end_code,
+                      (void *)current->mm->start_data,
+                      (void *)current->mm->end_data,
+                      (void *)current->mm->end_data,
+                      (void *)current->mm->brk,
+                      (void *)current->mm->start_stack);
        }
 
-       printk("return address: 0x%p; contents of [PC-16...PC+8]:\n", retaddr);
-       if (retaddr != 0 && retaddr <= (void*)physical_mem_end
+       printk(KERN_EMERG "return address: [0x%p]; contents of:", retaddr);
+       if (retaddr != 0 && retaddr <= (void *)physical_mem_end
 #if L1_CODE_LENGTH != 0
            /* FIXME: Copy the code out of L1 Instruction SRAM through dma
               memcpy.  */
-           && !(retaddr >= (void*)L1_CODE_START
-                && retaddr < (void*)(L1_CODE_START + L1_CODE_LENGTH))
+           && !(retaddr >= (void *)L1_CODE_START
+                && retaddr < (void *)(L1_CODE_START + L1_CODE_LENGTH))
 #endif
        ) {
-               int i = 0;
+               int i = ((unsigned int)retaddr & 0xFFFFFFF0) - 32;
                unsigned short x = 0;
-               for (i = -16; i < 8; i++) {
-                       if (get_user(x, (unsigned short *)retaddr + i))
+               for (; i < ((unsigned int)retaddr & 0xFFFFFFF0) + 32; i += 2) {
+                       if (!(i & 0xF))
+                               printk(KERN_EMERG "\n" KERN_EMERG
+                                       "0x%08x: ", i);
+
+                       if (get_user(x, (unsigned short *)i))
                                break;
 #ifndef CONFIG_DEBUG_HWERR
                        /* If one of the last few instructions was a STI
@@ -561,53 +570,65 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
                         * and we just noticed
                         */
                        if (x >= 0x0040 && x <= 0x0047 && i <= 0)
-                               panic("\n\nWARNING : You should reconfigure the kernel to turn on\n"
-                                       " 'Hardware error interrupt debugging'\n"
-                                       " The rest of this error is meanless\n");
+                               panic("\n\nWARNING : You should reconfigure"
+                                       " the kernel to turn on\n"
+                                       " 'Hardware error interrupt"
+                                       " debugging'\n"
+                                       " The rest of this error"
+                                       " is meanless\n");
 #endif
-
-                       if (i == -8)
-                               printk("\n");
-                       if (i == 0)
-                               printk("X\n");
-                       printk("%04x ", x);
+                       if (i == (unsigned int)retaddr)
+                               printk("[%04x]", x);
+                       else
+                               printk(" %04x ", x);
                }
+               printk("\n" KERN_EMERG "\n");
        } else
-               printk("Cannot look at the [PC] for it is in unreadable L1 SRAM - sorry\n");
-
-       printk("\n\n");
-
-       printk("RETE:  %08lx  RETN: %08lx  RETX: %08lx  RETS: %08lx\n",
-              fp->rete, fp->retn, fp->retx, fp->rets);
-       printk("IPEND: %04lx  SYSCFG: %04lx\n", fp->ipend, fp->syscfg);
-       printk("SEQSTAT: %08lx    SP: %08lx\n", (long)fp->seqstat, (long)fp);
-       printk("R0: %08lx    R1: %08lx    R2: %08lx    R3: %08lx\n",
-              fp->r0, fp->r1, fp->r2, fp->r3);
-       printk("R4: %08lx    R5: %08lx    R6: %08lx    R7: %08lx\n",
-              fp->r4, fp->r5, fp->r6, fp->r7);
-       printk("P0: %08lx    P1: %08lx    P2: %08lx    P3: %08lx\n",
-              fp->p0, fp->p1, fp->p2, fp->p3);
-       printk("P4: %08lx    P5: %08lx    FP: %08lx\n", fp->p4, fp->p5, fp->fp);
-       printk("A0.w: %08lx    A0.x: %08lx    A1.w: %08lx    A1.x: %08lx\n",
-              fp->a0w, fp->a0x, fp->a1w, fp->a1x);
-
-       printk("LB0: %08lx  LT0: %08lx  LC0: %08lx\n", fp->lb0, fp->lt0,
-              fp->lc0);
-       printk("LB1: %08lx  LT1: %08lx  LC1: %08lx\n", fp->lb1, fp->lt1,
-              fp->lc1);
-       printk("B0: %08lx  L0: %08lx  M0: %08lx  I0: %08lx\n", fp->b0, fp->l0,
-              fp->m0, fp->i0);
-       printk("B1: %08lx  L1: %08lx  M1: %08lx  I1: %08lx\n", fp->b1, fp->l1,
-              fp->m1, fp->i1);
-       printk("B2: %08lx  L2: %08lx  M2: %08lx  I2: %08lx\n", fp->b2, fp->l2,
-              fp->m2, fp->i2);
-       printk("B3: %08lx  L3: %08lx  M3: %08lx  I3: %08lx\n", fp->b3, fp->l3,
-              fp->m3, fp->i3);
-
-       printk("\nUSP: %08lx   ASTAT: %08lx\n", rdusp(), fp->astat);
+               printk(KERN_EMERG
+                       "Cannot look at the [PC] for it is"
+                       "in unreadable L1 SRAM - sorry\n");
+
+
+       printk(KERN_EMERG
+               "RETE:  %08lx  RETN: %08lx  RETX: %08lx  RETS: %08lx\n",
+               fp->rete, fp->retn, fp->retx, fp->rets);
+       printk(KERN_EMERG "IPEND: %04lx  SYSCFG: %04lx\n",
+               fp->ipend, fp->syscfg);
+       printk(KERN_EMERG "SEQSTAT: %08lx    SP: %08lx\n",
+               (long)fp->seqstat, (long)fp);
+       printk(KERN_EMERG "R0: %08lx    R1: %08lx    R2: %08lx    R3: %08lx\n",
+               fp->r0, fp->r1, fp->r2, fp->r3);
+       printk(KERN_EMERG "R4: %08lx    R5: %08lx    R6: %08lx    R7: %08lx\n",
+               fp->r4, fp->r5, fp->r6, fp->r7);
+       printk(KERN_EMERG "P0: %08lx    P1: %08lx    P2: %08lx    P3: %08lx\n",
+               fp->p0, fp->p1, fp->p2, fp->p3);
+       printk(KERN_EMERG
+               "P4: %08lx    P5: %08lx    FP: %08lx\n",
+               fp->p4, fp->p5, fp->fp);
+       printk(KERN_EMERG
+               "A0.w: %08lx    A0.x: %08lx    A1.w: %08lx    A1.x: %08lx\n",
+               fp->a0w, fp->a0x, fp->a1w, fp->a1x);
+
+       printk(KERN_EMERG "LB0: %08lx  LT0: %08lx  LC0: %08lx\n",
+               fp->lb0, fp->lt0, fp->lc0);
+       printk(KERN_EMERG "LB1: %08lx  LT1: %08lx  LC1: %08lx\n",
+               fp->lb1, fp->lt1, fp->lc1);
+       printk(KERN_EMERG "B0: %08lx  L0: %08lx  M0: %08lx  I0: %08lx\n",
+               fp->b0, fp->l0, fp->m0, fp->i0);
+       printk(KERN_EMERG "B1: %08lx  L1: %08lx  M1: %08lx  I1: %08lx\n",
+               fp->b1, fp->l1, fp->m1, fp->i1);
+       printk(KERN_EMERG "B2: %08lx  L2: %08lx  M2: %08lx  I2: %08lx\n",
+               fp->b2, fp->l2, fp->m2, fp->i2);
+       printk(KERN_EMERG "B3: %08lx  L3: %08lx  M3: %08lx  I3: %08lx\n",
+               fp->b3, fp->l3, fp->m3, fp->i3);
+
+       printk(KERN_EMERG "\n" KERN_EMERG "USP: %08lx   ASTAT: %08lx\n",
+               rdusp(), fp->astat);
        if ((long)fp->seqstat & SEQSTAT_EXCAUSE) {
-               printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void*)bfin_read_DCPLB_FAULT_ADDR());
-               printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void*)bfin_read_ICPLB_FAULT_ADDR());
+               printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n",
+                       (void *)bfin_read_DCPLB_FAULT_ADDR());
+               printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n",
+                       (void *)bfin_read_ICPLB_FAULT_ADDR());
        }
 
        printk("\n\n");
@@ -649,8 +670,8 @@ void panic_cplb_error(int cplb_panic, struct pt_regs *fp)
                break;
        }
 
-       printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void*)bfin_read_DCPLB_FAULT_ADDR());
-       printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void*)bfin_read_ICPLB_FAULT_ADDR());
+       printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void *)bfin_read_DCPLB_FAULT_ADDR());
+       printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void *)bfin_read_ICPLB_FAULT_ADDR());
        dump_bfin_regs(fp, (void *)fp->retx);
        dump_stack();
        panic("Unrecoverable event\n");