/* * virtio_rng.h — Virtio 1.0 entropy source driver for StarKernel * * Real hardware/host entropy, uniformly across all three architectures. * Exists specifically because this kernel has no per-arch RNG that covers * all three ISAs: amd64 has RDRAND and riscv64 has the Zkr extension, but * QEMU's aarch64 CPU models (including "max") expose neither RNDR nor any * other RNG property (checked directly against QEMU 10.2.1, see * vm_uuid.h's identical finding). A paravirtualized virtio-rng device * sidesteps the per-ISA gap entirely: the host supplies the entropy, the * guest-side protocol is identical on all three arches. * * QEMU-only: there is no virtio-rng on real hardware (Milestone 8, bare- * metal boot). A real per-arch RNG driver is a separate, later problem. * * Only one virtio-rng device is supported. */ #ifndef STARKERNEL_VIRTIO_RNG_H #define STARKERNEL_VIRTIO_RNG_H #include #include /* virtio PCI vendor (shared with every virtio device) */ #define VIRTIO_RNG_PCI_VENDOR_ID 0x1AF4u /* device IDs: virtio device id 4 (entropy source) */ #define VIRTIO_RNG_DEVICE_MODERN 0x1044u #define VIRTIO_RNG_DEVICE_LEGACY 0x1005u /* * virtio_rng_init — locate the virtio-rng device on the PCI bus and bring * the driver up. Call once, before the first virtio_rng_get_bytes() call. * * Returns 0 on success. * Returns -1 if no virtio-rng device was found on the PCI bus. * Returns -2 on driver initialisation failure (bad BAR, queue setup, etc.). */ int virtio_rng_init(void); /* * virtio_rng_ready — 1 if virtio_rng_init() has already succeeded. */ int virtio_rng_ready(void); /* * virtio_rng_get_bytes — fill buf with n bytes of real host-supplied * entropy, blocking (polling) until all n bytes are obtained. The device * may return fewer bytes than requested per request; this loops * internally until the buffer is full. * * Returns 0 on success (buf fully filled). * Returns -1 if virtio_rng_init() has not succeeded. * Returns -2 on a device/timeout error partway through. */ int virtio_rng_get_bytes(uint8_t *buf, size_t n); #endif /* STARKERNEL_VIRTIO_RNG_H */