[edk2,2/2] ArmPkg/DefaultExceptionHandlerLib: add stack dump to exception handling code

Message ID 1462804415-4007-2-git-send-email-ard.biesheuvel@linaro.org
State Accepted
Commit cd82e330bbb1329b5ab8bd236e063af41cd4007a
Headers show

Commit Message

Ard Biesheuvel May 9, 2016, 2:33 p.m.
This adds a partial stack dump (256 bytes at either side of the stack
pointer) to the CPU state dumping routine that is invoked when taking an
unexpected exception. Since dereferencing the stack pointer may itself
fault, ensure that we don't enter the dumping routine recursively.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
 ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c | 21 ++++++++++++++++++++
 1 file changed, 21 insertions(+)

-- 
2.7.4

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
index 57200ff642c2..a86f4be29931 100644
--- a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
+++ b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
@@ -34,6 +34,8 @@  STATIC CHAR8 *gExceptionTypeString[] = {
   "SError"
 };
 
+STATIC BOOLEAN mRecursiveException;
+
 CHAR8 *
 GetImageName (
   IN  UINTN  FaultAddress,
@@ -134,6 +136,14 @@  DefaultExceptionHandler (
 {
   CHAR8  Buffer[100];
   UINTN  CharCount;
+  INT32  Offset;
+
+  if (mRecursiveException) {
+    CharCount = AsciiSPrint (Buffer, sizeof (Buffer),"\nRecursive exception occurred while dumping the CPU state\n");
+    SerialPortWrite ((UINT8 *) Buffer, CharCount);
+    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);
@@ -182,5 +192,16 @@  DefaultExceptionHandler (
 
   DescribeExceptionSyndrome (SystemContext.SystemContextAArch64->ESR);
 
+  DEBUG ((EFI_D_ERROR, "\nStack dump:\n"));
+  for (Offset = -256; Offset < 256; Offset += 32) {
+    DEBUG  ((EFI_D_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)));
+  }
+
   CpuDeadLoop ();
 }