diff options
Diffstat (limited to 'arch/blackfin/kernel/traps.c')
| -rw-r--r-- | arch/blackfin/kernel/traps.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 5b0667da8d05..ffe7fb53eccb 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
| @@ -673,6 +673,14 @@ static void decode_instruction(unsigned short *address) | |||
| 673 | verbose_printk("RTI"); | 673 | verbose_printk("RTI"); |
| 674 | else if (opcode == 0x0012) | 674 | else if (opcode == 0x0012) |
| 675 | verbose_printk("RTX"); | 675 | verbose_printk("RTX"); |
| 676 | else if (opcode == 0x0013) | ||
| 677 | verbose_printk("RTN"); | ||
| 678 | else if (opcode == 0x0014) | ||
| 679 | verbose_printk("RTE"); | ||
| 680 | else if (opcode == 0x0025) | ||
| 681 | verbose_printk("EMUEXCPT"); | ||
| 682 | else if (opcode == 0x0040 && opcode <= 0x0047) | ||
| 683 | verbose_printk("STI R%i", opcode & 7); | ||
| 676 | else if (opcode >= 0x0050 && opcode <= 0x0057) | 684 | else if (opcode >= 0x0050 && opcode <= 0x0057) |
| 677 | verbose_printk("JUMP (P%i)", opcode & 7); | 685 | verbose_printk("JUMP (P%i)", opcode & 7); |
| 678 | else if (opcode >= 0x0060 && opcode <= 0x0067) | 686 | else if (opcode >= 0x0060 && opcode <= 0x0067) |
| @@ -681,6 +689,10 @@ static void decode_instruction(unsigned short *address) | |||
| 681 | verbose_printk("CALL (PC+P%i)", opcode & 7); | 689 | verbose_printk("CALL (PC+P%i)", opcode & 7); |
| 682 | else if (opcode >= 0x0080 && opcode <= 0x0087) | 690 | else if (opcode >= 0x0080 && opcode <= 0x0087) |
| 683 | verbose_printk("JUMP (PC+P%i)", opcode & 7); | 691 | verbose_printk("JUMP (PC+P%i)", opcode & 7); |
| 692 | else if (opcode >= 0x0090 && opcode <= 0x009F) | ||
| 693 | verbose_printk("RAISE 0x%x", opcode & 0xF); | ||
| 694 | else if (opcode >= 0x00A0 && opcode <= 0x00AF) | ||
| 695 | verbose_printk("EXCPT 0x%x", opcode & 0xF); | ||
| 684 | else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF)) | 696 | else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF)) |
| 685 | verbose_printk("IF !CC JUMP"); | 697 | verbose_printk("IF !CC JUMP"); |
| 686 | else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff)) | 698 | else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff)) |
| @@ -820,11 +832,8 @@ void show_stack(struct task_struct *task, unsigned long *stack) | |||
| 820 | decode_address(buf, (unsigned int)stack); | 832 | decode_address(buf, (unsigned int)stack); |
| 821 | printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf); | 833 | printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf); |
| 822 | 834 | ||
| 823 | addr = (unsigned int *)((unsigned int)stack & ~0x3F); | ||
| 824 | |||
| 825 | /* First thing is to look for a frame pointer */ | 835 | /* First thing is to look for a frame pointer */ |
| 826 | for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0; | 836 | for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) { |
| 827 | addr < endstack; addr++, i++) { | ||
| 828 | if (*addr & 0x1) | 837 | if (*addr & 0x1) |
| 829 | continue; | 838 | continue; |
| 830 | ins_addr = (unsigned short *)*addr; | 839 | ins_addr = (unsigned short *)*addr; |
| @@ -834,7 +843,8 @@ void show_stack(struct task_struct *task, unsigned long *stack) | |||
| 834 | 843 | ||
| 835 | if (fp) { | 844 | if (fp) { |
| 836 | /* Let's check to see if it is a frame pointer */ | 845 | /* Let's check to see if it is a frame pointer */ |
| 837 | while (fp >= (addr - 1) && fp < endstack && fp) | 846 | while (fp >= (addr - 1) && fp < endstack |
| 847 | && fp && ((unsigned int) fp & 0x3) == 0) | ||
| 838 | fp = (unsigned int *)*fp; | 848 | fp = (unsigned int *)*fp; |
| 839 | if (fp == 0 || fp == endstack) { | 849 | if (fp == 0 || fp == endstack) { |
| 840 | fp = addr - 1; | 850 | fp = addr - 1; |
| @@ -1052,8 +1062,9 @@ void show_regs(struct pt_regs *fp) | |||
| 1052 | char buf [150]; | 1062 | char buf [150]; |
| 1053 | struct irqaction *action; | 1063 | struct irqaction *action; |
| 1054 | unsigned int i; | 1064 | unsigned int i; |
| 1055 | unsigned long flags; | 1065 | unsigned long flags = 0; |
| 1056 | unsigned int cpu = smp_processor_id(); | 1066 | unsigned int cpu = smp_processor_id(); |
| 1067 | unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); | ||
| 1057 | 1068 | ||
| 1058 | verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted()); | 1069 | verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted()); |
| 1059 | verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n", | 1070 | verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n", |
| @@ -1073,17 +1084,22 @@ void show_regs(struct pt_regs *fp) | |||
| 1073 | } | 1084 | } |
| 1074 | verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n", | 1085 | verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n", |
| 1075 | fp->seqstat & SEQSTAT_EXCAUSE); | 1086 | fp->seqstat & SEQSTAT_EXCAUSE); |
| 1076 | for (i = 6; i <= 15 ; i++) { | 1087 | for (i = 2; i <= 15 ; i++) { |
| 1077 | if (fp->ipend & (1 << i)) { | 1088 | if (fp->ipend & (1 << i)) { |
| 1078 | decode_address(buf, bfin_read32(EVT0 + 4*i)); | 1089 | if (i != 4) { |
| 1079 | verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf); | 1090 | decode_address(buf, bfin_read32(EVT0 + 4*i)); |
| 1091 | verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf); | ||
| 1092 | } else | ||
| 1093 | verbose_printk(KERN_NOTICE " interrupts disabled\n"); | ||
| 1080 | } | 1094 | } |
| 1081 | } | 1095 | } |
| 1082 | 1096 | ||
| 1083 | /* if no interrupts are going off, don't print this out */ | 1097 | /* if no interrupts are going off, don't print this out */ |
| 1084 | if (fp->ipend & ~0x3F) { | 1098 | if (fp->ipend & ~0x3F) { |
| 1085 | for (i = 0; i < (NR_IRQS - 1); i++) { | 1099 | for (i = 0; i < (NR_IRQS - 1); i++) { |
| 1086 | spin_lock_irqsave(&irq_desc[i].lock, flags); | 1100 | if (!in_atomic) |
| 1101 | spin_lock_irqsave(&irq_desc[i].lock, flags); | ||
| 1102 | |||
| 1087 | action = irq_desc[i].action; | 1103 | action = irq_desc[i].action; |
| 1088 | if (!action) | 1104 | if (!action) |
| 1089 | goto unlock; | 1105 | goto unlock; |
| @@ -1096,7 +1112,8 @@ void show_regs(struct pt_regs *fp) | |||
| 1096 | } | 1112 | } |
| 1097 | verbose_printk("\n"); | 1113 | verbose_printk("\n"); |
| 1098 | unlock: | 1114 | unlock: |
| 1099 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 1115 | if (!in_atomic) |
| 1116 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | ||
| 1100 | } | 1117 | } |
| 1101 | } | 1118 | } |
| 1102 | 1119 | ||
