mirror of https://github.com/xemu-project/xemu.git
hw/riscv/boot.c: consolidate all kernel init in riscv_load_kernel()
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> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20230206140022.2748401-3-dbarboza@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
62c5bc348e
commit
487d73fc47
|
@ -176,10 +176,12 @@ target_ulong riscv_load_firmware(const char *firmware_filename,
|
||||||
target_ulong riscv_load_kernel(MachineState *machine,
|
target_ulong riscv_load_kernel(MachineState *machine,
|
||||||
RISCVHartArrayState *harts,
|
RISCVHartArrayState *harts,
|
||||||
target_ulong kernel_start_addr,
|
target_ulong kernel_start_addr,
|
||||||
|
bool load_initrd,
|
||||||
symbol_fn_t sym_cb)
|
symbol_fn_t sym_cb)
|
||||||
{
|
{
|
||||||
const char *kernel_filename = machine->kernel_filename;
|
const char *kernel_filename = machine->kernel_filename;
|
||||||
uint64_t kernel_load_base, kernel_entry;
|
uint64_t kernel_load_base, kernel_entry;
|
||||||
|
void *fdt = machine->fdt;
|
||||||
|
|
||||||
g_assert(kernel_filename != NULL);
|
g_assert(kernel_filename != NULL);
|
||||||
|
|
||||||
|
@ -220,6 +222,15 @@ out:
|
||||||
kernel_entry = extract64(kernel_entry, 0, 32);
|
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;
|
return kernel_entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -630,16 +630,7 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
|
||||||
firmware_end_addr);
|
firmware_end_addr);
|
||||||
|
|
||||||
kernel_entry = riscv_load_kernel(machine, &s->soc.u_cpus,
|
kernel_entry = riscv_load_kernel(machine, &s->soc.u_cpus,
|
||||||
kernel_start_addr, NULL);
|
kernel_start_addr, true, 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compute the fdt load address in dram */
|
/* Compute the fdt load address in dram */
|
||||||
fdt_load_addr = riscv_compute_fdt_addr(memmap[MICROCHIP_PFSOC_DRAM_LO].base,
|
fdt_load_addr = riscv_compute_fdt_addr(memmap[MICROCHIP_PFSOC_DRAM_LO].base,
|
||||||
|
|
|
@ -102,7 +102,8 @@ static void opentitan_board_init(MachineState *machine)
|
||||||
|
|
||||||
if (machine->kernel_filename) {
|
if (machine->kernel_filename) {
|
||||||
riscv_load_kernel(machine, &s->soc.cpus,
|
riscv_load_kernel(machine, &s->soc.cpus,
|
||||||
memmap[IBEX_DEV_RAM].base, NULL);
|
memmap[IBEX_DEV_RAM].base,
|
||||||
|
false, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,8 @@ static void sifive_e_machine_init(MachineState *machine)
|
||||||
|
|
||||||
if (machine->kernel_filename) {
|
if (machine->kernel_filename) {
|
||||||
riscv_load_kernel(machine, &s->soc.cpus,
|
riscv_load_kernel(machine, &s->soc.cpus,
|
||||||
memmap[SIFIVE_E_DEV_DTIM].base, NULL);
|
memmap[SIFIVE_E_DEV_DTIM].base,
|
||||||
|
false, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -599,16 +599,7 @@ static void sifive_u_machine_init(MachineState *machine)
|
||||||
firmware_end_addr);
|
firmware_end_addr);
|
||||||
|
|
||||||
kernel_entry = riscv_load_kernel(machine, &s->soc.u_cpus,
|
kernel_entry = riscv_load_kernel(machine, &s->soc.u_cpus,
|
||||||
kernel_start_addr, NULL);
|
kernel_start_addr, true, 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);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* If dynamic firmware is used, it doesn't know where is the next mode
|
* If dynamic firmware is used, it doesn't know where is the next mode
|
||||||
|
|
|
@ -307,16 +307,7 @@ static void spike_board_init(MachineState *machine)
|
||||||
|
|
||||||
kernel_entry = riscv_load_kernel(machine, &s->soc[0],
|
kernel_entry = riscv_load_kernel(machine, &s->soc[0],
|
||||||
kernel_start_addr,
|
kernel_start_addr,
|
||||||
htif_symbol_callback);
|
true, 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);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* If dynamic firmware is used, it doesn't know where is the next mode
|
* If dynamic firmware is used, it doesn't know where is the next mode
|
||||||
|
|
|
@ -1278,16 +1278,7 @@ static void virt_machine_done(Notifier *notifier, void *data)
|
||||||
firmware_end_addr);
|
firmware_end_addr);
|
||||||
|
|
||||||
kernel_entry = riscv_load_kernel(machine, &s->soc[0],
|
kernel_entry = riscv_load_kernel(machine, &s->soc[0],
|
||||||
kernel_start_addr, NULL);
|
kernel_start_addr, true, 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);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* If dynamic firmware is used, it doesn't know where is the next mode
|
* If dynamic firmware is used, it doesn't know where is the next mode
|
||||||
|
|
|
@ -46,6 +46,7 @@ target_ulong riscv_load_firmware(const char *firmware_filename,
|
||||||
target_ulong riscv_load_kernel(MachineState *machine,
|
target_ulong riscv_load_kernel(MachineState *machine,
|
||||||
RISCVHartArrayState *harts,
|
RISCVHartArrayState *harts,
|
||||||
target_ulong firmware_end_addr,
|
target_ulong firmware_end_addr,
|
||||||
|
bool load_initrd,
|
||||||
symbol_fn_t sym_cb);
|
symbol_fn_t sym_cb);
|
||||||
void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry);
|
void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry);
|
||||||
uint64_t riscv_compute_fdt_addr(hwaddr dram_start, uint64_t dram_size,
|
uint64_t riscv_compute_fdt_addr(hwaddr dram_start, uint64_t dram_size,
|
||||||
|
|
Loading…
Reference in New Issue