In 60592cfed2 ("hw/arm/virt: dt: add kaslr-seed property"), the kaslr-seed property was added, but the equally as important rng-seed property was forgotten about, which has identical semantics for a similar purpose. This commit implements it in exactly the same way as kaslr-seed.
Cc: Peter Maydell <peter.mayd...@linaro.org> Signed-off-by: Jason A. Donenfeld <ja...@zx2c4.com> --- hw/arm/virt.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/hw/arm/virt.h | 1 + 2 files changed, 41 insertions(+) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 097238faa7..8a3436a370 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -221,6 +221,16 @@ static bool cpu_type_valid(const char *cpu) return false; } +static void create_rng_seed(MachineState *ms, const char *node) +{ + uint8_t seed[32]; + + if (qemu_guest_getrandom(&seed, sizeof(seed), NULL)) { + return; + } + qemu_fdt_setprop(ms->fdt, node, "rng-seed", seed, sizeof(seed)); +} + static void create_kaslr_seed(MachineState *ms, const char *node) { uint64_t seed; @@ -251,6 +261,9 @@ static void create_fdt(VirtMachineState *vms) /* /chosen must exist for load_dtb to fill in necessary properties later */ qemu_fdt_add_subnode(fdt, "/chosen"); + if (vms->dtb_rng_seed) { + create_rng_seed(ms, "/chosen"); + } if (vms->dtb_kaslr_seed) { create_kaslr_seed(ms, "/chosen"); } @@ -260,6 +273,9 @@ static void create_fdt(VirtMachineState *vms) if (vms->dtb_kaslr_seed) { create_kaslr_seed(ms, "/secure-chosen"); } + if (vms->dtb_rng_seed) { + create_rng_seed(ms, "/secure-chosen"); + } } /* Clock node, for the benefit of the UART. The kernel device tree @@ -2348,6 +2364,20 @@ static void virt_set_its(Object *obj, bool value, Error **errp) vms->its = value; } +static bool virt_get_dtb_rng_seed(Object *obj, Error **errp) +{ + VirtMachineState *vms = VIRT_MACHINE(obj); + + return vms->dtb_rng_seed; +} + +static void virt_set_dtb_rng_seed(Object *obj, bool value, Error **errp) +{ + VirtMachineState *vms = VIRT_MACHINE(obj); + + vms->dtb_rng_seed = value; +} + static bool virt_get_dtb_kaslr_seed(Object *obj, Error **errp) { VirtMachineState *vms = VIRT_MACHINE(obj); @@ -2988,6 +3018,13 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) "Set on/off to enable/disable " "ITS instantiation"); + object_class_property_add_bool(oc, "dtb-rng-seed", + virt_get_dtb_rng_seed, + virt_set_dtb_rng_seed); + object_class_property_set_description(oc, "dtb-rng-seed", + "Set off to disable passing of rng-seed " + "dtb node to guest"); + object_class_property_add_bool(oc, "dtb-kaslr-seed", virt_get_dtb_kaslr_seed, virt_set_dtb_kaslr_seed); @@ -3061,6 +3098,9 @@ static void virt_instance_init(Object *obj) /* MTE is disabled by default. */ vms->mte = false; + /* Supply a rng-seed by default */ + vms->dtb_rng_seed = true; + /* Supply a kaslr-seed by default */ vms->dtb_kaslr_seed = true; diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index 15feabac63..cf652f1f3d 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -152,6 +152,7 @@ struct VirtMachineState { bool virt; bool ras; bool mte; + bool dtb_rng_seed; bool dtb_kaslr_seed; OnOffAuto acpi; VirtGICType gic_version; -- 2.35.1