From nobody Thu Apr 9 13:30:05 2026 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 4fs15H1yrcz6Z9FQ for ; Thu, 09 Apr 2026 13:30:11 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fs15H0p6cz3tKs for ; Thu, 09 Apr 2026 13:30:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775741411; 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=xtJscoA8DPzR/qQH9m+Jz0qg4+j+I7vd+qsDd9/YrVg=; b=U6rlnGszCWaVp0NZ5ATquhRZHjvXluiudBBK0gxXfMjAQfW6LbixeO1WoOYspI1xncqkt0 jMZ1JcAjAoNQStSSSLIx3OdfepfSNQDJyYa791SnHqi6At3y1KFOiAeoFp44bWRbaHAqkk B1nKjvIskTLC7SzrN8/WOBiBVfkYs27ImdIO0xxj5fePBhqTXVPA40qNsx0OikmM8uzbL+ 4FilxSPDr+729IozBz+inmFhzPb5XHBWYGh1wzsFr4OYKHYSXQVhoNrRjnVGHc8sAXZfsZ yUABco/4Mn12YZHvNzFZKxpX9stfnhgxe9Jb4SMB5EoGQ1KGxP+h/64HJR4FsA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1775741411; a=rsa-sha256; cv=none; b=Lmne6BCWgqpy+r0w90wGZ3VQS5aNMhj4nCheUhhBMnzeWenL+feXFvoaNDocPdCAkIqizq 7aXRLZrxTE+SQWR7DmMjMo1sMt0DmBTYrTBdRudpG0DuQfNBnNSNghvf1wDtV9LCAFZlBC 8jmHu0fI/I+eB7D4mEWcx9qIivGBjskNsGX33dcys/64lsjii89/wsJTaXMg7/SLZZwg6p q1ashq8t2TAbIVtCr2Ramzranxtwm0ppLjthr08aCC6mvYO89yr0o+TfGSgdKOpOklK9J9 pLgM+kZdCIDy5ebVSBECb3RHxl6QS5q0eVgA3+8F5lc6KXUyR1p7GSY1Pwembw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775741411; 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=xtJscoA8DPzR/qQH9m+Jz0qg4+j+I7vd+qsDd9/YrVg=; b=sbqBJSRWBiz4UZCEbouezGhL+H4Mt3O2d5T8KxJ8gvI6flpbEMOXzMzJbByocsJl5NCCGk 2Vn5Jgp9lQTJ0UT1iamLAkETQjY/IlSkh4KeDkNgWwL5lbq+9CcvwjnAjjfd0bPkW1dhtm NqqZZCPr/ta+VODv7feMcrrwyRBqd4nlTj5zD4Pw151jUWtDosi9cK8k6WZE/NwlBbm012 catEzBKnu2pe78eHO+OQzHATr7BdQz0XAt9RfvaeqgBRIZZJc4XBtXwTBKndgrL++yQIsu /AUHLX/NCu23HF4Gvry2Ol4QDOw8CYCuZr/n/mb+Cdv2LU4chIqTixEMc/jezQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fs15G6gRYz1F5L for ; Thu, 09 Apr 2026 13:30:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 38e0d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 09 Apr 2026 13:30:05 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Toomas Soome Subject: git: aacf448007f7 - main - loader.efi: panic() should show stack 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-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: aacf448007f7adbcdb528556cabcd120c9e8cb75 Auto-Submitted: auto-generated Date: Thu, 09 Apr 2026 13:30:05 +0000 Message-Id: <69d7a9dd.38e0d.6535c4c3@gitrepo.freebsd.org> The branch main has been updated by tsoome: URL: https://cgit.FreeBSD.org/src/commit/?id=aacf448007f7adbcdb528556cabcd120c9e8cb75 commit aacf448007f7adbcdb528556cabcd120c9e8cb75 Author: Toomas Soome AuthorDate: 2026-04-09 11:36:12 +0000 Commit: Toomas Soome CommitDate: 2026-04-09 13:29:12 +0000 loader.efi: panic() should show stack trace Because panic() does provide mechanism to have architecture specific panic call, we can instruct it to print out stack trace too (in hope we actually can print). While there, also implement simple check to detect loop in trace. illumos issue: https://www.illumos.org/issues/17887 --- stand/efi/loader/arch/amd64/trap.c | 88 +++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/stand/efi/loader/arch/amd64/trap.c b/stand/efi/loader/arch/amd64/trap.c index 3fe86f7b1924..ff7190d214ad 100644 --- a/stand/efi/loader/arch/amd64/trap.c +++ b/stand/efi/loader/arch/amd64/trap.c @@ -82,14 +82,68 @@ struct frame { }; void report_exc(struct trapframe *tf); -void -report_exc(struct trapframe *tf) + +static void +stack_trace(struct frame *fp, uintptr_t pc) { - struct frame *fp; - uintptr_t pc, base; + uintptr_t base; char buf[80]; base = (uintptr_t)boot_img->ImageBase; + + printf("Stack trace:\n"); + pager_open(); + while (fp != NULL || pc != 0) { + struct frame *nfp; + 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) + break; + + nfp = fp->fr_savfp; + if (nfp != NULL && nfp <= fp) { + printf("FP %016lx: loop detected, stopping trace\n", + (uintptr_t)nfp); + break; + } + fp = nfp; + + if (fp != NULL) + pc = fp->fr_savpc; + else + pc = 0; + } + pager_close(); +} + +void +panic_action(void) +{ + struct frame *fp; + uintptr_t rip; + + __asm __volatile("movq %%rbp,%0" : "=r" (fp)); + rip = fp->fr_savpc; + + stack_trace(fp, rip); + printf("--> Press a key on the console to reboot <--\n"); + getchar(); + printf("Rebooting...\n"); + exit(1); +} + +void +report_exc(struct trapframe *tf) +{ /* * printf() depends on loader runtime and UEFI firmware health * to produce the console output, in case of exception, the @@ -116,32 +170,8 @@ report_exc(struct trapframe *tf) 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; + stack_trace((struct frame *)tf->tf_rbp, tf->tf_rip); - if (fp != NULL) - fp = fp->fr_savfp; - - if (fp != NULL) - pc = fp->fr_savpc; - else - pc = 0; - } - pager_close(); printf("Machine stopped.\n"); }