On 22/08/2018 16:57, Fam Zheng wrote:
> On master (13b7b188501) and v3.0.0, booting the OpenBSD install63.iso with a
> virtio-net (slirp backend) device gives this assertion failure:
> 
> (gdb) bt
> #0  0x00007f6f25703feb in raise () at /lib64/libc.so.6
> #1  0x00007f6f256ee5c1 in abort () at /lib64/libc.so.6
> #2  0x00007f6f256ee491 in _nl_load_domain.cold.0 () at /lib64/libc.so.6
> #3  0x00007f6f256fc752 in  () at /lib64/libc.so.6
> #4  0x000055d966f5b5d6 in address_space_stw_le_cached (cache=0x7f6f040fd700, 
> addr=516, val=1, attrs=..., result=0x0)
>     at /stor/work/qemu/include/exec/memory_ldst_cached.inc.h:85

Does this help?

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index d4e4d98b59..5982678c75 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2006,14 +2006,25 @@ static int virtio_set_features_nocheck(VirtIODevice 
*vdev, uint64_t val)
 
 int virtio_set_features(VirtIODevice *vdev, uint64_t val)
 {
-   /*
+    int ret;
+    /*
      * The driver must not attempt to set features after feature negotiation
      * has finished.
      */
     if (vdev->status & VIRTIO_CONFIG_S_FEATURES_OK) {
         return -EINVAL;
     }
-    return virtio_set_features_nocheck(vdev, val);
+    ret = virtio_set_features_nocheck(vdev, val);
+    if (!ret && (val & VIRTIO_RING_F_EVENT_IDX)) {
+        /* VIRTIO_RING_F_EVENT_IDX changes the size of the caches.  */
+        int i;
+        for (i = 0; i < VIRTIO_QUEUE_MAX; i++) {
+            if (vdev->vq[i].vring.num != 0) {
+                virtio_init_region_cache(vdev, i);
+            }
+        }
+    }
+    return ret;
 }
 
 int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)

(I haven't tried to reproduce, or checked the spec to see if this could
be a guest bug too.  Of course assertion failures are wrong anyway, so
we might as well work around it as above).

Paolo

Reply via email to