A virtio device that had an error during reset will be marked as broken
and will not report reset completion to the guest.

Signed-off-by: Akihiko Odaki <[email protected]>
---
 hw/virtio/virtio.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index ed43c8bcb0bd..0b245f73f9d1 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -3443,6 +3443,7 @@ void virtio_reset(VirtIODevice *vdev)
         }
     }
 
+    vdev->broken = false;
     k->reset(vdev);
 }
 
@@ -3454,11 +3455,14 @@ void virtio_complete_reset(VirtIODevice *vdev)
 
     vdev->start_on_kick = false;
     vdev->started = false;
-    vdev->broken = false;
     virtio_features_clear(features);
     virtio_set_features_nocheck(vdev, features);
     vdev->queue_sel = 0;
-    vdev->status = 0;
+
+    if (!vdev->broken) {
+        vdev->status = 0;
+    }
+
     vdev->disabled = false;
     qatomic_set(&vdev->isr, 0);
     vdev->config_vector = VIRTIO_NO_VECTOR;

-- 
2.55.0


Reply via email to