[PATCH] arm: relocate: Introduce data-only relocation mode

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Mar 17 08:46:37 CET 2026


Am 16. März 2026 00:54:05 MEZ schrieb Marek Vasut <marek.vasut+renesas at mailbox.org>:
>Introduce new mode of relocation which relocates only data, not code.
>This is mainly meant to relocate data to read-write portion of the RAM,
>while the code remains in read-only portion of the RAM from which it is
>allowed to execute. This split configuration is present on various secure
>cores.

Ilias has been working on supporting RX and RW memory areas via the MMU. Isn't this compatible with code relocation?

Best regards

Heinrich


>
>The result of the relocation is U-Boot running at its original address,
>data relocated to the end of DRAM, but with added read-write area offset.
>The U-Boot binary area is not reserved from the end of the DRAM in this
>relocation mode, because U-Boot itself is not relocated.
>
>Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
>---
>Cc: Casey Connolly <casey.connolly at linaro.org>
>Cc: Heiko Schocher <hs at nabladev.com>
>Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
>Cc: Jerome Forissier <jerome.forissier at arm.com> <jerome at forissier.org>
>Cc: Jesse Taube <mr.bossman075 at gmail.com>
>Cc: Peng Fan <peng.fan at nxp.com>
>Cc: Quentin Schulz <quentin.schulz at cherry.de>
>Cc: Simon Glass <sjg at chromium.org>
>Cc: Tom Rini <trini at konsulko.com>
>Cc: Udit Kumar <u-kumar1 at ti.com>
>Cc: u-boot at lists.denx.de
>---
> Kconfig                 | 17 +++++++++++++++++
> arch/arm/lib/crt0.S     |  4 ++++
> arch/arm/lib/relocate.S | 25 +++++++++++++++++++++++++
> common/board_f.c        |  2 +-
> 4 files changed, 47 insertions(+), 1 deletion(-)
>
>diff --git a/Kconfig b/Kconfig
>index ce25ea24a60..575ee3b574f 100644
>--- a/Kconfig
>+++ b/Kconfig
>@@ -474,6 +474,23 @@ config SKIP_RELOCATE
> 	  Skips relocation of U-Boot allowing for systems that have extremely
> 	  limited RAM to run U-Boot.
> 
>+config SKIP_RELOCATE_CODE
>+	bool "Skips relocation of U-Boot code to end of RAM"
>+	help
>+	  Skips relocation of U-Boot code to the end of RAM, but still does
>+	  relocate data to the end of RAM. This is mainly meant to relocate
>+	  data to read-write portion of the RAM, while the code remains in
>+	  read-only portion of the RAM from which it is allowed to execute.
>+	  This split configuration is present on various secure cores.
>+
>+config SKIP_RELOCATE_CODE_DATA_OFFSET
>+	hex "Offset of read-write data memory from read-only text memory"
>+	default 0x0
>+	depends on SKIP_RELOCATE_CODE
>+	help
>+	  Offset of the read-write memory which contains data, from read-only
>+	  memory which contains executable text.
>+
> endif # EXPERT
> 
> config PHYS_64BIT
>diff --git a/arch/arm/lib/crt0.S b/arch/arm/lib/crt0.S
>index d10c129705d..f2c5aa37a8f 100644
>--- a/arch/arm/lib/crt0.S
>+++ b/arch/arm/lib/crt0.S
>@@ -157,7 +157,11 @@ ENTRY(_main)
> 	orr	lr, #1				/* As required by Thumb-only */
> #endif
> 	ldr	r0, [r9, #GD_RELOCADDR]		/* r0 = gd->relocaddr */
>+#if defined(CONFIG_SKIP_RELOCATE_CODE)
>+	bl	relocate_code
>+#else
> 	b	relocate_code
>+#endif
> here:
> /*
>  * now relocate vectors
>diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S
>index 6ee58f4edfe..b6a648708f4 100644
>--- a/arch/arm/lib/relocate.S
>+++ b/arch/arm/lib/relocate.S
>@@ -79,6 +79,15 @@ ENDPROC(relocate_vectors)
> ENTRY(relocate_code)
> relocate_base:
> 	adr	r3, relocate_base
>+
>+#ifdef CONFIG_SKIP_RELOCATE_CODE
>+	mov r4,	#CONFIG_SKIP_RELOCATE_CODE_DATA_OFFSET
>+
>+	ldr	r1, _data_start_ofs
>+	add	r5, r1, r3		/* r5 <- Run &__data_start */
>+	ldr	r1, _data_end_ofs
>+	add	r6, r1, r3		/* r6 <- Run &__data_end */
>+#else
> 	ldr	r1, _image_copy_start_ofs
> 	add	r1, r3			/* r1 <- Run &__image_copy_start */
> 	subs	r4, r0, r1		/* r4 <- Run to copy offset      */
>@@ -90,6 +99,7 @@ copy_loop:
> 	stmia	r0!, {r10-r11}		/* copy to   target address [r0] */
> 	cmp	r1, r2			/* until source end address [r2] */
> 	blo	copy_loop
>+#endif
> 
> 	/*
> 	 * fix .rel.dyn relocations
>@@ -107,6 +117,15 @@ fixloop:
> 	/* relative fix: increase location by offset */
> 	add	r0, r0, r4
> 	ldr	r1, [r0]
>+
>+#ifdef CONFIG_SKIP_RELOCATE_CODE
>+	/* Test whether this is data, if not, do not relocate. */
>+	cmp	r1, r5
>+	blt	fixnext
>+	cmp	r1, r6
>+	bgt	fixnext
>+#endif
>+
> 	add	r1, r1, r4
> 	str	r1, [r0]
> fixnext:
>@@ -126,3 +145,9 @@ _rel_dyn_start_ofs:
> 	.word	__rel_dyn_start - relocate_code
> _rel_dyn_end_ofs:
> 	.word	__rel_dyn_end - relocate_code
>+#ifdef CONFIG_SKIP_RELOCATE_CODE
>+_data_start_ofs:
>+	.word	__data_start - relocate_code
>+_data_end_ofs:
>+	.word	__data_end - relocate_code
>+#endif
>diff --git a/common/board_f.c b/common/board_f.c
>index df2b0dc899b..bd45669aef5 100644
>--- a/common/board_f.c
>+++ b/common/board_f.c
>@@ -463,7 +463,7 @@ static int reserve_uboot(void)
> 	if (CONFIG_IS_ENABLED(SKIP_RELOCATE))
> 		gd->flags |= GD_FLG_SKIP_RELOC;
> 
>-	if (!(gd->flags & GD_FLG_SKIP_RELOC)) {
>+	if (!(gd->flags & GD_FLG_SKIP_RELOC) && !CONFIG_IS_ENABLED(SKIP_RELOCATE_CODE)) {
> 		/*
> 		 * reserve memory for U-Boot code, data & bss
> 		 * round down to next 4 kB limit



More information about the U-Boot mailing list