Stefan Lankes <slan...@eonerc.rwth-aachen.de> writes:
> Currently, the flag `--initrd` is only support for Linux ARM kernels. > However, also other ELF kernels could depend on an initial ramdisk. > This PR loads also the initrd for ELF kernels and announce the > location by the nodes "/chosen/initrd-start" and > "/chosen/initrd-end" within the device tree. > > Signed-off-by: Stefan Lankes <slan...@eonerc.rwth-aachen.de> > --- > hw/arm/boot.c | 106 +++++++++++++++++++++++++++++--------------------- > 1 file changed, 62 insertions(+), 44 deletions(-) > > diff --git a/hw/arm/boot.c b/hw/arm/boot.c > index 54f6a3e0b3..f767a4809e 100644 > --- a/hw/arm/boot.c > +++ b/hw/arm/boot.c > @@ -657,20 +657,38 @@ int arm_load_dtb(hwaddr addr, const struct > arm_boot_info *binfo, > } > > if (binfo->initrd_size) { > - rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", > "linux,initrd-start", > + if (binfo->is_linux) { > + rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", > "linux,initrd-start", > acells, binfo->initrd_start); > - if (rc < 0) { > - fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n"); > - goto fail; > - } > + if (rc < 0) { > + fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n"); > + goto fail; > + } > > - rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-end", > - acells, > - binfo->initrd_start + > - binfo->initrd_size); > - if (rc < 0) { > - fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n"); > - goto fail; > + rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", > "linux,initrd-end", > + acells, > + binfo->initrd_start + > + binfo->initrd_size); > + if (rc < 0) { > + fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n"); > + goto fail; > + } > + } else { > + rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "initrd-start", > + acells, binfo->initrd_start); > + if (rc < 0) { > + fprintf(stderr, "couldn't set /chosen/initrd-start\n"); > + goto fail; > + } > + > + rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "initrd-end", > + acells, > + binfo->initrd_start + > + binfo->initrd_size); > + if (rc < 0) { > + fprintf(stderr, "couldn't set /chosen/initrd-end\n"); > + goto fail; > + } Where are these DTB nodes documented? Also could you not achieve the same thing using the guest-loader which uses the multiboot spec and sets: const char *compat[2] = { "multiboot,module", "multiboot,ramdisk" }; if (qemu_fdt_setprop_string_array(fdt, node, "compatible", (char **) &compat, ARRAY_SIZE(compat)) < 0) { error_setg(errp, "couldn't set %s/compatible", node); return; } -- Alex Bennée Virtualisation Tech Lead @ Linaro