diff options
-rw-r--r-- | bbl/bbl.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -4,10 +4,25 @@ #include "vm.h" #include "bits.h" #include "config.h" +#include "fdt.h" #include <string.h> static const void* entry_point; +static uintptr_t dtb_output() +{ + extern char _payload_end; + uintptr_t end = (uintptr_t) &_payload_end; + return (end + MEGAPAGE_SIZE - 1) / MEGAPAGE_SIZE * MEGAPAGE_SIZE; +} + +static void filter_dtb(uintptr_t source) +{ + uintptr_t dest = dtb_output(); + uint32_t size = fdt_size(source); + memcpy((void*)dest, (void*)source, size); +} + void boot_other_hart(uintptr_t dtb) { const void* entry; @@ -15,12 +30,13 @@ void boot_other_hart(uintptr_t dtb) entry = entry_point; mb(); } while (!entry); - enter_supervisor_mode(entry, read_csr(mhartid), dtb); + enter_supervisor_mode(entry, read_csr(mhartid), dtb_output()); } void boot_loader(uintptr_t dtb) { extern char _payload_start; + filter_dtb(dtb); #ifdef PK_ENABLE_LOGO print_logo(); #endif |