From nobody Sun Apr 28 06:40:23 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1510903447194948.8557299934581; Thu, 16 Nov 2017 23:24:07 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 0FB682035BB08; Thu, 16 Nov 2017 23:19:55 -0800 (PST) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-oln040092004020.outbound.protection.outlook.com [40.92.4.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id F12DA21B00DC4 for ; Thu, 16 Nov 2017 23:19:53 -0800 (PST) Received: from CY1NAM02FT048.eop-nam02.prod.protection.outlook.com (10.152.74.57) by CY1NAM02HT064.eop-nam02.prod.protection.outlook.com (10.152.75.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.218.12; Fri, 17 Nov 2017 07:24:03 +0000 Received: from CO2PR19MB0137.namprd19.prod.outlook.com (10.152.74.59) by CY1NAM02FT048.mail.protection.outlook.com (10.152.74.227) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.20.218.12 via Frontend Transport; Fri, 17 Nov 2017 07:24:02 +0000 Received: from CO2PR19MB0137.namprd19.prod.outlook.com ([10.161.82.25]) by CO2PR19MB0137.namprd19.prod.outlook.com ([10.161.82.25]) with mapi id 15.20.0239.007; Fri, 17 Nov 2017 07:24:02 +0000 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=40.92.4.20; helo=nam02-cy1-obe.outbound.protection.outlook.com; envelope-from=vanjeff_919@hotmail.com; receiver=edk2-devel@lists.01.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=UcNUX1TwxxZVh6sRDpu1deVe6UzHDKsp7FWyDsj6IXc=; b=AdUEwLmt9g3fYk4VeeOyLAR/uJ8CBIF2mrsI8H0pO1acWb0zMr/fylwV8fjPak4WgP5cH6TXZRFDmIt7Xn+8H9xK3gD2DBvGIiJi4u5G/kKfy80g1aid2DZ4JBFx0khQO0fciId/AQ9lGmatIf1t7x/kAkyF20zh0vN2lN4XUaW9zf+2SKhcz0muWSttLcPqOHYZnZdUlr/yD+SZHUuoEilEhlVHHKhNa0pcDcuhEHze9p1vKWWr0FcNmSjJN5U4h3I7K7MgPjQVw4yXZOLCmdt2aQgGRFoykRqpB7YQZpXFLUy2yC9BZr7rEb6ztwk2yYU09MEqsr6QaWkwj/JQZg== From: Fan Jeff To: Paulo Alcantara , "edk2-devel@lists.01.org" Thread-Topic: [edk2] [RFC v3 1/3] UefiCpuPkg/CpuExceptionHandlerLib/X64: Add stack trace support Thread-Index: AQHTXyYmFrGNIJLhvEWejc8xVtEVbaMYKxAb Date: Fri, 17 Nov 2017 07:24:02 +0000 Message-ID: References: , <86955028c6e8f82de1dc1e8206d2b5441cbbf33c.1510868616.git.pcacjr@zytor.com> In-Reply-To: <86955028c6e8f82de1dc1e8206d2b5441cbbf33c.1510868616.git.pcacjr@zytor.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: redhat.com; dkim=none (message not signed) header.d=none;redhat.com; dmarc=none action=none header.from=hotmail.com; x-incomingtopheadermarker: OriginalChecksum:DB46EF4A513050EBEA798D05EEC9889E3B79ECD0896F1E9D05E731F1EF01BD1E; UpperCasedChecksum:6CC689805DBBA3977A7D4DDDD62A5D719351F0B35A0923C955597BB96631AF63; SizeAsReceived:7318; Count:47 x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [Z4cahm42+iEcWAA6LrqEzuMxQTxhSejJ] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; CY1NAM02HT064; 6:OYIMqcSt9LSI4Vi8SxT2uzVMLx/11mUrR05wmUYSB05b0unBWskl/9g16kZDl9sQ/xmirvsLq1881SWGcZbNcCSNp0uxMVqh65UeibFp1sEdMZ65PgB5aaq+EbGJYa9W6YvpdXKJU5eu82GLsubirgv805mAiZBeV6zvHVjPI8e9KhyDKVYW2wLWyarc9S7cI04I2e9ntHIX51Ql81HRBpu5PoD/5TGXFoCBIqE0N/EBfzBcWLz72f38DesVZ5eqsgUrp/S1mpwipmnSjlMZxFl/YoIAjQK/emmsAEVV8VlC5zR5mVaPsAkeLSWUwGGj3doQP9ubyXrkVY+IYsZYJ/53fz8eMl7DCY1szENkP98=; 5:9pzAa8L/z6FwDk+ezgiscZp0JElLkrSMIeFx73R3GvYRqpHseIev3hzr7WTR9KVm/hpFjEt6fwBq0YPbMoZBzqw/2fnxpIYFiebnx7Psl9d8u6gVa6fak5MyPvPCzUkFwXmDB4uxG7ZbYbDJMnRLRMzjvEvnas+ZZJiInUOmwNk=; 24:Yhjzrm9/octkiutSes2FPPcHx3IqF+koncfjRfjEegeNsE8TNBhMz5uSoaclDwSe2DmNpzaQmXOpMSmPgQzEp8+pQ44oAl0XednbsTxJhz8=; 7:ZNJ6J1BAuD0LDmyqBajVdSthPUIwasYR1hYA6wIk6z9c8zHY27eFn6PHZ9PGyHBTDv/7gYbpV8WficK/sLlKM7EoN8QLeKF93ceEcRGu/rrUekY8LbUoBI7/64TXWBdo49QFfa9mXI2j/jxEs/9WfaFv4Ef9zVp03d1FazoCtVZufxbQ5ypCj/JvouBsvAuXZHaYVPQdt/99S/zQDcZ12J66GJ8IEeiNQ1IswWm+Owt+sNnCxBHDvXmEVb+Uvg51 x-incomingheadercount: 47 x-eopattributedmessage: 0 x-ms-office365-filtering-correlation-id: 05423e21-0ae9-4bb6-0cca-08d52d8c2dce x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201702061074)(5061506573)(5061507331)(1603103135)(2017031320274)(2017031324274)(2017031323274)(2017031322404)(1601125374)(1603101448)(1701031045); SRVR:CY1NAM02HT064; x-ms-traffictypediagnostic: CY1NAM02HT064: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(444000031); SRVR:CY1NAM02HT064; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY1NAM02HT064; x-forefront-prvs: 049486C505 x-forefront-antispam-report: SFV:NSPM; SFS:(7070007)(98901004); DIR:OUT; SFP:1901; SCL:1; SRVR:CY1NAM02HT064; H:CO2PR19MB0137.namprd19.prod.outlook.com; FPR:; SPF:None; LANG:; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: hotmail.com X-MS-Exchange-CrossTenant-Network-Message-Id: 05423e21-0ae9-4bb6-0cca-08d52d8c2dce X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Nov 2017 07:24:02.8224 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1NAM02HT064 X-Content-Filtered-By: Mailman/MimeDel 2.1.22 Subject: [edk2] =?gb2312?b?tPC4tDogIFtSRkMgdjMgMS8zXSBVZWZpQ3B1UGtnL0Nw?= =?gb2312?b?dUV4Y2VwdGlvbkhhbmRsZXJMaWIvWDY0OiBBZGQgc3RhY2sgdHJhY2Ugc3Vw?= =?gb2312?b?cG9ydA==?= X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laszlo Ersek , Eric Dong Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Paulo, I don't understand why you - 1 when calculating EIP offset in image, it con= fused me. + for (;;) { + // + // Print stack frame in the following format: + // + // # @ + (RBP) in [ | ????] + // + InternalPrintMessage ( + "%d 0x%016lx @ 0x%016lx+0x%x (0x%016lx) in %a\n", + *UnwoundStacksCount - 1, + Rip, + ImageBase, + Rip - ImageBase - 1, // ???? + Rbp, + PdbFileName + ); + Jeff ________________________________ =E5=8F=91=E4=BB=B6=E4=BA=BA: edk2-devel = =E4=BB=A3=E8=A1=A8 Paulo Alcantara =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: 2017=E5=B9=B411=E6=9C=8817=E6=97=A5 5= :56 =E6=94=B6=E4=BB=B6=E4=BA=BA: edk2-devel@lists.01.org =E6=8A=84=E9=80=81: Laszlo Ersek; Eric Dong =E4=B8=BB=E9=A2=98: [edk2] [RFC v3 1/3] UefiCpuPkg/CpuExceptionHandlerLib/X= 64: Add stack trace support This patch adds stack trace support during a X64 CPU exception. It will dump out back trace, stack contents as well as image module names that were part of the call stack. Contributed-under: TianoCore Contribution Agreement 1.1 Cc: Eric Dong Cc: Laszlo Ersek Signed-off-by: Paulo Alcantara --- UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c | 376= +++++++++++++++++++- 1 file changed, 374 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHan= dler.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler= .c index 65f0cff680..fe776ccc2d 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c @@ -14,6 +14,11 @@ #include "CpuExceptionCommon.h" +// +// Unknown PDB file name +// +GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *mUnknownPdbFileName =3D "????"; + /** Return address map of exception handler template so that C code can gene= rate exception tables. @@ -242,6 +247,357 @@ DumpCpuContext ( ); } +/** + Get absolute path and file name of PDB file in PE/COFF image. + + @param[in] ImageBase Base address of PE/COFF image. + @param[out] PdbAbsoluteFilePath Absolute path of PDB file. + @param[out] PdbFileName File name of PDB file. +**/ +STATIC +VOID +GetPdbFileName ( + IN UINTN ImageBase, + OUT CHAR8 **PdbAbsoluteFilePath, + OUT CHAR8 **PdbFileName + ) +{ + VOID *PdbPointer; + CHAR8 *Str; + + // + // Get PDB file name from PE/COFF image + // + PdbPointer =3D PeCoffLoaderGetPdbPointer ((VOID *)ImageBase); + if (PdbPointer =3D=3D NULL) { + // + // No PDB file name found. Set it to an unknown file name. + // + *PdbFileName =3D (CHAR8 *)mUnknownPdbFileName; + if (PdbAbsoluteFilePath !=3D NULL) { + *PdbAbsoluteFilePath =3D NULL; + } + } else { + // + // Get file name portion out of PDB file in PE/COFF image + // + Str =3D (CHAR8 *)((UINTN)PdbPointer + + AsciiStrLen ((CHAR8 *)PdbPointer) - sizeof *Str); + for (; *Str !=3D '/' && *Str !=3D '\\'; Str--) { + ; + } + + // + // Set PDB file name (also skip trailing path separator: '/' or '\\') + // + *PdbFileName =3D Str + 1; + + if (PdbAbsoluteFilePath !=3D NULL) { + // + // Set absolute file path of PDB file + // + *PdbAbsoluteFilePath =3D PdbPointer; + } + } +} + +/** + Dump stack contents. + + @param[in] CurrentRsp Current stack pointer address. + @param[in] UnwoundStacksCount Count of unwound stack frames. +**/ +STATIC +VOID +DumpStackContents ( + IN UINT64 CurrentRsp, + IN INTN UnwoundStacksCount + ) +{ + // + // Check for proper stack pointer alignment + // + if (((UINTN)CurrentRsp & (CPU_STACK_ALIGNMENT - 1)) !=3D 0) { + InternalPrintMessage ("!!!! Unaligned stack pointer. !!!!\n"); + return; + } + + // + // Dump out stack contents + // + InternalPrintMessage ("\nStack dump:\n"); + while (UnwoundStacksCount-- > 0) { + InternalPrintMessage ( + "0x%016lx: %016lx %016lx\n", + CurrentRsp, + *(UINT64 *)CurrentRsp, + *(UINT64 *)((UINTN)CurrentRsp + 8) + ); + + // + // Point to next stack + // + CurrentRsp +=3D CPU_STACK_ALIGNMENT; + } +} + +/** + Dump all image module names from call stack. + + @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. +**/ +STATIC +VOID +DumpImageModuleNames ( + IN EFI_SYSTEM_CONTEXT SystemContext + ) +{ + EFI_STATUS Status; + UINT64 Rip; + UINTN ImageBase; + VOID *EntryPoint; + CHAR8 *PdbAbsoluteFilePath; + CHAR8 *PdbFileName; + UINT64 Rbp; + UINTN LastImageBase; + + // + // Set current RIP address + // + Rip =3D SystemContext.SystemContextX64->Rip; + + // + // Set current frame pointer address + // + Rbp =3D SystemContext.SystemContextX64->Rbp; + + // + // Check for proper frame pointer alignment + // + if (((UINTN)Rbp & (CPU_STACK_ALIGNMENT - 1)) !=3D 0) { + InternalPrintMessage ("!!!! Unaligned frame pointer. !!!!\n"); + return; + } + + // + // Get initial PE/COFF image base address from current RIP + // + ImageBase =3D PeCoffSearchImageBase (Rip); + if (ImageBase =3D=3D 0) { + InternalPrintMessage ("!!!! Could not find image module names. !!!!"); + return; + } + + // + // Set last PE/COFF image base address + // + LastImageBase =3D ImageBase; + + // + // Get initial PE/COFF image's entry point + // + Status =3D PeCoffLoaderGetEntryPoint ((VOID *)ImageBase, &EntryPoint); + if (EFI_ERROR (Status)) { + EntryPoint =3D NULL; + } + + // + // Get file name and absolute path of initial PDB file + // + GetPdbFileName (ImageBase, &PdbAbsoluteFilePath, &PdbFileName); + + // + // Print out initial image module name (if any) + // + if (PdbAbsoluteFilePath !=3D NULL) { + InternalPrintMessage ( + "\n%a (ImageBase=3D0x%016lx, EntryPoint=3D0x%016lx):\n", + PdbFileName, + ImageBase, + (UINTN)EntryPoint + ); + InternalPrintMessage ("%a\n", PdbAbsoluteFilePath); + } + + // + // Walk through call stack and find next module names + // + for (;;) { + // + // Set RIP with return address from current stack frame + // + Rip =3D *(UINT64 *)((UINTN)Rbp + 8); + + // + // If RIP is zero, then stop unwinding the stack + // + if (Rip =3D=3D 0) { + break; + } + + // + // Search for the respective PE/COFF image based on RIP + // + ImageBase =3D PeCoffSearchImageBase (Rip); + if (ImageBase =3D=3D 0) { + // + // Stop stack trace + // + break; + } + + // + // If RIP points to another PE/COFF image, then find its respective PD= B file + // name. + // + if (LastImageBase !=3D ImageBase) { + // + // Get PE/COFF image's entry point + // + Status =3D PeCoffLoaderGetEntryPoint ((VOID *)ImageBase, &EntryPoint= ); + if (EFI_ERROR (Status)) { + EntryPoint =3D NULL; + } + + // + // Get file name and absolute path of PDB file + // + GetPdbFileName (ImageBase, &PdbAbsoluteFilePath, &PdbFileName); + + // + // Print out image module name (if any) + // + if (PdbAbsoluteFilePath !=3D NULL) { + InternalPrintMessage ( + "%a (ImageBase=3D0x%016lx, EntryPoint=3D0x%016lx):\n", + PdbFileName, + ImageBase, + (UINTN)EntryPoint + ); + InternalPrintMessage ("%a\n", PdbAbsoluteFilePath); + } + + // + // Save last PE/COFF image base address + // + LastImageBase =3D ImageBase; + } + + // + // Unwind the stack + // + Rbp =3D *(UINT64 *)(UINTN)Rbp; + } +} + +/** + Dump stack trace. + + @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. + @param[out] UnwoundStacksCount Count of unwound stack frames. +**/ +STATIC +VOID +DumpStackTrace ( + IN EFI_SYSTEM_CONTEXT SystemContext, + OUT INTN *UnwoundStacksCount + ) +{ + UINT64 Rip; + UINT64 Rbp; + UINTN ImageBase; + CHAR8 *PdbFileName; + + // + // Set current RIP address + // + Rip =3D SystemContext.SystemContextX64->Rip; + + // + // Set current frame pointer address + // + Rbp =3D SystemContext.SystemContextX64->Rbp; + + // + // Get initial PE/COFF image base address from current RIP + // + ImageBase =3D PeCoffSearchImageBase (Rip); + if (ImageBase =3D=3D 0) { + InternalPrintMessage ("!!!! Could not find backtrace information. !!!!= "); + return; + } + + // + // Get PDB file name from initial PE/COFF image + // + GetPdbFileName (ImageBase, NULL, &PdbFileName); + + // + // Initialize count of unwound stacks + // + *UnwoundStacksCount =3D 1; + + // + // Print out back trace + // + InternalPrintMessage ("\nCall trace:\n"); + + for (;;) { + // + // Print stack frame in the following format: + // + // # @ + (RBP) in [ | ????] + // + InternalPrintMessage ( + "%d 0x%016lx @ 0x%016lx+0x%x (0x%016lx) in %a\n", + *UnwoundStacksCount - 1, + Rip, + ImageBase, + Rip - ImageBase - 1, + Rbp, + PdbFileName + ); + + // + // Set RIP with return address from current stack frame + // + Rip =3D *(UINT64 *)((UINTN)Rbp + 8); + + // + // If RIP is zero, then stop unwinding the stack + // + if (Rip =3D=3D 0) { + break; + } + + // + // Search for the respective PE/COFF image based on RIP + // + ImageBase =3D PeCoffSearchImageBase (Rip); + if (ImageBase =3D=3D 0) { + // + // Stop stack trace + // + break; + } + + // + // Get PDB file name + // + GetPdbFileName (ImageBase, NULL, &PdbFileName); + + // + // Unwind the stack + // + Rbp =3D *(UINT64 *)(UINTN)Rbp; + + // + // Increment count of unwound stacks + // + (*UnwoundStacksCount)++; + } +} + /** Display CPU information. @@ -254,9 +610,25 @@ DumpImageAndCpuContent ( IN EFI_SYSTEM_CONTEXT SystemContext ) { + INTN UnwoundStacksCount; + + // + // Dump CPU context + // DumpCpuContext (ExceptionType, SystemContext); + + // + // Dump stack trace + // + DumpStackTrace (SystemContext, &UnwoundStacksCount); + + // + // Dump image module names + // + DumpImageModuleNames (SystemContext); + // - // Dump module image base and module entry point by RIP + // Dump stack contents // - DumpModuleImageInfo (SystemContext.SystemContextX64->Rip); + DumpStackContents (SystemContext.SystemContextX64->Rsp, UnwoundStacksCou= nt); } -- 2.14.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel edk2-devel Info Page - 01.org lists.01.org Your email address: Your name (optional): You may enter a privacy password = below. This provides only mild security, but should prevent others from mes= sing ... _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel