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 v5 20/22] riscv: link ELF image into PBL
Date: Fri, 16 Jan 2026 09:12:31 +0100	[thread overview]
Message-ID: <20260116-pbl-load-elf-v5-20-51d042021c5a@pengutronix.de> (raw)
In-Reply-To: <20260116-pbl-load-elf-v5-0-51d042021c5a@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.

As barebox proper is now an ELF file we no longer need to map the entry
function to the start of the image. Just link it to wherever the linker
wants it and drop the text_entry section. Also, remove the start()
function and set the ELF entry to barebox_non_pbl_start() directly.

While at it also remove the bare_init stuff from the barebox proper
linker script as it's only relevant to the PBL linker script which
is a separate script.

Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/riscv/Kconfig           |  1 +
 arch/riscv/boot/start.c      | 19 +------------------
 arch/riscv/boot/uncompress.c | 17 ++++++++++++++++-
 arch/riscv/lib/barebox.lds.S |  7 +------
 4 files changed, 19 insertions(+), 25 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 96d013d851..d9794354f4 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -17,6 +17,7 @@ config RISCV
 	select HAS_KALLSYMS
 	select RISCV_TIMER if RISCV_SBI
 	select HW_HAS_PCI
+	select PBL_IMAGE_ELF
 	select HAVE_ARCH_BOARD_GENERIC_DT
 	select HAVE_ARCH_BOOTM_OFTREE
 
diff --git a/arch/riscv/boot/start.c b/arch/riscv/boot/start.c
index 5091340c8a..15bb91ac1b 100644
--- a/arch/riscv/boot/start.c
+++ b/arch/riscv/boot/start.c
@@ -114,7 +114,7 @@ device_initcall(barebox_memory_areas_init);
  * First function in the uncompressed image. We get here from
  * the pbl. The stack already has been set up by the pbl.
  */
-__noreturn __no_sanitize_address __section(.text_entry)
+__noreturn
 void barebox_non_pbl_start(unsigned long membase, unsigned long memsize,
 			   void *boarddata)
 {
@@ -123,12 +123,6 @@ void barebox_non_pbl_start(unsigned long membase, unsigned long memsize,
 	unsigned long barebox_size = barebox_image_size + MAX_BSS_SIZE;
 	unsigned long barebox_base = riscv_mem_barebox_image(membase, endmem, barebox_size);
 
-	relocate_to_current_adr();
-
-	setup_c();
-
-	barrier();
-
 	irq_init_vector(riscv_mode());
 
 	pr_debug("memory at 0x%08lx, size 0x%08lx\n", membase, memsize);
@@ -183,14 +177,3 @@ void barebox_non_pbl_start(unsigned long membase, unsigned long memsize,
 
 	start_barebox();
 }
-
-void start(unsigned long membase, unsigned long memsize, void *boarddata);
-/*
- * First function in the uncompressed image. We get here from
- * the pbl. The stack already has been set up by the pbl.
- */
-void __no_sanitize_address __section(.text_entry) start(unsigned long membase,
-		unsigned long memsize, void *boarddata)
-{
-	barebox_non_pbl_start(membase, memsize, boarddata);
-}
diff --git a/arch/riscv/boot/uncompress.c b/arch/riscv/boot/uncompress.c
index 84142acf9c..9527dd1d7d 100644
--- a/arch/riscv/boot/uncompress.c
+++ b/arch/riscv/boot/uncompress.c
@@ -32,6 +32,8 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize,
 	unsigned long barebox_base;
 	void *pg_start, *pg_end;
 	unsigned long pc = get_pc();
+	struct elf_image elf;
+	int ret;
 
 	irq_init_vector(riscv_mode());
 
@@ -68,7 +70,20 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize,
 
 	sync_caches_for_execution();
 
-	barebox = (void *)barebox_base;
+	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);
+
+	/*
+	 * TODO: Add pbl_mmu_setup_from_elf() call when RISC-V PBL
+	 * MMU support is implemented, similar to ARM
+	 */
+
+	barebox = (void *)(unsigned long)elf.entry;
 
 	pr_debug("jumping to uncompressed image at 0x%p. dtb=0x%p\n", barebox, fdt);
 
diff --git a/arch/riscv/lib/barebox.lds.S b/arch/riscv/lib/barebox.lds.S
index 0cfa4bff57..e266693809 100644
--- a/arch/riscv/lib/barebox.lds.S
+++ b/arch/riscv/lib/barebox.lds.S
@@ -14,7 +14,7 @@
 #include <asm/barebox.lds.h>
 
 OUTPUT_ARCH(BAREBOX_OUTPUT_ARCH)
-ENTRY(start)
+ENTRY(barebox_non_pbl_start)
 OUTPUT_FORMAT(BAREBOX_OUTPUT_FORMAT)
 
 PHDRS
@@ -36,16 +36,11 @@ SECTIONS
 	.text      :
 	{
 		_stext = .;
-		*(.text_entry*)
-		__bare_init_start = .;
-		*(.text_bare_init*)
-		__bare_init_end = .;
 		__exceptions_start = .;
 		KEEP(*(.text_exceptions*))
 		__exceptions_stop = .;
 		*(.text*)
 	} :text
-	BAREBOX_BARE_INIT_SIZE
 
 	. = ALIGN(4096);
 	__start_rodata = .;

-- 
2.47.3




  parent reply	other threads:[~2026-01-16  8:36 UTC|newest]

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