@@ -623,6 +623,10 @@ void virtio_set_status(VirtIODevice *vdev, uint8_t val)
VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
trace_virtio_set_status(vdev, val);
+ if (val) {
+ /* Unsetting NEED_RESET bit without reset is ignored. */
+ val |= (vdev->status & VIRTIO_CONFIG_S_NEEDS_RESET);
+ }
if (k->set_status) {
k->set_status(vdev, val);
}
@@ -1384,6 +1388,20 @@ static void virtio_device_realize(DeviceState *dev, Error **errp)
virtio_bus_device_plugged(vdev);
}
+void virtio_device_set_needs_reset(VirtIODevice *vdev)
+{
+ if (vdev->status & VIRTIO_CONFIG_S_NEEDS_RESET) {
+ return;
+ }
+ vdev->status |= VIRTIO_CONFIG_S_NEEDS_RESET;
+ virtio_notify_config(vdev);
+}
+
+bool virtio_device_needs_reset(VirtIODevice *vdev)
+{
+ return vdev->status & VIRTIO_CONFIG_S_NEEDS_RESET;
+}
+
static void virtio_device_unrealize(DeviceState *dev, Error **errp)
{
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
@@ -131,6 +131,8 @@ VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
void (*handle_output)(VirtIODevice *,
VirtQueue *),
Error **errp);
+void virtio_device_set_needs_reset(VirtIODevice *vdev);
+bool virtio_device_needs_reset(VirtIODevice *vdev);
void virtio_del_queue(VirtIODevice *vdev, int n, Error **errp);
Signed-off-by: Fam Zheng <famz@redhat.com> --- hw/virtio/virtio.c | 18 ++++++++++++++++++ include/hw/virtio/virtio.h | 2 ++ 2 files changed, 20 insertions(+)