summaryrefslogtreecommitdiff
path: root/hw/virtio/virtio.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/virtio/virtio.c')
-rw-r--r--hw/virtio/virtio.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 9d637e043e..892d881216 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -123,6 +123,8 @@ struct VirtQueue
unsigned int inuse;
+ bool ready;
+
uint16_t vector;
VirtIOHandleOutput handle_output;
VirtIODevice *vdev;
@@ -1938,7 +1940,12 @@ int virtio_set_status(VirtIODevice *vdev, uint8_t val)
}
}
- if ((vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) !=
+ if (vdev->device_mode) {
+ if ((vdev->status & VIRTIO_CONFIG_S_FEATURES_OK) !=
+ (val & VIRTIO_CONFIG_S_FEATURES_OK)) {
+ virtio_set_started(vdev, val & VIRTIO_CONFIG_S_FEATURES_OK);
+ }
+ } else if ((vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) !=
(val & VIRTIO_CONFIG_S_DRIVER_OK)) {
virtio_set_started(vdev, val & VIRTIO_CONFIG_S_DRIVER_OK);
}
@@ -2015,6 +2022,7 @@ void virtio_reset(void *opaque)
vdev->vq[i].notification = true;
vdev->vq[i].vring.num = vdev->vq[i].vring.num_default;
vdev->vq[i].inuse = 0;
+ vdev->vq[i].ready = false;
virtio_virtqueue_reset_region_cache(&vdev->vq[i]);
}
}
@@ -3300,6 +3308,16 @@ bool virtio_queue_enabled(VirtIODevice *vdev, int n)
return virtio_queue_enabled_legacy(vdev, n);
}
+bool virtio_queue_get_ready(VirtIODevice *vdev, int n)
+{
+ return vdev->vq[n].ready;
+}
+
+void virtio_queue_set_ready(VirtIODevice *vdev, int n, bool ready)
+{
+ vdev->vq[n].ready = ready;
+}
+
hwaddr virtio_queue_get_avail_addr(VirtIODevice *vdev, int n)
{
return vdev->vq[n].vring.avail;
@@ -3685,6 +3703,7 @@ static Property virtio_properties[] = {
DEFINE_PROP_BOOL("use-disabled-flag", VirtIODevice, use_disabled_flag, true),
DEFINE_PROP_BOOL("x-disable-legacy-check", VirtIODevice,
disable_legacy_check, false),
+ DEFINE_PROP_BOOL("device-mode", VirtIODevice, device_mode, false),
DEFINE_PROP_END_OF_LIST(),
};