From 425c3c6247f03f4890465e346f6aed5cfbd32f23 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Thu, 14 Jan 2021 17:35:39 +0000 Subject: [PATCH] dev: Fix reset of virtio devices The VirtualQueue reset was just resetting the queue address but it was not touching other cached state and its associated ring buffers (used and avail) Change-Id: I55cc767d791825899d62c4cd88b84809527f3f22 Signed-off-by: Giacomo Travaglini Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/39701 Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg Tested-by: kokoro --- src/dev/virtio/base.cc | 14 ++++++++++++-- src/dev/virtio/base.hh | 18 +++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/dev/virtio/base.cc b/src/dev/virtio/base.cc index 0624c7e51..c19cf9245 100644 --- a/src/dev/virtio/base.cc +++ b/src/dev/virtio/base.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016 ARM Limited + * Copyright (c) 2014, 2016, 2021 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -255,6 +255,16 @@ VirtQueue::unserialize(CheckpointIn &cp) setAddress(addr_in); } +void +VirtQueue::reset() +{ + _address = 0; + _last_avail = 0; + + avail.reset(); + used.reset(); +} + void VirtQueue::setAddress(Addr address) { @@ -366,7 +376,7 @@ VirtIODeviceBase::reset() _deviceStatus = 0; for (QueueID i = 0; i < _queues.size(); ++i) - _queues[i]->setAddress(0); + _queues[i]->reset(); } void diff --git a/src/dev/virtio/base.hh b/src/dev/virtio/base.hh index d9ade7f66..72ad02e01 100644 --- a/src/dev/virtio/base.hh +++ b/src/dev/virtio/base.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016-2017 ARM Limited + * Copyright (c) 2014, 2016-2017, 2021 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -305,6 +305,14 @@ public: /** @{ * @name Low-level Device Interface */ + + /** + * Reset cached state in this queue and in the associated + * ring buffers. A client of this method should be the + * VirtIODeviceBase::reset. + */ + void reset(); + /** * Set the base address of this queue. * @@ -464,6 +472,14 @@ public: header{0, 0}, ring(size), _proxy(proxy), _base(0), byteOrder(bo) {} + /** Reset any state in the ring buffer. */ + void + reset() + { + header = {0, 0}; + _base = 0; + }; + /** * Set the base address of the VirtIO ring buffer. * -- 2.30.2