]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
ArmPkg: Change use of EFI_D_* to DEBUG_*
[mirror_edk2.git] / ArmPkg / Library / DefaultExceptionHandlerLib / AArch64 / DefaultExceptionHandler.c
CommitLineData
25402f5d
HL
1/** @file\r
2 Default exception handler\r
3\r
4 Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
451b6658 5 Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>\r
25402f5d 6\r
4059386c 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
25402f5d
HL
8\r
9**/\r
10\r
11#include <Uefi.h>\r
12#include <Library/UefiLib.h>\r
13#include <Library/BaseLib.h>\r
14#include <Library/DebugLib.h>\r
15#include <Library/PeCoffGetEntryPointLib.h>\r
16#include <Library/PrintLib.h>\r
17#include <Library/ArmDisassemblerLib.h>\r
18#include <Library/SerialPortLib.h>\r
31f53880 19#include <Library/UefiBootServicesTableLib.h>\r
25402f5d
HL
20\r
21#include <Guid/DebugImageInfoTable.h>\r
22#include <Protocol/DebugSupport.h>\r
23#include <Protocol/LoadedImage.h>\r
24\r
25402f5d
HL
25STATIC CHAR8 *gExceptionTypeString[] = {\r
26 "Synchronous",\r
27 "IRQ",\r
28 "FIQ",\r
29 "SError"\r
30};\r
31\r
cd82e330
AB
32STATIC BOOLEAN mRecursiveException;\r
33\r
25402f5d
HL
34CHAR8 *\r
35GetImageName (\r
36 IN UINTN FaultAddress,\r
37 OUT UINTN *ImageBase,\r
38 OUT UINTN *PeCoffSizeOfHeaders\r
39 );\r
40\r
451b6658
OM
41STATIC\r
42VOID\r
43DescribeInstructionOrDataAbort (\r
44 IN CHAR8 *AbortType,\r
45 IN UINTN Iss\r
46 )\r
47{\r
48 CHAR8 *AbortCause;\r
49\r
50 switch (Iss & 0x3f) {\r
51 case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register"; break;\r
52 case 0x1: AbortCause = "Address size fault, first level"; break;\r
53 case 0x2: AbortCause = "Address size fault, second level"; break;\r
54 case 0x3: AbortCause = "Address size fault, third level"; break;\r
55 case 0x4: AbortCause = "Translation fault, zeroth level"; break;\r
56 case 0x5: AbortCause = "Translation fault, first level"; break;\r
57 case 0x6: AbortCause = "Translation fault, second level"; break;\r
58 case 0x7: AbortCause = "Translation fault, third level"; break;\r
59 case 0x9: AbortCause = "Access flag fault, first level"; break;\r
60 case 0xa: AbortCause = "Access flag fault, second level"; break;\r
61 case 0xb: AbortCause = "Access flag fault, third level"; break;\r
62 case 0xd: AbortCause = "Permission fault, first level"; break;\r
63 case 0xe: AbortCause = "Permission fault, second level"; break;\r
64 case 0xf: AbortCause = "Permission fault, third level"; break;\r
65 case 0x10: AbortCause = "Synchronous external abort"; break;\r
66 case 0x18: AbortCause = "Synchronous parity error on memory access"; break;\r
67 case 0x11: AbortCause = "Asynchronous external abort"; break;\r
68 case 0x19: AbortCause = "Asynchronous parity error on memory access"; break;\r
69 case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level"; break;\r
70 case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level"; break;\r
71 case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level"; break;\r
72 case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level"; break;\r
73 case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level"; break;\r
74 case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level"; break;\r
75 case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level"; break;\r
76 case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level"; break;\r
77 case 0x21: AbortCause = "Alignment fault"; break;\r
78 case 0x22: AbortCause = "Debug event"; break;\r
79 case 0x30: AbortCause = "TLB conflict abort"; break;\r
80 case 0x33:\r
81 case 0x34: AbortCause = "IMPLEMENTATION DEFINED"; break;\r
82 case 0x35:\r
83 case 0x36: AbortCause = "Domain fault"; break;\r
84 default: AbortCause = ""; break;\r
85 }\r
86\r
a4a582e1 87 DEBUG ((DEBUG_ERROR, "\n%a: %a\n", AbortType, AbortCause));\r
451b6658
OM
88}\r
89\r
90STATIC\r
91VOID\r
92DescribeExceptionSyndrome (\r
93 IN UINT32 Esr\r
94 )\r
95{\r
96 CHAR8 *Message;\r
97 UINTN Ec;\r
98 UINTN Iss;\r
99\r
100 Ec = Esr >> 26;\r
101 Iss = Esr & 0x00ffffff;\r
102\r
103 switch (Ec) {\r
104 case 0x15: Message = "SVC executed in AArch64"; break;\r
105 case 0x20:\r
106 case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss); return;\r
107 case 0x22: Message = "PC alignment fault"; break;\r
108 case 0x23: Message = "SP alignment fault"; break;\r
109 case 0x24:\r
110 case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss); return;\r
111 default: return;\r
112 }\r
113\r
a4a582e1 114 DEBUG ((DEBUG_ERROR, "\n %a \n", Message));\r
451b6658
OM
115}\r
116\r
1f8f4e33
AB
117#ifndef MDEPKG_NDEBUG\r
118STATIC\r
119CONST CHAR8 *\r
120BaseName (\r
121 IN CONST CHAR8 *FullName\r
122 )\r
123{\r
124 CONST CHAR8 *Str;\r
125\r
126 Str = FullName + AsciiStrLen (FullName);\r
127\r
128 while (--Str > FullName) {\r
129 if (*Str == '/' || *Str == '\\') {\r
130 return Str + 1;\r
131 }\r
132 }\r
133 return Str;\r
134}\r
135#endif\r
136\r
25402f5d
HL
137/**\r
138 This is the default action to take on an unexpected exception\r
139\r
ff5fef14 140 Since this is exception context don't do anything crazy like try to allocate memory.\r
25402f5d
HL
141\r
142 @param ExceptionType Type of the exception\r
143 @param SystemContext Register state at the time of the Exception\r
144\r
145**/\r
146VOID\r
147DefaultExceptionHandler (\r
148 IN EFI_EXCEPTION_TYPE ExceptionType,\r
149 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
150 )\r
151{\r
152 CHAR8 Buffer[100];\r
153 UINTN CharCount;\r
cd82e330
AB
154 INT32 Offset;\r
155\r
156 if (mRecursiveException) {\r
31f53880
AB
157 STATIC CHAR8 CONST Message[] = "\nRecursive exception occurred while dumping the CPU state\n";\r
158\r
159 SerialPortWrite ((UINT8 *)Message, sizeof Message - 1);\r
160 if (gST->ConOut != NULL) {\r
161 AsciiPrint (Message);\r
162 }\r
cd82e330
AB
163 CpuDeadLoop ();\r
164 }\r
165 mRecursiveException = TRUE;\r
25402f5d 166\r
451b6658 167 CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n\n%a Exception at 0x%016lx\n", gExceptionTypeString[ExceptionType], SystemContext.SystemContextAArch64->ELR);\r
25402f5d 168 SerialPortWrite ((UINT8 *) Buffer, CharCount);\r
31f53880
AB
169 if (gST->ConOut != NULL) {\r
170 AsciiPrint (Buffer);\r
171 }\r
25402f5d
HL
172\r
173 DEBUG_CODE_BEGIN ();\r
062f9fd2 174 CHAR8 *Pdb, *PrevPdb;\r
25402f5d
HL
175 UINTN ImageBase;\r
176 UINTN PeCoffSizeOfHeader;\r
960d0de8 177 UINT64 *Fp;\r
062f9fd2
AB
178 UINT64 RootFp[2];\r
179 UINTN Idx;\r
960d0de8 180\r
062f9fd2 181 PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);\r
25402f5d 182 if (Pdb != NULL) {\r
a4a582e1 183 DEBUG ((DEBUG_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n",\r
062f9fd2
AB
184 SystemContext.SystemContextAArch64->ELR, ImageBase,\r
185 SystemContext.SystemContextAArch64->ELR - ImageBase, BaseName (Pdb)));\r
173bf5c8 186 } else {\r
a4a582e1 187 DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR));\r
173bf5c8 188 }\r
062f9fd2 189\r
173bf5c8
AB
190 if ((UINT64 *)SystemContext.SystemContextAArch64->FP != 0) {\r
191 Idx = 0;\r
062f9fd2 192\r
173bf5c8
AB
193 RootFp[0] = ((UINT64 *)SystemContext.SystemContextAArch64->FP)[0];\r
194 RootFp[1] = ((UINT64 *)SystemContext.SystemContextAArch64->FP)[1];\r
195 if (RootFp[1] != SystemContext.SystemContextAArch64->LR) {\r
196 RootFp[0] = SystemContext.SystemContextAArch64->FP;\r
197 RootFp[1] = SystemContext.SystemContextAArch64->LR;\r
198 }\r
199 for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {\r
200 Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);\r
201 if (Pdb != NULL) {\r
202 if (Pdb != PrevPdb) {\r
203 Idx++;\r
204 PrevPdb = Pdb;\r
062f9fd2 205 }\r
a4a582e1 206 DEBUG ((DEBUG_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n",\r
173bf5c8
AB
207 Fp[1], ImageBase, Fp[1] - ImageBase, Idx, BaseName (Pdb)));\r
208 } else {\r
a4a582e1 209 DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Fp[1]));\r
960d0de8 210 }\r
173bf5c8
AB
211 }\r
212 PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);\r
213 if (Pdb != NULL) {\r
a4a582e1 214 DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb));\r
173bf5c8 215 }\r
062f9fd2 216\r
173bf5c8
AB
217 Idx = 0;\r
218 for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {\r
219 Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);\r
220 if (Pdb != NULL && Pdb != PrevPdb) {\r
a4a582e1 221 DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", ++Idx, Pdb));\r
173bf5c8 222 PrevPdb = Pdb;\r
960d0de8
AB
223 }\r
224 }\r
25402f5d
HL
225 }\r
226 DEBUG_CODE_END ();\r
227\r
a4a582e1
MK
228 DEBUG ((DEBUG_ERROR, "\n X0 0x%016lx X1 0x%016lx X2 0x%016lx X3 0x%016lx\n", SystemContext.SystemContextAArch64->X0, SystemContext.SystemContextAArch64->X1, SystemContext.SystemContextAArch64->X2, SystemContext.SystemContextAArch64->X3));\r
229 DEBUG ((DEBUG_ERROR, " X4 0x%016lx X5 0x%016lx X6 0x%016lx X7 0x%016lx\n", SystemContext.SystemContextAArch64->X4, SystemContext.SystemContextAArch64->X5, SystemContext.SystemContextAArch64->X6, SystemContext.SystemContextAArch64->X7));\r
230 DEBUG ((DEBUG_ERROR, " X8 0x%016lx X9 0x%016lx X10 0x%016lx X11 0x%016lx\n", SystemContext.SystemContextAArch64->X8, SystemContext.SystemContextAArch64->X9, SystemContext.SystemContextAArch64->X10, SystemContext.SystemContextAArch64->X11));\r
231 DEBUG ((DEBUG_ERROR, " X12 0x%016lx X13 0x%016lx X14 0x%016lx X15 0x%016lx\n", SystemContext.SystemContextAArch64->X12, SystemContext.SystemContextAArch64->X13, SystemContext.SystemContextAArch64->X14, SystemContext.SystemContextAArch64->X15));\r
232 DEBUG ((DEBUG_ERROR, " X16 0x%016lx X17 0x%016lx X18 0x%016lx X19 0x%016lx\n", SystemContext.SystemContextAArch64->X16, SystemContext.SystemContextAArch64->X17, SystemContext.SystemContextAArch64->X18, SystemContext.SystemContextAArch64->X19));\r
233 DEBUG ((DEBUG_ERROR, " X20 0x%016lx X21 0x%016lx X22 0x%016lx X23 0x%016lx\n", SystemContext.SystemContextAArch64->X20, SystemContext.SystemContextAArch64->X21, SystemContext.SystemContextAArch64->X22, SystemContext.SystemContextAArch64->X23));\r
234 DEBUG ((DEBUG_ERROR, " X24 0x%016lx X25 0x%016lx X26 0x%016lx X27 0x%016lx\n", SystemContext.SystemContextAArch64->X24, SystemContext.SystemContextAArch64->X25, SystemContext.SystemContextAArch64->X26, SystemContext.SystemContextAArch64->X27));\r
235 DEBUG ((DEBUG_ERROR, " X28 0x%016lx FP 0x%016lx LR 0x%016lx \n", SystemContext.SystemContextAArch64->X28, SystemContext.SystemContextAArch64->FP, SystemContext.SystemContextAArch64->LR));\r
25402f5d
HL
236\r
237 /* We save these as 128bit numbers, but have to print them as two 64bit numbers,\r
238 so swap the 64bit words to correctly represent a 128bit number. */\r
a4a582e1
MK
239 DEBUG ((DEBUG_ERROR, "\n V0 0x%016lx %016lx V1 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V0[1], SystemContext.SystemContextAArch64->V0[0], SystemContext.SystemContextAArch64->V1[1], SystemContext.SystemContextAArch64->V1[0]));\r
240 DEBUG ((DEBUG_ERROR, " V2 0x%016lx %016lx V3 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V2[1], SystemContext.SystemContextAArch64->V2[0], SystemContext.SystemContextAArch64->V3[1], SystemContext.SystemContextAArch64->V3[0]));\r
241 DEBUG ((DEBUG_ERROR, " V4 0x%016lx %016lx V5 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V4[1], SystemContext.SystemContextAArch64->V4[0], SystemContext.SystemContextAArch64->V5[1], SystemContext.SystemContextAArch64->V5[0]));\r
242 DEBUG ((DEBUG_ERROR, " V6 0x%016lx %016lx V7 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V6[1], SystemContext.SystemContextAArch64->V6[0], SystemContext.SystemContextAArch64->V7[1], SystemContext.SystemContextAArch64->V7[0]));\r
243 DEBUG ((DEBUG_ERROR, " V8 0x%016lx %016lx V9 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V8[1], SystemContext.SystemContextAArch64->V8[0], SystemContext.SystemContextAArch64->V9[1], SystemContext.SystemContextAArch64->V9[0]));\r
244 DEBUG ((DEBUG_ERROR, " V10 0x%016lx %016lx V11 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V10[1], SystemContext.SystemContextAArch64->V10[0], SystemContext.SystemContextAArch64->V11[1], SystemContext.SystemContextAArch64->V11[0]));\r
245 DEBUG ((DEBUG_ERROR, " V12 0x%016lx %016lx V13 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V12[1], SystemContext.SystemContextAArch64->V12[0], SystemContext.SystemContextAArch64->V13[1], SystemContext.SystemContextAArch64->V13[0]));\r
246 DEBUG ((DEBUG_ERROR, " V14 0x%016lx %016lx V15 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V14[1], SystemContext.SystemContextAArch64->V14[0], SystemContext.SystemContextAArch64->V15[1], SystemContext.SystemContextAArch64->V15[0]));\r
247 DEBUG ((DEBUG_ERROR, " V16 0x%016lx %016lx V17 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V16[1], SystemContext.SystemContextAArch64->V16[0], SystemContext.SystemContextAArch64->V17[1], SystemContext.SystemContextAArch64->V17[0]));\r
248 DEBUG ((DEBUG_ERROR, " V18 0x%016lx %016lx V19 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V18[1], SystemContext.SystemContextAArch64->V18[0], SystemContext.SystemContextAArch64->V19[1], SystemContext.SystemContextAArch64->V19[0]));\r
249 DEBUG ((DEBUG_ERROR, " V20 0x%016lx %016lx V21 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V20[1], SystemContext.SystemContextAArch64->V20[0], SystemContext.SystemContextAArch64->V21[1], SystemContext.SystemContextAArch64->V21[0]));\r
250 DEBUG ((DEBUG_ERROR, " V22 0x%016lx %016lx V23 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V22[1], SystemContext.SystemContextAArch64->V22[0], SystemContext.SystemContextAArch64->V23[1], SystemContext.SystemContextAArch64->V23[0]));\r
251 DEBUG ((DEBUG_ERROR, " V24 0x%016lx %016lx V25 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V24[1], SystemContext.SystemContextAArch64->V24[0], SystemContext.SystemContextAArch64->V25[1], SystemContext.SystemContextAArch64->V25[0]));\r
252 DEBUG ((DEBUG_ERROR, " V26 0x%016lx %016lx V27 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V26[1], SystemContext.SystemContextAArch64->V26[0], SystemContext.SystemContextAArch64->V27[1], SystemContext.SystemContextAArch64->V27[0]));\r
253 DEBUG ((DEBUG_ERROR, " V28 0x%016lx %016lx V29 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V28[1], SystemContext.SystemContextAArch64->V28[0], SystemContext.SystemContextAArch64->V29[1], SystemContext.SystemContextAArch64->V29[0]));\r
254 DEBUG ((DEBUG_ERROR, " V30 0x%016lx %016lx V31 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V30[1], SystemContext.SystemContextAArch64->V30[0], SystemContext.SystemContextAArch64->V31[1], SystemContext.SystemContextAArch64->V31[0]));\r
255\r
256 DEBUG ((DEBUG_ERROR, "\n SP 0x%016lx ELR 0x%016lx SPSR 0x%08lx FPSR 0x%08lx\n ESR 0x%08lx FAR 0x%016lx\n", SystemContext.SystemContextAArch64->SP, SystemContext.SystemContextAArch64->ELR, SystemContext.SystemContextAArch64->SPSR, SystemContext.SystemContextAArch64->FPSR, SystemContext.SystemContextAArch64->ESR, SystemContext.SystemContextAArch64->FAR));\r
257\r
258 DEBUG ((DEBUG_ERROR, "\n ESR : EC 0x%02x IL 0x%x ISS 0x%08x\n", (SystemContext.SystemContextAArch64->ESR & 0xFC000000) >> 26, (SystemContext.SystemContextAArch64->ESR >> 25) & 0x1, SystemContext.SystemContextAArch64->ESR & 0x1FFFFFF ));\r
25402f5d 259\r
451b6658 260 DescribeExceptionSyndrome (SystemContext.SystemContextAArch64->ESR);\r
1549fb60 261\r
a4a582e1 262 DEBUG ((DEBUG_ERROR, "\nStack dump:\n"));\r
cd82e330 263 for (Offset = -256; Offset < 256; Offset += 32) {\r
a4a582e1 264 DEBUG ((DEBUG_ERROR, "%c %013lx: %016lx %016lx %016lx %016lx\n",\r
cd82e330
AB
265 Offset == 0 ? '>' : ' ',\r
266 SystemContext.SystemContextAArch64->SP + Offset,\r
267 *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset),\r
268 *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 8),\r
269 *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 16),\r
270 *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24)));\r
271 }\r
272\r
f9ebccec 273 ASSERT (FALSE);\r
1549fb60 274 CpuDeadLoop ();\r
25402f5d 275}\r