mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: BAREBOX <barebox@lists.infradead.org>
Cc: "Claude Sonnet 4.5" <noreply@anthropic.com>,
	Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH v4 16/22] ARM: link ELF image into PBL
Date: Wed, 14 Jan 2026 13:14:41 +0100	[thread overview]
Message-ID: <20260114-pbl-load-elf-v4-16-0afa78d95a7e@pengutronix.de> (raw)
In-Reply-To: <20260114-pbl-load-elf-v4-0-0afa78d95a7e@pengutronix.de>

Instead of linking the raw binary barebox proper image into the PBL link
the ELF image into the PBL. With this barebox proper starts with a properly
linked and fully initialized C environment, so the calls to
relocate_to_adr() and setup_c() can be removed from barebox proper.

Also we no longer have to link the entry point to the beginning of the
binary as we can jump to the correct ELF entry point. With this we can
remove the text_entry section.

Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/Kconfig          |  1 +
 arch/arm/cpu/start.c      | 13 ++++---------
 arch/arm/cpu/uncompress.c | 24 +++++++++++++++++-------
 3 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 5123e9b1402c56db94df6a7a33ae993c61d51fbc..65856977ab41298be36b78c64de857570d575744 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -18,6 +18,7 @@ config ARM
 	select HW_HAS_PCI
 	select ARCH_HAS_DMA_WRITE_COMBINE
 	select HAVE_EFI_LOADER if MMU # for payload unaligned accesses
+	select PBL_IMAGE_ELF
 	default y
 
 config ARCH_LINUX_NAME
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index f7d4507e71588ba5e241b24b952d55e2a4b0f794..2498bdb894c261f587af6542ea4574c497a6edc0 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -127,8 +127,9 @@ static int barebox_memory_areas_init(void)
 }
 device_initcall(barebox_memory_areas_init);
 
