From nobody Tue Jan 24 22:10:49 2023 X-Original-To: dev-commits-src-branches@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 4P1h4T6NR9z3bf99; Tue, 24 Jan 2023 22:10:49 +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 4P1h4T5XDCz4Lk3; Tue, 24 Jan 2023 22:10:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674598249; 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=M+vn91dGw8Ty8RiX1fvdQsC/isnR7TL750wvth0yXoc=; b=PqF/tPWL1pn8oM9At09Sw8Ud+qeMrk9k/sbeR3/GcUfVKZiW24rclHCLcNvPRszlpKeKFM vNhPZchACbTi4LsAZEVN1YTpOFLc+8/PG6F7iNXU9tZ7S1JjGQM4bUGH4bpuUV6ZbOQRyL +FUnls49gR/bFzkx6XJ4NzHBZHd7+av8KmGRkUJewCCmED4eU0riqUwF6y3lYMaCYP01YC sYB5DiMux+0Wg6eYhTuCPdc8iPvpQcohZ5I8wO9egUErBO/yVeMABaJL9+H/wVR70YOQZe pQBm5v8Pp0oNufEt6tiXBxWC4Ey8VeXM8dXayK8MTX41YkKtEZrzLDOHBbC8yw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674598249; 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=M+vn91dGw8Ty8RiX1fvdQsC/isnR7TL750wvth0yXoc=; b=bmDXUJ86lfl1TvZDSMBmnrONscVPvL2dVoVHqwcNebA3ro8bDn6Dd3/BzqJ3A0NufxUTqy J0Cg5nDD8dAWMLII53ptkYbXrdenGl3mW8LDk6UEh1t5Wd6k1ivSEJgmuzhnAwj/0bqYVy MGKFZE6gJXGYRudUsy6PZf22YkRznsMKTsmjIMRUiRzN6M1IZx5gk7yZDzpNu846n7Y+pO OowMOBgOieEiPu1abkp/YCWEyc0R6sdCX0X7T9Qt91qJ8veTsQPMEkOZkHOX3GMxyb6ta8 f/XzWkrjCEcLI9lZjOiuv/9TdIb0iStQgOF7t90XuCa9xo0EVXpU8+/RypgnYA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674598249; a=rsa-sha256; cv=none; b=xJ270MGEXAmkcKoYdWNc5hC0o0sJ4JpwI4Ngdld8vDCC49YDr3B1r/Wlnn3OvjWtor+tVd H9THaJXo/risoDe/ldd3xTujE3lMqVTG9ug1fRBaqpmKJlA1P1y1G47YUsoygOUWexZka1 R+2cRNpTzS72OJbUuHL3hDrAEHhT/AK6HO8d3m/ce3+kgNuMohqykVIaafe0ZKyvWrmuKo LoLWuWx9oUx2sujg+W6kEw/KEfckRCeOcjyWwqTPNJtQG3Vd5K45E8RVz7qLIilcIg9m9z Wup1Pjj+jxiFzA8NGAmEPoAhob6DTK05TwtGtdKIuEAFt+UlwWyfSxGmIwkOGA== 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 4P1h4T4csSzQM5; Tue, 24 Jan 2023 22:10:49 +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 30OMAnnq080585; Tue, 24 Jan 2023 22:10:49 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30OMAnjB080584; Tue, 24 Jan 2023 22:10:49 GMT (envelope-from git) Date: Tue, 24 Jan 2023 22:10:49 GMT Message-Id: <202301242210.30OMAnjB080584@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Warner Losh Subject: git: 47c3f7f6db26 - stable/13 - loader.efi: faults could try to print out call trace List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 47c3f7f6db2613d2f737251b767ebe3bc966d8e8 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=47c3f7f6db2613d2f737251b767ebe3bc966d8e8 commit 47c3f7f6db2613d2f737251b767ebe3bc966d8e8 Author: Toomas Soome AuthorDate: 2022-06-08 12:23:05 +0000 Commit: Warner Losh CommitDate: 2023-01-24 21:49:23 +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 (cherry picked from commit f4ca0fdbe69db4ab8147406e753d869d77485c2c) --- 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);