[PATCH] hw/ppc: pass random seed to fdt

Jason A. Donenfeld posted 1 patch 3 years, 7 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20220712135114.289855-1-Jason@zx2c4.com
Maintainers: "Cédric Le Goater" <clg@kaod.org>, Daniel Henrique Barboza <danielhb413@gmail.com>, David Gibson <david@gibson.dropbear.id.au>, Greg Kurz <groug@kaod.org>
hw/ppc/e500.c  | 5 +++++
hw/ppc/spapr.c | 5 +++++
2 files changed, 10 insertions(+)
[PATCH] hw/ppc: pass random seed to fdt
Posted by Jason A. Donenfeld 3 years, 7 months ago
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 confirmed to successfully initialize the
RNG on Linux 5.19-rc6. The rng-seed node is part of the DT spec. Set
this on the paravirt platforms, spapr and e500, just as is done on other
architectures with paravirt hardware.

Cc: Daniel Henrique Barboza <danielhb413@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
---
 hw/ppc/e500.c  | 5 +++++
 hw/ppc/spapr.c | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 7f7f5b3452..2f86eb490e 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -17,6 +17,7 @@
 #include "qemu/osdep.h"
 #include "qemu/datadir.h"
 #include "qemu/units.h"
+#include "qemu/guest-random.h"
 #include "qapi/error.h"
 #include "e500.h"
 #include "e500-ccsr.h"
@@ -346,6 +347,7 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
         };
     const char *dtb_file = machine->dtb;
     const char *toplevel_compat = machine->dt_compatible;
+    uint8_t rng_seed[32];
 
     if (dtb_file) {
         char *filename;
@@ -403,6 +405,9 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
     if (ret < 0)
         fprintf(stderr, "couldn't set /chosen/bootargs\n");
 
+    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
+    qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed));
+
     if (kvm_enabled()) {
         /* Read out host's frequencies */
         clock_freq = kvmppc_get_clockfreq();
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 9a5382d527..3a5112899e 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -27,6 +27,7 @@
 #include "qemu/osdep.h"
 #include "qemu/datadir.h"
 #include "qemu/memalign.h"
+#include "qemu/guest-random.h"
 #include "qapi/error.h"
 #include "qapi/qapi-events-machine.h"
 #include "qapi/qapi-events-qdev.h"
@@ -1014,6 +1015,7 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
 {
     MachineState *machine = MACHINE(spapr);
     SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+    uint8_t rng_seed[32];
     int chosen;
 
     _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
@@ -1091,6 +1093,9 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
         spapr_dt_ov5_platform_support(spapr, fdt, chosen);
     }
 
+    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
+    _FDT(fdt_setprop(fdt, chosen, "rng-seed", rng_seed, sizeof(rng_seed)));
+
     _FDT(spapr_dt_ovec(fdt, chosen, spapr->ov5_cas, "ibm,architecture-vec-5"));
 }
 
-- 
2.35.1
Re: [PATCH] hw/ppc: pass random seed to fdt
Posted by Daniel Henrique Barboza 3 years, 6 months ago
Queued in gitlab.com/danielhb/qemu/tree/ppc-next. Thanks,


Daniel

On 7/12/22 10:51, Jason A. Donenfeld wrote:
> 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 confirmed to successfully initialize the
> RNG on Linux 5.19-rc6. The rng-seed node is part of the DT spec. Set
> this on the paravirt platforms, spapr and e500, just as is done on other
> architectures with paravirt hardware.
> 
> Cc: Daniel Henrique Barboza <danielhb413@gmail.com>
> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
> ---
>   hw/ppc/e500.c  | 5 +++++
>   hw/ppc/spapr.c | 5 +++++
>   2 files changed, 10 insertions(+)
> 
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 7f7f5b3452..2f86eb490e 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -17,6 +17,7 @@
>   #include "qemu/osdep.h"
>   #include "qemu/datadir.h"
>   #include "qemu/units.h"
> +#include "qemu/guest-random.h"
>   #include "qapi/error.h"
>   #include "e500.h"
>   #include "e500-ccsr.h"
> @@ -346,6 +347,7 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
>           };
>       const char *dtb_file = machine->dtb;
>       const char *toplevel_compat = machine->dt_compatible;
> +    uint8_t rng_seed[32];
>   
>       if (dtb_file) {
>           char *filename;
> @@ -403,6 +405,9 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
>       if (ret < 0)
>           fprintf(stderr, "couldn't set /chosen/bootargs\n");
>   
> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
> +    qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed));
> +
>       if (kvm_enabled()) {
>           /* Read out host's frequencies */
>           clock_freq = kvmppc_get_clockfreq();
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 9a5382d527..3a5112899e 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -27,6 +27,7 @@
>   #include "qemu/osdep.h"
>   #include "qemu/datadir.h"
>   #include "qemu/memalign.h"
> +#include "qemu/guest-random.h"
>   #include "qapi/error.h"
>   #include "qapi/qapi-events-machine.h"
>   #include "qapi/qapi-events-qdev.h"
> @@ -1014,6 +1015,7 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
>   {
>       MachineState *machine = MACHINE(spapr);
>       SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
> +    uint8_t rng_seed[32];
>       int chosen;
>   
>       _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
> @@ -1091,6 +1093,9 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
>           spapr_dt_ov5_platform_support(spapr, fdt, chosen);
>       }
>   
> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
> +    _FDT(fdt_setprop(fdt, chosen, "rng-seed", rng_seed, sizeof(rng_seed)));
> +
>       _FDT(spapr_dt_ovec(fdt, chosen, spapr->ov5_cas, "ibm,architecture-vec-5"));
>   }
>
Re: [PATCH] hw/ppc: pass random seed to fdt
Posted by Daniel Henrique Barboza 3 years, 7 months ago

