From nobody Thu Jul 14 13:03:38 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4LkF6g0fVtz1Hxwn; Thu, 14 Jul 2022 13:03:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LkF6g06zBz3tXr; Thu, 14 Jul 2022 13:03:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1657803819; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=NTLQb3Uh9ru7rRF8VhfN89ilZIoQnNk84bC9Iv5J8N8=; b=ZeajZZvnABLJJi1EzRSeZK2eWKGJPmFX7R5hgWQlGd+8xh4M+CCskvY4aKHlUL+n4eMCEe wP8AIcBjpSMcChfk4ptbzzsNTa1b12w3fYhAfcw/KWqkcboO/f0VOPBz6hkPoYGj/2XE5G aMy3fup/jzRsrd5yVHuxantkupmyUzNmGTLRElxQDZqlr6/qtgqG7B5BwWSrqoIP37LgHa ZCj40D9wng7AUMlQULkqyJ6bAhEdX1w42lxaH2qqrCE4hm4E1E9CjuM1n7zZRpX98zSzuD 5xAcmbOViqMdS8kX4YlZQSdDoDGgWGP6kkdSJUsBEgixhDkuqcaRYMAjxJ1REA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4LkF6f5ytVz13sZ; Thu, 14 Jul 2022 13:03:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 26ED3c7K005421; Thu, 14 Jul 2022 13:03:38 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 26ED3cTi005420; Thu, 14 Jul 2022 13:03:38 GMT (envelope-from git) Date: Thu, 14 Jul 2022 13:03:38 GMT Message-Id: <202207141303.26ED3cTi005420@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Toomas Soome Subject: git: f4ca0fdbe69d - main - loader.efi: faults could try to print out call trace List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: tsoome X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f4ca0fdbe69db4ab8147406e753d869d77485c2c Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1657803819; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=NTLQb3Uh9ru7rRF8VhfN89ilZIoQnNk84bC9Iv5J8N8=; b=WGXZXy/pJftWOdCuywpLB7WHsKc6SvLLKhjJV6IexHDd5S6oX42JjR8S4zLVHC3jLn/9Nw CnLg9rx8+QBffvzBUVRcq0XOOwHOpX0/4dbYIgQK4/zu6lC5J5HIIKULfmLqSugF5kmH3j JUUD4Eb9p+6i5TypBa24iBO3nmrFdNk+J4L1T0WkcnGz9HGEC1QA0whLdL7YWPsON+JEtE WMuM5at52jHBGY0o4RtbLQFczkA9Sa2bTD7d+VHh2Ilts1BBrYoD1xgMLq4U83RgxhNnGG OEVqPGvCGFeapyNEQ5iMMw0dSB0/L97bvqrCnY4H/4Z3f6mDkZZiXbrIlUTU1Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1657803819; a=rsa-sha256; cv=none; b=o6SnM7oPZzPjbigTAz42AGqWgi1dqvtngl1slVcPgSXMHOFZVmUFPTDkmJVbV0XKqF9qPr G+8bIdYAjKsHV/44kx9l7JYSAI68gFB3yQJTkXF0fEFcAPZiBnO8FirzGu0PZjAbilEgsP H3X50gNN4ORRbpZCRfaTfEjdTJC0xm4+aGVaw3a7+yq5zjezE/yQpxEbtviuk3vtJv6f1j 63o/8LmnvYf9Mr4Sj4E1wrLc9SG4nTon7YRRy0BCjCrHEp+v7N7CwcLLxzj7+TFex/lk3a hvjw/65TGwCf/IEsA73by7aNxlCRufOOUtYY/x82vI1F0dCfbUX9eKp/dZC1oA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by tsoome: URL: https://cgit.FreeBSD.org/src/commit/?id=f4ca0fdbe69db4ab8147406e753d869d77485c2c commit f4ca0fdbe69db4ab8147406e753d869d77485c2c Author: Toomas Soome AuthorDate: 2022-06-08 12:23:05 +0000 Commit: Toomas Soome CommitDate: 2022-07-14 12:59:26 +0000 loader.efi: faults could try to print out call trace with grab_faults, we can try to print out the trace of function calls. Without symbol table, we can not translate addresses to function names, but even addresses can help to track the bugs. For loader functions, print out absolute address, so it could be searched from objdump -d output. Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D35433 --- stand/efi/loader/arch/amd64/trap.c | 37 +++++++++++++++++++++++++++++++++++++ stand/efi/loader/loader_efi.h | 3 +++ 2 files changed, 40 insertions(+) diff --git a/stand/efi/loader/arch/amd64/trap.c b/stand/efi/loader/arch/amd64/trap.c index 1a4306b00e0a..81357e558185 100644 --- a/stand/efi/loader/arch/amd64/trap.c +++ b/stand/efi/loader/arch/amd64/trap.c @@ -78,11 +78,21 @@ static uint32_t loader_tss; /* Loader TSS segment */ static struct region_descriptor fw_gdt; /* Descriptor of pristine GDT */ static EFI_PHYSICAL_ADDRESS loader_gdt_pa; /* Address of loader shadow GDT */ +struct frame { + struct frame *fr_savfp; + uintptr_t fr_savpc; +}; + void report_exc(struct trapframe *tf); void report_exc(struct trapframe *tf) { + struct frame *fp; + uintptr_t pc, base; + char buf[80]; + int ret; + base = (uintptr_t)boot_img->ImageBase; /* * printf() depends on loader runtime and UEFI firmware health * to produce the console output, in case of exception, the @@ -108,6 +118,33 @@ report_exc(struct trapframe *tf) tf->tf_rdi, tf->tf_rsi, tf->tf_rdx, tf->tf_rcx, tf->tf_r8, tf->tf_r9, tf->tf_rax, tf->tf_rbx, tf->tf_rbp, tf->tf_r10, tf->tf_r11, tf->tf_r12, tf->tf_r13, tf->tf_r14, tf->tf_r15); + + fp = (struct frame *)tf->tf_rbp; + pc = tf->tf_rip; + + printf("Stack trace:\n"); + pager_open(); + while (fp != NULL || pc != 0) { + char *source = "PC"; + + if (pc >= base && pc < base + boot_img->ImageSize) { + pc -= base; + source = "loader PC"; + } + (void) snprintf(buf, sizeof (buf), "FP %016lx: %s 0x%016lx\n", + (uintptr_t)fp, source, pc); + if (pager_output(buf)) + break; + + if (fp != NULL) + fp = fp->fr_savfp; + + if (fp != NULL) + pc = fp->fr_savpc; + else + pc = 0; + } + pager_close(); printf("Machine stopped.\n"); } diff --git a/stand/efi/loader/loader_efi.h b/stand/efi/loader/loader_efi.h index d1958d62fe10..49434698fa03 100644 --- a/stand/efi/loader/loader_efi.h +++ b/stand/efi/loader/loader_efi.h @@ -32,6 +32,7 @@ #include #include +#include #ifdef __amd64__ enum { @@ -42,6 +43,8 @@ enum { extern int copy_staging; #endif +extern EFI_LOADED_IMAGE *boot_img; + int efi_autoload(void); int efi_copy_init(void);