diff options
Diffstat (limited to 'arch')
-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 5ab87b0b92dd..aa660f32d8c8 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) | |||
148 | unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; | 148 | unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; |
149 | 149 | ||
150 | #ifdef CONFIG_KGDB | 150 | #ifdef CONFIG_KGDB |
151 | # define CHK_DEBUGGER_TRAP() do { CHK_DEBUGGER(trapnr, sig, info.si_code, fp,); } while (0) | 151 | # define CHK_DEBUGGER_TRAP() \ |
152 | # define CHK_DEBUGGER_TRAP_MAYBE() do { if (kgdb_connected) CHK_DEBUGGER_TRAP(); } while (0) | 152 | do { \ |
153 | CHK_DEBUGGER(trapnr, sig, info.si_code, fp); \ | ||
154 | } while (0) | ||
155 | # define CHK_DEBUGGER_TRAP_MAYBE() \ | ||
156 | do { \ | ||
157 | if (kgdb_connected) \ | ||
158 | CHK_DEBUGGER_TRAP(); \ | ||
159 | } while (0) | ||
153 | #else | 160 | #else |
154 | # define CHK_DEBUGGER_TRAP() do { } while (0) | 161 | # define CHK_DEBUGGER_TRAP() do { } while (0) |
155 | # define CHK_DEBUGGER_TRAP_MAYBE() do { } while (0) | 162 | # define CHK_DEBUGGER_TRAP_MAYBE() do { } while (0) |
@@ -297,7 +304,8 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
297 | info.si_code = ILL_CPLB_MULHIT; | 304 | info.si_code = ILL_CPLB_MULHIT; |
298 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO | 305 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO |
299 | sig = SIGSEGV; | 306 | sig = SIGSEGV; |
300 | printk(KERN_EMERG "\n\nNULL pointer access (probably)\n"); | 307 | printk(KERN_EMERG "\n" |
308 | KERN_EMERG "NULL pointer access (probably)\n"); | ||
301 | #else | 309 | #else |
302 | sig = SIGILL; | 310 | sig = SIGILL; |
303 | printk(KERN_EMERG EXC_0x27); | 311 | printk(KERN_EMERG EXC_0x27); |
@@ -418,7 +426,9 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
418 | if (current->mm) { | 426 | if (current->mm) { |
419 | fp->pc = current->mm->start_code; | 427 | fp->pc = current->mm->start_code; |
420 | } else { | 428 | } else { |
421 | printk(KERN_EMERG "I can't return to memory that doesn't exist - bad things happen\n"); | 429 | printk(KERN_EMERG |
430 | "I can't return to memory that doesn't exist" | ||
431 | " - bad things happen\n"); | ||
422 | panic("Help - I've fallen and can't get up\n"); | 432 | panic("Help - I've fallen and can't get up\n"); |
423 | } | 433 | } |
424 | } | 434 | } |
@@ -522,15 +532,19 @@ EXPORT_SYMBOL(dump_stack); | |||
522 | void dump_bfin_regs(struct pt_regs *fp, void *retaddr) | 532 | void dump_bfin_regs(struct pt_regs *fp, void *retaddr) |
523 | { | 533 | { |
524 | if (current->pid) { | 534 | if (current->pid) { |
525 | printk("\nCURRENT PROCESS:\n\n"); | 535 | printk(KERN_EMERG "\n" KERN_EMERG "CURRENT PROCESS:\n" |
526 | printk("COMM=%s PID=%d\n", current->comm, current->pid); | 536 | KERN_EMERG "\n"); |
537 | printk(KERN_EMERG "COMM=%s PID=%d\n", | ||
538 | current->comm, current->pid); | ||
527 | } else { | 539 | } else { |
528 | printk | 540 | printk |
529 | ("\nNo Valid pid - Either things are really messed up, or you are in the kernel\n"); | 541 | (KERN_EMERG "\n" KERN_EMERG |
542 | "No Valid pid - Either things are really messed up," | ||
543 | " or you are in the kernel\n"); | ||
530 | } | 544 | } |
531 | 545 | ||
532 | if (current->mm) { | 546 | if (current->mm) { |
533 | printk("TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n" | 547 | printk(KERN_EMERG "TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n" |
534 | "BSS = 0x%p-0x%p USER-STACK = 0x%p\n\n", | 548 | "BSS = 0x%p-0x%p USER-STACK = 0x%p\n\n", |
535 | (void*)current->mm->start_code, | 549 | (void*)current->mm->start_code, |
536 | (void*)current->mm->end_code, | 550 | (void*)current->mm->end_code, |
@@ -541,7 +555,7 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) | |||
541 | (void*)current->mm->start_stack); | 555 | (void*)current->mm->start_stack); |
542 | } | 556 | } |
543 | 557 | ||
544 | printk("return address: 0x%p; contents of [PC-16...PC+8]:\n", retaddr); | 558 | printk(KERN_EMERG "return address: [0x%p]; contents of:", retaddr); |
545 | if (retaddr != 0 && retaddr <= (void*)physical_mem_end | 559 | if (retaddr != 0 && retaddr <= (void*)physical_mem_end |
546 | #if L1_CODE_LENGTH != 0 | 560 | #if L1_CODE_LENGTH != 0 |
547 | /* FIXME: Copy the code out of L1 Instruction SRAM through dma | 561 | /* 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) | |||
550 | && retaddr < (void*)(L1_CODE_START + L1_CODE_LENGTH)) | 564 | && retaddr < (void*)(L1_CODE_START + L1_CODE_LENGTH)) |
551 | #endif | 565 | #endif |
552 | ) { | 566 | ) { |
553 | int i = 0; | 567 | int i = ((unsigned int)retaddr & 0xFFFFFFF0) - 32; |
554 | unsigned short x = 0; | 568 | unsigned short x = 0; |
555 | for (i = -16; i < 8; i++) { | 569 | for (; i < ((unsigned int)retaddr & 0xFFFFFFF0 ) + 32 ; |
556 | if (get_user(x, (unsigned short *)retaddr + i)) | 570 | i += 2) { |
571 | if ( !(i & 0xF) ) | ||
572 | printk(KERN_EMERG "\n" KERN_EMERG | ||
573 | "0x%08x: ", i); | ||
574 | |||
575 | if (get_user(x, (unsigned short *)i)) | ||
557 | break; | 576 | break; |
558 | #ifndef CONFIG_DEBUG_HWERR | 577 | #ifndef CONFIG_DEBUG_HWERR |
559 | /* If one of the last few instructions was a STI | 578 | /* If one of the last few instructions was a STI |
@@ -561,53 +580,65 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr) | |||
561 | * and we just noticed | 580 | * and we just noticed |
562 | */ | 581 | */ |
563 | if (x >= 0x0040 && x <= 0x0047 && i <= 0) | 582 | if (x >= 0x0040 && x <= 0x0047 && i <= 0) |
564 | panic("\n\nWARNING : You should reconfigure the kernel to turn on\n" | 583 | panic("\n\nWARNING : You should reconfigure" |
565 | " 'Hardware error interrupt debugging'\n" | 584 | " the kernel to turn on\n" |
566 | " The rest of this error is meanless\n"); | 585 | " 'Hardware error interrupt" |
586 | " debugging'\n" | ||
587 | " The rest of this error" | ||
588 | " is meanless\n"); | ||
567 | #endif | 589 | #endif |
568 | 590 | if ( i == (unsigned int)retaddr ) | |
569 | if (i == -8) | 591 | printk("[%04x]", x); |
570 | printk("\n"); | 592 | else |
571 | if (i == 0) | 593 | printk(" %04x ", x); |
572 | printk("X\n"); | ||
573 | printk("%04x ", x); | ||
574 | } | 594 | } |
595 | printk("\n" KERN_EMERG "\n"); | ||
575 | } else | 596 | } else |
576 | printk("Cannot look at the [PC] for it is in unreadable L1 SRAM - sorry\n"); | 597 | printk(KERN_EMERG |
577 | 598 | "Cannot look at the [PC] for it is" | |
578 | printk("\n\n"); | 599 | "in unreadable L1 SRAM - sorry\n"); |
579 | 600 | ||
580 | printk("RETE: %08lx RETN: %08lx RETX: %08lx RETS: %08lx\n", | 601 | |
581 | fp->rete, fp->retn, fp->retx, fp->rets); | 602 | printk(KERN_EMERG |
582 | printk("IPEND: %04lx SYSCFG: %04lx\n", fp->ipend, fp->syscfg); | 603 | "RETE: %08lx RETN: %08lx RETX: %08lx RETS: %08lx\n", |
583 | printk("SEQSTAT: %08lx SP: %08lx\n", (long)fp->seqstat, (long)fp); | 604 | fp->rete, fp->retn, fp->retx, fp->rets); |
584 | printk("R0: %08lx R1: %08lx R2: %08lx R3: %08lx\n", | 605 | printk(KERN_EMERG "IPEND: %04lx SYSCFG: %04lx\n", |
585 | fp->r0, fp->r1, fp->r2, fp->r3); | 606 | fp->ipend, fp->syscfg); |
586 | printk("R4: %08lx R5: %08lx R6: %08lx R7: %08lx\n", | 607 | printk(KERN_EMERG "SEQSTAT: %08lx SP: %08lx\n", |
587 | fp->r4, fp->r5, fp->r6, fp->r7); | 608 | (long)fp->seqstat, (long)fp); |
588 | printk("P0: %08lx P1: %08lx P2: %08lx P3: %08lx\n", | 609 | printk(KERN_EMERG "R0: %08lx R1: %08lx R2: %08lx R3: %08lx\n", |
589 | fp->p0, fp->p1, fp->p2, fp->p3); | 610 | fp->r0, fp->r1, fp->r2, fp->r3); |
590 | printk("P4: %08lx P5: %08lx FP: %08lx\n", fp->p4, fp->p5, fp->fp); | 611 | printk(KERN_EMERG "R4: %08lx R5: %08lx R6: %08lx R7: %08lx\n", |
591 | printk("A0.w: %08lx A0.x: %08lx A1.w: %08lx A1.x: %08lx\n", | 612 | fp->r4, fp->r5, fp->r6, fp->r7); |
592 | fp->a0w, fp->a0x, fp->a1w, fp->a1x); | 613 | printk(KERN_EMERG "P0: %08lx P1: %08lx P2: %08lx P3: %08lx\n", |
593 | 614 | fp->p0, fp->p1, fp->p2, fp->p3); | |
594 | printk("LB0: %08lx LT0: %08lx LC0: %08lx\n", fp->lb0, fp->lt0, | 615 | printk(KERN_EMERG |
595 | fp->lc0); | 616 | "P4: %08lx P5: %08lx FP: %08lx\n", |
596 | printk("LB1: %08lx LT1: %08lx LC1: %08lx\n", fp->lb1, fp->lt1, | 617 | fp->p4, fp->p5, fp->fp); |
597 | fp->lc1); | 618 | printk(KERN_EMERG |
598 | printk("B0: %08lx L0: %08lx M0: %08lx I0: %08lx\n", fp->b0, fp->l0, | 619 | "A0.w: %08lx A0.x: %08lx A1.w: %08lx A1.x: %08lx\n", |
599 | fp->m0, fp->i0); | 620 | fp->a0w, fp->a0x, fp->a1w, fp->a1x); |
600 | printk("B1: %08lx L1: %08lx M1: %08lx I1: %08lx\n", fp->b1, fp->l1, | 621 | |
601 | fp->m1, fp->i1); | 622 | printk(KERN_EMERG "LB0: %08lx LT0: %08lx LC0: %08lx\n", |
602 | printk("B2: %08lx L2: %08lx M2: %08lx I2: %08lx\n", fp->b2, fp->l2, | 623 | fp->lb0, fp->lt0, fp->lc0); |
603 | fp->m2, fp->i2); | 624 | printk(KERN_EMERG "LB1: %08lx LT1: %08lx LC1: %08lx\n", |
604 | printk("B3: %08lx L3: %08lx M3: %08lx I3: %08lx\n", fp->b3, fp->l3, | 625 | fp->lb1, fp->lt1, fp->lc1); |
605 | fp->m3, fp->i3); | 626 | printk(KERN_EMERG "B0: %08lx L0: %08lx M0: %08lx I0: %08lx\n", |
606 | 627 | fp->b0, fp->l0, fp->m0, fp->i0); | |
607 | printk("\nUSP: %08lx ASTAT: %08lx\n", rdusp(), fp->astat); | 628 | printk(KERN_EMERG "B1: %08lx L1: %08lx M1: %08lx I1: %08lx\n", |
629 | fp->b1, fp->l1, fp->m1, fp->i1); | ||
630 | printk(KERN_EMERG "B2: %08lx L2: %08lx M2: %08lx I2: %08lx\n", | ||
631 | fp->b2, fp->l2, fp->m2, fp->i2); | ||
632 | printk(KERN_EMERG "B3: %08lx L3: %08lx M3: %08lx I3: %08lx\n", | ||
633 | fp->b3, fp->l3, fp->m3, fp->i3); | ||
634 | |||
635 | printk(KERN_EMERG "\n" KERN_EMERG "USP: %08lx ASTAT: %08lx\n", | ||
636 | rdusp(), fp->astat); | ||
608 | if ((long)fp->seqstat & SEQSTAT_EXCAUSE) { | 637 | if ((long)fp->seqstat & SEQSTAT_EXCAUSE) { |
609 | printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void*)bfin_read_DCPLB_FAULT_ADDR()); | 638 | printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", |
610 | printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void*)bfin_read_ICPLB_FAULT_ADDR()); | 639 | (void *)bfin_read_DCPLB_FAULT_ADDR()); |
640 | printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", | ||
641 | (void *)bfin_read_ICPLB_FAULT_ADDR()); | ||
611 | } | 642 | } |
612 | 643 | ||
613 | printk("\n\n"); | 644 | printk("\n\n"); |