]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandler.c
ArmPkg: Moved ARMv7 specific files to a 'Arm' subdirectory
[mirror_edk2.git] / ArmPkg / Library / DefaultExceptionHandlerLib / DefaultExceptionHandler.c
diff --git a/ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandler.c b/ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandler.c
deleted file mode 100644 (file)
index bb29b95..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/** @file\r
-  Default exception handler\r
-\r
-  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
-  Copyright (c) 2012, ARM Ltd. All rights reserved.<BR>\r
-  \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include <Uefi.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/PeCoffGetEntryPointLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/ArmDisassemblerLib.h>\r
-#include <Library/SerialPortLib.h>\r
-\r
-#include <Guid/DebugImageInfoTable.h>\r
-\r
-#include <Protocol/DebugSupport.h>\r
-#include <Library/DefaultExceptionHandlerLib.h>\r
-\r
-EFI_DEBUG_IMAGE_INFO_TABLE_HEADER *gDebugImageTableHeader = NULL;\r
-\r
-typedef struct {\r
-  UINT32  BIT;\r
-  CHAR8   Char;\r
-} CPSR_CHAR;\r
-\r
-CHAR8 *\r
-GetImageName (\r
-  IN  UINT32  FaultAddress,\r
-  OUT UINT32  *ImageBase,\r
-  OUT UINT32  *PeCoffSizeOfHeaders\r
-  );\r
-\r
-/**\r
-  Convert the Current Program Status Register (CPSR) to a string. The string is \r
-  a defacto standard in the ARM world. \r
-  \r
-  It is possible to add extra bits by adding them to CpsrChar array.\r
-\r
-  @param  Cpsr         ARM CPSR register value\r
-  @param  ReturnStr    32 byte string that contains string version of CPSR\r
-\r
-**/\r
-VOID\r
-CpsrString (\r
-  IN  UINT32  Cpsr,\r
-  OUT CHAR8   *ReturnStr\r
-  )\r
-{\r
-  UINTN     Index;\r
-  CHAR8*    Str;\r
-  CHAR8*    ModeStr;\r
-  CPSR_CHAR CpsrChar[] = {\r
-    { 31, 'n' },\r
-    { 30, 'z' },\r
-    { 29, 'c' },\r
-    { 28, 'v' },\r
-\r
-    { 9,  'e' },\r
-    { 8,  'a' },\r
-    { 7,  'i' },\r
-    { 6,  'f' },\r
-    { 5,  't' },\r
-    { 0,  '?' }\r
-  };\r
-  \r
-  Str = ReturnStr;\r
-\r
-  for (Index = 0; CpsrChar[Index].BIT != 0; Index++, Str++) {\r
-    *Str = CpsrChar[Index].Char;\r
-    if ((Cpsr & (1 << CpsrChar[Index].BIT)) != 0) {\r
-      // Concert to upper case if bit is set\r
-      *Str &= ~0x20;\r
-    }\r
-  }\r
-  \r
-  *Str++ = '_';\r
-  *Str = '\0';\r
-  \r
-  switch (Cpsr & 0x1f) {\r
-  case 0x10:\r
-    ModeStr = "usr";\r
-    break;\r
-  case 0x011:\r
-    ModeStr = "fiq";\r
-    break;\r
-  case 0x12:\r
-    ModeStr = "irq";\r
-    break;\r
-  case 0x13:\r
-    ModeStr = "svc";\r
-    break;\r
-  case 0x16:\r
-    ModeStr = "mon";\r
-    break;\r
-  case 0x17:\r
-    ModeStr = "abt";\r
-    break;\r
-  case 0x1b:\r
-    ModeStr = "und";\r
-    break;\r
-  case 0x1f:\r
-    ModeStr = "sys";\r
-    break;\r
-  \r
-  default:\r
-    ModeStr = "???";\r
-    break;\r
-  }\r
-  \r
-  AsciiStrCat (Str, ModeStr);\r
-  return;\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
-STATIC CHAR8 *gExceptionTypeString[] = {\r
-  "Reset",\r
-  "Undefined OpCode",\r
-  "SVC",\r
-  "Prefetch Abort",\r
-  "Data Abort",\r
-  "Undefined",\r
-  "IRQ",\r
-  "FIQ"\r
-};\r
-\r
-/**\r
-  This is the default action to take on an unexpected exception\r
-  \r
-  Since this is exception context don't do anything crazy like try to allcoate memory.\r
-\r
-  @param  ExceptionType    Type of the exception\r
-  @param  SystemContext    Register state at the time of the Exception\r
-\r
-\r
-**/\r
-VOID\r
-DefaultExceptionHandler (\r
-  IN     EFI_EXCEPTION_TYPE           ExceptionType,\r
-  IN OUT EFI_SYSTEM_CONTEXT           SystemContext\r
-  )\r
-{\r
-  CHAR8     Buffer[100];\r
-  UINTN     CharCount;\r
-  UINT32    DfsrStatus;\r
-  UINT32    IfsrStatus;\r
-  BOOLEAN   DfsrWrite;\r
-  UINT32    PcAdjust = 0;\r
-\r
-  CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n%a Exception PC at 0x%08x  CPSR 0x%08x ",\r
-         gExceptionTypeString[ExceptionType], SystemContext.SystemContextArm->PC, SystemContext.SystemContextArm->CPSR);\r
-  SerialPortWrite ((UINT8 *) Buffer, CharCount);\r
-\r
-  DEBUG_CODE_BEGIN ();\r
-    CHAR8   *Pdb;\r
-    UINT32  ImageBase;\r
-    UINT32  PeCoffSizeOfHeader;\r
-    UINT32  Offset;\r
-    CHAR8   CpsrStr[32];  // char per bit. Lower 5-bits are mode that is a 3 char string\r
-    CHAR8   Buffer[80];\r
-    UINT8   *DisAsm;\r
-    UINT32  ItBlock;\r
-    \r
-    CpsrString (SystemContext.SystemContextArm->CPSR, CpsrStr);\r
-    DEBUG ((EFI_D_ERROR, "%a\n", CpsrStr));\r
-  \r
-    Pdb = GetImageName (SystemContext.SystemContextArm->PC, &ImageBase, &PeCoffSizeOfHeader);\r
-    Offset = SystemContext.SystemContextArm->PC - ImageBase;\r
-    if (Pdb != NULL) {\r
-      DEBUG ((EFI_D_ERROR, "%a\n", Pdb));\r
-\r
-      //\r
-      // A PE/COFF image loads its headers into memory so the headers are \r
-      // included in the linked addresses. ELF and Mach-O images do not\r
-      // include the headers so the first byte of the image is usually\r
-      // text (code). If you look at link maps from ELF or Mach-O images\r
-      // you need to subtract out the size of the PE/COFF header to get\r
-      // get the offset that matches the link map. \r
-      //\r
-      DEBUG ((EFI_D_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader));\r
-      \r
-      // If we come from an image it is safe to show the instruction. We know it should not fault\r
-      DisAsm = (UINT8 *)(UINTN)SystemContext.SystemContextArm->PC;\r
-      ItBlock = 0;\r
-      DisassembleInstruction (&DisAsm, (SystemContext.SystemContextArm->CPSR & BIT5) == BIT5, TRUE, &ItBlock, Buffer, sizeof (Buffer));\r
-      DEBUG ((EFI_D_ERROR, "\n%a", Buffer));\r
-      \r
-      switch (ExceptionType) {\r
-      case EXCEPT_ARM_UNDEFINED_INSTRUCTION:\r
-      case EXCEPT_ARM_SOFTWARE_INTERRUPT:\r
-      case EXCEPT_ARM_PREFETCH_ABORT:\r
-      case EXCEPT_ARM_DATA_ABORT:\r
-        // advance PC past the faulting instruction\r
-        PcAdjust = (UINTN)DisAsm - SystemContext.SystemContextArm->PC;\r
-        break;\r
-      \r
-      default:\r
-        break;\r
-      }\r
-\r
-    }\r
-  DEBUG_CODE_END ();\r
-  DEBUG ((EFI_D_ERROR, "\n  R0 0x%08x   R1 0x%08x   R2 0x%08x   R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3));\r
-  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", 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
-\r
-  IfsrStatus = (SystemContext.SystemContextArm->IFSR & 0xf) | ((SystemContext.SystemContextArm->IFSR >> 6) & 0x10);\r
-  if (IfsrStatus != 0) {\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
-  // Clear the error registers that we have already displayed incase some one wants to keep going\r
-  SystemContext.SystemContextArm->DFSR = 0;\r
-  SystemContext.SystemContextArm->IFSR = 0;\r
-\r
-  // If some one is stepping past the exception handler adjust the PC to point to the next instruction \r
-  SystemContext.SystemContextArm->PC += PcAdjust;\r
-}\r