hw/ppc: pass random seed to fdt
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> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20220712135114.289855-1-Jason@zx2c4.com> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
285c471f82
commit
c4b075318e
@ -17,6 +17,7 @@
|
|||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/datadir.h"
|
#include "qemu/datadir.h"
|
||||||
#include "qemu/units.h"
|
#include "qemu/units.h"
|
||||||
|
#include "qemu/guest-random.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "e500.h"
|
#include "e500.h"
|
||||||
#include "e500-ccsr.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 *dtb_file = machine->dtb;
|
||||||
const char *toplevel_compat = machine->dt_compatible;
|
const char *toplevel_compat = machine->dt_compatible;
|
||||||
|
uint8_t rng_seed[32];
|
||||||
|
|
||||||
if (dtb_file) {
|
if (dtb_file) {
|
||||||
char *filename;
|
char *filename;
|
||||||
@ -403,6 +405,9 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
fprintf(stderr, "couldn't set /chosen/bootargs\n");
|
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()) {
|
if (kvm_enabled()) {
|
||||||
/* Read out host's frequencies */
|
/* Read out host's frequencies */
|
||||||
clock_freq = kvmppc_get_clockfreq();
|
clock_freq = kvmppc_get_clockfreq();
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/datadir.h"
|
#include "qemu/datadir.h"
|
||||||
#include "qemu/memalign.h"
|
#include "qemu/memalign.h"
|
||||||
|
#include "qemu/guest-random.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qapi-events-machine.h"
|
#include "qapi/qapi-events-machine.h"
|
||||||
#include "qapi/qapi-events-qdev.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);
|
MachineState *machine = MACHINE(spapr);
|
||||||
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
|
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
|
||||||
|
uint8_t rng_seed[32];
|
||||||
int chosen;
|
int chosen;
|
||||||
|
|
||||||
_FDT(chosen = fdt_add_subnode(fdt, 0, "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);
|
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"));
|
_FDT(spapr_dt_ovec(fdt, chosen, spapr->ov5_cas, "ibm,architecture-vec-5"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user