public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Michael Zimmermann <sigmaepsilon92@gmail.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	Leif Lindholm <leif.lindholm@linaro.org>
Subject: Re: [PATCH 2/2] ArmPkg/DefaultExceptionHandlerLib AARCH64: add minimal backtrace to crash dump
Date: Wed, 7 Sep 2016 12:03:54 +0100	[thread overview]
Message-ID: <CAKv+Gu9B-2Emc2cXAEhT6AK5+5AasWwN6YJKiowVaUr8bDquoQ@mail.gmail.com> (raw)
In-Reply-To: <CAN9vWD+NDo9XMKQxEpkzFotPFFUDVd+0gX7e=rNSZRbSZRVv5Q@mail.gmail.com>

On 7 September 2016 at 10:48, Michael Zimmermann
<sigmaepsilon92@gmail.com> 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 <ard.biesheuvel@linaro.org>
> 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 <ard.biesheuvel@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	other threads:[~2016-09-07 11:03 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-07  8:21 [PATCH 1/2] BaseTools/tools_def AARCH64: enable frame pointers for DEBUG builds Ard Biesheuvel
2016-09-07  8:21 ` [PATCH 2/2] ArmPkg/DefaultExceptionHandlerLib AARCH64: add minimal backtrace to crash dump Ard Biesheuvel
2016-09-07  9:48   ` Michael Zimmermann
2016-09-07 11:03     ` Ard Biesheuvel [this message]
2016-09-07 11:25       ` Michael Zimmermann
2016-09-07 11:32         ` Ard Biesheuvel
2016-09-09 13:08           ` Ard Biesheuvel
2016-09-09 18:03             ` Michael Zimmermann
2016-09-09 16:03   ` Andrew Fish
2016-09-07 15:00 ` [PATCH 1/2] BaseTools/tools_def AARCH64: enable frame pointers for DEBUG builds Leif Lindholm

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKv+Gu9B-2Emc2cXAEhT6AK5+5AasWwN6YJKiowVaUr8bDquoQ@mail.gmail.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox