Hi Song / Jason,

We're seeing non-deterministic hangs in our functional test
suite 'tests/functional/test_loongarch64_virt.py' and my
attempt at git bisect is blaming this commit.

With this applied, perhaps 1 time in 10, the test case hangs,
with zero serial port output from EDK2 emitted

  https://gitlab.com/qemu-project/qemu/-/issues/2686

I'm not seeing an obvious flaw in this commit's code, so I'm
wondering if it has accidentally tickled some other subtle
pre-existing bug elsewhere. Some general problem with FDT
handling on loongarch64 perhaps ?

On Thu, Sep 12, 2024 at 08:51:31PM +0800, Song Gao wrote:
> From: "Jason A. Donenfeld" <ja...@zx2c4.com>
> 
> If the FDT contains /chosen/rng-seed, then the Linux RNG will use it to
> initialize early. Set this using the usual guest random number
> generation function.
> 
> This is the same procedure that's done in b91b6b5a2c ("hw/microblaze:
> pass random seed to fdt"), e4b4f0b71c ("hw/riscv: virt: pass random seed
> to fdt"), c6fe3e6b4c ("hw/openrisc: virt: pass random seed to fdt"),
> 67f7e426e5 ("hw/i386: pass RNG seed via setup_data entry"), c287941a4d
> ("hw/rx: pass random seed to fdt"), 5e19cc68fb ("hw/mips: boston: pass
> random seed to fdt"), 6b23a67916 ("hw/nios2: virt: pass random seed to fdt")
> c4b075318e ("hw/ppc: pass random seed to fdt"), and 5242876f37
> ("hw/arm/virt: dt: add rng-seed property").
> 
> These earlier commits later were amended to rerandomize the RNG seed on
> snapshot load, but the LoongArch code somehow already does that, despite
> not having this patch here, presumably due to some lucky copy and
> pasting.
> 
> Signed-off-by: Jason A. Donenfeld <ja...@zx2c4.com>
> Reviewed-by: Song Gao <gaos...@loongson.cn>
> Message-Id: <20240905153316.2038769-1-ja...@zx2c4.com>
> Signed-off-by: Song Gao <gaos...@loongson.cn>
> ---
>  hw/loongarch/virt.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 76dd29a391..81b1f9486f 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -48,6 +48,7 @@
>  #include "hw/block/flash.h"
>  #include "hw/virtio/virtio-iommu.h"
>  #include "qemu/error-report.h"
> +#include "qemu/guest-random.h"
>  
>  static bool virt_is_veiointc_enabled(LoongArchVirtMachineState *lvms)
>  {
> @@ -303,6 +304,7 @@ static void fdt_add_uart_node(LoongArchVirtMachineState 
> *lvms,
>  static void create_fdt(LoongArchVirtMachineState *lvms)
>  {
>      MachineState *ms = MACHINE(lvms);
> +    uint8_t rng_seed[32];
>  
>      ms->fdt = create_device_tree(&lvms->fdt_size);
>      if (!ms->fdt) {
> @@ -316,6 +318,10 @@ static void create_fdt(LoongArchVirtMachineState *lvms)
>      qemu_fdt_setprop_cell(ms->fdt, "/", "#address-cells", 0x2);
>      qemu_fdt_setprop_cell(ms->fdt, "/", "#size-cells", 0x2);
>      qemu_fdt_add_subnode(ms->fdt, "/chosen");
> +
> +    /* Pass seed to RNG */
> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
> +    qemu_fdt_setprop(ms->fdt, "/chosen", "rng-seed", rng_seed, 
> sizeof(rng_seed));
>  }
>  
>  static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
> -- 
> 2.34.1
> 
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Reply via email to