The Linux kernel already has a virtio-rng driver, this is the device
implementation.
When the guest asks for entropy from the virtio hwrng, it puts a buffer
in the vq. We then put entropy into that buffer, and push it back to
the guest.
The chardev connected to this device is fed the data to be sent to the
guest.
Invocation is simple:
$ qemu ... -device virtio-rng-pci,chardev=foo
In the guest, we see
$ cat /sys/devices/virtual/misc/hw_random/rng_available
virtio
$ cat /sys/devices/virtual/misc/hw_random/rng_current
virtio
# cat /dev/hwrng
Simply feeding /dev/urandom from the host to the chardev is sufficient:
$ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
-device virtio-rng,chardev=foo
$ nc -U /tmp/foo< /dev/urandom
A QMP event is sent for interested apps to monitor activity and send the
appropriate number of bytes that get asked by the guest:
{"timestamp": {"seconds": 1337966878, "microseconds": 517009}, \
"event": "ENTROPY_NEEDED", "data": {"bytes": 64}}