Hi,
On 1/5/26 12:26 PM, Sascha Hauer wrote:
> 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.
>
> Signed-off-by: Sascha Hauer <[email protected]>
> ---
> arch/arm/Kconfig | 2 ++
> arch/arm/cpu/start.c | 4 ----
> arch/arm/cpu/uncompress.c | 32 ++++++++++++++++++++++++++------
> 3 files changed, 28 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index
> afa6de3cd0b145e42755e3ca2d7a13c8a69ff1d3..60975083b32f3127f982c526c6cf30ffe3e45924
> 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -17,6 +17,8 @@ config ARM
> select HAVE_ARCH_BOOTM_OFTREE
> select HW_HAS_PCI
> select ARCH_HAS_DMA_WRITE_COMBINE
> + select ELF
> + 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..71a12abdd0941889617e6b63063304d0e4522c81
> 100644
> --- a/arch/arm/cpu/start.c
> +++ b/arch/arm/cpu/start.c
> @@ -139,10 +139,6 @@ __noreturn __prereloc void
> barebox_non_pbl_start(unsigned long membase,
void NAKED __prereloc __section(.text_entry) start should no longer be
needed as well as the .text_entry section itself.
> if (IS_ENABLED(CONFIG_CPU_V7))
> armv7_hyp_install();
>
> - relocate_to_adr(barebox_base);
> -
> - setup_c();
> -
> barrier();
You can also drop the barrier while at it.
> + struct elf_image elf;
> + int ret;
Move to start of function?
> +
> + ret = elf_open_binary_into(&elf, (void *)barebox_base);
> + if (ret) {
> + pr_err("Failed to open ELF binary: %d\n", ret);
> + hang();
panic?
> + }
> +
> + ret = elf_load_inplace(&elf);
> + if (ret) {
> + pr_err("Failed to relocate ELF: %d\n", ret);
> + hang();
panic?
> + }
> +
> + pr_debug("ELF entry point: 0x%llx\n", elf.entry);
>
> if (IS_ENABLED(CONFIG_THUMB2_BAREBOX))
> - barebox = (void *)(barebox_base + 1);
> + barebox = (void *)(unsigned long)(elf.entry | 1);
In my testing the ELF file already had an odd address. Was it different
for you?
> else
> - barebox = (void *)barebox_base;
> + barebox = (void *)(unsigned long)elf.entry;
I have patches that I can submit afterwards that share some of the ELF
info with barebox proper. This allows us to avoid recomputing addresses
relative to endmem again and just use the info extract from the ELF.
Cheers,
Ahmad
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |