On Mon, 02/16 17:33, Gerd Hoffmann wrote: > Add VIRTIO_PCI_FLAG_DISABLE_LEGACY and VIRTIO_PCI_FLAG_DISABLE_MODERN > for VirtIOPCIProxy->flags. Also add properties for them. They can be > used to disable modern (virtio 1.0) or legacy (virtio 0.9) modes. By > default both are advertized and the guest driver can choose. > > Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > --- > hw/virtio/virtio-pci.c | 46 +++++++++++++++++++++++++++++++++------------- > hw/virtio/virtio-pci.h | 6 ++++++ > 2 files changed, 39 insertions(+), 13 deletions(-) > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index 4c9a0b8..6c0c650 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -1233,6 +1233,8 @@ static void virtio_pci_device_plugged(DeviceState *d) > { > VirtIOPCIProxy *proxy = VIRTIO_PCI(d); > VirtioBusState *bus = &proxy->bus; > + bool legacy = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_LEGACY); > + bool modern = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_MODERN); > uint8_t *config; > uint32_t size; > > @@ -1240,13 +1242,24 @@ static void virtio_pci_device_plugged(DeviceState *d) > if (proxy->class_code) { > pci_config_set_class(config, proxy->class_code); > } > - pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID, > - pci_get_word(config + PCI_VENDOR_ID)); > - pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus)); > + > + if (legacy) { > + /* legacy and transitional */ > + pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID, > + pci_get_word(config + PCI_VENDOR_ID)); > + pci_set_word(config + PCI_SUBSYSTEM_ID, virtio_bus_get_vdev_id(bus)); > + } else { > + /* pure virtio-1.0 */ > + pci_set_word(config + PCI_VENDOR_ID, > + PCI_VENDOR_ID_REDHAT_QUMRANET); > + pci_set_word(config + PCI_DEVICE_ID, > + 0x1040 + virtio_bus_get_vdev_id(bus)); > + pci_config_set_revision(config, 1); > + }
Should we forbid setting both legacy and modern at the same time? Fam