[PATCH v3 0/2] arm: s5p4418: fix relocation

Fix relocation of u-boot for s5p4418-SoC. I.e. use __image_copy_start instead of _start to calculate the monitor length. Furthermore use an adapted version of relocate_vectors for the s5p4418-SoC. Background: The header (NSIH) used by the 2nd-bootloader (included at the begin of u-boot.bin) is not loaded into RAM. Therefore _start has to be after the header and therefore is not equal to __image_copy_start which is at the begin of the header.
Changes in v3: - MICROBLAZE has not built anymore. Therefore do change calculation of gd->mon_len for ARCH_NEXELL only. This makes sure that MICROBLAZE and other ARM-boards are not affected.
Changes in v2: - Cosmetic: Fix spelling mistake in commit message
Stefan Bosch (2): common: board_f: change calculation of gd->mon_len to fix s5p4418 reloc arm: s5p4418: fix relocation of vectors
arch/arm/cpu/armv7/s5p4418/Makefile | 3 +++ arch/arm/cpu/armv7/s5p4418/relocate.S | 24 ++++++++++++++++++++++++ common/board_f.c | 4 +++- 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 arch/arm/cpu/armv7/s5p4418/relocate.S

ARCH_NEXELL: Change calculation of monitor length (gd->mon_len) to fix relocation at boards with s5p4418-SoC (ARCH_NEXELL). At s5p4418, _start is after the header (NSIH). Therefore the monitor length has to be calculated using __image_copy_start instead of _start in order the whole monitor code is relocated.
Signed-off-by: Stefan Bosch stefan_b@posteo.net ---
Changes in v3: - MICROBLAZE has not built anymore. Therefore do change calculation of gd->mon_len for ARCH_NEXELL only. This makes sure that MICROBLAZE and other ARM-boards are not affected.
Changes in v2: - Cosmetic: Fix spelling mistake in commit message
common/board_f.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/common/board_f.c b/common/board_f.c index d4d7d01f8f..73297fc1b2 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -282,7 +282,9 @@ static int init_func_i2c(void)
static int setup_mon_len(void) { -#if defined(__ARM__) || defined(__MICROBLAZE__) +#if defined(CONFIG_ARCH_NEXELL) + gd->mon_len = (ulong)__bss_end - (ulong)__image_copy_start; +#elif defined(__ARM__) || defined(__MICROBLAZE__) gd->mon_len = (ulong)__bss_end - (ulong)_start; #elif defined(CONFIG_SANDBOX) && !defined(__riscv) gd->mon_len = (ulong)_end - (ulong)_init;

On Fri, Jan 26, 2024 at 12:50:55PM +0000, Stefan Bosch wrote:
ARCH_NEXELL: Change calculation of monitor length (gd->mon_len) to fix relocation at boards with s5p4418-SoC (ARCH_NEXELL). At s5p4418, _start is after the header (NSIH). Therefore the monitor length has to be calculated using __image_copy_start instead of _start in order the whole monitor code is relocated.
Signed-off-by: Stefan Bosch stefan_b@posteo.net
Applied to u-boot/next, thanks!

The header (NSIH) used for the s5p4418-SoC is not loaded into RAM by the 2nd-bootloader, see boot0.h. Therefore, use an adapted version of relocate_vectors which relocates the vectors after the header (at _start) instead of the 'dummy'-vectors at the start of the header (at __image_copy_start).
Signed-off-by: Stefan Bosch stefan_b@posteo.net ---
(no changes since v1)
arch/arm/cpu/armv7/s5p4418/Makefile | 3 +++ arch/arm/cpu/armv7/s5p4418/relocate.S | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 arch/arm/cpu/armv7/s5p4418/relocate.S
diff --git a/arch/arm/cpu/armv7/s5p4418/Makefile b/arch/arm/cpu/armv7/s5p4418/Makefile index 321b257b6d..58042581c4 100644 --- a/arch/arm/cpu/armv7/s5p4418/Makefile +++ b/arch/arm/cpu/armv7/s5p4418/Makefile @@ -2,5 +2,8 @@ # # (C) Copyright 2016 Nexell # Hyunseok, Jung hsjung@nexell.co.kr +# +# Copyright (C) 2023 Stefan Bosch stefan_b@posteo.net
obj-y += cpu.o +obj-y += relocate.o diff --git a/arch/arm/cpu/armv7/s5p4418/relocate.S b/arch/arm/cpu/armv7/s5p4418/relocate.S new file mode 100644 index 0000000000..d6e76adceb --- /dev/null +++ b/arch/arm/cpu/armv7/s5p4418/relocate.S @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * relocate - S5P4418 specific relocation for ARM U-Boot + * + * Copyright (c) 2013 Albert ARIBAUD albert.u.boot@aribaud.net + * Copyright (C) 2023 Stefan Bosch stefan_b@posteo.net + */ + +#include <asm-offsets.h> +#include <asm/assembler.h> +#include <linux/linkage.h> + +ENTRY(relocate_vectors) + + /* + * The s5p4418 SoC has the security extensions, so use VBAR to relocate + * the exception vectors. + */ + ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */ + add r0, #0x400 /* vectors are after NSIH + 0x200 */ + mcr p15, 0, r0, c12, c0, 0 /* Set VBAR */ + ret lr + +ENDPROC(relocate_vectors)

Hi,
2024년 1월 26일 (금) 21:53, Stefan Bosch stefan_b@posteo.net님이 작성:
The header (NSIH) used for the s5p4418-SoC is not loaded into RAM by the 2nd-bootloader, see boot0.h. Therefore, use an adapted version of relocate_vectors which relocates the vectors after the header (at _start) instead of the 'dummy'-vectors at the start of the header (at __image_copy_start).
Signed-off-by: Stefan Bosch stefan_b@posteo.net
(no changes since v1)
arch/arm/cpu/armv7/s5p4418/Makefile | 3 +++ arch/arm/cpu/armv7/s5p4418/relocate.S | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 arch/arm/cpu/armv7/s5p4418/relocate.S
diff --git a/arch/arm/cpu/armv7/s5p4418/Makefile b/arch/arm/cpu/armv7/s5p4418/Makefile index 321b257b6d..58042581c4 100644 --- a/arch/arm/cpu/armv7/s5p4418/Makefile +++ b/arch/arm/cpu/armv7/s5p4418/Makefile @@ -2,5 +2,8 @@ # # (C) Copyright 2016 Nexell # Hyunseok, Jung hsjung@nexell.co.kr +# +# Copyright (C) 2023 Stefan Bosch stefan_b@posteo.net
obj-y += cpu.o +obj-y += relocate.o diff --git a/arch/arm/cpu/armv7/s5p4418/relocate.S b/arch/arm/cpu/armv7/s5p4418/relocate.S new file mode 100644 index 0000000000..d6e76adceb --- /dev/null +++ b/arch/arm/cpu/armv7/s5p4418/relocate.S @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/*
- relocate - S5P4418 specific relocation for ARM U-Boot
- Copyright (c) 2013 Albert ARIBAUD albert.u.boot@aribaud.net
- Copyright (C) 2023 Stefan Bosch stefan_b@posteo.net
- */
+#include <asm-offsets.h> +#include <asm/assembler.h> +#include <linux/linkage.h>
+ENTRY(relocate_vectors)
/*
* The s5p4418 SoC has the security extensions, so use VBAR to
relocate
* the exception vectors.
*/
ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
add r0, #0x400 /* vectors are after NSIH
- 0x200 */
mcr p15, 0, r0, c12, c0, 0 /* Set VBAR */
ret lr
+ENDPROC(relocate_vectors)
2.17.1
Reviewed-by: Minkyu Kang mk7.kang@samsung.com
Thanks. Minkyu Kang.

On Fri, Jan 26, 2024 at 12:50:56PM +0000, Stefan Bosch wrote:
The header (NSIH) used for the s5p4418-SoC is not loaded into RAM by the 2nd-bootloader, see boot0.h. Therefore, use an adapted version of relocate_vectors which relocates the vectors after the header (at _start) instead of the 'dummy'-vectors at the start of the header (at __image_copy_start).
Signed-off-by: Stefan Bosch stefan_b@posteo.net Reviewed-by: Minkyu Kang mk7.kang@samsung.com
Applied to u-boot/next, thanks!

Hi, Tom.
Could you please pick this patchset up?
2024년 1월 27일 (토) 05:03, Stefan Bosch stefan_b@posteo.net님이 작성:
Fix relocation of u-boot for s5p4418-SoC. I.e. use __image_copy_start instead of _start to calculate the monitor length. Furthermore use an adapted version of relocate_vectors for the s5p4418-SoC. Background: The header (NSIH) used by the 2nd-bootloader (included at the begin of u-boot.bin) is not loaded into RAM. Therefore _start has to be after the header and therefore is not equal to __image_copy_start which is at the begin of the header.
Changes in v3:
- MICROBLAZE has not built anymore. Therefore do change calculation of gd->mon_len for ARCH_NEXELL only. This makes sure that MICROBLAZE and other ARM-boards are not affected.
Changes in v2:
- Cosmetic: Fix spelling mistake in commit message
Stefan Bosch (2): common: board_f: change calculation of gd->mon_len to fix s5p4418 reloc arm: s5p4418: fix relocation of vectors
arch/arm/cpu/armv7/s5p4418/Makefile | 3 +++ arch/arm/cpu/armv7/s5p4418/relocate.S | 24 ++++++++++++++++++++++++ common/board_f.c | 4 +++- 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 arch/arm/cpu/armv7/s5p4418/relocate.S
-- 2.17.1
Thanks. Minkyu Kang.
participants (3)
-
Minkyu Kang
-
Stefan Bosch
-
Tom Rini