From nobody Sun Oct 5 01:51:59 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1758827346; cv=none; d=zohomail.com; s=zohoarc; b=BMiZ/40rp/wtemH1CoLiXw5Xkw8rgzRivJD0pxvTnjNj0t7imvNk0zhPenMyMoWdT3WRTQn88qxoswk2DA5bBjbwR8yTHysDJ2a97xd4fqlYICgnBnXiB8JrQByEouyC/7UI1/0yvQ43TPCojAERd5uEX/4u2XapTrFkI9GpPuk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758827346; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=BYVIK3K0CW1ZXw2KlAJPGZEJb1U1vNG9vIqbqHnLfPQ=; b=OK/OPkqCoWYUdxnEHF2kEgxfrWpDSE/p9Gd8igxvlHuA0wUs8rele+eAk5/UaHzNv9Z2vuhceq0u3O8r3g4ZuEt4M35nXfO94zwSdCREig6IG0TdHa/eTC884OQzz3ZddeQ6V8aDlj7RdFwbv0twzIjM4BeENsM6DmmUdRC40Y4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1758827346387803.5556901170318; Thu, 25 Sep 2025 12:09:06 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 34749418C0; Thu, 25 Sep 2025 15:09:05 -0400 (EDT) Received: from [172.19.199.14] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 9BEC344B84; Thu, 25 Sep 2025 14:21:34 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 6CAE944151; Thu, 25 Sep 2025 14:20:04 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id CF9F743F98 for ; Thu, 25 Sep 2025 14:08:07 -0400 (EDT) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-219-2eWzr5RqN1KIpN-aX-1NXg-1; Thu, 25 Sep 2025 14:08:05 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 1E5B318002C0 for ; Thu, 25 Sep 2025 18:08:05 +0000 (UTC) Received: from harajuku.usersys.redhat.com.homenet.telecomitalia.it (unknown [10.45.225.196]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4B0CB30002D2 for ; Thu, 25 Sep 2025 18:08:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1758823687; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BYVIK3K0CW1ZXw2KlAJPGZEJb1U1vNG9vIqbqHnLfPQ=; b=NRK5rhfAXTrMnAKlvBdGlVdSAqNsvkmKp7yaIWq9/hFUC0OL4e1XHmLZxMghMd9qYRQgW2 sFqULXbDMAdue3OK2oCrtMmBO45cRGQdjSkr6yq0AuSBahsSuVj1KIYF4HmceMjmoUS/4u vH2CAia3L2pZQHqUD/S9TYKyaEnKLPQ= X-MC-Unique: 2eWzr5RqN1KIpN-aX-1NXg-1 X-Mimecast-MFC-AGG-ID: 2eWzr5RqN1KIpN-aX-1NXg_1758823685 To: devel@lists.libvirt.org Subject: [PATCH v2 27/38] qemu: Validate USB controllers earlier Date: Thu, 25 Sep 2025 20:07:13 +0200 Message-ID: <20250925180724.500758-28-abologna@redhat.com> In-Reply-To: <20250925180724.500758-1-abologna@redhat.com> References: <20250925180724.500758-1-abologna@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: VKa60e69Zw-9mCKui71IBDvrlD7B80J1NCneNEtVTe8_1758823685 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: SURHNJRMK27CGV4G4DSK5XWKJS7TY24M X-Message-ID-Hash: SURHNJRMK27CGV4G4DSK5XWKJS7TY24M X-MailFrom: abologna@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Andrea Bolognani via Devel Reply-To: Andrea Bolognani X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1758827347984116600 Content-Type: text/plain; charset="utf-8"; x-default="true" Right now we call qemuValidateDomainDeviceDefControllerUSB() quite late, just as we're generating the QEMU command line. The original intention was likely to prevent configurations from being rejected, even though a default USB controller model could not be found, because using -usb could be used as a last resort. As it turns out, this premise was always flawed: in order for -usb to work, the underlying device still needs to be compiled into QEMU, and if that was the case then the earlier code would have detected its presence and set the model name accordingly. More recently, we have dropped the use of -usb altogether so there's simply no longer anything to fall back to. With all this in mind, we can move the validation step much earlier, making for a better user experience as any issues will be reported when the domain is defined rather than when an attempt is made to start it. Signed-off-by: Andrea Bolognani Reviewed-by: Michal Privoznik Reviewed-by: Peter Krempa --- src/qemu/qemu_command.c | 114 +----------------- src/qemu/qemu_validate.c | 112 ++++++++++++++++- ...ilable-pseries.ppc64-latest.abi-update.xml | 31 ----- ...matic-unavailable-pseries.ppc64-latest.xml | 31 ----- ...ic-unavailable-realview.aarch64-latest.xml | 25 ---- ...-unavailable-versatilepb.armv7l-latest.xml | 27 ----- ...controller-default-isapc.x86_64-latest.err | 2 +- ...controller-default-isapc.x86_64-latest.xml | 26 ---- ...ntroller-default-microvm.x86_64-latest.err | 2 +- ...ntroller-default-microvm.x86_64-latest.xml | 24 ---- ...ontroller-default-nousb.aarch64-latest.err | 2 +- ...ontroller-default-nousb.aarch64-latest.xml | 22 ---- ...fault-unavailable-g3beige.ppc64-latest.xml | 27 ----- ...fault-unavailable-i440fx.x86_64-latest.xml | 29 ----- ...default-unavailable-mac99.ppc64-latest.xml | 27 ----- ...efault-unavailable-mac99ppc.ppc-latest.xml | 24 ---- ...ault-unavailable-powernv9.ppc64-latest.xml | 27 ----- ...fault-unavailable-pseries.ppc64-latest.xml | 31 ----- ...-default-unavailable-q35.x86_64-latest.xml | 47 -------- ...lt-unavailable-realview.aarch64-latest.xml | 25 ---- ...-unavailable-versatilepb.armv7l-latest.xml | 27 ----- ...navailable-virt-aarch64.aarch64-latest.xml | 43 ------- ...le-virt-loongarch64.loongarch64-latest.xml | 40 ------ ...navailable-virt-riscv64.riscv64-latest.xml | 41 ------- ...ler-nec-xhci-unavailable.x86_64-latest.xml | 33 ----- tests/qemuxmlconftest.c | 40 +++--- 26 files changed, 136 insertions(+), 743 deletions(-) delete mode 100644 tests/qemuxmlconfdata/usb-controller-automatic-unavaila= ble-pseries.ppc64-latest.abi-update.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-automatic-unavaila= ble-pseries.ppc64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-automatic-unavaila= ble-realview.aarch64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-automatic-unavaila= ble-versatilepb.armv7l-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-isapc.x86_= 64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-microvm.x8= 6_64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-nousb.aarc= h64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-g3beige.ppc64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-i440fx.x86_64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-mac99.ppc64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-mac99ppc.ppc-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-powernv9.ppc64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-pseries.ppc64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-q35.x86_64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-realview.aarch64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-versatilepb.armv7l-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-virt-aarch64.aarch64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-virt-loongarch64.loongarch64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-virt-riscv64.riscv64-latest.xml delete mode 100644 tests/qemuxmlconfdata/usb-controller-nec-xhci-unavailab= le.x86_64-latest.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d43c0fd21d..08e2a5147d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2558,112 +2558,6 @@ qemuBuildFilesystemCommandLine(virCommand *cmd, } =20 =20 -static bool -qemuDomainControllerUSBIsPCI(const virDomainControllerDef *controller) -{ - switch ((virDomainControllerModelUSB)controller->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: - /* The models above are PCI devices */ - return true; - - case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2: - /* The models above are not relevant to the QEMU driver */ - return false; - - case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: - default: - return false; - } -} - - -static int -qemuControllerModelUSBToCaps(int model) -{ - switch (model) { - case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI: - return QEMU_CAPS_PIIX3_USB_UHCI; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI: - return QEMU_CAPS_PIIX4_USB_UHCI; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI: - return QEMU_CAPS_USB_EHCI; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2: - case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3: - return QEMU_CAPS_ICH9_USB_EHCI1; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI: - return QEMU_CAPS_VT82C686B_USB_UHCI; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI: - return QEMU_CAPS_PCI_OHCI; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: - return QEMU_CAPS_NEC_USB_XHCI; - case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: - return QEMU_CAPS_DEVICE_QEMU_XHCI; - default: - return -1; - } -} - - -static int -qemuValidateDomainDeviceDefControllerUSB(const virDomainControllerDef *con= troller, - const virDomainDef *def, - virQEMUCaps *qemuCaps) -{ - if (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) - return 0; - - if (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unable to determine model for USB controller idx= =3D%1$d"), - controller->idx); - return -1; - } - - if (qemuDomainControllerUSBIsPCI(controller) && - !qemuDomainSupportsPCI(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("USB controller model '%1$s' requires PCI but mac= hine type '%2$s' does not support PCI"), - virDomainControllerModelUSBTypeToString(controller-= >model), - def->os.machine); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, qemuControllerModelUSBToCaps(controller-= >model))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("USB controller model '%1$s' not supported in thi= s QEMU binary"), - virDomainControllerModelUSBTypeToString(controller-= >model)); - return -1; - } - - if (controller->opts.usbopts.ports !=3D -1) { - if (controller->model !=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHC= I && - controller->model !=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XH= CI) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("usb controller type '%1$s' doesn't support '= ports' with this QEMU binary"), - virDomainControllerModelUSBTypeToString(control= ler->model)); - return -1; - } - } - - return 0; -} - - static const char * qemuBuildUSBControllerFindMasterAlias(const virDomainDef *domainDef, const virDomainControllerDef *def) @@ -2691,14 +2585,10 @@ qemuBuildUSBControllerFindMasterAlias(const virDoma= inDef *domainDef, =20 static virJSONValue * qemuBuildUSBControllerDevProps(const virDomainDef *domainDef, - virDomainControllerDef *def, - virQEMUCaps *qemuCaps) + virDomainControllerDef *def) { g_autoptr(virJSONValue) props =3D NULL; =20 - if (qemuValidateDomainDeviceDefControllerUSB(def, domainDef, qemuCaps)= < 0) - return NULL; - if (virJSONValueObjectAdd(&props, "s:driver", qemuControllerModelUSBTypeToStri= ng(def->model), "k:p2", def->opts.usbopts.ports, @@ -2994,7 +2884,7 @@ qemuBuildControllerDevProps(const virDomainDef *domai= nDef, break; =20 case VIR_DOMAIN_CONTROLLER_TYPE_USB: - if (!(props =3D qemuBuildUSBControllerDevProps(domainDef, def, qem= uCaps))) + if (!(props =3D qemuBuildUSBControllerDevProps(domainDef, def))) return -1; =20 break; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 456f9ee2f2..7f3ffe8bd5 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -3864,6 +3864,112 @@ qemuValidateDomainDeviceDefControllerSCSI(const vir= DomainControllerDef *controll } =20 =20 +static bool +qemuDomainControllerUSBIsPCI(const virDomainControllerDef *controller) +{ + switch ((virDomainControllerModelUSB)controller->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: + /* The models above are PCI devices */ + return true; + + case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2: + /* The models above are not relevant to the QEMU driver */ + return false; + + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: + default: + return false; + } +} + + +static int +qemuControllerModelUSBToCaps(int model) +{ + switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI: + return QEMU_CAPS_PIIX3_USB_UHCI; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI: + return QEMU_CAPS_PIIX4_USB_UHCI; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI: + return QEMU_CAPS_USB_EHCI; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2: + case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3: + return QEMU_CAPS_ICH9_USB_EHCI1; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI: + return QEMU_CAPS_VT82C686B_USB_UHCI; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI: + return QEMU_CAPS_PCI_OHCI; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: + return QEMU_CAPS_NEC_USB_XHCI; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: + return QEMU_CAPS_DEVICE_QEMU_XHCI; + default: + return -1; + } +} + + +static int +qemuValidateDomainDeviceDefControllerUSB(const virDomainControllerDef *con= troller, + const virDomainDef *def, + virQEMUCaps *qemuCaps) +{ + if (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) + return 0; + + if (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unable to determine model for USB controller idx= =3D%1$d"), + controller->idx); + return -1; + } + + if (qemuDomainControllerUSBIsPCI(controller) && + !qemuDomainSupportsPCI(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("USB controller model '%1$s' requires PCI but mac= hine type '%2$s' does not support PCI"), + virDomainControllerModelUSBTypeToString(controller-= >model), + def->os.machine); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, qemuControllerModelUSBToCaps(controller-= >model))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("USB controller model '%1$s' not supported in thi= s QEMU binary"), + virDomainControllerModelUSBTypeToString(controller-= >model)); + return -1; + } + + if (controller->opts.usbopts.ports !=3D -1) { + if (controller->model !=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHC= I && + controller->model !=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XH= CI) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("usb controller type '%1$s' doesn't support '= ports' with this QEMU binary"), + virDomainControllerModelUSBTypeToString(control= ler->model)); + return -1; + } + } + + return 0; +} + + /** * virValidateControllerPCIModelNameToQEMUCaps: * @modelName: model name @@ -4533,10 +4639,14 @@ qemuValidateDomainDeviceDefController(const virDoma= inControllerDef *controller, qemuCaps); break; =20 + case VIR_DOMAIN_CONTROLLER_TYPE_USB: + ret =3D qemuValidateDomainDeviceDefControllerUSB(controller, def, + qemuCaps); + break; + case VIR_DOMAIN_CONTROLLER_TYPE_FDC: case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: case VIR_DOMAIN_CONTROLLER_TYPE_CCID: - case VIR_DOMAIN_CONTROLLER_TYPE_USB: case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: case VIR_DOMAIN_CONTROLLER_TYPE_ISA: case VIR_DOMAIN_CONTROLLER_TYPE_LAST: diff --git a/tests/qemuxmlconfdata/usb-controller-automatic-unavailable-pse= ries.ppc64-latest.abi-update.xml b/tests/qemuxmlconfdata/usb-controller-aut= omatic-unavailable-pseries.ppc64-latest.abi-update.xml deleted file mode 100644 index 2b71e447e8..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-automatic-unavailable-pseries.pp= c64-latest.abi-update.xml +++ /dev/null @@ -1,31 +0,0 @@ - - QEMUGuest1 - c7a5fdbd-edaf-9455-926a-d65c16db1809 - 219100 - 219100 - 1 - - hvm - - - - POWER10 - - - destroy - restart - destroy - - /usr/bin/qemu-system-ppc64 - -
- - - - - -