[PATCH 14/15] ARM: make relocatable mandatory
Sascha Hauer
s.hauer at pengutronix.de
Thu Apr 25 04:54:38 PDT 2024
Most ARM boards use relocatable binaries already. Make it mandatory
for the remaining boards to better unify the ARM support.
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
arch/arm/Kconfig | 10 ++--------
arch/arm/Makefile | 16 ++--------------
arch/arm/cpu/exceptions_32.S | 2 +-
arch/arm/cpu/start.c | 3 +--
arch/arm/cpu/uncompress.c | 27 +++++++++++----------------
arch/arm/include/asm/barebox-arm.h | 11 ++---------
arch/arm/lib/pbl.lds.S | 18 ++++++------------
arch/arm/lib32/barebox.lds.S | 4 ----
arch/arm/lib64/barebox.lds.S | 4 ----
arch/arm/mach-rockchip/Kconfig | 1 -
arch/arm/mach-zynq/Kconfig | 3 ---
11 files changed, 25 insertions(+), 74 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9acda8d929..6a6d7955d1 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -4,7 +4,6 @@ config ARM
bool
select HAS_KALLSYMS
select HAS_CACHE
- select HAVE_CONFIGURABLE_TEXT_BASE if !RELOCATABLE
select HAVE_IMAGE_COMPRESSION
select HAVE_ARCH_KASAN
select ARCH_HAS_SJLJ
@@ -12,6 +11,8 @@ config ARM
select HAVE_EFI_STUB
select HAVE_PBL_IMAGE
select HAVE_PBL_MULTI_IMAGES
+ select RELOCATABLE
+ select PBL_RELOCATABLE
default y
config ARM_LINUX
@@ -67,7 +68,6 @@ config ARCH_CLPS711X
select GPIOLIB
select HAS_DEBUG_LL
select MFD_SYSCON
- select RELOCATABLE
config ARCH_MVEBU
bool "Marvell EBU platforms"
@@ -115,7 +115,6 @@ config ARCH_TEGRA
select GPIO_TEGRA
select OFDEVICE
select OFTREE
- select RELOCATABLE
select RESET_CONTROLLER
select PINCTRL
@@ -131,7 +130,6 @@ config ARCH_ARM64_VIRT
bool "ARM64 QEMU Virt board"
depends on 64BIT
select CPU_V8
- select RELOCATABLE
select ARM_AMBA
select BOARD_ARM_VIRT
select HW_HAS_PCI
@@ -145,7 +143,6 @@ config ARCH_BCM283X
select CLOCKSOURCE_BCM283X
select ARM_AMBA
select HAS_DEBUG_LL
- select RELOCATABLE
config ARCH_IMX
bool "Freescale iMX-based"
@@ -154,7 +151,6 @@ config ARCH_IMX
select COMMON_CLK
select WATCHDOG_IMX_RESET_SOURCE
select HAS_DEBUG_LL
- select RELOCATABLE
config ARCH_K3
bool "Texas Instruments Inc. K3 multicore SoC architecture"
@@ -229,7 +225,6 @@ config ARCH_VEXPRESS
select AMBA_SP804
select COMMON_CLK
select COMMON_CLK_OF_PROVIDER
- select RELOCATABLE
config ARCH_ZYNQMP
bool "Xilinx ZynqMP-based boards"
@@ -240,7 +235,6 @@ config ARCH_ZYNQMP
select COMMON_CLK
select COMMON_CLK_OF_PROVIDER
select GPIOLIB
- select RELOCATABLE
select HAS_MACB
source "arch/arm/cpu/Kconfig"
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 67362d2023..f98770f66a 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -108,24 +108,12 @@ KBUILD_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
# Add cleanup flags
KBUILD_CPPFLAGS += -fdata-sections -ffunction-sections
-LDFLAGS_barebox += --gc-sections
-LDFLAGS_pbl += --gc-sections
+LDFLAGS_barebox += --gc-sections -pie
+LDFLAGS_pbl += --gc-sections -pie
# early code often runs at addresses we are not linked at
KBUILD_CFLAGS_KERNEL += -fPIE
-ifdef CONFIG_RELOCATABLE
-LDFLAGS_barebox += -pie
-else
-LDFLAGS_barebox += -static
-endif
-
-ifdef CONFIG_PBL_RELOCATABLE
-LDFLAGS_pbl += -pie
-else
-LDFLAGS_pbl += -static
-endif
-
KBUILD_BINARY := barebox.bin
quiet_cmd_mlo ?= IFT $@
diff --git a/arch/arm/cpu/exceptions_32.S b/arch/arm/cpu/exceptions_32.S
index 749c713aab..235996f7ec 100644
--- a/arch/arm/cpu/exceptions_32.S
+++ b/arch/arm/cpu/exceptions_32.S
@@ -128,7 +128,7 @@ fiq:
bad_save_user_regs
bl do_fiq
-#if defined(CONFIG_RELOCATABLE) && defined(CONFIG_ARM_EXCEPTIONS)
+#ifdef CONFIG_ARM_EXCEPTIONS
/*
* With relocatable binary support the runtime exception vectors do not match
* the addresses in the binary. We have to fix them up during runtime
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index cc5529eef5..6d0a7cfc6b 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -158,8 +158,7 @@ __noreturn __prereloc void barebox_non_pbl_start(unsigned long membase,
if (IS_ENABLED(CONFIG_CPU_V7))
armv7_hyp_install();
- if (IS_ENABLED(CONFIG_RELOCATABLE))
- relocate_to_adr(barebox_base);
+ relocate_to_adr(barebox_base);
setup_c();
diff --git a/arch/arm/cpu/uncompress.c b/arch/arm/cpu/uncompress.c
index 4101cb36a4..aa1a49bfc9 100644
--- a/arch/arm/cpu/uncompress.c
+++ b/arch/arm/cpu/uncompress.c
@@ -43,26 +43,21 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize,
pg_start = runtime_address(input_data);
pg_end = runtime_address(input_data_end);
- if (IS_ENABLED(CONFIG_PBL_RELOCATABLE)) {
- /*
- * If we run from inside the memory just relocate the binary
- * to the current address. Otherwise it may be a readonly location.
- * Copy and relocate to the start of the memory in this case.
- */
- if (pc > membase && pc - membase < memsize)
- relocate_to_current_adr();
- else
- relocate_to_adr(membase);
- }
+ /*
+ * If we run from inside the memory just relocate the binary
+ * to the current address. Otherwise it may be a readonly location.
+ * Copy and relocate to the start of the memory in this case.
+ */
+ if (pc > membase && pc - membase < memsize)
+ relocate_to_current_adr();
+ else
+ relocate_to_adr(membase);
pg_len = pg_end - pg_start;
uncompressed_len = get_unaligned((const u32 *)(pg_start + pg_len - 4));
- if (IS_ENABLED(CONFIG_RELOCATABLE))
- barebox_base = arm_mem_barebox_image(membase, endmem,
- uncompressed_len + MAX_BSS_SIZE);
- else
- barebox_base = TEXT_BASE;
+ barebox_base = arm_mem_barebox_image(membase, endmem,
+ uncompressed_len + MAX_BSS_SIZE);
setup_c();
diff --git a/arch/arm/include/asm/barebox-arm.h b/arch/arm/include/asm/barebox-arm.h
index 7a7e5a2403..4d70360b91 100644
--- a/arch/arm/include/asm/barebox-arm.h
+++ b/arch/arm/include/asm/barebox-arm.h
@@ -42,7 +42,7 @@ struct barebox_arm_boarddata *barebox_arm_get_boarddata(void);
#define barebox_arm_get_boarddata barebox_get_boarddata
-#if defined(CONFIG_RELOCATABLE) && defined(CONFIG_ARM_EXCEPTIONS)
+#ifdef CONFIG_ARM_EXCEPTIONS
void arm_fixup_vectors(void);
#else
static inline void arm_fixup_vectors(void)
@@ -127,14 +127,7 @@ static inline unsigned long arm_mem_barebox_image(unsigned long membase,
{
endmem = arm_mem_ramoops(endmem);
- if (IS_ENABLED(CONFIG_RELOCATABLE)) {
- return ALIGN_DOWN(endmem - size, SZ_1M);
- } else {
- if (TEXT_BASE >= membase && TEXT_BASE < endmem)
- return TEXT_BASE;
- else
- return endmem;
- }
+ return ALIGN_DOWN(endmem - size, SZ_1M);
}
/*
diff --git a/arch/arm/lib/pbl.lds.S b/arch/arm/lib/pbl.lds.S
index ec7296f0fb..4f58a4eba0 100644
--- a/arch/arm/lib/pbl.lds.S
+++ b/arch/arm/lib/pbl.lds.S
@@ -25,12 +25,6 @@ PECOFF_FILE_ALIGNMENT = 0x200;
#define PECOFF_EDATA_PADDING
#endif
-#ifdef CONFIG_PBL_RELOCATABLE
-#define BASE 0x0
-#else
-#define BASE (TEXT_BASE - SZ_2M)
-#endif
-
#ifdef CONFIG_HABV4_QSPI
#define HAB_CSF_LEN 0x4000
#else
@@ -42,7 +36,7 @@ OUTPUT_ARCH(BAREBOX_OUTPUT_ARCH)
SECTIONS
{
- . = BASE;
+ . = 0x0;
.image_start : { *(.__image_start) }
@@ -97,7 +91,7 @@ SECTIONS
BAREBOX_RELOCATION_TABLE
- pbl_code_size = . - BASE;
+ pbl_code_size = .;
. = ALIGN(4);
.__bss_start : { *(.__bss_start) }
@@ -105,7 +99,7 @@ SECTIONS
.__bss_stop : { *(.__bss_stop) }
_end = .;
- pbl_memory_size = . - BASE;
+ pbl_memory_size = .;
#if defined(CONFIG_CPU_64) && defined(CONFIG_HABV4)
. = ALIGN(0x1000);
@@ -142,8 +136,8 @@ SECTIONS
.image_end : { KEEP(*(.__image_end)) }
- pbl_image_size = . - BASE;
+ pbl_image_size = .;
- _barebox_image_size = __image_end - BASE;
- _barebox_pbl_size = __bss_start - BASE;
+ _barebox_image_size = __image_end;
+ _barebox_pbl_size = __bss_start;
}
diff --git a/arch/arm/lib32/barebox.lds.S b/arch/arm/lib32/barebox.lds.S
index 90be773840..ad9e9e84ef 100644
--- a/arch/arm/lib32/barebox.lds.S
+++ b/arch/arm/lib32/barebox.lds.S
@@ -9,11 +9,7 @@ OUTPUT_ARCH(BAREBOX_OUTPUT_ARCH)
ENTRY(start)
SECTIONS
{
-#ifdef CONFIG_RELOCATABLE
. = 0x0;
-#else
- . = TEXT_BASE;
-#endif
.image_start : { *(.__image_start) }
. = ALIGN(4);
diff --git a/arch/arm/lib64/barebox.lds.S b/arch/arm/lib64/barebox.lds.S
index a05340ad48..2479646d9d 100644
--- a/arch/arm/lib64/barebox.lds.S
+++ b/arch/arm/lib64/barebox.lds.S
@@ -8,11 +8,7 @@ OUTPUT_ARCH(BAREBOX_OUTPUT_ARCH)
ENTRY(start)
SECTIONS
{
-#ifdef CONFIG_RELOCATABLE
. = 0x0;
-#else
- . = TEXT_BASE;
-#endif
.image_start : { *(.__image_start) }
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index f373624f5c..1421b9e257 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -31,7 +31,6 @@ config ARCH_ROCKCHIP_V8
bool
select CPU_V8
select ARM_ATF
- select RELOCATABLE
config ARCH_RK3399
bool
diff --git a/arch/arm/mach-zynq/Kconfig b/arch/arm/mach-zynq/Kconfig
index be51411a43..2403c2edc3 100644
--- a/arch/arm/mach-zynq/Kconfig
+++ b/arch/arm/mach-zynq/Kconfig
@@ -19,9 +19,6 @@ config ARCH_ZYNQ7000
select HAS_MACB
select OFTREE
select OFDEVICE
- select RELOCATABLE
-
-
menu "select Zynq boards to be built"
--
2.39.2
More information about the barebox
mailing list