Message ID | 20200214072127.64330-2-anup.patel@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | RISC-V Spike machine improvements | expand |
On Thu, Feb 13, 2020 at 11:24 PM Anup Patel <anup.patel@wdc.com> wrote: > > This patch adds an optional function pointer, "sym_cb", to > riscv_load_firmware() which provides the possibility to access > the symbol table during kernel loading. > > The pointer is ignored, if supplied with flat (non-elf) firmware image. > > The Spike board requires it locate the HTIF symbols from firmware ELF > passed via "-bios" option. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > hw/riscv/boot.c | 13 ++++++++----- > hw/riscv/sifive_u.c | 2 +- > hw/riscv/virt.c | 2 +- > include/hw/riscv/boot.h | 6 ++++-- > 4 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c > index 027303d2a3..7ec94dc701 100644 > --- a/hw/riscv/boot.c > +++ b/hw/riscv/boot.c > @@ -36,7 +36,8 @@ > > void riscv_find_and_load_firmware(MachineState *machine, > const char *default_machine_firmware, > - hwaddr firmware_load_addr) > + hwaddr firmware_load_addr, > + symbol_fn_t sym_cb) > { > char *firmware_filename = NULL; > > @@ -76,7 +77,7 @@ void riscv_find_and_load_firmware(MachineState *machine, > > if (firmware_filename) { > /* If not "none" load the firmware */ > - riscv_load_firmware(firmware_filename, firmware_load_addr); > + riscv_load_firmware(firmware_filename, firmware_load_addr, sym_cb); > g_free(firmware_filename); > } > } > @@ -96,12 +97,14 @@ char *riscv_find_firmware(const char *firmware_filename) > } > > target_ulong riscv_load_firmware(const char *firmware_filename, > - hwaddr firmware_load_addr) > + hwaddr firmware_load_addr, > + symbol_fn_t sym_cb) > { > uint64_t firmware_entry, firmware_start, firmware_end; > > - if (load_elf(firmware_filename, NULL, NULL, NULL, &firmware_entry, > - &firmware_start, &firmware_end, 0, EM_RISCV, 1, 0) > 0) { > + if (load_elf_ram_sym(firmware_filename, NULL, NULL, NULL, > + &firmware_entry, &firmware_start, &firmware_end, 0, > + EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) { > return firmware_entry; > } > > diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c > index 0140e95732..0c84215f42 100644 > --- a/hw/riscv/sifive_u.c > +++ b/hw/riscv/sifive_u.c > @@ -341,7 +341,7 @@ static void riscv_sifive_u_init(MachineState *machine) > create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); > > riscv_find_and_load_firmware(machine, BIOS_FILENAME, > - memmap[SIFIVE_U_DRAM].base); > + memmap[SIFIVE_U_DRAM].base, NULL); > > if (machine->kernel_filename) { > uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename, > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index c44b865959..90a5bfef63 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -476,7 +476,7 @@ static void riscv_virt_board_init(MachineState *machine) > mask_rom); > > riscv_find_and_load_firmware(machine, BIOS_FILENAME, > - memmap[VIRT_DRAM].base); > + memmap[VIRT_DRAM].base, NULL); > > if (machine->kernel_filename) { > uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename, > diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h > index df80051fbc..474a940ad5 100644 > --- a/include/hw/riscv/boot.h > +++ b/include/hw/riscv/boot.h > @@ -24,10 +24,12 @@ > > void riscv_find_and_load_firmware(MachineState *machine, > const char *default_machine_firmware, > - hwaddr firmware_load_addr); > + hwaddr firmware_load_addr, > + symbol_fn_t sym_cb); > char *riscv_find_firmware(const char *firmware_filename); > target_ulong riscv_load_firmware(const char *firmware_filename, > - hwaddr firmware_load_addr); > + hwaddr firmware_load_addr, > + symbol_fn_t sym_cb); > target_ulong riscv_load_kernel(const char *kernel_filename, > symbol_fn_t sym_cb); > hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, > -- > 2.17.1 > >
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 027303d2a3..7ec94dc701 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -36,7 +36,8 @@ void riscv_find_and_load_firmware(MachineState *machine, const char *default_machine_firmware, - hwaddr firmware_load_addr) + hwaddr firmware_load_addr, + symbol_fn_t sym_cb) { char *firmware_filename = NULL; @@ -76,7 +77,7 @@ void riscv_find_and_load_firmware(MachineState *machine, if (firmware_filename) { /* If not "none" load the firmware */ - riscv_load_firmware(firmware_filename, firmware_load_addr); + riscv_load_firmware(firmware_filename, firmware_load_addr, sym_cb); g_free(firmware_filename); } } @@ -96,12 +97,14 @@ char *riscv_find_firmware(const char *firmware_filename) } target_ulong riscv_load_firmware(const char *firmware_filename, - hwaddr firmware_load_addr) + hwaddr firmware_load_addr, + symbol_fn_t sym_cb) { uint64_t firmware_entry, firmware_start, firmware_end; - if (load_elf(firmware_filename, NULL, NULL, NULL, &firmware_entry, - &firmware_start, &firmware_end, 0, EM_RISCV, 1, 0) > 0) { + if (load_elf_ram_sym(firmware_filename, NULL, NULL, NULL, + &firmware_entry, &firmware_start, &firmware_end, 0, + EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) { return firmware_entry; } diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index 0140e95732..0c84215f42 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -341,7 +341,7 @@ static void riscv_sifive_u_init(MachineState *machine) create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); riscv_find_and_load_firmware(machine, BIOS_FILENAME, - memmap[SIFIVE_U_DRAM].base); + memmap[SIFIVE_U_DRAM].base, NULL); if (machine->kernel_filename) { uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename, diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index c44b865959..90a5bfef63 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -476,7 +476,7 @@ static void riscv_virt_board_init(MachineState *machine) mask_rom); riscv_find_and_load_firmware(machine, BIOS_FILENAME, - memmap[VIRT_DRAM].base); + memmap[VIRT_DRAM].base, NULL); if (machine->kernel_filename) { uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename, diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index df80051fbc..474a940ad5 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -24,10 +24,12 @@ void riscv_find_and_load_firmware(MachineState *machine, const char *default_machine_firmware, - hwaddr firmware_load_addr); + hwaddr firmware_load_addr, + symbol_fn_t sym_cb); char *riscv_find_firmware(const char *firmware_filename); target_ulong riscv_load_firmware(const char *firmware_filename, - hwaddr firmware_load_addr); + hwaddr firmware_load_addr, + symbol_fn_t sym_cb); target_ulong riscv_load_kernel(const char *kernel_filename, symbol_fn_t sym_cb); hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size,
This patch adds an optional function pointer, "sym_cb", to riscv_load_firmware() which provides the possibility to access the symbol table during kernel loading. The pointer is ignored, if supplied with flat (non-elf) firmware image. The Spike board requires it locate the HTIF symbols from firmware ELF passed via "-bios" option. Signed-off-by: Anup Patel <anup.patel@wdc.com> --- hw/riscv/boot.c | 13 ++++++++----- hw/riscv/sifive_u.c | 2 +- hw/riscv/virt.c | 2 +- include/hw/riscv/boot.h | 6 ++++-- 4 files changed, 14 insertions(+), 9 deletions(-)