diff options
author | Jessica Clarke <jrtc27@jrtc27.com> | 2020-04-29 03:24:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-28 19:24:21 -0700 |
commit | d5f5d91b8488b220a51aed3b63aa9de26c1ac73c (patch) | |
tree | 7d02e999618cd88c3198e5852aaca1a3acccbd7c | |
parent | 8c125897999720856262f941396a9004b0ff5d3d (diff) | |
download | pk-d5f5d91b8488b220a51aed3b63aa9de26c1ac73c.zip pk-d5f5d91b8488b220a51aed3b63aa9de26c1ac73c.tar.gz pk-d5f5d91b8488b220a51aed3b63aa9de26c1ac73c.tar.bz2 |
Support --without-payload for OpenSBI fw_jump-style booting (#186)
We expect the firmware to load the external payload at the second
megapage, and that there is space to put the filtered FDT at 0x2200000
past the start of memory. With a default MEM_START of 0x80000000, this
matches the standard OpenSBI values for FW_JUMP_ADDR and
FW_JUMP_FDT_ADDR of 0x80400000/0x80200000 (RV32/RV64) and 0x82200000
respectively, so payloads linked for one should work with the other.
-rw-r--r-- | Makefile.in | 5 | ||||
-rw-r--r-- | bbl/bbl.c | 14 | ||||
-rw-r--r-- | bbl/bbl.mk.in | 12 |
3 files changed, 25 insertions, 6 deletions
diff --git a/Makefile.in b/Makefile.in index 470f306..5c2687d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -111,7 +111,10 @@ VPATH := $(addprefix $(src_dir)/, $(sprojs_enabled)) CC := @CC@ READELF := @READELF@ OBJCOPY := @OBJCOPY@ -CFLAGS := @CFLAGS@ $(CFLAGS) $(march) $(mabi) -DBBL_PAYLOAD=\"bbl_payload\" -DBBL_LOGO_FILE=\"bbl_logo_file\" -fno-stack-protector -U_FORTIFY_SOURCE +CFLAGS := @CFLAGS@ $(CFLAGS) $(march) $(mabi) -DBBL_LOGO_FILE=\"bbl_logo_file\" -DMEM_START=@MEM_START@ -fno-stack-protector -U_FORTIFY_SOURCE +ifneq (@BBL_PAYLOAD@,no) +CFLAGS := $(CFLAGS) -DBBL_PAYLOAD=\"bbl_payload\" +endif BBL_PAYLOAD := @BBL_PAYLOAD@ COMPILE := $(CC) -MMD -MP $(CFLAGS) \ $(sprojs_include) @@ -9,7 +9,14 @@ #include "fdt.h" #include <string.h> +#ifdef BBL_PAYLOAD extern char _payload_start, _payload_end; /* internal payload */ +# define PAYLOAD_START &_payload_start +# define PAYLOAD_END ROUNDUP((uintptr_t)&_payload_end, MEGAPAGE_SIZE) +#else +# define PAYLOAD_START (void*)(MEM_START + MEGAPAGE_SIZE) +# define PAYLOAD_END (void*)(MEM_START + 0x2200000) +#endif static const void* entry_point; long disabled_hart_mask; @@ -23,8 +30,9 @@ static uintptr_t dtb_output() * address. The kernel's virtual mapping begins at its load address, * thus mandating device-tree is in physical memory after the kernel. */ - uintptr_t end = kernel_end ? (uintptr_t)kernel_end : (uintptr_t)&_payload_end; - return (end + MEGAPAGE_SIZE - 1) / MEGAPAGE_SIZE * MEGAPAGE_SIZE; + uintptr_t end = kernel_end ? ROUNDUP((uintptr_t)kernel_end, MEGAPAGE_SIZE) + : (uintptr_t)PAYLOAD_END; + return end; } static void filter_dtb(uintptr_t source) @@ -123,6 +131,6 @@ void boot_loader(uintptr_t dtb) #endif mb(); /* Use optional FDT preloaded external payload if present */ - entry_point = kernel_start ? kernel_start : &_payload_start; + entry_point = kernel_start ? kernel_start : PAYLOAD_START; boot_other_hart(0); } diff --git a/bbl/bbl.mk.in b/bbl/bbl.mk.in index b0ef476..a35e783 100644 --- a/bbl/bbl.mk.in +++ b/bbl/bbl.mk.in @@ -4,7 +4,6 @@ bbl_subproject_deps = \ util \ softfloat \ machine \ - dummy_payload \ bbl_hdrs = \ bbl.h \ @@ -13,13 +12,22 @@ bbl_c_srcs = \ logo.c \ bbl_asm_srcs = \ - payload.S \ raw_logo.S \ +ifeq (@BBL_PAYLOAD@,dummy_payload) +bbl_subproject_deps += \ + dummy_payload +endif + +ifneq (@BBL_PAYLOAD@,no) +bbl_asm_srcs += \ + payload.S + payload.o: bbl_payload bbl_payload: $(BBL_PAYLOAD) if $(READELF) -h $< 2> /dev/null > /dev/null; then $(OBJCOPY) -O binary --set-section-flags .bss=alloc,load,contents $< $@; else cp $< $@; fi +endif raw_logo.o: bbl_logo_file |