]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandler.c
Update execption handler to print out DFSR & IFSR info.
[mirror_edk2.git] / ArmPkg / Library / DefaultExceptionHandlerLib / DefaultExceptionHandler.c
index 56504948a34e42002c3b01b2f4c25aee0cbacc55..996a6772ec92dc03d7e8aee00253e87b29e2fbd1 100644 (file)
@@ -178,7 +178,37 @@ CpsrString (
   AsciiStrCat (Str, ModeStr);\r
   return;\r
 }  \r
-  \r
+\r
+CHAR8 *\r
+FaultStatusToString (\r
+  IN  UINT32  Status\r
+  )\r
+{\r
+  CHAR8 *FaultSource;\r
+\r
+  switch (Status) {\r
+    case 0x01: FaultSource = "Alignment fault"; break;\r
+    case 0x02: FaultSource = "Debug event fault"; break;\r
+    case 0x03: FaultSource = "Access Flag fault on Section"; break;\r
+    case 0x04: FaultSource = "Cache maintenance operation fault[2]"; break;\r
+    case 0x05: FaultSource = "Translation fault on Section"; break;\r
+    case 0x06: FaultSource = "Access Flag fault on Page"; break;\r
+    case 0x07: FaultSource = "Translation fault on Page"; break;\r
+    case 0x08: FaultSource = "Precise External Abort"; break;\r
+    case 0x09: FaultSource = "Domain fault on Section"; break;\r
+    case 0x0b: FaultSource = "Domain fault on Page"; break;\r
+    case 0x0c: FaultSource = "External abort on translation, first level"; break;\r
+    case 0x0d: FaultSource = "Permission fault on Section"; break;\r
+    case 0x0e: FaultSource = "External abort on translation, second level"; break;\r
+    case 0x0f: FaultSource = "Permission fault on Page"; break;\r
+    case 0x16: FaultSource = "Imprecise External Abort"; break;\r
+    default:   FaultSource = "No function"; break;\r
+    }\r
+\r
+  return FaultSource;\r
+}\r
+\r
+\r
 CHAR8 *gExceptionTypeString[] = {\r
   "Reset",\r
   "Undefined OpCode",\r
@@ -207,6 +237,8 @@ DefaultExceptionHandler (
   IN OUT EFI_SYSTEM_CONTEXT           SystemContext\r
   )\r
 {\r
+  UINT32    DfsrStatus;\r
+  BOOLEAN   DfsrWrite;\r
 \r
   DEBUG ((EFI_D_ERROR, "\n%a Exception PC at 0x%08x  CPSR 0x%08x ", gExceptionTypeString[ExceptionType], SystemContext.SystemContextArm->PC, SystemContext.SystemContextArm->CPSR));\r
   DEBUG_CODE_BEGIN ();\r
@@ -242,7 +274,8 @@ DefaultExceptionHandler (
         DEBUG ((EFI_D_ERROR, "\n%a", Buffer));\r
       } else {\r
         // Thumb\r
-        DEBUG ((EFI_D_ERROR, "\nFaulting Instruction 0x%04x", (UINT16 *)(UINTN)SystemContext.SystemContextArm->PC));\r
+        DisassembleThumbInstruction ((UINT16 *)(UINTN)SystemContext.SystemContextArm->PC, Buffer, sizeof (Buffer));\r
+        DEBUG ((EFI_D_ERROR, "\n%a", Buffer));\r
       }\r
     }\r
   DEBUG_CODE_END ();\r
@@ -250,8 +283,19 @@ DefaultExceptionHandler (
   DEBUG ((EFI_D_ERROR, "  R4 0x%08x   R5 0x%08x   R6 0x%08x   R7 0x%08x\n", SystemContext.SystemContextArm->R4, SystemContext.SystemContextArm->R5, SystemContext.SystemContextArm->R6, SystemContext.SystemContextArm->R7));\r
   DEBUG ((EFI_D_ERROR, "  R8 0x%08x   R9 0x%08x  R10 0x%08x  R11 0x%08x\n", SystemContext.SystemContextArm->R8, SystemContext.SystemContextArm->R9, SystemContext.SystemContextArm->R10, SystemContext.SystemContextArm->R11));\r
   DEBUG ((EFI_D_ERROR, " R12 0x%08x   SP 0x%08x   LR 0x%08x   PC 0x%08x\n", SystemContext.SystemContextArm->R12, SystemContext.SystemContextArm->SP, SystemContext.SystemContextArm->LR, SystemContext.SystemContextArm->PC));\r
-  DEBUG ((EFI_D_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR));\r
+  DEBUG ((EFI_D_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR));\r
+\r
+  // Bit10 is Status[4] Bit3:0 is Status[3:0]\r
+  DfsrStatus = (SystemContext.SystemContextArm->DFSR & 0xf) | ((SystemContext.SystemContextArm->DFSR >> 6) & 0x10);\r
+  DfsrWrite = (SystemContext.SystemContextArm->DFSR & BIT11) != 0;\r
+  if (DfsrStatus != 0x00) {\r
+    DEBUG ((EFI_D_ERROR, " %a: %a 0x%08x\n", FaultStatusToString (DfsrStatus), DfsrWrite ? "write to" : "read from", SystemContext.SystemContextArm->DFAR));\r
+  }\r
+  if (SystemContext.SystemContextArm->IFSR & 0xf != 0x00) {\r
+    DEBUG ((EFI_D_ERROR, "Instruction %a at 0x%08x, \n", FaultStatusToString (SystemContext.SystemContextArm->IFSR & 0xf), SystemContext.SystemContextArm->IFAR));\r
+  }\r
 \r
+  DEBUG ((EFI_D_ERROR, "\n"));\r
   ASSERT (FALSE);\r
 }\r
 \r