From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x233.google.com (mail-it0-x233.google.com [IPv6:2607:f8b0:4001:c0b::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E50AB1A1EC6 for ; Wed, 7 Sep 2016 04:03:55 -0700 (PDT) Received: by mail-it0-x233.google.com with SMTP id i184so190244111itf.1 for ; Wed, 07 Sep 2016 04:03:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=WCxDXgGwT82vbHo3LyA7BNgWuVCst4xqkX9rhs0WDT8=; b=KCeI9/TJ25G3gJkUTPyoea/1EmhPf57s40i2AA5/AyZNeMOXrnMAWbTtjp1H8ZBl3V ZgwpGMEQfGsdf1437fb+lCOM/usFre35ckgu7mmdhWVmYW0H/9eL8IJ+HVCUqbm19de7 i3N65LgORLx0wLjLo4wCER3cyu+dQDnbSSvGs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=WCxDXgGwT82vbHo3LyA7BNgWuVCst4xqkX9rhs0WDT8=; b=gzMIuJCayHtn8DrrgUK67M5DlHIVd9j+xYTT79iYIN6DSmL1wcof8CYyy/v+WDFV45 aeg27sw6+R3Pphh9ubfCSqmtf2muuMrlB64W7LjvNNS9VkNldAMoUR8TWXGb1L5HizJH AHLMV/XdG1dIdKu5GSFRPFkySfLRQx229eHyTLtLleoYdgKO4nUxNmcD10D1jCzY9aID lhKt/an4PUsx0t7kEt9NRqAQoNDgLRdkI075dwX4TFob7692q5xz31XjijpTh5NPuDJg QgmMbfZex6/bGfCVZ9+IoMrLqNArFNpQSszlyRibywsDMGYppM43e7m1BcyzIJT6fbLz e5DA== X-Gm-Message-State: AE9vXwNYLVQGoUztD90fcFPTIdhoiAPZtKkcoO97cO1+pWPDWgAyfBxzmRjQp/GjUcTVH/qH2HjQcWnepJ/cXwOp X-Received: by 10.36.141.194 with SMTP id w185mr5466431itd.87.1473246235104; Wed, 07 Sep 2016 04:03:55 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.204.195 with HTTP; Wed, 7 Sep 2016 04:03:54 -0700 (PDT) In-Reply-To: References: <1473236515-8318-1-git-send-email-ard.biesheuvel@linaro.org> <1473236515-8318-2-git-send-email-ard.biesheuvel@linaro.org> From: Ard Biesheuvel Date: Wed, 7 Sep 2016 12:03:54 +0100 Message-ID: To: Michael Zimmermann Cc: "edk2-devel@lists.01.org" , Leif Lindholm Subject: Re: [PATCH 2/2] ArmPkg/DefaultExceptionHandlerLib AARCH64: add minimal backtrace to crash dump X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Sep 2016 11:03:56 -0000 Content-Type: text/plain; charset=UTF-8 On 7 September 2016 at 10:48, Michael Zimmermann 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 > 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 >> --- >> >> 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 > >