arch-riscv, dev: add VirtIO entropy device(VirtIORng) support

Systemd, which is used by many main stream Linux distributions,
will lead to slow boot if entropy is low. On X86 platforms,
this problem can be alleviated by enabling RDRAND instructions.
However, RISC-V doesn't have similar instructions. For QEMU/KVM,
this problem can be solved by passing randomness from the host
via virtio_rng. But gem5 doesn't have VirtIORng support now.

Some user report that the boot time of riscv-ubuntu-run.py is
too long. To alleviate this problem, this patch add VirtIORng
device support for gem5.

Change-Id: Id93b5703161701212fd6683837034cb0cff590c5
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/55483
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Luming Wang
2022-01-14 03:21:50 +00:00
parent faf3730559
commit f67ff25f7b
7 changed files with 307 additions and 1 deletions

View File

@@ -54,6 +54,7 @@ from m5.objects import (
RawDiskImage,
RiscvMmioVirtIO,
VirtIOBlock,
VirtIORng,
Frequency,
Port,
)
@@ -119,10 +120,18 @@ class RiscvBoard(AbstractBoard, KernelDiskWorkload):
pio_addr=0x10008000,
)
# The virtio rng
self.rng = RiscvMmioVirtIO(
vio=VirtIORng(),
interrupt_id=0x8,
pio_size=4096,
pio_addr=0x10007000,
)
# Note: This overrides the platform's code because the platform isn't
# general enough.
self._on_chip_devices = [self.platform.clint, self.platform.plic]
self._off_chip_devices = [self.platform.uart, self.disk]
self._off_chip_devices = [self.platform.uart, self.disk, self.rng]
def _setup_io_devices(self) -> None:
"""Connect the I/O devices to the I/O bus"""
@@ -337,6 +346,18 @@ class RiscvBoard(AbstractBoard, KernelDiskWorkload):
disk_node.appendCompatible(["virtio,mmio"])
soc_node.append(disk_node)
# VirtIO MMIO rng node
rng = self.rng
rng_node = rng.generateBasicPioDeviceNode(
soc_state, "virtio_mmio", rng.pio_addr, rng.pio_size
)
rng_node.append(FdtPropertyWords("interrupts", [rng.interrupt_id]))
rng_node.append(
FdtPropertyWords("interrupt-parent", soc_state.phandle(plic))
)
rng_node.appendCompatible(["virtio,mmio"])
soc_node.append(rng_node)
root.append(soc_node)
fdt = Fdt()