summaryrefslogtreecommitdiffstats
path: root/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
diff options
context:
space:
mode:
Diffstat (limited to 'ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c')
-rw-r--r--ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c264
1 files changed, 162 insertions, 102 deletions
diff --git a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
index 2bb0888b43..f2bca5d740 100644
--- a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
+++ b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
@@ -22,14 +22,14 @@
#include <Protocol/DebugSupport.h>
#include <Protocol/LoadedImage.h>
-STATIC CHAR8 *gExceptionTypeString[] = {
+STATIC CHAR8 *gExceptionTypeString[] = {
"Synchronous",
"IRQ",
"FIQ",
"SError"
};
-STATIC BOOLEAN mRecursiveException;
+STATIC BOOLEAN mRecursiveException;
CHAR8 *
GetImageName (
@@ -41,47 +41,79 @@ GetImageName (
STATIC
VOID
DescribeInstructionOrDataAbort (
- IN CHAR8 *AbortType,
- IN UINTN Iss
+ IN CHAR8 *AbortType,
+ IN UINTN Iss
)
{
- CHAR8 *AbortCause;
+ CHAR8 *AbortCause;
switch (Iss & 0x3f) {
- case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register"; break;
- case 0x1: AbortCause = "Address size fault, first level"; break;
- case 0x2: AbortCause = "Address size fault, second level"; break;
- case 0x3: AbortCause = "Address size fault, third level"; break;
- case 0x4: AbortCause = "Translation fault, zeroth level"; break;
- case 0x5: AbortCause = "Translation fault, first level"; break;
- case 0x6: AbortCause = "Translation fault, second level"; break;
- case 0x7: AbortCause = "Translation fault, third level"; break;
- case 0x9: AbortCause = "Access flag fault, first level"; break;
- case 0xa: AbortCause = "Access flag fault, second level"; break;
- case 0xb: AbortCause = "Access flag fault, third level"; break;
- case 0xd: AbortCause = "Permission fault, first level"; break;
- case 0xe: AbortCause = "Permission fault, second level"; break;
- case 0xf: AbortCause = "Permission fault, third level"; break;
- case 0x10: AbortCause = "Synchronous external abort"; break;
- case 0x18: AbortCause = "Synchronous parity error on memory access"; break;
- case 0x11: AbortCause = "Asynchronous external abort"; break;
- case 0x19: AbortCause = "Asynchronous parity error on memory access"; break;
- case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level"; break;
- case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level"; break;
- case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level"; break;
- case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level"; break;
- case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level"; break;
- case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level"; break;
- case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level"; break;
- case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level"; break;
- case 0x21: AbortCause = "Alignment fault"; break;
- case 0x22: AbortCause = "Debug event"; break;
- case 0x30: AbortCause = "TLB conflict abort"; break;
+ case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register";
+ break;
+ case 0x1: AbortCause = "Address size fault, first level";
+ break;
+ case 0x2: AbortCause = "Address size fault, second level";
+ break;
+ case 0x3: AbortCause = "Address size fault, third level";
+ break;
+ case 0x4: AbortCause = "Translation fault, zeroth level";
+ break;
+ case 0x5: AbortCause = "Translation fault, first level";
+ break;
+ case 0x6: AbortCause = "Translation fault, second level";
+ break;
+ case 0x7: AbortCause = "Translation fault, third level";
+ break;
+ case 0x9: AbortCause = "Access flag fault, first level";
+ break;
+ case 0xa: AbortCause = "Access flag fault, second level";
+ break;
+ case 0xb: AbortCause = "Access flag fault, third level";
+ break;
+ case 0xd: AbortCause = "Permission fault, first level";
+ break;
+ case 0xe: AbortCause = "Permission fault, second level";
+ break;
+ case 0xf: AbortCause = "Permission fault, third level";
+ break;
+ case 0x10: AbortCause = "Synchronous external abort";
+ break;
+ case 0x18: AbortCause = "Synchronous parity error on memory access";
+ break;
+ case 0x11: AbortCause = "Asynchronous external abort";
+ break;
+ case 0x19: AbortCause = "Asynchronous parity error on memory access";
+ break;
+ case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level";
+ break;
+ case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level";
+ break;
+ case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level";
+ break;
+ case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level";
+ break;
+ case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level";
+ break;
+ case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level";
+ break;
+ case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level";
+ break;
+ case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level";
+ break;
+ case 0x21: AbortCause = "Alignment fault";
+ break;
+ case 0x22: AbortCause = "Debug event";
+ break;
+ case 0x30: AbortCause = "TLB conflict abort";
+ break;
case 0x33:
- case 0x34: AbortCause = "IMPLEMENTATION DEFINED"; break;
+ case 0x34: AbortCause = "IMPLEMENTATION DEFINED";
+ break;
case 0x35:
- case 0x36: AbortCause = "Domain fault"; break;
- default: AbortCause = ""; break;
+ case 0x36: AbortCause = "Domain fault";
+ break;
+ default: AbortCause = "";
+ break;
}
DEBUG ((DEBUG_ERROR, "\n%a: %a\n", AbortType, AbortCause));
@@ -90,24 +122,29 @@ DescribeInstructionOrDataAbort (
STATIC
VOID
DescribeExceptionSyndrome (
- IN UINT32 Esr
+ IN UINT32 Esr
)
{
- CHAR8 *Message;
- UINTN Ec;
- UINTN Iss;
+ CHAR8 *Message;
+ UINTN Ec;
+ UINTN Iss;
- Ec = Esr >> 26;
+ Ec = Esr >> 26;
Iss = Esr & 0x00ffffff;
switch (Ec) {
- case 0x15: Message = "SVC executed in AArch64"; break;
+ case 0x15: Message = "SVC executed in AArch64";
+ break;
case 0x20:
- case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss); return;
- case 0x22: Message = "PC alignment fault"; break;
- case 0x23: Message = "SP alignment fault"; break;
+ case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss);
+ return;
+ case 0x22: Message = "PC alignment fault";
+ break;
+ case 0x23: Message = "SP alignment fault";
+ break;
case 0x24:
- case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss); return;
+ case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss);
+ return;
default: return;
}
@@ -118,20 +155,22 @@ DescribeExceptionSyndrome (
STATIC
CONST CHAR8 *
BaseName (
- IN CONST CHAR8 *FullName
+ IN CONST CHAR8 *FullName
)
{
- CONST CHAR8 *Str;
+ CONST CHAR8 *Str;
Str = FullName + AsciiStrLen (FullName);
while (--Str > FullName) {
- if (*Str == '/' || *Str == '\\') {
+ if ((*Str == '/') || (*Str == '\\')) {
return Str + 1;
}
}
+
return Str;
}
+
#endif
/**
@@ -145,8 +184,8 @@ BaseName (
**/
VOID
DefaultExceptionHandler (
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
{
CHAR8 Buffer[100];
@@ -154,75 +193,93 @@ DefaultExceptionHandler (
INT32 Offset;
if (mRecursiveException) {
- STATIC CHAR8 CONST Message[] = "\nRecursive exception occurred while dumping the CPU state\n";
+ STATIC CHAR8 CONST Message[] = "\nRecursive exception occurred while dumping the CPU state\n";
SerialPortWrite ((UINT8 *)Message, sizeof Message - 1);
if (gST->ConOut != NULL) {
AsciiPrint (Message);
}
+
CpuDeadLoop ();
}
+
mRecursiveException = TRUE;
- CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n\n%a Exception at 0x%016lx\n", gExceptionTypeString[ExceptionType], SystemContext.SystemContextAArch64->ELR);
- SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n\n%a Exception at 0x%016lx\n", gExceptionTypeString[ExceptionType], SystemContext.SystemContextAArch64->ELR);
+ SerialPortWrite ((UINT8 *)Buffer, CharCount);
if (gST->ConOut != NULL) {
AsciiPrint (Buffer);
}
DEBUG_CODE_BEGIN ();
- CHAR8 *Pdb, *PrevPdb;
- UINTN ImageBase;
- UINTN PeCoffSizeOfHeader;
- UINT64 *Fp;
- UINT64 RootFp[2];
- UINTN Idx;
+ CHAR8 *Pdb, *PrevPdb;
+ UINTN ImageBase;
+ UINTN PeCoffSizeOfHeader;
+ UINT64 *Fp;
+ UINT64 RootFp[2];
+ UINTN Idx;
+
+ PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);
+ if (Pdb != NULL) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n",
+ SystemContext.SystemContextAArch64->ELR,
+ ImageBase,
+ SystemContext.SystemContextAArch64->ELR - ImageBase,
+ BaseName (Pdb)
+ ));
+ } else {
+ DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR));
+ }
- PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);
- if (Pdb != NULL) {
- DEBUG ((DEBUG_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n",
- SystemContext.SystemContextAArch64->ELR, ImageBase,
- SystemContext.SystemContextAArch64->ELR - ImageBase, BaseName (Pdb)));
- } else {
- DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR));
- }
+ if ((UINT64 *)SystemContext.SystemContextAArch64->FP != 0) {
+ Idx = 0;
- if ((UINT64 *)SystemContext.SystemContextAArch64->FP != 0) {
- Idx = 0;
+ RootFp[0] = ((UINT64 *)SystemContext.SystemContextAArch64->FP)[0];
+ RootFp[1] = ((UINT64 *)SystemContext.SystemContextAArch64->FP)[1];
+ if (RootFp[1] != SystemContext.SystemContextAArch64->LR) {
+ RootFp[0] = SystemContext.SystemContextAArch64->FP;
+ RootFp[1] = SystemContext.SystemContextAArch64->LR;
+ }
- RootFp[0] = ((UINT64 *)SystemContext.SystemContextAArch64->FP)[0];
- RootFp[1] = ((UINT64 *)SystemContext.SystemContextAArch64->FP)[1];
- if (RootFp[1] != SystemContext.SystemContextAArch64->LR) {
- RootFp[0] = SystemContext.SystemContextAArch64->FP;
- RootFp[1] = SystemContext.SystemContextAArch64->LR;
- }
- for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {
- Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
- if (Pdb != NULL) {
- if (Pdb != PrevPdb) {
- Idx++;
- PrevPdb = Pdb;
- }
- DEBUG ((DEBUG_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n",
- Fp[1], ImageBase, Fp[1] - ImageBase, Idx, BaseName (Pdb)));
- } else {
- DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Fp[1]));
- }
- }
- PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);
+ for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {
+ Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
if (Pdb != NULL) {
- DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb));
- }
-
- Idx = 0;
- for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {
- Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
- if (Pdb != NULL && Pdb != PrevPdb) {
- DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", ++Idx, Pdb));
+ if (Pdb != PrevPdb) {
+ Idx++;
PrevPdb = Pdb;
}
+
+ DEBUG ((
+ DEBUG_ERROR,
+ "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n",
+ Fp[1],
+ ImageBase,
+ Fp[1] - ImageBase,
+ Idx,
+ BaseName (Pdb)
+ ));
+ } else {
+ DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Fp[1]));
+ }
+ }
+
+ PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);
+ if (Pdb != NULL) {
+ DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb));
+ }
+
+ Idx = 0;
+ for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {
+ Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
+ if ((Pdb != NULL) && (Pdb != PrevPdb)) {
+ DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", ++Idx, Pdb));
+ PrevPdb = Pdb;
}
}
+ }
+
DEBUG_CODE_END ();
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));
@@ -255,19 +312,22 @@ DefaultExceptionHandler (
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));
- 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 ));
+ 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));
DescribeExceptionSyndrome (SystemContext.SystemContextAArch64->ESR);
DEBUG ((DEBUG_ERROR, "\nStack dump:\n"));
for (Offset = -256; Offset < 256; Offset += 32) {
- DEBUG ((DEBUG_ERROR, "%c %013lx: %016lx %016lx %016lx %016lx\n",
+ DEBUG ((
+ DEBUG_ERROR,
+ "%c %013lx: %016lx %016lx %016lx %016lx\n",
Offset == 0 ? '>' : ' ',
SystemContext.SystemContextAArch64->SP + Offset,
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset),
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 8),
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 16),
- *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24)));
+ *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24)
+ ));
}
ASSERT (FALSE);