And just to give you some idea that this truly is possible from firmware and I'm not just making it up, consider this patch to U-Boot: u-boot: diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c index cab8da4860..27f3ee68c0 100644 --- a/arch/mips/lib/bootm.c +++ b/arch/mips/lib/bootm.c @@ -211,6 +211,8 @@ static void linux_env_legacy(bootm_headers_t *images) sprintf(env_buf, "%un8r", gd->baudrate); linux_env_set("modetty0", env_buf); } + + linux_env_set("rngseed", "4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60"); } static int boot_reloc_fdt(bootm_headers_t *images) Now, obviously that seed should be generated from some real method (a seed file in flash, a hardware RNG U-Boot knows about, etc), but for the purposes of showing that this is how things are passed to Linux, the above suffices. To show that this ingested by Linux, let's then add: linux: diff --git a/drivers/char/random.c b/drivers/char/random.c index a007e3dad80f..05d5b8bcb7e9 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -890,6 +890,7 @@ EXPORT_SYMBOL_GPL(add_hwgenerator_randomness); */ void __init add_bootloader_randomness(const void *buf, size_t len) { + print_hex_dump(KERN_ERR, "SARU seed: ", DUMP_PREFIX_OFFSET, 16, 1, buf, len, 1); mix_pool_bytes(buf, len); if (trust_bootloader) credit_init_bits(len * 8); And now let's boot it: $ qemu-system-mips -nographic -bios ./u-boot.bin -m 1G -netdev user,tftp=arch/mips/boot,bootfile=/uImage,id=net -device pcnet,netdev=net U-Boot 2022.10-dirty (Oct 04 2022 - 12:31:05 +0200) Board: MIPS Malta CoreLV DRAM: 256 MiB Core: 3 devices, 3 uclasses, devicetree: separate PCI: Failed autoconfig bar 10 PCI: Failed autoconfig bar 14 PCI: Failed autoconfig bar 18 PCI: Failed autoconfig bar 1c PCI: Failed autoconfig bar 20 PCI: Failed autoconfig bar 24 Flash: 4 MiB Loading Environment from Flash... *** Warning - bad CRC, using default environment In: serial@3f8 Out: serial@3f8 Err: serial@3f8 Net: eth0: pcnet#0 IDE: Bus 0: not available malta # bootp BOOTP broadcast 1 DHCP client bound to address 10.0.2.15 (1 ms) Using pcnet#0 device TFTP from server 10.0.2.2; our IP address is 10.0.2.15 Filename '/uImage'. Load address: 0x81000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# #################################################### 169.6 MiB/s done Bytes transferred = 4446702 (43d9ee hex) malta # bootm ## Booting kernel from Legacy Image at 81000000 ... Image Name: Linux-6.0.0-rc6+ Created: 2022-10-04 10:23:27 UTC Image Type: MIPS Linux Kernel Image (gzip compressed) Data Size: 4446638 Bytes = 4.2 MiB Load Address: 80100000 Entry Point: 8054939c Verifying Checksum ... OK Uncompressing Kernel Image [ 0.000000] Linux version 6.0.0-rc6+ (zx2c4@thinkpad) (mips-linux-musl-gcc (GCC) 11.2.1 20211120, GNU ld (GNU Binutils) 2.37) #5 SMP PREEMPT Fri Jun 5 15:58:00 CEST 2015 [ 0.000000] earlycon: uart8250 at I/O port 0x3f8 (options '38400n8') [ 0.000000] printk: bootconsole [uart8250] enabled [ 0.000000] Config serial console: console=ttyS0,38400n8r [ 0.000000] MIPS CPS SMP unable to proceed without a CM [ 0.000000] CPU0 revision is: 00019300 (MIPS 24Kc) [ 0.000000] FPU revision is: 00739300 [ 0.000000] OF: fdt: No chosen node found, continuing without [ 0.000000] OF: fdt: Ignoring memory range 0x100000000 - 0x17ffff000 [ 0.000000] MIPS: machine is mti,malta [ 0.000000] Software DMA cache coherency enabled [ 0.000000] Initrd not found or empty - disabling initrd [ 0.000000] Primary instruction cache 2kB, VIPT, 2-way, linesize 16 bytes. [ 0.000000] Primary data cache 2kB, 2-way, VIPT, no aliases, linesize 16 bytes [ 0.000000] Zone ranges: [ 0.000000] DMA [mem 0x0000000000000000-0x0000000000ffffff] [ 0.000000] Normal [mem 0x0000000001000000-0x000000001fffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000000fffffff] [ 0.000000] node 0: [mem 0x0000000090000000-0x00000000ffffefff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ffffefff] [ 0.000000] SARU seed: 00000000: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 ABCDEFGHIJKLMNOP [ 0.000000] SARU seed: 00000010: 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 QRSTUVWXYZ[\]^_` [ 0.000000] random: crng init done ... So, as you can see, it works perfectly. Thus, setting this in QEMU follows *exactly* *the* *same* *pattern* as every other architecture that allows for this kind of mechanism. There's nothing weird or unusual or out of place happening here. Hope this helps clarify. Regards, Jason