diff options
-rw-r--r-- | arch/m68k/kernel/traps.c | 126 |
1 files changed, 68 insertions, 58 deletions
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index 837a88709902..9adf378f8f1e 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
@@ -927,66 +927,88 @@ void show_trace(unsigned long *stack) | |||
927 | void show_registers(struct pt_regs *regs) | 927 | void show_registers(struct pt_regs *regs) |
928 | { | 928 | { |
929 | struct frame *fp = (struct frame *)regs; | 929 | struct frame *fp = (struct frame *)regs; |
930 | mm_segment_t old_fs = get_fs(); | ||
931 | u16 c, *cp; | ||
930 | unsigned long addr; | 932 | unsigned long addr; |
931 | int i; | 933 | int i; |
932 | 934 | ||
935 | print_modules(); | ||
936 | printk("PC: [<%08lx>]",regs->pc); | ||
937 | print_symbol(" %s", regs->pc); | ||
938 | printk("\nSR: %04x SP: %p a2: %08lx\n", | ||
939 | regs->sr, regs, regs->a2); | ||
940 | printk("d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n", | ||
941 | regs->d0, regs->d1, regs->d2, regs->d3); | ||
942 | printk("d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", | ||
943 | regs->d4, regs->d5, regs->a0, regs->a1); | ||
944 | |||
945 | printk("Process %s (pid: %d, task=%p)\n", | ||
946 | current->comm, current->pid, current); | ||
933 | addr = (unsigned long)&fp->un; | 947 | addr = (unsigned long)&fp->un; |
934 | printk("Frame format=%X ", fp->ptregs.format); | 948 | printk("Frame format=%X ", regs->format); |
935 | switch (fp->ptregs.format) { | 949 | switch (regs->format) { |
936 | case 0x2: | 950 | case 0x2: |
937 | printk("instr addr=%08lx\n", fp->un.fmt2.iaddr); | 951 | printk("instr addr=%08lx\n", fp->un.fmt2.iaddr); |
938 | addr += sizeof(fp->un.fmt2); | 952 | addr += sizeof(fp->un.fmt2); |
939 | break; | 953 | break; |
940 | case 0x3: | 954 | case 0x3: |
941 | printk("eff addr=%08lx\n", fp->un.fmt3.effaddr); | 955 | printk("eff addr=%08lx\n", fp->un.fmt3.effaddr); |
942 | addr += sizeof(fp->un.fmt3); | 956 | addr += sizeof(fp->un.fmt3); |
943 | break; | 957 | break; |
944 | case 0x4: | 958 | case 0x4: |
945 | printk((CPU_IS_060 ? "fault addr=%08lx fslw=%08lx\n" | 959 | printk((CPU_IS_060 ? "fault addr=%08lx fslw=%08lx\n" |
946 | : "eff addr=%08lx pc=%08lx\n"), | 960 | : "eff addr=%08lx pc=%08lx\n"), |
947 | fp->un.fmt4.effaddr, fp->un.fmt4.pc); | 961 | fp->un.fmt4.effaddr, fp->un.fmt4.pc); |
948 | addr += sizeof(fp->un.fmt4); | 962 | addr += sizeof(fp->un.fmt4); |
949 | break; | 963 | break; |
950 | case 0x7: | 964 | case 0x7: |
951 | printk("eff addr=%08lx ssw=%04x faddr=%08lx\n", | 965 | printk("eff addr=%08lx ssw=%04x faddr=%08lx\n", |
952 | fp->un.fmt7.effaddr, fp->un.fmt7.ssw, fp->un.fmt7.faddr); | 966 | fp->un.fmt7.effaddr, fp->un.fmt7.ssw, fp->un.fmt7.faddr); |
953 | printk("wb 1 stat/addr/data: %04x %08lx %08lx\n", | 967 | printk("wb 1 stat/addr/data: %04x %08lx %08lx\n", |
954 | fp->un.fmt7.wb1s, fp->un.fmt7.wb1a, fp->un.fmt7.wb1dpd0); | 968 | fp->un.fmt7.wb1s, fp->un.fmt7.wb1a, fp->un.fmt7.wb1dpd0); |
955 | printk("wb 2 stat/addr/data: %04x %08lx %08lx\n", | 969 | printk("wb 2 stat/addr/data: %04x %08lx %08lx\n", |
956 | fp->un.fmt7.wb2s, fp->un.fmt7.wb2a, fp->un.fmt7.wb2d); | 970 | fp->un.fmt7.wb2s, fp->un.fmt7.wb2a, fp->un.fmt7.wb2d); |
957 | printk("wb 3 stat/addr/data: %04x %08lx %08lx\n", | 971 | printk("wb 3 stat/addr/data: %04x %08lx %08lx\n", |
958 | fp->un.fmt7.wb3s, fp->un.fmt7.wb3a, fp->un.fmt7.wb3d); | 972 | fp->un.fmt7.wb3s, fp->un.fmt7.wb3a, fp->un.fmt7.wb3d); |
959 | printk("push data: %08lx %08lx %08lx %08lx\n", | 973 | printk("push data: %08lx %08lx %08lx %08lx\n", |
960 | fp->un.fmt7.wb1dpd0, fp->un.fmt7.pd1, fp->un.fmt7.pd2, | 974 | fp->un.fmt7.wb1dpd0, fp->un.fmt7.pd1, fp->un.fmt7.pd2, |
961 | fp->un.fmt7.pd3); | 975 | fp->un.fmt7.pd3); |
962 | addr += sizeof(fp->un.fmt7); | 976 | addr += sizeof(fp->un.fmt7); |
963 | break; | 977 | break; |
964 | case 0x9: | 978 | case 0x9: |
965 | printk("instr addr=%08lx\n", fp->un.fmt9.iaddr); | 979 | printk("instr addr=%08lx\n", fp->un.fmt9.iaddr); |
966 | addr += sizeof(fp->un.fmt9); | 980 | addr += sizeof(fp->un.fmt9); |
967 | break; | 981 | break; |
968 | case 0xa: | 982 | case 0xa: |
969 | printk("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", | 983 | printk("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", |
970 | fp->un.fmta.ssw, fp->un.fmta.isc, fp->un.fmta.isb, | 984 | fp->un.fmta.ssw, fp->un.fmta.isc, fp->un.fmta.isb, |
971 | fp->un.fmta.daddr, fp->un.fmta.dobuf); | 985 | fp->un.fmta.daddr, fp->un.fmta.dobuf); |
972 | addr += sizeof(fp->un.fmta); | 986 | addr += sizeof(fp->un.fmta); |
973 | break; | 987 | break; |
974 | case 0xb: | 988 | case 0xb: |
975 | printk("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", | 989 | printk("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", |
976 | fp->un.fmtb.ssw, fp->un.fmtb.isc, fp->un.fmtb.isb, | 990 | fp->un.fmtb.ssw, fp->un.fmtb.isc, fp->un.fmtb.isb, |
977 | fp->un.fmtb.daddr, fp->un.fmtb.dobuf); | 991 | fp->un.fmtb.daddr, fp->un.fmtb.dobuf); |
978 | printk("baddr=%08lx dibuf=%08lx ver=%x\n", | 992 | printk("baddr=%08lx dibuf=%08lx ver=%x\n", |
979 | fp->un.fmtb.baddr, fp->un.fmtb.dibuf, fp->un.fmtb.ver); | 993 | fp->un.fmtb.baddr, fp->un.fmtb.dibuf, fp->un.fmtb.ver); |
980 | addr += sizeof(fp->un.fmtb); | 994 | addr += sizeof(fp->un.fmtb); |
981 | break; | 995 | break; |
982 | default: | 996 | default: |
983 | printk("\n"); | 997 | printk("\n"); |
984 | } | 998 | } |
985 | show_stack(NULL, (unsigned long *)addr); | 999 | show_stack(NULL, (unsigned long *)addr); |
986 | 1000 | ||
987 | printk("Code: "); | 1001 | printk("Code:"); |
988 | for (i = 0; i < 10; i++) | 1002 | set_fs(KERNEL_DS); |
989 | printk("%04x ", 0xffff & ((short *) fp->ptregs.pc)[i]); | 1003 | cp = (u16 *)regs->pc; |
1004 | for (i = -8; i < 16; i++) { | ||
1005 | if (get_user(c, cp + i) && i >= 0) { | ||
1006 | printk(" Bad PC value."); | ||
1007 | break; | ||
1008 | } | ||
1009 | printk(i ? " %04x" : " <%04x>", c); | ||
1010 | } | ||
1011 | set_fs(old_fs); | ||
990 | printk ("\n"); | 1012 | printk ("\n"); |
991 | } | 1013 | } |
992 | 1014 | ||
@@ -1190,19 +1212,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr) | |||
1190 | 1212 | ||
1191 | console_verbose(); | 1213 | console_verbose(); |
1192 | printk("%s: %08x\n",str,nr); | 1214 | printk("%s: %08x\n",str,nr); |
1193 | print_modules(); | 1215 | show_registers(fp); |
1194 | printk("PC: [<%08lx>]",fp->pc); | ||
1195 | print_symbol(" %s\n", fp->pc); | ||
1196 | printk("\nSR: %04x SP: %p a2: %08lx\n", | ||
1197 | fp->sr, fp, fp->a2); | ||
1198 | printk("d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n", | ||
1199 | fp->d0, fp->d1, fp->d2, fp->d3); | ||
1200 | printk("d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", | ||
1201 | fp->d4, fp->d5, fp->a0, fp->a1); | ||
1202 | |||
1203 | printk("Process %s (pid: %d, stackpage=%08lx)\n", | ||
1204 | current->comm, current->pid, PAGE_SIZE+(unsigned long)current); | ||
1205 | show_stack(NULL, (unsigned long *)fp); | ||
1206 | do_exit(SIGSEGV); | 1216 | do_exit(SIGSEGV); |
1207 | } | 1217 | } |
1208 | 1218 | ||