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.
Also we no longer have to link the entry point to the beginning of the binary as we can jump to the correct ELF entry point. With this we can remove the text_entry section. Reviewed-by: Ahmad Fatoum <[email protected]> Signed-off-by: Sascha Hauer <[email protected]> --- arch/arm/Kconfig | 1 + arch/arm/cpu/start.c | 13 ++++--------- arch/arm/cpu/uncompress.c | 24 +++++++++++++++++------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5123e9b1402c56db94df6a7a33ae993c61d51fbc..65856977ab41298be36b78c64de857570d575744 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -18,6 +18,7 @@ config ARM select HW_HAS_PCI select ARCH_HAS_DMA_WRITE_COMBINE select HAVE_EFI_LOADER if MMU # for payload unaligned accesses + select PBL_IMAGE_ELF default y config ARCH_LINUX_NAME diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index f7d4507e71588ba5e241b24b952d55e2a4b0f794..2498bdb894c261f587af6542ea4574c497a6edc0 100644 --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -127,8 +127,9 @@ static int barebox_memory_areas_init(void) } device_initcall(barebox_memory_areas_init); -__noreturn __prereloc void barebox_non_pbl_start(unsigned long membase, - unsigned long memsize, struct handoff_data *hd) +__noreturn void barebox_non_pbl_start(unsigned long membase, + unsigned long memsize, + struct handoff_data *hd) { unsigned long endmem = membase + memsize; unsigned long malloc_start, malloc_end; @@ -139,12 +140,6 @@ __noreturn __prereloc void barebox_non_pbl_start(unsigned long membase, if (IS_ENABLED(CONFIG_CPU_V7)) armv7_hyp_install(); - relocate_to_adr(barebox_base); - - setup_c(); - - barrier(); - pbl_barebox_break(); pr_debug("memory at 0x%08lx, size 0x%08lx\n", membase, memsize); @@ -200,7 +195,7 @@ void start(unsigned long membase, unsigned long memsize, struct handoff_data *hd * First function in the uncompressed image. We get here from * the pbl. The stack already has been set up by the pbl. */ -void NAKED __prereloc __section(.text_entry) start(unsigned long membase, +void __section(.text_entry) start(unsigned long membase, unsigned long memsize, struct handoff_data *hd) { barebox_non_pbl_start(membase, memsize, hd); diff --git a/arch/arm/cpu/uncompress.c b/arch/arm/cpu/uncompress.c index b9fc1d04db96e77c8fcd7fd1930798ea1d9294d7..10df5fcba90b3d5f616a9d16e6bdc5120cf54e9d 100644 --- a/arch/arm/cpu/uncompress.c +++ b/arch/arm/cpu/uncompress.c @@ -20,6 +20,7 @@ #include <asm/mmu.h> #include <asm/unaligned.h> #include <compressed-dtb.h> +#include <elf.h> #include <debug_ll.h> @@ -41,6 +42,8 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize, void *pg_start, *pg_end; unsigned long pc = get_pc(); void *handoff_data; + struct elf_image elf; + int ret; /* piggy data is not relocated, so determine the bounds now */ pg_start = runtime_address(input_data); @@ -85,21 +88,28 @@ void __noreturn barebox_pbl_start(unsigned long membase, unsigned long memsize, else if (IS_ENABLED(CONFIG_ARMV7R_MPU)) set_cr(get_cr() | CR_C); - pr_debug("uncompressing barebox binary at 0x%p (size 0x%08x) to 0x%08lx (uncompressed size: 0x%08x)\n", + pr_debug("uncompressing barebox ELF at 0x%p (size 0x%08x) to 0x%08lx (uncompressed size: 0x%08x)\n", pg_start, pg_len, barebox_base, uncompressed_len); pbl_barebox_uncompress((void*)barebox_base, pg_start, pg_len); + pr_debug("relocating ELF in place\n"); + + 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); + + barebox = (void *)(unsigned long)elf.entry; + handoff_data_move(handoff_data); sync_caches_for_execution(); - if (IS_ENABLED(CONFIG_THUMB2_BAREBOX)) - barebox = (void *)(barebox_base + 1); - else - barebox = (void *)barebox_base; - - pr_debug("jumping to uncompressed image at 0x%p\n", barebox); + pr_debug("jumping to ELF entry point at 0x%p\n", barebox); if (IS_ENABLED(CONFIG_CPU_V7) && boot_cpu_mode() == HYP_MODE) armv7_switch_to_hyp(); -- 2.47.3
