From b14d4187fe1a328b9e87f61a984fd70e17211954 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Fri, 17 Feb 2017 01:54:52 -0800 Subject: Clean up boot loader for physical address loading --- bbl/bbl.c | 11 +++++------ bbl/bbl.h | 9 +-------- bbl/kernel_elf.c | 8 ++------ 3 files changed, 8 insertions(+), 20 deletions(-) (limited to 'bbl') diff --git a/bbl/bbl.c b/bbl/bbl.c index 96605fd..bdd56ad 100644 --- a/bbl/bbl.c +++ b/bbl/bbl.c @@ -6,25 +6,24 @@ #include "config.h" #include -static kernel_elf_info info; -static volatile int elf_loaded; +static volatile uintptr_t entry_point; void boot_other_hart() { - while (!elf_loaded) + while (!entry_point) ; mb(); - enter_supervisor_mode((void *)info.entry + info.load_offset, read_csr(mhartid), 0); + enter_supervisor_mode((void *)entry_point, read_csr(mhartid), 0); } void boot_loader() { extern char _payload_start, _payload_end; - load_kernel_elf(&_payload_start, &_payload_end - &_payload_start, &info); + uintptr_t entry = load_kernel_elf(&_payload_start, &_payload_end - &_payload_start); #ifdef PK_ENABLE_LOGO print_logo(); #endif mb(); - elf_loaded = 1; + entry_point = entry; boot_other_hart(); } diff --git a/bbl/bbl.h b/bbl/bbl.h index e9e1dab..67997b9 100644 --- a/bbl/bbl.h +++ b/bbl/bbl.h @@ -8,14 +8,7 @@ #include #include -typedef struct { - uintptr_t entry; - uintptr_t first_user_vaddr; - uintptr_t first_vaddr_after_user; - uintptr_t load_offset; -} kernel_elf_info; - -void load_kernel_elf(void* blob, size_t size, kernel_elf_info* info); +uintptr_t load_kernel_elf(void* blob, size_t size); void print_logo(); #endif // !__ASSEMBLER__ diff --git a/bbl/kernel_elf.c b/bbl/kernel_elf.c index e22c35c..096a690 100644 --- a/bbl/kernel_elf.c +++ b/bbl/kernel_elf.c @@ -7,7 +7,7 @@ #include #include -void load_kernel_elf(void* blob, size_t size, kernel_elf_info* info) +uintptr_t load_kernel_elf(void* blob, size_t size) { Elf_Ehdr* eh = blob; if (sizeof(*eh) > size || @@ -43,11 +43,7 @@ void load_kernel_elf(void* blob, size_t size, kernel_elf_info* info) } } - info->entry = eh->e_entry; - info->load_offset = bias; - info->first_user_vaddr = min_vaddr; - info->first_vaddr_after_user = ROUNDUP(max_vaddr - bias, RISCV_PGSIZE); - return; + return eh->e_entry + bias; fail: die("failed to load payload"); -- cgit v1.1