qemu-riscv
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] hw/riscv: Add optional symbol callback ptr to riscv_load_ker


From: Alistair Francis
Subject: Re: [PATCH] hw/riscv: Add optional symbol callback ptr to riscv_load_kernel()
Date: Sat, 23 Nov 2019 23:33:30 -0800

On Tue, Nov 19, 2019 at 12:03 AM Zhuang, Siwei (Data61, Kensington
NSW) <address@hidden> wrote:
>
> This patch adds an optional function pointer, "sym_cb", to
> riscv_load_kernel() which provides the possibility to access the symbol
> table during kernel loading.
>
> The pointer is ignored, if supplied with Image or uImage file.
>
> The Spike board requires the access to locate the HTIF symbols.
>
> Fixes: 0ac24d56c5e7 ("hw/riscv: Split out the boot functions")
> Buglink: https://bugs.launchpad.net/qemu/+bug/1835827
> Signed-off-by: Siwei Zhuang <address@hidden>

Reviewed-by: Alistair Francis <address@hidden>

Alistair

> ---
>  hw/riscv/boot.c         | 7 ++++---
>  hw/riscv/sifive_e.c     | 2 +-
>  hw/riscv/sifive_u.c     | 3 ++-
>  hw/riscv/spike.c        | 6 +++---
>  hw/riscv/virt.c         | 3 ++-
>  include/hw/riscv/boot.h | 3 ++-
>  6 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
> index 7fee98d2f8..027303d2a3 100644
> --- a/hw/riscv/boot.c
> +++ b/hw/riscv/boot.c
> @@ -114,12 +114,13 @@ target_ulong riscv_load_firmware(const char 
> *firmware_filename,
>      exit(1);
>  }
>
> -target_ulong riscv_load_kernel(const char *kernel_filename)
> +target_ulong riscv_load_kernel(const char *kernel_filename, symbol_fn_t 
> sym_cb)
>  {
>      uint64_t kernel_entry, kernel_high;
>
> -    if (load_elf(kernel_filename, NULL, NULL, NULL,
> -                 &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) > 0) {
> +    if (load_elf_ram_sym(kernel_filename, NULL, NULL, NULL,
> +                         &kernel_entry, NULL, &kernel_high, 0,
> +                         EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) {
>          return kernel_entry;
>      }
>
> diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> index 0f9d641a0e..8a6b0348df 100644
> --- a/hw/riscv/sifive_e.c
> +++ b/hw/riscv/sifive_e.c
> @@ -111,7 +111,7 @@ static void riscv_sifive_e_init(MachineState *machine)
>                            memmap[SIFIVE_E_MROM].base, &address_space_memory);
>
>      if (machine->kernel_filename) {
> -        riscv_load_kernel(machine->kernel_filename);
> +        riscv_load_kernel(machine->kernel_filename, NULL);
>      }
>  }
>
> diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> index 9552abf4dd..0140e95732 100644
> --- a/hw/riscv/sifive_u.c
> +++ b/hw/riscv/sifive_u.c
> @@ -344,7 +344,8 @@ static void riscv_sifive_u_init(MachineState *machine)
>                                   memmap[SIFIVE_U_DRAM].base);
>
>      if (machine->kernel_filename) {
> -        uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename);
> +        uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename,
> +                                                  NULL);
>
>          if (machine->initrd_filename) {
>              hwaddr start;
> diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
> index 8bbffbcd0f..8823681783 100644
> --- a/hw/riscv/spike.c
> +++ b/hw/riscv/spike.c
> @@ -184,7 +184,7 @@ static void spike_board_init(MachineState *machine)
>                                  mask_rom);
>
>      if (machine->kernel_filename) {
> -        riscv_load_kernel(machine->kernel_filename);
> +        riscv_load_kernel(machine->kernel_filename, htif_symbol_callback);
>      }
>
>      /* reset vector */
> @@ -273,7 +273,7 @@ static void spike_v1_10_0_board_init(MachineState 
> *machine)
>                                  mask_rom);
>
>      if (machine->kernel_filename) {
> -        riscv_load_kernel(machine->kernel_filename);
> +        riscv_load_kernel(machine->kernel_filename, htif_symbol_callback);
>      }
>
>      /* reset vector */
> @@ -359,7 +359,7 @@ static void spike_v1_09_1_board_init(MachineState 
> *machine)
>                                  mask_rom);
>
>      if (machine->kernel_filename) {
> -        riscv_load_kernel(machine->kernel_filename);
> +        riscv_load_kernel(machine->kernel_filename, htif_symbol_callback);
>      }
>
>      /* reset vector */
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index 23f340df19..65557c837e 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -476,7 +476,8 @@ static void riscv_virt_board_init(MachineState *machine)
>                                   memmap[VIRT_DRAM].base);
>
>      if (machine->kernel_filename) {
> -        uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename);
> +        uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename,
> +                                                  NULL);
>
>          if (machine->initrd_filename) {
>              hwaddr start;
> diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
> index 66075d0e57..df80051fbc 100644
> --- a/include/hw/riscv/boot.h
> +++ b/include/hw/riscv/boot.h
> @@ -28,7 +28,8 @@ void riscv_find_and_load_firmware(MachineState *machine,
>  char *riscv_find_firmware(const char *firmware_filename);
>  target_ulong riscv_load_firmware(const char *firmware_filename,
>                                   hwaddr firmware_load_addr);
> -target_ulong riscv_load_kernel(const char *kernel_filename);
> +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,
>                           uint64_t kernel_entry, hwaddr *start);
>
> --
> 2.24.0
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]