Message ID | 20230113171805.470252-3-dbarboza@ventanamicro.com |
---|---|
State | New |
Headers | show |
Series | hw/riscv: clear kernel_entry high bits with 32bit CPUs | expand |
On Sat, Jan 14, 2023 at 3:39 AM Daniel Henrique Barboza <dbarboza@ventanamicro.com> wrote: > > The only remaining caller is riscv_load_kernel_and_initrd() which > belongs to the same file. > > Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Reviewed-by: Bin Meng <bmeng@tinylab.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > hw/riscv/boot.c | 80 ++++++++++++++++++++--------------------- > include/hw/riscv/boot.h | 1 - > 2 files changed, 40 insertions(+), 41 deletions(-) > > diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c > index 4888d5c1e0..e868fb6ade 100644 > --- a/hw/riscv/boot.c > +++ b/hw/riscv/boot.c > @@ -173,6 +173,46 @@ target_ulong riscv_load_firmware(const char *firmware_filename, > exit(1); > } > > +static void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry) > +{ > + const char *filename = machine->initrd_filename; > + uint64_t mem_size = machine->ram_size; > + void *fdt = machine->fdt; > + hwaddr start, end; > + ssize_t size; > + > + g_assert(filename != NULL); > + > + /* > + * We want to put the initrd far enough into RAM that when the > + * kernel is uncompressed it will not clobber the initrd. However > + * on boards without much RAM we must ensure that we still leave > + * enough room for a decent sized initrd, and on boards with large > + * amounts of RAM we must avoid the initrd being so far up in RAM > + * that it is outside lowmem and inaccessible to the kernel. > + * So for boards with less than 256MB of RAM we put the initrd > + * halfway into RAM, and for boards with 256MB of RAM or more we put > + * the initrd at 128MB. > + */ > + start = kernel_entry + MIN(mem_size / 2, 128 * MiB); > + > + size = load_ramdisk(filename, start, mem_size - start); > + if (size == -1) { > + size = load_image_targphys(filename, start, mem_size - start); > + if (size == -1) { > + error_report("could not load ramdisk '%s'", filename); > + exit(1); > + } > + } > + > + /* Some RISC-V machines (e.g. opentitan) don't have a fdt. */ > + if (fdt) { > + end = start + size; > + qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start", start); > + qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end", end); > + } > +} > + > target_ulong riscv_load_kernel(MachineState *machine, > target_ulong kernel_start_addr, > bool load_initrd, > @@ -225,46 +265,6 @@ out: > return kernel_entry; > } > > -void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry) > -{ > - const char *filename = machine->initrd_filename; > - uint64_t mem_size = machine->ram_size; > - void *fdt = machine->fdt; > - hwaddr start, end; > - ssize_t size; > - > - g_assert(filename != NULL); > - > - /* > - * We want to put the initrd far enough into RAM that when the > - * kernel is uncompressed it will not clobber the initrd. However > - * on boards without much RAM we must ensure that we still leave > - * enough room for a decent sized initrd, and on boards with large > - * amounts of RAM we must avoid the initrd being so far up in RAM > - * that it is outside lowmem and inaccessible to the kernel. > - * So for boards with less than 256MB of RAM we put the initrd > - * halfway into RAM, and for boards with 256MB of RAM or more we put > - * the initrd at 128MB. > - */ > - start = kernel_entry + MIN(mem_size / 2, 128 * MiB); > - > - size = load_ramdisk(filename, start, mem_size - start); > - if (size == -1) { > - size = load_image_targphys(filename, start, mem_size - start); > - if (size == -1) { > - error_report("could not load ramdisk '%s'", filename); > - exit(1); > - } > - } > - > - /* Some RISC-V machines (e.g. opentitan) don't have a fdt. */ > - if (fdt) { > - end = start + size; > - qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start", start); > - qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end", end); > - } > -} > - > uint64_t riscv_load_fdt(hwaddr dram_base, uint64_t mem_size, void *fdt) > { > uint64_t temp, fdt_addr; > diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h > index c3de897371..cbd131bad7 100644 > --- a/include/hw/riscv/boot.h > +++ b/include/hw/riscv/boot.h > @@ -47,7 +47,6 @@ target_ulong riscv_load_kernel(MachineState *machine, > 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_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); > void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts, > hwaddr saddr, > -- > 2.39.0 > >
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 4888d5c1e0..e868fb6ade 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -173,6 +173,46 @@ target_ulong riscv_load_firmware(const char *firmware_filename, exit(1); } +static void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry) +{ + const char *filename = machine->initrd_filename; + uint64_t mem_size = machine->ram_size; + void *fdt = machine->fdt; + hwaddr start, end; + ssize_t size; + + g_assert(filename != NULL); + + /* + * We want to put the initrd far enough into RAM that when the + * kernel is uncompressed it will not clobber the initrd. However + * on boards without much RAM we must ensure that we still leave + * enough room for a decent sized initrd, and on boards with large + * amounts of RAM we must avoid the initrd being so far up in RAM + * that it is outside lowmem and inaccessible to the kernel. + * So for boards with less than 256MB of RAM we put the initrd + * halfway into RAM, and for boards with 256MB of RAM or more we put + * the initrd at 128MB. + */ + start = kernel_entry + MIN(mem_size / 2, 128 * MiB); + + size = load_ramdisk(filename, start, mem_size - start); + if (size == -1) { + size = load_image_targphys(filename, start, mem_size - start); + if (size == -1) { + error_report("could not load ramdisk '%s'", filename); + exit(1); + } + } + + /* Some RISC-V machines (e.g. opentitan) don't have a fdt. */ + if (fdt) { + end = start + size; + qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start", start); + qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end", end); + } +} + target_ulong riscv_load_kernel(MachineState *machine, target_ulong kernel_start_addr, bool load_initrd, @@ -225,46 +265,6 @@ out: return kernel_entry; } -void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry) -{ - const char *filename = machine->initrd_filename; - uint64_t mem_size = machine->ram_size; - void *fdt = machine->fdt; - hwaddr start, end; - ssize_t size; - - g_assert(filename != NULL); - - /* - * We want to put the initrd far enough into RAM that when the - * kernel is uncompressed it will not clobber the initrd. However - * on boards without much RAM we must ensure that we still leave - * enough room for a decent sized initrd, and on boards with large - * amounts of RAM we must avoid the initrd being so far up in RAM - * that it is outside lowmem and inaccessible to the kernel. - * So for boards with less than 256MB of RAM we put the initrd - * halfway into RAM, and for boards with 256MB of RAM or more we put - * the initrd at 128MB. - */ - start = kernel_entry + MIN(mem_size / 2, 128 * MiB); - - size = load_ramdisk(filename, start, mem_size - start); - if (size == -1) { - size = load_image_targphys(filename, start, mem_size - start); - if (size == -1) { - error_report("could not load ramdisk '%s'", filename); - exit(1); - } - } - - /* Some RISC-V machines (e.g. opentitan) don't have a fdt. */ - if (fdt) { - end = start + size; - qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start", start); - qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end", end); - } -} - uint64_t riscv_load_fdt(hwaddr dram_base, uint64_t mem_size, void *fdt) { uint64_t temp, fdt_addr; diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index c3de897371..cbd131bad7 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -47,7 +47,6 @@ target_ulong riscv_load_kernel(MachineState *machine, 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_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts, hwaddr saddr,