@@ -396,4 +396,6 @@ static inline bool virtio_device_disabled(VirtIODevice *vdev)
return unlikely(vdev->disabled || vdev->broken);
}
+bool virtio_legacy_allowed(VirtIODevice *vdev);
+
#endif
@@ -27,6 +27,7 @@
#include "hw/virtio/virtio-access.h"
#include "sysemu/dma.h"
#include "sysemu/runstate.h"
+#include "standard-headers/linux/virtio_ids.h"
/*
* The alignment to use between consumer and producer parts of vring.
@@ -3279,6 +3280,30 @@ void virtio_init(VirtIODevice *vdev, const char *name,
vdev->use_guest_notifier_mask = true;
}
+/*
+ * Only devices that have already been around prior to defining the virtio
+ * standard support legacy mode; this includes devices not specified in the
+ * standard. All newer devices conform to the virtio standard only.
+ */
+bool virtio_legacy_allowed(VirtIODevice *vdev)
+{
+ switch (vdev->device_id) {
+ case VIRTIO_ID_NET:
+ case VIRTIO_ID_BLOCK:
+ case VIRTIO_ID_CONSOLE:
+ case VIRTIO_ID_RNG:
+ case VIRTIO_ID_BALLOON:
+ case VIRTIO_ID_RPMSG:
+ case VIRTIO_ID_SCSI:
+ case VIRTIO_ID_9P:
+ case VIRTIO_ID_RPROC_SERIAL:
+ case VIRTIO_ID_CAIF:
+ return true;
+ default:
+ return false;
+ }
+}
+
hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n)
{
return vdev->vq[n].vring.desc;