aboutsummaryrefslogtreecommitdiff
path: root/hw/virtio/virtio-pci.c
diff options
context:
space:
mode:
authorDaniel P. Berrangé <berrange@redhat.com>2019-02-15 10:32:38 +0000
committerMichael S. Tsirkin <mst@redhat.com>2019-05-20 18:40:02 -0400
commitf2784eed306449c3d04a71a05ed6463b8289aedf (patch)
tree2423b124711ecb9137f44769d99d504f2aca3074 /hw/virtio/virtio-pci.c
parent2259637b95bef3116cc262459271de08e038cc66 (diff)
hw: report invalid disable-legacy|modern usage for virtio-1-only devs
A number of virtio devices (gpu, crypto, mouse, keyboard, tablet) only support the virtio-1 (aka modern) mode. Currently if the user launches QEMU, setting those devices to enable legacy mode, QEMU will silently create them in modern mode, ignoring the user's (mistaken) request. This patch introduces proper data validation so that an attempt to configure a virtio-1-only devices in legacy mode gets reported as an error to the user. Checking this required introduction of a new field to explicitly track what operating model is to be used for a device, separately from the disable_modern and disable_legacy fields that record the user's requested configuration. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-Id: <20190215103239.28640-2-berrange@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/virtio/virtio-pci.c')
-rw-r--r--hw/virtio/virtio-pci.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index cb44e19b67..509c1ff555 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1721,16 +1721,22 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp)
/* PCI BAR regions must be powers of 2 */
pow2ceil(proxy->notify.offset + proxy->notify.size));
- if (proxy->disable_legacy == ON_OFF_AUTO_AUTO) {
- proxy->disable_legacy = pcie_port ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
- }
-
- if (!virtio_pci_modern(proxy) && !virtio_pci_legacy(proxy)) {
- error_setg(errp, "device cannot work as neither modern nor legacy mode"
- " is enabled");
- error_append_hint(errp, "Set either disable-modern or disable-legacy"
- " to off\n");
- return;
+ if ((proxy->disable_legacy == ON_OFF_AUTO_ON) ||
+ ((proxy->disable_legacy == ON_OFF_AUTO_AUTO) && pcie_port)) {
+ if (proxy->disable_modern) {
+ error_setg(errp, "device cannot work as neither modern nor "
+ "legacy mode is enabled");
+ error_append_hint(errp, "Set either disable-modern or "
+ "disable-legacy to off\n");
+ return;
+ }
+ proxy->mode = VIRTIO_PCI_MODE_MODERN;
+ } else {
+ if (proxy->disable_modern) {
+ proxy->mode = VIRTIO_PCI_MODE_LEGACY;
+ } else {
+ proxy->mode = VIRTIO_PCI_MODE_TRANSITIONAL;
+ }
}
if (pcie_port && pci_is_express(pci_dev)) {