]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/DefaultExceptionHandlerLib/Arm/DefaultExceptionHandler.c
BaseTools/FMMT: Add a tool FMMT
[mirror_edk2.git] / ArmPkg / Library / DefaultExceptionHandlerLib / Arm / DefaultExceptionHandler.c
index 179fc224be54c8666ec4df07ee70d7a459292ad3..a214e6ef250110d88f4fc4c682820c2df2fc45b5 100644 (file)
@@ -4,13 +4,7 @@
   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
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Library/PrintLib.h>\r
 #include <Library/ArmDisassemblerLib.h>\r
 #include <Library/SerialPortLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.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
+// The number of elements in a CHAR8 array, including the terminating NUL, that\r
+// is meant to hold the string rendering of the CPSR.\r
+//\r
+#define CPSR_STRING_SIZE 32\r
 \r
 typedef struct {\r
   UINT32  BIT;\r
@@ -48,7 +48,8 @@ GetImageName (
   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
+  @param  ReturnStr    CPSR_STRING_SIZE byte string that contains string\r
+                       version of CPSR\r
 \r
 **/\r
 VOID\r
@@ -118,8 +119,10 @@ CpsrString (
     break;\r
   }\r
 \r
-  AsciiStrCat (Str, ModeStr);\r
-  return;\r
+  //\r
+  // See the interface contract in the leading comment block.\r
+  //\r
+  AsciiStrCatS (Str, CPSR_STRING_SIZE - (Str - ReturnStr), ModeStr);\r
 }\r
 \r
 CHAR8 *\r
@@ -187,14 +190,18 @@ DefaultExceptionHandler (
 \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
+  SerialPortWrite ((UINT8 *)Buffer, CharCount);\r
+  if (gST->ConOut != NULL) {\r
+    AsciiPrint (Buffer);\r
+  }\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   CpsrStr[CPSR_STRING_SIZE];  // char per bit. Lower 5-bits are mode\r
+                                        // that is a 3 char string\r
     CHAR8   Buffer[80];\r
     UINT8   *DisAsm;\r
     UINT32  ItBlock;\r
@@ -259,6 +266,8 @@ DefaultExceptionHandler (
   DEBUG ((EFI_D_ERROR, "\n"));\r
   ASSERT (FALSE);\r
 \r
+  CpuDeadLoop ();   // may return if executing under a debugger\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