On 7/12/22 10:51, Jason A. Donenfeld wrote:
> 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 confirmed to successfully initialize the
> RNG on Linux 5.19-rc6. The rng-seed node is part of the DT spec. Set
> this on the paravirt platforms, spapr and e500, just as is done on other
> architectures with paravirt hardware.
> 
> Cc: Daniel Henrique Barboza <danielhb413@gmail.com>
> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
> ---

With current QEMU master, running a fedora 36 ppc64le guest with a
5.19.0-rc2-00054-g12ede8ffb103 kernel :

[root@fedora ~]# dmesg | grep -i rng
[    5.130623] random: crng init done
[root@fedora ~]#


After applying this patch:


[root@fedora ~]# dmesg | grep -i rng
[    0.000000] random: crng init done
[root@fedora ~]#



Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>




>   hw/ppc/e500.c  | 5 +++++
>   hw/ppc/spapr.c | 5 +++++
>   2 files changed, 10 insertions(+)
> 
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 7f7f5b3452..2f86eb490e 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -17,6 +17,7 @@
>   #include "qemu/osdep.h"
>   #include "qemu/datadir.h"
>   #include "qemu/units.h"
> +#include "qemu/guest-random.h"
>   #include "qapi/error.h"
>   #include "e500.h"
>   #include "e500-ccsr.h"
> @@ -346,6 +347,7 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
>           };
>       const char *dtb_file = machine->dtb;
>       const char *toplevel_compat = machine->dt_compatible;
> +    uint8_t rng_seed[32];
>   
>       if (dtb_file) {
>           char *filename;
> @@ -403,6 +405,9 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
>       if (ret < 0)
>           fprintf(stderr, "couldn't set /chosen/bootargs\n");
>   
> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
> +    qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed));
> +
>       if (kvm_enabled()) {
>           /* Read out host's frequencies */
>           clock_freq = kvmppc_get_clockfreq();
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 9a5382d527..3a5112899e 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -27,6 +27,7 @@
>   #include "qemu/osdep.h"
>   #include "qemu/datadir.h"
>   #include "qemu/memalign.h"
> +#include "qemu/guest-random.h"
>   #include "qapi/error.h"
>   #include "qapi/qapi-events-machine.h"
>   #include "qapi/qapi-events-qdev.h"
> @@ -1014,6 +1015,7 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
>   {
>       MachineState *machine = MACHINE(spapr);
>       SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
> +    uint8_t rng_seed[32];
>       int chosen;
>   
>       _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
> @@ -1091,6 +1093,9 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
>           spapr_dt_ov5_platform_support(spapr, fdt, chosen);
>       }
>   
> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
> +    _FDT(fdt_setprop(fdt, chosen, "rng-seed", rng_seed, sizeof(rng_seed)));
> +
>       _FDT(spapr_dt_ovec(fdt, chosen, spapr->ov5_cas, "ibm,architecture-vec-5"));
>   }
>
Re: [PATCH] hw/ppc: pass random seed to fdt
Posted by Daniel Henrique Barboza 3 years, 7 months ago
CCing qemu-ppc and Cedric for awareness since I forgot to do so in
my reply (⌒_⌒;)



Daniel

