When dumping the CPU state after an unhandled fault, walk the stack
frames and decode the return addresses so we can show a minimal
backtrace. Unfortunately, we do not have sufficient information to
show the function names, but at least we can see the modules and the
return addresses inside the modules.

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

Example output:

Synchronous Exception at 0x00000000F5EA4C8C
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
 loaded at 0x00000000F5E90000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
 (0x00000000F5EA4AE8) loaded at 0x00000000F5E90000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
 (0x00000000F5EA1BFC) loaded at 0x00000000F5E90000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
 (0x00000000F5EA23F4) loaded at 0x00000000F5E90000
called from 
/work/jenkins/workspace/ap-uefi-bin/EDK2_ARCH/ARM/EDK2_BINARY/FatPkg/label/sas-sw/Build/Fat/RELEASE_GCC49/AARCH64/FatPkg/EnhancedFatDxe/Fat/DEBUG/Fat.dll
 (0x00000000FADC454C) loaded at 0x00000000FADC3000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
 (0x00000000FE47C868) loaded at 0x00000000FE471000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
 (0x00000000FAE2C50C) loaded at 0x00000000FAE01000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
 (0x00000000FAE2C674) loaded at 0x00000000FAE01000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
 (0x00000000FAE2C264) loaded at 0x00000000FAE01000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
 (0x00000000FAE36998) loaded at 0x00000000FAE01000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
 (0x00000000FAE03668) loaded at 0x00000000FAE01000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
 (0x00000000FE4733F0) loaded at 0x00000000FE471000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
 (0x00000000FE4724A0) loaded at 0x00000000FE471000
called from 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
 (0x00000000FE472024) loaded at 0x00000000FE471000
---
 .../AArch64/DefaultExceptionHandler.c               | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git 
a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c 
b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
index 31fc936b21ff..84b442f2b6f4 100644
--- 
a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
+++ 
b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
@@ -152,9 +152,30 @@ DefaultExceptionHandler (
     CHAR8  *Pdb;
     UINTN  ImageBase;
     UINTN  PeCoffSizeOfHeader;
+    UINT64 *Fp;
+
     Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, 
&PeCoffSizeOfHeader);
     if (Pdb != NULL) {
       DEBUG ((EFI_D_ERROR, "%a loaded at 0x%016lx \n", Pdb, ImageBase));
+
+      Pdb = GetImageName (SystemContext.SystemContextAArch64->LR, &ImageBase,
+              &PeCoffSizeOfHeader);
+      if (Pdb != NULL) {
+        DEBUG ((EFI_D_ERROR, "called from %a (0x%016lx) loaded at 0x%016lx \n",
+          Pdb, SystemContext.SystemContextAArch64->LR, ImageBase));
+      }
+      for (Fp = (UINT64 *)SystemContext.SystemContextAArch64->FP;
+           *Fp != 0;
+           Fp = (UINT64 *)Fp[0]) {
+        if (Fp[1] == SystemContext.SystemContextAArch64->LR) {
+         continue;
+        }
+        Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
+        if (Pdb != NULL) {
+          DEBUG ((EFI_D_ERROR, "called from %a (0x%016lx) loaded at 0x%016lx 
\n",
+            Pdb, Fp[1], ImageBase));
+        }
+      }
     }
   DEBUG_CODE_END ();
 
-- 
2.7.4

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

Reply via email to