From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x229.google.com (mail-it0-x229.google.com [IPv6:2607:f8b0:4001:c0b::229]) (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 640E21A1EC7 for ; Wed, 7 Sep 2016 04:32:35 -0700 (PDT) Received: by mail-it0-x229.google.com with SMTP id e124so15570764ith.0 for ; Wed, 07 Sep 2016 04:32:35 -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=7Q/ib0LcLzpCwrCV1SVyzfbvWCJseOS6BXoIm/MGIZw=; b=FIsmLlVEJODz5f6RdpetPLNjwjRMjx5Cqyw9vNBxzv+wJ1EYXhJ6wQC7LlJ/GYejfH rjCGnT2zg4Kqd0cVIDQ29dMjTLB67MMY0rbutYt2pQP/QfWQVEjif9/dwq7UJiXRmPsJ dPLLaUrUR5DVwYTbp4ysscbbqdnuCi5nfbyfw= 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=7Q/ib0LcLzpCwrCV1SVyzfbvWCJseOS6BXoIm/MGIZw=; b=A0zxSxWumosXYa0prZVJiGp+xbdCyTDf/O6dxte86S4/YPcylSrUB8NI52HN88ps1Q AUUIcuese+wg954XFG91u5BZMbn59aSZmJ7p4SFecljGgmBZymFOngBQsK/jw2Wn8ahZ qG+TGSj6+jjG9EX9+O87sN5xHVDA/bST36KNt4pkJ2LBALARpfcYNEHOswrtTpYC1338 w52a5cNi+8pU8mnfjmNNIotFE4WSG0joIUEz2lXuDtK/TKgaNasfze+wTirPJFqFLNPw Wd0O+YTc15cZNDF31VxHT1t7Mkq768TWcl17wAhnLPtTBvxELfav956yGAj6VcvJcOCA 26MA== X-Gm-Message-State: AE9vXwMrMM2Iiiw9gBJjuXe6XRYYdgGjNwU/9UVKQ1Ul38Silr7bU1mYxWVUaqkbSpdg9zRhUoFDC8QZxcWXIFbJ X-Received: by 10.36.57.215 with SMTP id l206mr5771210ita.5.1473247954588; Wed, 07 Sep 2016 04:32:34 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.204.195 with HTTP; Wed, 7 Sep 2016 04:32:34 -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:32:34 +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:32:35 -0000 Content-Type: text/plain; charset=UTF-8 On 7 September 2016 at 12:25, Michael Zimmermann wrote: >> However, looking at this >> code, this is still not sufficient to find the *next* frame pointer on >> the stack. > are you sure about that? this code looks like it does just that: > https://github.com/torvalds/linux/blob/master/arch/arm/kernel/stacktrace.c > First of all, that comment makes little sense: * With framepointer enabled, a simple function prologue looks like this: * mov ip, sp * stmdb sp!, {fp, ip, lr, pc} I assume this should be stmdb sp!, {fp, ip, lr} * sub fp, ip, #4 * * A simple function epilogue looks like this: * ldm sp, {fp, sp, pc} But then, it looks like GCC in ARM mode happens to generate stack frames that are easily unwound. However, in EDK2 we use Thumb2 primarily, and the code I snipped is actually from a -fno-omit-frame-pointer Thumb2 build, and it does not look like whatever is pushed onto the stack can be decoded unambiguously like that. > On Wed, Sep 7, 2016 at 1:03 PM, Ard Biesheuvel > wrote: >> >> 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 >> > >> > > >