-__noreturn __prereloc void barebox_non_pbl_start(unsigned long membase,
-		unsigned long memsize, struct handoff_data *hd)
+__noreturn void barebox_non_pbl_start(unsigned long membase,
+				      unsigned long memsize,
+				      struct handoff_data *hd)
 {
 	unsigned long endmem = membase + memsize;
 	unsigned long malloc_start, malloc_end;
@@ -139,12 +140,6 @@ __noreturn __prereloc void barebox_non_pbl_start(unsigned long membase,
 	if (IS_ENABLED(CONFIG_CPU_V7))
 		armv7_hyp_install();
 
-	relocate_to_adr(barebox_base);
-
-	setup_c();
-
-	barrier();
-
 	pbl_barebox_break();
 
 	pr_debug("memory at 0x%08lx, size 0x%08lx\n", membase, memsize);
@@ -200,7 +195,7 @@ void start(unsigned long membase, unsigned long memsize, struct handoff_data *hd
  * First function in the uncompressed image. We get here from
  * the pbl. The stack already has been set up by the pbl.
  */
-void NAKED __prereloc __section(.text_entry) start(unsigned long membase,
+void __section(.text_entry) start(unsigned long membase,
 		unsigned long memsize, struct handoff_data *hd)
 {
 	barebox_non_pbl_start(membase, memsize, hd);
diff --git a/arch/arm/cpu/uncompress.c b/arch/arm/cpu/uncompress.c
index b9fc1d04db96e77c8fcd7fd1930798ea1d9294d7..10df5fcba90b3d5f616a9d16e6bdc5120cf54e9d 100644
--- a/arch/arm/cpu/uncompress.c
+++ b/arch/arm/cpu/uncompress.c
@@ -20,6 +20,7 @@
 #include <asm/mmu.h>
 #include <asm/unaligned.h>
 #include <compressed-dtb.h>
+#include <elf.h>
 
 #include <debug_ll.h>
 
@@ -41,6 +42,8 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize,
 	void *pg_start, *pg_end;
 	unsigned long pc = get_pc();
 	void *handoff_data;
+	struct elf_image elf;
+	int ret;
 
 	/* piggy data is not relocated, so determine the bounds now */
 	pg_start = runtime_address(input_data);
@@ -85,21 +88,28 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize,
 	else if (IS_ENABLED(CONFIG_ARMV7R_MPU))
 		set_cr(get_cr() | CR_C);
 
-	pr_debug("uncompressing barebox binary at 0x%p (size 0x%08x) to 0x%08lx (uncompressed size: 0x%08x)\n",
+	pr_debug("uncompressing barebox ELF at 0x%p (size 0x%08x) to 0x%08lx (uncompressed size: 0x%08x)\n",
 			pg_start, pg_len, barebox_base, uncompressed_len);
 
 	pbl_barebox_uncompress((void*)barebox_base, pg_start, pg_len);
 
+	pr_debug("relocating ELF in place\n");
+
+	ret = elf_open_binary_into(&elf, (void *)barebox_base);
+	if (ret)
+		panic("Failed to open ELF binary: %d\n", ret);
+
+	ret = elf_load_inplace(&elf);
+	if (ret)
+		panic("Failed to relocate ELF: %d\n", ret);
+
+	barebox = (void *)(unsigned long)elf.entry;
+
 	handoff_data_move(handoff_data);
 
 	sync_caches_for_execution();
 
-	if (IS_ENABLED(CONFIG_THUMB2_BAREBOX))
-		barebox = (void *)(barebox_base + 1);
-	else
-		barebox = (void *)barebox_base;
-
-	pr_debug("jumping to uncompressed image at 0x%p\n", barebox);
+	pr_debug("jumping to ELF entry point at 0x%p\n", barebox);
 
 	if (IS_ENABLED(CONFIG_CPU_V7) && boot_cpu_mode() == HYP_MODE)
 		armv7_switch_to_hyp();

-- 
2.47.3




  parent reply	other threads:[~2026-01-14 12:36 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-14 12:14 [PATCH v4 00/22] PBL: Add PBL ELF loading support with dynamic relocations Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 01/22] Makefile.compiler: add objcopy-option Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 02/22] elf: only accept images matching the native ELF_CLASS Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 03/22] elf: build for PBL as well Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 04/22] elf: add elf segment iterator Sascha Hauer
2026-01-14 13:45   ` Ahmad Fatoum
2026-01-14 12:14 ` [PATCH v4 05/22] elf: add dynamic relocation support Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 06/22] ARM: implement elf_apply_relocations() for ELF " Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 07/22] riscv: define generic relocate_image Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 08/22] riscv: implement elf_apply_relocations() for ELF relocation support Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 09/22] elf: implement elf_load_inplace() Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 10/22] elf: create elf_open_binary_into() Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 11/22] Makefile: add vmbarebox build target Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 12/22] PBL: allow to link ELF image into PBL Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 13/22] mmu: add MAP_CACHED_RO mapping type Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 14/22] ARM: drop arm_fixup_vectors() Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 15/22] ARM: linker script: create separate PT_LOAD segments for text, rodata, and data Sascha Hauer
2026-01-14 15:06   ` Ahmad Fatoum
2026-01-14 12:14 ` Sascha Hauer [this message]
2026-01-14 12:14 ` [PATCH v4 17/22] ARM: cleanup barebox proper entry Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 18/22] ARM: PBL: setup MMU with proper permissions from ELF segments Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 19/22] riscv: linker script: create separate PT_LOAD segments for text, rodata, and data Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 20/22] riscv: link ELF image into PBL Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 21/22] riscv: Allwinner D1: Drop M-Mode Sascha Hauer
2026-01-14 12:14 ` [PATCH v4 22/22] riscv: add ELF segment-based memory protection with MMU Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260114-pbl-load-elf-v4-16-0afa78d95a7e@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=noreply@anthropic.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox