From nobody Sun Oct 5 01:50:03 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=1758826974; cv=none; d=zohomail.com; s=zohoarc; b=maKdSx/rNU9X/o3jiDI1y0WFr8hVIR4opcWyc7Ma7QB48c2mXzKCnH3ehgbedtoRYpcSqqxKB30T/VqJNm/bC/rTP1KYPKXFzD4ghoy8RRHRpfcgIfWGAlO/mjR96kth+hkKA7syzsCASYBF7XSgWWpg7Ie3QlclyApQ7v5uKZM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758826974; 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=U+kaQA2plLF3h007TSVed7Za0iXl3ruizCRRQExluhk=; b=cEoCaKNp5/b1bVa21ijDZni5yNwdtrEJ01eaiNDT+SiAiRgA+2vGi1F/einkTOzbo10TBbkRcteaxLHWfUbqVFpYgAnIwfEJ2lS+qwu9DWfIYX6ZRrGnjdH7JoKHWKEQ37Pgb0cM3VZDfmQaVzc4dPIfLXuBUcidTfa2e/55NCc= 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 1758826974426584.8293124024085; Thu, 25 Sep 2025 12:02:54 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 559E7417E5; Thu, 25 Sep 2025 15:02:53 -0400 (EDT) Received: from [172.19.199.14] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id C5C3244B04; Thu, 25 Sep 2025 14:21:17 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id ECDBB44119; Thu, 25 Sep 2025 14:19:17 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.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 E35FC44153 for ; Thu, 25 Sep 2025 14:08:04 -0400 (EDT) Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-538-XxgXXz2QOx2sHkFx3Kkjjg-1; Thu, 25 Sep 2025 14:08:03 -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-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 73AB01955F28 for ; Thu, 25 Sep 2025 18:08:02 +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 A041B30002D1 for ; Thu, 25 Sep 2025 18:08:01 +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=1758823684; 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=U+kaQA2plLF3h007TSVed7Za0iXl3ruizCRRQExluhk=; b=E9WjoWTOZ7aBMvqwylVpL/PYBupXztYCGNOHHmHqEmZnEm1Tj1wTDECRsivzJ91T6m7MUp iIj8vuUvoVUh92FPYm2jfhQPuXrC7CMD8tZHHTBGE+j3vjj6RVo5rwIPbbvPWi9SceKPEW w6/vjyHHGK+nWb8u/R08g/pBQopFQfI= X-MC-Unique: XxgXXz2QOx2sHkFx3Kkjjg-1 X-Mimecast-MFC-AGG-ID: XxgXXz2QOx2sHkFx3Kkjjg_1758823682 To: devel@lists.libvirt.org Subject: [PATCH v2 25/38] qemu: Validate PCI support for USB controllers Date: Thu, 25 Sep 2025 20:07:11 +0200 Message-ID: <20250925180724.500758-26-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: 4mpKv6izJZkH6IwF644Ka_v_6WK-eN8mRHAFq6B95Fg_1758823682 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: V2FXHM3EFFXKUKQAZVN7JFHUMXPWO5BS X-Message-ID-Hash: V2FXHM3EFFXKUKQAZVN7JFHUMXPWO5BS 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: 1758826975132116600 Content-Type: text/plain; charset="utf-8"; x-default="true" Attempting to use a USB controller that's a PCI device with a machine type that doesn't support PCI should result in an error. Note that, while all USB controllers supported by the libvirt QEMU driver today are PCI devices, QEMU itself implements machine types that come with non-PCI USB controllers. Having a separate helper with a switch/case statement ensures that things will need to be updated accordingly if libvirt will ever grow support for those USB controllers. Signed-off-by: Andrea Bolognani Reviewed-by: Peter Krempa --- src/qemu/qemu_command.c | 44 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f48165f75c..a17e5eaaab 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2558,6 +2558,38 @@ 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) { @@ -2589,6 +2621,7 @@ qemuControllerModelUSBToCaps(int model) =20 static int qemuValidateDomainDeviceDefControllerUSB(const virDomainControllerDef *con= troller, + const virDomainDef *def, virQEMUCaps *qemuCaps) { if (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT) { @@ -2598,6 +2631,15 @@ qemuValidateDomainDeviceDefControllerUSB(const virDo= mainControllerDef *controlle return -1; } =20 + 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"), @@ -2651,7 +2693,7 @@ qemuBuildUSBControllerDevProps(const virDomainDef *do= mainDef, { g_autoptr(virJSONValue) props =3D NULL; =20 - if (qemuValidateDomainDeviceDefControllerUSB(def, qemuCaps) < 0) + if (qemuValidateDomainDeviceDefControllerUSB(def, domainDef, qemuCaps)= < 0) return NULL; =20 if (virJSONValueObjectAdd(&props, --=20 2.51.0