Message ID | 20230206140022.2748401-3-dbarboza@ventanamicro.com |
---|---|
State | New |
Headers | show |
Series | Consolidate all kernel init in load_kernel() | expand |
On 6/2/23 15:00, Daniel Henrique Barboza wrote: > The microchip_icicle_kit, sifive_u, spike and virt boards are now doing > the same steps when '-kernel' is used: > > - execute load_kernel() > - load init_rd() > - write kernel_cmdline > > Let's fold everything inside riscv_load_kernel() to avoid code > repetition. To not change the behavior of boards that aren't calling > riscv_load_init(), add an 'load_initrd' flag to riscv_load_kernel() and > allow these boards to opt out from initrd loading. > > Cc: Palmer Dabbelt <palmer@dabbelt.com> > Reviewed-by: Bin Meng <bmeng@tinylab.org> > Reviewed-by: Alistair Francis <alistair.francis@wdc.com> > Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > --- > hw/riscv/boot.c | 11 +++++++++++ > hw/riscv/microchip_pfsoc.c | 11 +---------- > hw/riscv/opentitan.c | 3 ++- > hw/riscv/sifive_e.c | 3 ++- > hw/riscv/sifive_u.c | 11 +---------- > hw/riscv/spike.c | 11 +---------- > hw/riscv/virt.c | 11 +---------- > include/hw/riscv/boot.h | 1 + > 8 files changed, 20 insertions(+), 42 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
On 2/6/23 04:00, Daniel Henrique Barboza wrote: > To not change the behavior of boards that aren't calling > riscv_load_init(), add an 'load_initrd' flag to riscv_load_kernel() and > allow these boards to opt out from initrd loading. Surely this is simply a bug for those boards. I cannot believe, for instance, that sifive_u should allow initrd and sifive_e must not. Backward compatible behaviour is had simply by not providing the command-line argument. r~
On 2/6/23 16:54, Richard Henderson wrote: > On 2/6/23 04:00, Daniel Henrique Barboza wrote: >> To not change the behavior of boards that aren't calling >> riscv_load_init(), add an 'load_initrd' flag to riscv_load_kernel() and >> allow these boards to opt out from initrd loading. > > Surely this is simply a bug for those boards. > > I cannot believe, for instance, that sifive_u should allow initrd and sifive_e must not. > > Backward compatible behaviour is had simply by not providing the command-line argument. That makes sense but the question here is whether the sifive_e board supports -initrd if the option is provided. I tend to believe that it does, and the current code state is mostly an oversight (we forgot to add load_initrd() support for the board) rather than an intentional design choice, but since I'm not sure about it I opted for playing it safe. If someone can guarantee that the sifive_e and the opentitan boards are capable of -initrd loading I can re-send this patch without the 'load_initrd' flag. Thanks, Daniel > > > r~
On Tue, Feb 7, 2023 at 6:19 AM Daniel Henrique Barboza <dbarboza@ventanamicro.com> wrote: > > > > On 2/6/23 16:54, Richard Henderson wrote: > > On 2/6/23 04:00, Daniel Henrique Barboza wrote: > >> To not change the behavior of boards that aren't calling > >> riscv_load_init(), add an 'load_initrd' flag to riscv_load_kernel() and > >> allow these boards to opt out from initrd loading. > > > > Surely this is simply a bug for those boards. > > > > I cannot believe, for instance, that sifive_u should allow initrd and sifive_e must not. > > > > Backward compatible behaviour is had simply by not providing the command-line argument. > > That makes sense but the question here is whether the sifive_e board supports > -initrd if the option is provided. I tend to believe that it does, and the current > code state is mostly an oversight (we forgot to add load_initrd() support for the > board) rather than an intentional design choice, but since I'm not sure about > it I opted for playing it safe. > > If someone can guarantee that the sifive_e and the opentitan boards are capable of > -initrd loading I can re-send this patch without the 'load_initrd' flag. Those boards can only boot small scale RTOS-like OSes or baremetal code. Which is why they don't support the -initrd option. I guess there isn't much harm in allowing an initrd, although I'm not really sure when it would be used. Alistair > > > Thanks, > > Daniel > > > > > > > r~ >
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index df6b4a1fba..4954bb9d4b 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -176,10 +176,12 @@ target_ulong riscv_load_firmware(const char *firmware_filename, target_ulong riscv_load_kernel(MachineState *machine, RISCVHartArrayState *harts, target_ulong kernel_start_addr, + bool load_initrd, symbol_fn_t sym_cb) { const char *kernel_filename = machine->kernel_filename; uint64_t kernel_load_base, kernel_entry; + void *fdt = machine->fdt; g_assert(kernel_filename != NULL); @@ -220,6 +222,15 @@ out: kernel_entry = extract64(kernel_entry, 0, 32); } + if (load_initrd && machine->initrd_filename) { + riscv_load_initrd(machine, kernel_entry); + } + + if (fdt && machine->kernel_cmdline && *machine->kernel_cmdline) { + qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", + machine->kernel_cmdline); + } + return kernel_entry; } diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c index 712625d2a4..e81bbd12df 100644 --- a/hw/riscv/microchip_pfsoc.c +++ b/hw/riscv/microchip_pfsoc.c @@ -630,16 +630,7 @@ static void microchip_icicle_kit_machine_init(MachineState *machine) firmware_end_addr); kernel_entry = riscv_load_kernel(machine, &s->soc.u_cpus, - kernel_start_addr, NULL); - - if (machine->initrd_filename) { - riscv_load_initrd(machine, kernel_entry); - } - - if (machine->kernel_cmdline && *machine->kernel_cmdline) { - qemu_fdt_setprop_string(machine->fdt, "/chosen", - "bootargs", machine->kernel_cmdline); - } + kernel_start_addr, true, NULL); /* Compute the fdt load address in dram */ fdt_load_addr = riscv_compute_fdt_addr(memmap[MICROCHIP_PFSOC_DRAM_LO].base, diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c index 7fe4fb5628..b06944d382 100644 --- a/hw/riscv/opentitan.c +++ b/hw/riscv/opentitan.c @@ -102,7 +102,8 @@ static void opentitan_board_init(MachineState *machine) if (machine->kernel_filename) { riscv_load_kernel(machine, &s->soc.cpus, - memmap[IBEX_DEV_RAM].base, NULL); + memmap[IBEX_DEV_RAM].base, + false, NULL); } } diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c index 1a7d381514..04939b60c3 100644 --- a/hw/riscv/sifive_e.c +++ b/hw/riscv/sifive_e.c @@ -115,7 +115,8 @@ static void sifive_e_machine_init(MachineState *machine) if (machine->kernel_filename) { riscv_load_kernel(machine, &s->soc.cpus, - memmap[SIFIVE_E_DEV_DTIM].base, NULL); + memmap[SIFIVE_E_DEV_DTIM].base, + false, NULL); } } diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index 71be442a50..ad3bb35b34 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -599,16 +599,7 @@ static void sifive_u_machine_init(MachineState *machine) firmware_end_addr); kernel_entry = riscv_load_kernel(machine, &s->soc.u_cpus, - kernel_start_addr, NULL); - - if (machine->initrd_filename) { - riscv_load_initrd(machine, kernel_entry); - } - - if (machine->kernel_cmdline && *machine->kernel_cmdline) { - qemu_fdt_setprop_string(machine->fdt, "/chosen", "bootargs", - machine->kernel_cmdline); - } + kernel_start_addr, true, NULL); } else { /* * If dynamic firmware is used, it doesn't know where is the next mode diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c index 1fa91167ab..a584d5b3a2 100644 --- a/hw/riscv/spike.c +++ b/hw/riscv/spike.c @@ -307,16 +307,7 @@ static void spike_board_init(MachineState *machine) kernel_entry = riscv_load_kernel(machine, &s->soc[0], kernel_start_addr, - htif_symbol_callback); - - if (machine->initrd_filename) { - riscv_load_initrd(machine, kernel_entry); - } - - if (machine->kernel_cmdline && *machine->kernel_cmdline) { - qemu_fdt_setprop_string(machine->fdt, "/chosen", "bootargs", - machine->kernel_cmdline); - } + true, htif_symbol_callback); } else { /* * If dynamic firmware is used, it doesn't know where is the next mode diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index d0531cc641..2f2c82e8df 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1278,16 +1278,7 @@ static void virt_machine_done(Notifier *notifier, void *data) firmware_end_addr); kernel_entry = riscv_load_kernel(machine, &s->soc[0], - kernel_start_addr, NULL); - - if (machine->initrd_filename) { - riscv_load_initrd(machine, kernel_entry); - } - - if (machine->kernel_cmdline && *machine->kernel_cmdline) { - qemu_fdt_setprop_string(machine->fdt, "/chosen", "bootargs", - machine->kernel_cmdline); - } + kernel_start_addr, true, NULL); } else { /* * If dynamic firmware is used, it doesn't know where is the next mode diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index 6295316afb..ea1de8b020 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -46,6 +46,7 @@ target_ulong riscv_load_firmware(const char *firmware_filename, target_ulong riscv_load_kernel(MachineState *machine, RISCVHartArrayState *harts, target_ulong firmware_end_addr, + bool load_initrd, symbol_fn_t sym_cb); void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry); uint64_t riscv_compute_fdt_addr(hwaddr dram_start, uint64_t dram_size,