git: b7dae28f364c - stable/13 - loader.efi: Defer efi_translate(e_entry) until after bi_load
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 30 Apr 2026 17:53:39 UTC
The branch stable/13 has been updated by jrtc27:
URL: https://cgit.FreeBSD.org/src/commit/?id=b7dae28f364c05627132abf61a91cf82123b4672
commit b7dae28f364c05627132abf61a91cf82123b4672
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:53:04 +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 99ee498b1b65..1b4e0f596478 100644
--- a/stand/efi/loader/arch/arm/exec.c
+++ b/stand/efi/loader/arch/arm/exec.c
@@ -72,9 +72,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) {
@@ -87,6 +84,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 43c935f4e0a9..8c466e29b04c 100644
--- a/stand/efi/loader/arch/arm64/exec.c
+++ b/stand/efi/loader/arch/arm64/exec.c
@@ -125,7 +125,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);
@@ -136,6 +135,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 686a42028608..4d7a183aa0fc 100644
--- a/stand/efi/loader/arch/riscv/exec.c
+++ b/stand/efi/loader/arch/riscv/exec.c
@@ -59,9 +59,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) {
@@ -75,6 +72,8 @@ __elfN(exec)(struct preloaded_file *fp)
*/
dev_cleanup();
+ entry = efi_translate(e->e_entry);
+
(*entry)((void *)modulep);
panic("exec returned");
}