aboutsummaryrefslogtreecommitdiff
path: root/bbl
diff options
context:
space:
mode:
authorJessica Clarke <jrtc27@jrtc27.com>2020-04-29 03:24:21 +0100
committerGitHub <noreply@github.com>2020-04-28 19:24:21 -0700
commitd5f5d91b8488b220a51aed3b63aa9de26c1ac73c (patch)
tree7d02e999618cd88c3198e5852aaca1a3acccbd7c /bbl
parent8c125897999720856262f941396a9004b0ff5d3d (diff)
downloadriscv-pk-d5f5d91b8488b220a51aed3b63aa9de26c1ac73c.zip
riscv-pk-d5f5d91b8488b220a51aed3b63aa9de26c1ac73c.tar.gz
riscv-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.
Diffstat (limited to 'bbl')
-rw-r--r--bbl/bbl.c14
-rw-r--r--bbl/bbl.mk.in12
2 files changed, 21 insertions, 5 deletions
diff --git a/bbl/bbl.c b/bbl/bbl.c
index ce1be95..3b92fc1 100644
--- a/bbl/bbl.c
+++ b/bbl/bbl.c
@@ -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