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.

As barebox proper is now an ELF file we no longer need to map the entry
function to the start of the image. Just link it to wherever the linker
wants it and drop the text_entry section. Also, remove the start()
function and set the ELF entry to barebox_non_pbl_start() directly.

While at it also remove the bare_init stuff from the barebox proper
linker script as it's only relevant to the PBL linker script which
is a separate script.

Reviewed-by: Ahmad Fatoum <[email protected]>
Signed-off-by: Sascha Hauer <[email protected]>
---
 arch/riscv/Kconfig           |  1 +
 arch/riscv/boot/start.c      | 19 +------------------
 arch/riscv/boot/uncompress.c | 21 ++++++++++++++++++++-
 arch/riscv/lib/barebox.lds.S |  7 +------
 4 files changed, 23 insertions(+), 25 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 
96d013d8514ac12de5c34a426262d85f8cf021b9..d9794354f4ed2e8bf7276e03b968c566002c2ec6
 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -17,6 +17,7 @@ config RISCV
        select HAS_KALLSYMS
        select RISCV_TIMER if RISCV_SBI
        select HW_HAS_PCI
+       select PBL_IMAGE_ELF
        select HAVE_ARCH_BOARD_GENERIC_DT
        select HAVE_ARCH_BOOTM_OFTREE
 
diff --git a/arch/riscv/boot/start.c b/arch/riscv/boot/start.c
index 
5091340c8a374fc360ab732ba01ec8516e82a83d..15bb91ac1b49ada66375507120256daff6b563f4
 100644
--- a/arch/riscv/boot/start.c
+++ b/arch/riscv/boot/start.c
@@ -114,7 +114,7 @@ device_initcall(barebox_memory_areas_init);
  * First function in the uncompressed image. We get here from
  * the pbl. The stack already has been set up by the pbl.
  */
-__noreturn __no_sanitize_address __section(.text_entry)
+__noreturn
 void barebox_non_pbl_start(unsigned long membase, unsigned long memsize,
                           void *boarddata)
 {
@@ -123,12 +123,6 @@ void barebox_non_pbl_start(unsigned long membase, unsigned 
long memsize,
        unsigned long barebox_size = barebox_image_size + MAX_BSS_SIZE;
        unsigned long barebox_base = riscv_mem_barebox_image(membase, endmem, 
barebox_size);
 
-       relocate_to_current_adr();
-
-       setup_c();
-
-       barrier();
-
        irq_init_vector(riscv_mode());
 
        pr_debug("memory at 0x%08lx, size 0x%08lx\n", membase, memsize);
@@ -183,14 +177,3 @@ void barebox_non_pbl_start(unsigned long membase, unsigned 
long memsize,
 
        start_barebox();
 }
-
-void start(unsigned long membase, unsigned long memsize, void *boarddata);
-/*
- * First function in the uncompressed image. We get here from
- * the pbl. The stack already has been set up by the pbl.
- */
-void __no_sanitize_address __section(.text_entry) start(unsigned long membase,
-               unsigned long memsize, void *boarddata)
-{
-       barebox_non_pbl_start(membase, memsize, boarddata);
-}
diff --git a/arch/riscv/boot/uncompress.c b/arch/riscv/boot/uncompress.c
index 
84142acf9c66fe1fcceb6ae63d15ac078ccddee7..d0eb36accb04bfd27504a931a0b30effc3b8237b
 100644
--- a/arch/riscv/boot/uncompress.c
+++ b/arch/riscv/boot/uncompress.c
@@ -32,6 +32,8 @@ void __noreturn barebox_pbl_start(unsigned long membase, 
unsigned long memsize,
        unsigned long barebox_base;
        void *pg_start, *pg_end;
        unsigned long pc = get_pc();
+       struct elf_image elf;
+       int ret;
 
        irq_init_vector(riscv_mode());
 
@@ -68,7 +70,24 @@ void __noreturn barebox_pbl_start(unsigned long membase, 
unsigned long memsize,
 
        sync_caches_for_execution();
 
-       barebox = (void *)barebox_base;
+       ret = elf_open_binary_into(&elf, (void *)barebox_base);
+       if (ret) {
+               pr_err("Failed to open ELF binary: %d\n", ret);
+               hang();
+       }
+
+       ret = elf_load_inplace(&elf);
+       if (ret) {
+               pr_err("Failed to relocate ELF: %d\n", ret);
+               hang();
+       }
+
+       /*
+        * TODO: Add pbl_mmu_setup_from_elf() call when RISC-V PBL
+        * MMU support is implemented, similar to ARM
+        */
+
+       barebox = (void *)(unsigned long)elf.entry;
 
        pr_debug("jumping to uncompressed image at 0x%p. dtb=0x%p\n", barebox, 
fdt);
 
diff --git a/arch/riscv/lib/barebox.lds.S b/arch/riscv/lib/barebox.lds.S
index 
0cfa4bff57920bfaed822cb62c553c49f543994c..e2666938097d2a732067f4bd69140a9969eb0cbb
 100644
--- a/arch/riscv/lib/barebox.lds.S
+++ b/arch/riscv/lib/barebox.lds.S
@@ -14,7 +14,7 @@
 #include <asm/barebox.lds.h>
 
 OUTPUT_ARCH(BAREBOX_OUTPUT_ARCH)
-ENTRY(start)
+ENTRY(barebox_non_pbl_start)
 OUTPUT_FORMAT(BAREBOX_OUTPUT_FORMAT)
 
 PHDRS
@@ -36,16 +36,11 @@ SECTIONS
        .text      :
        {
                _stext = .;
-               *(.text_entry*)
-               __bare_init_start = .;
-               *(.text_bare_init*)
-               __bare_init_end = .;
                __exceptions_start = .;
                KEEP(*(.text_exceptions*))
                __exceptions_stop = .;
                *(.text*)
        } :text
-       BAREBOX_BARE_INIT_SIZE
 
        . = ALIGN(4096);
        __start_rodata = .;

-- 
2.47.3


Reply via email to