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 00/22] PBL: Add PBL ELF loading support with dynamic relocations
Date: Wed, 14 Jan 2026 13:14:25 +0100 [thread overview]
Message-ID: <20260114-pbl-load-elf-v4-0-0afa78d95a7e@pengutronix.de> (raw)
Until now we linked the raw barebox proper binary into the PBL which
comes with a number of disadvantages. We rely on self-modifying code
to in barebox proper (relocate_to_current_adr()) and have no initialized
bss segment (setup_c()). Also we can only mark the .text and .rodata as
readonly during runtime of barebox proper.
This series overcomes this by linking a ELF image into the PBL. This
image is properly layed out, linked and initialized in the PBL. With
this barebox proper has a proper C environment and text/rodata
protection from the start.
As a bonus this series also adds initial MMU support for RISCV, also
based on loading the ELF image and configuring the MMU from the PBL.
I lost track about the review feedback for v1, partly because I asked
Claude to integrate the review feedback for me, which it did, but not
completely. Nevertheless I think this series has enough changes for now
so that it deserves a second look.
What I didn't care about yet is that we found out that neither ARM nor
RiscV use any absolute relocations, so we might be able to remove
support for them, make sure these are not emitted during compile time,
or properly test/fix them when we discover that they are indeed needed.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
Changes in v4:
- remove --remove-section=.note.gnu.build-id, catched by
--remove-section=.note*
- actually use __image_* in remap_range_end_sans_image()
- drop pbl_remap_range in favor of remap_range()
- drop duplicate ELF entry point pr_debug()
- add static inline wrapper for pbl_mmu_setup_from_elf()
- reorder segments
- make dynamic section RO
- introduce elf_for_each_segment()
- Use lowest vaddr segment for base address
- Link to v3: https://lore.barebox.org/20260108-pbl-load-elf-v3-0-e28c931fc179@pengutronix.de
Changes in v3:
- integrate Ahmads feedback
- cleanup barebox proper entry
- add missing "ax" flag to ARM exception table, and let linker do the
fixup
- Link to v2: https://lore.barebox.org/20260106-pbl-load-elf-v2-0-487bc760f045@pengutronix.de
Changes in v2:
- rebased on Ahmads patches and with it reused existing relocate_image()
- hopefully integrated all feedback for v1
- Link to v1: https://lore.barebox.org/20260105-pbl-load-elf-v1-0-e97853f98232@pengutronix.de
---
Sascha Hauer (22):
Makefile.compiler: add objcopy-option
elf: only accept images matching the native ELF_CLASS
elf: build for PBL as well
elf: add elf segment iterator
elf: add dynamic relocation support
ARM: implement elf_apply_relocations() for ELF relocation support
riscv: define generic relocate_image
riscv: implement elf_apply_relocations() for ELF relocation support
elf: implement elf_load_inplace()
elf: create elf_open_binary_into()
Makefile: add vmbarebox build target
PBL: allow to link ELF image into PBL
mmu: add MAP_CACHED_RO mapping type
ARM: drop arm_fixup_vectors()
ARM: linker script: create separate PT_LOAD segments for text, rodata, and data
ARM: link ELF image into PBL
ARM: cleanup barebox proper entry
ARM: PBL: setup MMU with proper permissions from ELF segments
riscv: linker script: create separate PT_LOAD segments for text, rodata, and data
riscv: link ELF image into PBL
riscv: Allwinner D1: Drop M-Mode
riscv: add ELF segment-based memory protection with MMU
Makefile | 14 +-
arch/arm/Kconfig | 1 +
arch/arm/cpu/exceptions_32.S | 54 +----
arch/arm/cpu/interrupts_32.c | 5 +-
arch/arm/cpu/mmu-common.c | 31 ++-
arch/arm/cpu/mmu-common.h | 3 +-
arch/arm/cpu/mmu_32.c | 6 +-
arch/arm/cpu/mmu_64.c | 2 +-
arch/arm/cpu/no-mmu.c | 2 -
arch/arm/cpu/start.c | 22 +-
arch/arm/cpu/uncompress.c | 34 ++-
arch/arm/include/asm/barebox-arm.h | 4 -
arch/arm/include/asm/elf.h | 7 +
arch/arm/lib32/barebox.lds.S | 42 ++--
arch/arm/lib32/reloc.c | 19 ++
arch/arm/lib64/barebox.lds.S | 38 ++--
arch/arm/lib64/reloc.c | 21 +-
arch/riscv/Kconfig | 18 ++
arch/riscv/Kconfig.socs | 1 -
arch/riscv/boot/start.c | 19 +-
arch/riscv/boot/uncompress.c | 34 ++-
arch/riscv/cpu/Makefile | 1 +
arch/riscv/cpu/mmu.c | 354 +++++++++++++++++++++++++++++
arch/riscv/cpu/mmu.h | 120 ++++++++++
arch/riscv/include/asm/asm.h | 3 +-
arch/riscv/include/asm/mmu.h | 36 +++
arch/riscv/lib/barebox.lds.S | 45 ++--
arch/riscv/lib/reloc.c | 43 ++--
common/Makefile | 2 +-
common/elf.c | 446 +++++++++++++++++++++++++++++++++++--
include/elf.h | 79 +++++++
include/mmu.h | 3 +-
include/pbl/mmu.h | 38 ++++
pbl/Kconfig | 9 +
pbl/Makefile | 1 +
pbl/mmu.c | 107 +++++++++
scripts/Makefile.compiler | 5 +
37 files changed, 1452 insertions(+), 217 deletions(-)
---
base-commit: 2f99ee71fb44dc60b60d234fb38e0b3c6932f02b
change-id: 20251227-pbl-load-elf-cb4cb0ceb7d8
Best regards,
--
Sascha Hauer <s.hauer@pengutronix.de>
next reply other threads:[~2026-01-14 12:15 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-14 12:14 Sascha Hauer [this message]
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 ` [PATCH v4 16/22] ARM: link ELF image into PBL Sascha Hauer
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-0-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