From 52485bbc38bfb6d92ae6ccc29023dd2d487c557d Mon Sep 17 00:00:00 2001 From: Hoa Nguyen Date: Wed, 16 Feb 2022 15:59:08 -0800 Subject: [PATCH] dev: Make VirtIORng device use gem5's rng instead of C++'s Currently, VirtIORng uses C++'s RNG. This causes nondeterminism across simulations using this device. One example is the example RISC-V board booting Ubuntu, configs/example/gem5_library/riscv-ubuntu-run.py JIRA: https://gem5.atlassian.net/browse/GEM5-1193 Change-Id: I299e72eb891819007b4260390f5c2ba94d2dec7b Signed-off-by: Hoa Nguyen Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/56889 Maintainer: Bobby Bruce Reviewed-by: Jason Lowe-Power Tested-by: kokoro --- src/dev/virtio/VirtIORng.py | 2 -- src/dev/virtio/rng.cc | 28 +++++----------------------- src/dev/virtio/rng.hh | 13 ++----------- 3 files changed, 7 insertions(+), 36 deletions(-) diff --git a/src/dev/virtio/VirtIORng.py b/src/dev/virtio/VirtIORng.py index 54848ee7f1..13df059fa0 100644 --- a/src/dev/virtio/VirtIORng.py +++ b/src/dev/virtio/VirtIORng.py @@ -46,5 +46,3 @@ class VirtIORng(VirtIODeviceBase): cxx_class = 'gem5::VirtIORng' qSize = Param.Unsigned(16, "Request queue size") - - entropy_source = Param.String("/dev/random", "The source of entropy") diff --git a/src/dev/virtio/rng.cc b/src/dev/virtio/rng.cc index 50a747ce98..c26568eb94 100644 --- a/src/dev/virtio/rng.cc +++ b/src/dev/virtio/rng.cc @@ -38,9 +38,7 @@ #include "dev/virtio/rng.hh" -#include -#include - +#include "base/random.hh" #include "debug/VIORng.hh" #include "params/VirtIORng.hh" #include "sim/system.hh" @@ -50,8 +48,7 @@ namespace gem5 VirtIORng::VirtIORng(const Params ¶ms) : VirtIODeviceBase(params, ID_RNG, 0, 0), - qReq(params.system->physProxy, byteOrder, params.qSize, - params.entropy_source, *this) + qReq(params.system->physProxy, byteOrder, params.qSize, *this) { registerQueue(qReq); } @@ -60,16 +57,10 @@ VirtIORng::~VirtIORng() { } -VirtIORng::RngQueue::RngQueue(PortProxy &proxy, ByteOrder bo, - uint16_t size, const std::string &rng_file_path, +VirtIORng::RngQueue::RngQueue(PortProxy &proxy, ByteOrder bo, uint16_t size, VirtIORng &_parent) - : VirtQueue(proxy, bo, size), parent(_parent), dist(0,255) + : VirtQueue(proxy, bo, size), parent(_parent) { - rng_fd = open(rng_file_path.c_str(), O_RDONLY); - if (rng_fd < 0) { - DPRINTF(VIORng, "error when open entropy source: %s\n", - rng_file_path.c_str()); - } } void @@ -89,16 +80,7 @@ VirtIORng::RngQueue::trySend() DPRINTF(VIORng, "Got descriptor (len: %i)\n", d->size()); size_t len = 0; while (len < d->size()) { - uint8_t byte = 0; - bool rng_read_success = false; - if (rng_fd >= 0) { - ssize_t result = read(rng_fd, &byte, sizeof(uint8_t)); - rng_read_success = (result > 0); - } - if (!rng_read_success) { - // fallback to C++ std rng generator - byte = dist(rd_device); - } + uint8_t byte = gem5::random_mt.random(); d->chainWrite(len, &byte, sizeof(uint8_t)); ++len; } diff --git a/src/dev/virtio/rng.hh b/src/dev/virtio/rng.hh index 50a3723359..7be235421a 100644 --- a/src/dev/virtio/rng.hh +++ b/src/dev/virtio/rng.hh @@ -39,8 +39,6 @@ #ifndef __DEV_VIRTIO_RNG_HH__ #define __DEV_VIRTIO_RNG_HH__ -#include - #include "base/compiler.hh" #include "dev/virtio/base.hh" @@ -76,9 +74,8 @@ class VirtIORng : public VirtIODeviceBase : public VirtQueue { public: - RngQueue(PortProxy &proxy, ByteOrder bo, - uint16_t size, const std::string &rng_file_path, - VirtIORng &_parent); + RngQueue(PortProxy &proxy, ByteOrder bo, uint16_t size, + VirtIORng &_parent); virtual ~RngQueue() {} void onNotify() { trySend(); } @@ -90,12 +87,6 @@ class VirtIORng : public VirtIODeviceBase protected: VirtIORng &parent; - private: - // system's special file for generating random number - int rng_fd; - // fallback random number generator - std::random_device rd_device; - std::uniform_int_distribution dist; }; /** Receive queue for port 0 */ RngQueue qReq;