On 7 September 2016 at 10:48, Michael Zimmermann
<[email protected]> wrote:
> nice, can we do this for ARM too? I usually need to add DEBUG((...))'s all
> over the place for hours until I found the reason for a fault.
>
This is going to be tricky. Unlike AARCH64, which unambiguously
describes in the AAPCS how to link the stack frames using x29, the
AAPCS for ARM does not standardise this, and so different compilers
may do different things, also depending on whether you are executing
in ARM or Thumb mode. For instance, the following prologue was snipped
from a BdsDxe.dll build using GCC5 in Thumb2 mode.
00000254 <_ModuleEntryPoint>:
254: e96d 7e02 strd r7, lr, [sp, #-8]!
258: b084 sub sp, #16
25a: af00 add r7, sp, #0
Googling around, i can indeed find sources that describe how GCC uses
r7 as the frame pointer for Thumb2 code. However, looking at this
code, this is still not sufficient to find the *next* frame pointer on
the stack. IOW, there is no standardised layout to find the next frame
pointer inside the stack frame.
The only way to do this reliably is using unwind tables, but this is
*much* more complicated than the 20 line patch that enables it for
AArch64
Ard.
> On Wed, Sep 7, 2016 at 10:21 AM, Ard Biesheuvel <[email protected]>
> wrote:
>>
>> 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 <[email protected]>
>> ---
>>
>> 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
>> [email protected]
>> https://lists.01.org/mailman/listinfo/edk2-devel
>
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel