2 * Copyright (C) 2005-2006 Atmel Corporation
4 * See file CREDITS for list of people who contributed to this
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24 #include <asm/sysreg.h>
25 #include <asm/ptrace.h>
27 DECLARE_GLOBAL_DATA_PTR
;
29 static const char * const cpu_modes
[8] = {
30 "Application", "Supervisor", "Interrupt level 0", "Interrupt level 1",
31 "Interrupt level 2", "Interrupt level 3", "Exception", "NMI"
34 static void dump_mem(const char *str
, unsigned long bottom
, unsigned long top
)
39 printf("%s(0x%08lx to 0x%08lx)\n", str
, bottom
, top
);
41 for (p
= bottom
& ~31; p
< top
; ) {
42 printf("%04lx: ", p
& 0xffff);
44 for (i
= 0; i
< 8; i
++, p
+= 4) {
47 if (p
< bottom
|| p
>= top
)
50 val
= *(unsigned long *)p
;
58 void do_unknown_exception(unsigned int ecr
, struct pt_regs
*regs
)
62 printf("\n *** Unhandled exception %u at PC=0x%08lx\n", ecr
, regs
->pc
);
65 case ECR_BUS_ERROR_WRITE
:
66 case ECR_BUS_ERROR_READ
:
67 printf("Bus error at address 0x%08lx\n",
70 case ECR_TLB_MULTIPLE
:
71 case ECR_ADDR_ALIGN_X
:
72 case ECR_PROTECTION_X
:
73 case ECR_ADDR_ALIGN_R
:
74 case ECR_ADDR_ALIGN_W
:
75 case ECR_PROTECTION_R
:
76 case ECR_PROTECTION_W
:
77 case ECR_DTLB_MODIFIED
:
81 printf("MMU exception at address 0x%08lx\n",
86 printf(" pc: %08lx lr: %08lx sp: %08lx r12: %08lx\n",
87 regs
->pc
, regs
->lr
, regs
->sp
, regs
->r12
);
88 printf(" r11: %08lx r10: %08lx r9: %08lx r8: %08lx\n",
89 regs
->r11
, regs
->r10
, regs
->r9
, regs
->r8
);
90 printf(" r7: %08lx r6: %08lx r5: %08lx r4: %08lx\n",
91 regs
->r7
, regs
->r6
, regs
->r5
, regs
->r4
);
92 printf(" r3: %08lx r2: %08lx r1: %08lx r0: %08lx\n",
93 regs
->r3
, regs
->r2
, regs
->r1
, regs
->r0
);
94 printf("Flags: %c%c%c%c%c\n",
95 regs
->sr
& SR_Q
? 'Q' : 'q',
96 regs
->sr
& SR_V
? 'V' : 'v',
97 regs
->sr
& SR_N
? 'N' : 'n',
98 regs
->sr
& SR_Z
? 'Z' : 'z',
99 regs
->sr
& SR_C
? 'C' : 'c');
100 printf("Mode bits: %c%c%c%c%c%c%c%c%c\n",
101 regs
->sr
& SR_H
? 'H' : 'h',
102 regs
->sr
& SR_R
? 'R' : 'r',
103 regs
->sr
& SR_J
? 'J' : 'j',
104 regs
->sr
& SR_EM
? 'E' : 'e',
105 regs
->sr
& SR_I3M
? '3' : '.',
106 regs
->sr
& SR_I2M
? '2' : '.',
107 regs
->sr
& SR_I1M
? '1' : '.',
108 regs
->sr
& SR_I0M
? '0' : '.',
109 regs
->sr
& SR_GM
? 'G' : 'g');
110 mode
= (regs
->sr
>> SYSREG_M0_OFFSET
) & 7;
111 printf("CPU Mode: %s\n", cpu_modes
[mode
]);
113 /* Avoid exception loops */
114 if (regs
->sp
< (gd
->stack_end
- CONFIG_STACKSIZE
)
115 || regs
->sp
>= gd
->stack_end
)
116 printf("\nStack pointer seems bogus, won't do stack dump\n");
118 dump_mem("\nStack: ", regs
->sp
, gd
->stack_end
);
120 panic("Unhandled exception\n");