Date: Thu, 30 Apr 2026 17:48:54 +0000 From: Jessica Clarke <jrtc27@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 8eb9eaa37945 - stable/14 - loader.efi: Defer efi_translate(e_entry) until after bi_load Message-ID: <69f39606.3188b.3fa675c9@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/14 has been updated by jrtc27: URL: https://cgit.FreeBSD.org/src/commit/?id=8eb9eaa37945b03af9acbb64ad304cea4d0cc936 commit 8eb9eaa37945b03af9acbb64ad304cea4d0cc936 Author: Jessica Clarke <jrtc27@FreeBSD.org> AuthorDate: 2026-04-17 14:20:12 +0000 Commit: Jessica Clarke <jrtc27@FreeBSD.org> CommitDate: 2026-04-30 17:44:58 +0000 loader.efi: Defer efi_translate(e_entry) until after bi_load bi_load itself loads various things into the staging area which can cause it to grow, which may result in the staging area moving, including the kernel. Therefore the address we get for the kernel entry point prior to bi_load may not be correct afterwards when we actually call it, and so we must defer the translation. On arm and riscv (but not arm64, which predates both of them in loader.efi and did not gain a copy of arm's added printf when arm support was added) we also printf this entry point to the console, which we can no longer do since bi_load calls ExitBootServices, so remove this printf that, in practice, seems to not be so useful, given nobody ever felt the need to add it to arm64. If anyone really feels this is an important printf to have then bi_load will need to be split so we can call printf after all the loading and potential reallocation of the staging area, but before ExitBootServices is called. We may also want to make this code more uniform and shared between the three architectures here, since there isn't much architecture-specific about this (and something like the RISC-V boot hart protocol could easily be made an MD hook). Reviewed by: imp Fixes: 0cafabf97fae ("Add support for arm64 to loader.efi and boot1.efi") Fixes: ea7796a9ae6b ("EFI: don't call printf after ExitBootServices, since it uses Boot Services") Fixes: 2192efc03bc4 ("RISC-V boot1.efi and loader.efi support") MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D56431 (cherry picked from commit ab1d659e78e454995b7c2b4566e035269b215e48) --- stand/efi/loader/arch/arm/exec.c | 5 ++--- stand/efi/loader/arch/arm64/exec.c | 3 ++- stand/efi/loader/arch/riscv/exec.c | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/stand/efi/loader/arch/arm/exec.c b/stand/efi/loader/arch/arm/exec.c index 85a8c26ade30..82106bf95e77 100644 --- a/stand/efi/loader/arch/arm/exec.c +++ b/stand/efi/loader/arch/arm/exec.c @@ -71,9 +71,6 @@ __elfN(arm_exec)(struct preloaded_file *fp) efi_time_fini(); - entry = efi_translate(e->e_entry); - - printf("Kernel entry at %p...\n", entry); printf("Kernel args: %s\n", fp->f_args); if ((error = bi_load(fp->f_args, &modulep, &kernend, true)) != 0) { @@ -86,6 +83,8 @@ __elfN(arm_exec)(struct preloaded_file *fp) dev_cleanup(); + entry = efi_translate(e->e_entry); + (*entry)((void *)modulep); panic("exec returned"); } diff --git a/stand/efi/loader/arch/arm64/exec.c b/stand/efi/loader/arch/arm64/exec.c index 877cff658d1e..3f19955e8530 100644 --- a/stand/efi/loader/arch/arm64/exec.c +++ b/stand/efi/loader/arch/arm64/exec.c @@ -70,7 +70,6 @@ elf64_exec(struct preloaded_file *fp) return(EFTYPE); ehdr = (Elf_Ehdr *)&(md->md_data); - entry = efi_translate(ehdr->e_entry); efi_time_fini(); err = bi_load(fp->f_args, &modulep, &kernendp, true); @@ -81,6 +80,8 @@ elf64_exec(struct preloaded_file *fp) dev_cleanup(); + entry = efi_translate(ehdr->e_entry); + /* Clean D-cache under kernel area and invalidate whole I-cache */ clean_addr = (vm_offset_t)efi_translate(fp->f_addr); clean_size = (vm_offset_t)efi_translate(kernendp) - clean_addr; diff --git a/stand/efi/loader/arch/riscv/exec.c b/stand/efi/loader/arch/riscv/exec.c index 3c40517ea968..ff5c12da1565 100644 --- a/stand/efi/loader/arch/riscv/exec.c +++ b/stand/efi/loader/arch/riscv/exec.c @@ -58,9 +58,6 @@ __elfN(exec)(struct preloaded_file *fp) efi_time_fini(); - entry = efi_translate(e->e_entry); - - printf("Kernel entry at %p...\n", entry); printf("Kernel args: %s\n", fp->f_args); if ((error = bi_load(fp->f_args, &modulep, &kernend, true)) != 0) { @@ -74,6 +71,8 @@ __elfN(exec)(struct preloaded_file *fp) */ dev_cleanup(); + entry = efi_translate(e->e_entry); + (*entry)((void *)modulep); panic("exec returned"); }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69f39606.3188b.3fa675c9>
