diff options
Diffstat (limited to 'arch/blackfin/kernel/traps.c')
-rw-r--r-- | arch/blackfin/kernel/traps.c | 141 |
1 files changed, 86 insertions, 55 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 5ab87b0b92d..aa660f32d8c 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c @@ -148,8 +148,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) @@ -297,7 +304,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 +426,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,15 +532,19 @@ 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" + printk(KERN_EMERG "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, @@ -541,7 +555,7 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) (void*)current->mm->start_stack); } - printk("return address: 0x%p; contents of [PC-16...PC+8]:\n", retaddr); + 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 @@ -550,10 +564,15 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) && 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 +580,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"); |