From: Jens Freimann <jf...@linux.vnet.ibm.com>

reset the guest vring avail/used idx fields, otherwise it's possible
that old values remain in memory which would cause a reboot to fail
with a "Guest moved used index" message

Signed-off-by: Jens Freimann <jf...@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntrae...@de.ibm.com>
---
 hw/s390-virtio-bus.c |    7 +++++++
 hw/s390-virtio-bus.h |    2 ++
 2 files changed, 9 insertions(+)

diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index 74419b3..084bac1 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -225,6 +225,7 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
 {
     VirtIOS390Bus *bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus);
     ram_addr_t cur_offs;
+    target_phys_addr_t idx_addr;
     uint8_t num_vq;
     int i;
 
@@ -250,6 +251,12 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
         vring = s390_virtio_next_ring(bus);
         virtio_queue_set_addr(dev->vdev, i, vring);
         virtio_queue_set_vector(dev->vdev, i, i);
+        idx_addr = virtio_queue_get_avail_addr(dev->vdev, i) +
+                     VIRTIO_VRING_AVAIL_IDX_OFFS;
+        stw_phys(idx_addr, 0);
+        idx_addr = virtio_queue_get_used_addr(dev->vdev, i) +
+                     VIRTIO_VRING_USED_IDX_OFFS;
+        stw_phys(idx_addr, 0);
         stq_be_phys(vq + VIRTIO_VQCONFIG_OFFS_ADDRESS, vring);
         stw_be_phys(vq + VIRTIO_VQCONFIG_OFFS_NUM, 
virtio_queue_get_num(dev->vdev, i));
     }
diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
index 0e60bc0..8deec1e 100644
--- a/hw/s390-virtio-bus.h
+++ b/hw/s390-virtio-bus.h
@@ -34,6 +34,8 @@
 #define VIRTIO_VQCONFIG_LEN            24
 
 #define VIRTIO_RING_LEN                        (TARGET_PAGE_SIZE * 3)
+#define VIRTIO_VRING_AVAIL_IDX_OFFS 2
+#define VIRTIO_VRING_USED_IDX_OFFS 2
 #define S390_DEVICE_PAGES              512
 
 #define VIRTIO_PARAM_MASK               0xff
-- 
1.7.9.6


Reply via email to