On 7/12/22 17:26, Daniel Henrique Barboza wrote:
> 
> 
> On 7/12/22 10:51, Jason A. Donenfeld wrote:
>> 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 confirmed to successfully initialize the
>> RNG on Linux 5.19-rc6. The rng-seed node is part of the DT spec. Set
>> this on the paravirt platforms, spapr and e500, just as is done on other
>> architectures with paravirt hardware.
>>
>> Cc: Daniel Henrique Barboza <danielhb413@gmail.com>
>> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
>> ---
> 
> With current QEMU master, running a fedora 36 ppc64le guest with a
> 5.19.0-rc2-00054-g12ede8ffb103 kernel :
> 
> [root@fedora ~]# dmesg | grep -i rng
> [    5.130623] random: crng init done
> [root@fedora ~]#
> 
> 
> After applying this patch:
> 
> 
> [root@fedora ~]# dmesg | grep -i rng
> [    0.000000] random: crng init done
> [root@fedora ~]#
> 
> 
> 
> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> 
> 
> 
> 
>>   hw/ppc/e500.c  | 5 +++++
>>   hw/ppc/spapr.c | 5 +++++
>>   2 files changed, 10 insertions(+)
>>
>> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
>> index 7f7f5b3452..2f86eb490e 100644
>> --- a/hw/ppc/e500.c
>> +++ b/hw/ppc/e500.c
>> @@ -17,6 +17,7 @@
>>   #include "qemu/osdep.h"
>>   #include "qemu/datadir.h"
>>   #include "qemu/units.h"
>> +#include "qemu/guest-random.h"
>>   #include "qapi/error.h"
>>   #include "e500.h"
>>   #include "e500-ccsr.h"
>> @@ -346,6 +347,7 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
>>           };
>>       const char *dtb_file = machine->dtb;
>>       const char *toplevel_compat = machine->dt_compatible;
>> +    uint8_t rng_seed[32];
>>       if (dtb_file) {
>>           char *filename;
>> @@ -403,6 +405,9 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
>>       if (ret < 0)
>>           fprintf(stderr, "couldn't set /chosen/bootargs\n");
>> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
>> +    qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed));
>> +
>>       if (kvm_enabled()) {
>>           /* Read out host's frequencies */
>>           clock_freq = kvmppc_get_clockfreq();
>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>> index 9a5382d527..3a5112899e 100644
>> --- a/hw/ppc/spapr.c
>> +++ b/hw/ppc/spapr.c
>> @@ -27,6 +27,7 @@
>>   #include "qemu/osdep.h"
>>   #include "qemu/datadir.h"
>>   #include "qemu/memalign.h"
>> +#include "qemu/guest-random.h"
>>   #include "qapi/error.h"
>>   #include "qapi/qapi-events-machine.h"
>>   #include "qapi/qapi-events-qdev.h"
>> @@ -1014,6 +1015,7 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
>>   {
>>       MachineState *machine = MACHINE(spapr);
>>       SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
>> +    uint8_t rng_seed[32];
>>       int chosen;
>>       _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
>> @@ -1091,6 +1093,9 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset)
>>           spapr_dt_ov5_platform_support(spapr, fdt, chosen);
>>       }
>> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
>> +    _FDT(fdt_setprop(fdt, chosen, "rng-seed", rng_seed, sizeof(rng_seed)));
>> +
>>       _FDT(spapr_dt_ovec(fdt, chosen, spapr->ov5_cas, "ibm,architecture-vec-5"));
>>   }

Re: [PATCH] hw/ppc: pass random seed to fdt
Posted by Jason A. Donenfeld 3 years, 6 months ago
Hi Daniel,

On Tue, Jul 12, 2022 at 05:31:27PM -0300, Daniel Henrique Barboza wrote:
> CCing qemu-ppc and Cedric for awareness since I forgot to do so in
> my reply (⌒_⌒;)
> > Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>

Thanks for the review and for forwarding this to qemu-ppc. What's the
route this patch needs to take in order to make it into some tree
somewhere? Can somebody queue it up?

Regards,
Jason

Re: [PATCH] hw/ppc: pass random seed to fdt
Posted by Daniel Henrique Barboza 3 years, 6 months ago

On 7/13/22 14:30, Jason A. Donenfeld wrote:
> Hi Daniel,
> 
> On Tue, Jul 12, 2022 at 05:31:27PM -0300, Daniel Henrique Barboza wrote:
>> CCing qemu-ppc and Cedric for awareness since I forgot to do so in
>> my reply (⌒_⌒;)
>>> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> 
> Thanks for the review and for forwarding this to qemu-ppc. What's the
> route this patch needs to take in order to make it into some tree
> somewhere? Can somebody queue it up?


I'll queue it up shortly in my ppc-next tree in Gitlab at

gitlab.com/danielhb/qemu/tree/ppc-next


After that I'll send a pull request get it merged with upstream. Probably
end of this week/next Monday.


Thanks,


Daniel


> 
> Regards,
> Jason

Re: [PATCH] hw/ppc: pass random seed to fdt
Posted by Jason A. Donenfeld 3 years, 6 months ago
Hi Daniel,

On Wed, Jul 13, 2022 at 7:37 PM Daniel Henrique Barboza
<danielhb413@gmail.com> wrote:
>
>
>
> On 7/13/22 14:30, Jason A. Donenfeld wrote:
> > Hi Daniel,
> >
> > On Tue, Jul 12, 2022 at 05:31:27PM -0300, Daniel Henrique Barboza wrote:
> >> CCing qemu-ppc and Cedric for awareness since I forgot to do so in
> >> my reply (⌒_⌒;)
> >>> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> >
> > Thanks for the review and for forwarding this to qemu-ppc. What's the
> > route this patch needs to take in order to make it into some tree
> > somewhere? Can somebody queue it up?
>
>
> I'll queue it up shortly in my ppc-next tree in Gitlab at
>
> gitlab.com/danielhb/qemu/tree/ppc-next
>
>
> After that I'll send a pull request get it merged with upstream. Probably
> end of this week/next Monday.

Excellent, thanks!

Jason