From nobody Sun Feb 8 07:07:52 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258384; cv=none; d=zohomail.com; s=zohoarc; b=G9tsPkD9Cf9MFnAH8jDoWNZG58WIEfZh4wpnkSiKdJGRJjW17inu+9SaUK6j3vRh2Sampwk/8FWkLSBBYzP6vRpzjc06XM1w74wrIwoWGu6hyaQ9xwTI3zNhAPF5XZlvxwCaKENe6v1JxodIJ0Ul4JN/bvSyroaMeAdhiHgSIi0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258384; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=rbZsP74cLmC+RMxQMUoUMCGlfoHfoyYzQH9nafppbj4=; b=HEEnYLiPl3AIYtyNOq+9m0tRcFU0oFvMuXzj33tFtmEA8DIYhE66CuvBWf4C7S8ccznFxSlTHzUF/PolpgiWfT3cHVMHQLnz2EgpiqgoN0WJ2mF7G2bPwhc1vlgrDeek7wvQKEqsYJ9mEMQAbYfvO3ZGbg1G0YmT6rRDdFf5Oiw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258384692561.2739334657198; Thu, 26 Mar 2020 14:33:04 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-167-nXUMlDRIO4Ki_-mtvOW-eg-1; Thu, 26 Mar 2020 17:32:31 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D7E6E8018A2; Thu, 26 Mar 2020 21:32:25 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ABDA110002A9; Thu, 26 Mar 2020 21:32:25 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6229F18089D0; Thu, 26 Mar 2020 21:32:25 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLWA7t010343 for ; Thu, 26 Mar 2020 17:32:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7A645105541B; Thu, 26 Mar 2020 21:32:10 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7605E1055419 for ; Thu, 26 Mar 2020 21:32:10 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 47CDA800298 for ; Thu, 26 Mar 2020 21:32:10 +0000 (UTC) Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-445-e0_OtB1GOamCmouWo79tnA-1; Thu, 26 Mar 2020 17:32:07 -0400 Received: by mail-qk1-f193.google.com with SMTP id j4so8627399qkc.11; Thu, 26 Mar 2020 14:32:07 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.32.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:32:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258383; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=rbZsP74cLmC+RMxQMUoUMCGlfoHfoyYzQH9nafppbj4=; b=JJPM6DjNDeTuSlGVFXXW/ifCPSbXLEh0nsZUntSczFSULHsBhJuEFKG/97bPOdHcUVUX2+ a4jKOiYGTzTR7Z34A0dSq1Y2XX52jjMWWNfy7BEm1jBSLE0fNnJzxzXJLRyaKwAGPEvecD prr6o1xiZDSEhOldaMTZ3nLrl7TnCYU= X-MC-Unique: nXUMlDRIO4Ki_-mtvOW-eg-1 X-MC-Unique: e0_OtB1GOamCmouWo79tnA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1w4PHNPaGjFpKwSBZNag/UIQXkH+PjZCLEO66enRoFc=; b=IKrifVtC7v4CPm1BawKwKGzfc5uL2YubSRNVxdZ+tUbeIpCveSx/XtQChqPU4gUxii drZokIn+kgYeBbCLNS0NBXbIXAHsyZELfOw4+lDpijIjfwf8XBk0xVDxltnbUhrGum3S Xmr0Ib7srpOW0EYZ/VpxDcUv73EfUKPPxrhdM+FEjSVVekfJVA5NQ84UfGE90jllXhi3 AxPUdG6m1C7v90VjqTvygODu9blRnDfDlHGONUpV2qwreedtXaJIVdrhQvdmEjOrywfF ssQWwS6u7zJntLhYhL02ideyq06G8S2khLD/Vd0Ixn2nnnjtFThaM0lrsniyGUKL/G4b bkqw== X-Gm-Message-State: ANhLgQ0jkle6HHa0+lcMv/QMECdA4/REsXPiKpJz7QU5jGmtpCR2Ft7Z LMy70UjX+OkPhdGUzfTEraDvA2CV X-Google-Smtp-Source: ADFU+vuwQshOG0qZ4+HDZnCqzPCsm9hmxB2whXniZMXBoiDspLuKuKYaEpmQmObILlNaAAM49d1jlg== X-Received: by 2002:a37:2f41:: with SMTP id v62mr10919218qkh.207.1585258326009; Thu, 26 Mar 2020 14:32:06 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 14/15] qemu: move remaining qemuDomainDeviceDefValidate() helpers Date: Thu, 26 Mar 2020 18:31:24 -0300 Message-Id: <20200326213125.2306013-15-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLWA7t010343 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" This will allow to move qemuDomainDeviceDefValidate() itself in the next patch in a cleaner way. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 392 +-------------------------------------- src/qemu/qemu_validate.c | 376 +++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 21 +++ 3 files changed, 405 insertions(+), 384 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ddcc0551db..3ab2bfe879 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5007,75 +5007,6 @@ qemuDomainDefPostParse(virDomainDefPtr def, } =20 =20 -static int -qemuDomainDeviceDefValidateNVRAM(virDomainNVRAMDefPtr nvram, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (!nvram) - return 0; - - if (qemuDomainIsPSeries(def)) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("nvram device is not supported by " - "this QEMU binary")); - return -1; - } - } else { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("nvram device is only supported for PPC64")); - return -1; - } - - if (!(nvram->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO = && - nvram->info.addr.spaprvio.has_reg)) { - - virReportError(VIR_ERR_XML_ERROR, "%s", - _("nvram address type must be spaprvio")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateHub(virDomainHubDefPtr hub, - virQEMUCapsPtr qemuCaps) -{ - if (hub->type !=3D VIR_DOMAIN_HUB_TYPE_USB) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("hub type %s not supported"), - virDomainHubTypeToString(hub->type)); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_HUB)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("usb-hub not supported by QEMU binary")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateMemory(virDomainMemoryDefPtr mem, - virQEMUCapsPtr qemuCaps) -{ - if (mem->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_NVDIMM && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("nvdimm isn't supported by this QEMU binary")); - return -1; - } - - return 0; -} - - int qemuDomainValidateActualNetDef(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps) @@ -5347,313 +5278,6 @@ qemuDomainValidateStorageSource(virStorageSourcePtr= src, } =20 =20 -static int -qemuDomainDeviceDefValidateVsock(const virDomainVsockDef *vsock, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_VSOCK)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vsock device is not supported " - "with this QEMU binary")); - return -1; - } - - if (!qemuDomainCheckCCWS390AddressSupport(def, &vsock->info, qemuCaps, - "vsock")) - return -1; - - return 0; -} - - -static int -qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - virQEMUCapsFlags flag; - - /* TPM 1.2 and 2 are not compatible, so we choose a specific version h= ere */ - if (tpm->version =3D=3D VIR_DOMAIN_TPM_VERSION_DEFAULT) - tpm->version =3D VIR_DOMAIN_TPM_VERSION_1_2; - - switch (tpm->version) { - case VIR_DOMAIN_TPM_VERSION_1_2: - /* TPM 1.2 + CRB do not work */ - if (tpm->type =3D=3D VIR_DOMAIN_TPM_TYPE_EMULATOR && - tpm->model =3D=3D VIR_DOMAIN_TPM_MODEL_CRB) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported interface %s for TPM 1.2"), - virDomainTPMModelTypeToString(tpm->model)); - return -1; - } - break; - case VIR_DOMAIN_TPM_VERSION_2_0: - case VIR_DOMAIN_TPM_VERSION_DEFAULT: - case VIR_DOMAIN_TPM_VERSION_LAST: - break; - } - - switch (tpm->type) { - case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH)) - goto no_support; - break; - - case VIR_DOMAIN_TPM_TYPE_EMULATOR: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR)) - goto no_support; - - break; - case VIR_DOMAIN_TPM_TYPE_LAST: - break; - } - - switch (tpm->model) { - case VIR_DOMAIN_TPM_MODEL_TIS: - flag =3D QEMU_CAPS_DEVICE_TPM_TIS; - break; - case VIR_DOMAIN_TPM_MODEL_CRB: - flag =3D QEMU_CAPS_DEVICE_TPM_CRB; - break; - case VIR_DOMAIN_TPM_MODEL_SPAPR: - flag =3D QEMU_CAPS_DEVICE_TPM_SPAPR; - break; - case VIR_DOMAIN_TPM_MODEL_LAST: - default: - virReportEnumRangeError(virDomainTPMModel, tpm->model); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, flag)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The QEMU executable %s does not support TPM " - "model %s"), - def->emulator, - virDomainTPMModelTypeToString(tpm->model)); - return -1; - } - - return 0; - - no_support: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The QEMU executable %s does not support TPM " - "backend type %s"), - def->emulator, - virDomainTPMBackendTypeToString(tpm->type)); - return -1; -} - - -static int -qemuDomainDeviceDefValidateInput(const virDomainInputDef *input, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - const char *baseName; - int cap; - int ccwCap; - - if (input->bus =3D=3D VIR_DOMAIN_INPUT_BUS_PS2 && !ARCH_IS_X86(def->os= .arch) && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_I8042)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s is not supported by this QEMU binary"), - virDomainInputBusTypeToString(input->bus)); - return -1; - } - - if (input->bus !=3D VIR_DOMAIN_INPUT_BUS_VIRTIO) - return 0; - - /* Only type=3Dpassthrough supports model=3Dvirtio-(non-)transitional = */ - switch ((virDomainInputModel)input->model) { - case VIR_DOMAIN_INPUT_MODEL_VIRTIO_TRANSITIONAL: - case VIR_DOMAIN_INPUT_MODEL_VIRTIO_NON_TRANSITIONAL: - switch ((virDomainInputType)input->type) { - case VIR_DOMAIN_INPUT_TYPE_MOUSE: - case VIR_DOMAIN_INPUT_TYPE_TABLET: - case VIR_DOMAIN_INPUT_TYPE_KBD: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("virtio (non-)transitional models are not " - "supported for input type=3D%s"), - virDomainInputTypeToString(input->type)); - return -1; - case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: - break; - case VIR_DOMAIN_INPUT_TYPE_LAST: - default: - virReportEnumRangeError(virDomainInputType, - input->type); - return -1; - } - break; - case VIR_DOMAIN_INPUT_MODEL_VIRTIO: - case VIR_DOMAIN_INPUT_MODEL_DEFAULT: - break; - case VIR_DOMAIN_INPUT_MODEL_LAST: - default: - virReportEnumRangeError(virDomainInputModel, - input->model); - return -1; - } - - switch ((virDomainInputType)input->type) { - case VIR_DOMAIN_INPUT_TYPE_MOUSE: - baseName =3D "virtio-mouse"; - cap =3D QEMU_CAPS_VIRTIO_MOUSE; - ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW; - break; - case VIR_DOMAIN_INPUT_TYPE_TABLET: - baseName =3D "virtio-tablet"; - cap =3D QEMU_CAPS_VIRTIO_TABLET; - ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW; - break; - case VIR_DOMAIN_INPUT_TYPE_KBD: - baseName =3D "virtio-keyboard"; - cap =3D QEMU_CAPS_VIRTIO_KEYBOARD; - ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_KEYBOARD_CCW; - break; - case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: - baseName =3D "virtio-input-host"; - cap =3D QEMU_CAPS_VIRTIO_INPUT_HOST; - ccwCap =3D QEMU_CAPS_LAST; - break; - case VIR_DOMAIN_INPUT_TYPE_LAST: - default: - virReportEnumRangeError(virDomainInputType, - input->type); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, cap) || - (input->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && - !virQEMUCapsGet(qemuCaps, ccwCap))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s is not supported by this QEMU binary"), - baseName); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateMemballoon(const virDomainMemballoonDef *membal= loon, - virQEMUCapsPtr qemuCaps) -{ - if (!memballoon || - memballoon->model =3D=3D VIR_DOMAIN_MEMBALLOON_MODEL_NONE) { - return 0; - } - - if (memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO && - memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_TRANSITI= ONAL && - memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_NON_TRAN= SITIONAL) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Memory balloon device type '%s' is not supported= by this version of qemu"), - virDomainMemballoonModelTypeToString(memballoon->mo= del)); - return -1; - } - - if (memballoon->autodeflate !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("deflate-on-oom is not supported by this QEMU bin= ary")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateIOMMU(const virDomainIOMMUDef *iommu, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - switch (iommu->model) { - case VIR_DOMAIN_IOMMU_MODEL_INTEL: - if (!qemuDomainIsQ35(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is only supported with " - "Q35 machines"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU) && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is not supported with " - "this QEMU binary"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - break; - - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - if (!qemuDomainIsARMVirt(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is only supported with " - "ARM Virt machines"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is not supported with " - "this QEMU binary"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - break; - - case VIR_DOMAIN_IOMMU_MODEL_LAST: - default: - virReportEnumRangeError(virDomainIOMMUModel, iommu->model); - return -1; - } - - /* These capability checks ensure we're not trying to use features - * of Intel IOMMU that the QEMU binary does not support, but they - * also make sure we report an error when trying to use features - * that are not implemented by SMMUv3 */ - - if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: interrupt remapping is not supported " - "with this QEMU binary")); - return -1; - } - if (iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_CACHING_MODE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: caching mode is not supported " - "with this QEMU binary")); - return -1; - } - if (iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: eim is not supported " - "with this QEMU binary")); - return -1; - } - if (iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_DEVICE_IOTLB)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: device IOTLB is not supported " - "with this QEMU binary")); - return -1; - } - - return 0; -} - - static int qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, @@ -5724,11 +5348,11 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_VSOCK: - ret =3D qemuDomainDeviceDefValidateVsock(dev->data.vsock, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefVsock(dev->data.vsock, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_TPM: - ret =3D qemuDomainDeviceDefValidateTPM(dev->data.tpm, def, qemuCap= s); + ret =3D qemuValidateDomainDeviceDefTPM(dev->data.tpm, def, qemuCap= s); break; =20 case VIR_DOMAIN_DEVICE_GRAPHICS: @@ -5737,15 +5361,15 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_INPUT: - ret =3D qemuDomainDeviceDefValidateInput(dev->data.input, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefInput(dev->data.input, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_MEMBALLOON: - ret =3D qemuDomainDeviceDefValidateMemballoon(dev->data.memballoon= , qemuCaps); + ret =3D qemuValidateDomainDeviceDefMemballoon(dev->data.memballoon= , qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_IOMMU: - ret =3D qemuDomainDeviceDefValidateIOMMU(dev->data.iommu, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefIOMMU(dev->data.iommu, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_FS: @@ -5753,11 +5377,11 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_NVRAM: - ret =3D qemuDomainDeviceDefValidateNVRAM(dev->data.nvram, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefNVRAM(dev->data.nvram, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_HUB: - ret =3D qemuDomainDeviceDefValidateHub(dev->data.hub, qemuCaps); + ret =3D qemuValidateDomainDeviceDefHub(dev->data.hub, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_SOUND: @@ -5765,7 +5389,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_MEMORY: - ret =3D qemuDomainDeviceDefValidateMemory(dev->data.memory, qemuCa= ps); + ret =3D qemuValidateDomainDeviceDefMemory(dev->data.memory, qemuCa= ps); break; =20 case VIR_DOMAIN_DEVICE_LEASE: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 58ed2512d4..6c772093de 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -3088,3 +3088,379 @@ qemuValidateDomainDeviceDefSound(virDomainSoundDefP= tr sound, =20 return 0; } + + +int +qemuValidateDomainDeviceDefVsock(const virDomainVsockDef *vsock, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_VSOCK)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vsock device is not supported " + "with this QEMU binary")); + return -1; + } + + if (!qemuDomainCheckCCWS390AddressSupport(def, &vsock->info, qemuCaps, + "vsock")) + return -1; + + return 0; +} + + +int +qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + virQEMUCapsFlags flag; + + /* TPM 1.2 and 2 are not compatible, so we choose a specific version h= ere */ + if (tpm->version =3D=3D VIR_DOMAIN_TPM_VERSION_DEFAULT) + tpm->version =3D VIR_DOMAIN_TPM_VERSION_1_2; + + switch (tpm->version) { + case VIR_DOMAIN_TPM_VERSION_1_2: + /* TPM 1.2 + CRB do not work */ + if (tpm->type =3D=3D VIR_DOMAIN_TPM_TYPE_EMULATOR && + tpm->model =3D=3D VIR_DOMAIN_TPM_MODEL_CRB) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported interface %s for TPM 1.2"), + virDomainTPMModelTypeToString(tpm->model)); + return -1; + } + break; + case VIR_DOMAIN_TPM_VERSION_2_0: + case VIR_DOMAIN_TPM_VERSION_DEFAULT: + case VIR_DOMAIN_TPM_VERSION_LAST: + break; + } + + switch (tpm->type) { + case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH)) + goto no_support; + break; + + case VIR_DOMAIN_TPM_TYPE_EMULATOR: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR)) + goto no_support; + + break; + case VIR_DOMAIN_TPM_TYPE_LAST: + break; + } + + switch (tpm->model) { + case VIR_DOMAIN_TPM_MODEL_TIS: + flag =3D QEMU_CAPS_DEVICE_TPM_TIS; + break; + case VIR_DOMAIN_TPM_MODEL_CRB: + flag =3D QEMU_CAPS_DEVICE_TPM_CRB; + break; + case VIR_DOMAIN_TPM_MODEL_SPAPR: + flag =3D QEMU_CAPS_DEVICE_TPM_SPAPR; + break; + case VIR_DOMAIN_TPM_MODEL_LAST: + default: + virReportEnumRangeError(virDomainTPMModel, tpm->model); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, flag)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The QEMU executable %s does not support TPM " + "model %s"), + def->emulator, + virDomainTPMModelTypeToString(tpm->model)); + return -1; + } + + return 0; + + no_support: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The QEMU executable %s does not support TPM " + "backend type %s"), + def->emulator, + virDomainTPMBackendTypeToString(tpm->type)); + return -1; +} + + +int +qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + const char *baseName; + int cap; + int ccwCap; + + if (input->bus =3D=3D VIR_DOMAIN_INPUT_BUS_PS2 && !ARCH_IS_X86(def->os= .arch) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_I8042)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s is not supported by this QEMU binary"), + virDomainInputBusTypeToString(input->bus)); + return -1; + } + + if (input->bus !=3D VIR_DOMAIN_INPUT_BUS_VIRTIO) + return 0; + + /* Only type=3Dpassthrough supports model=3Dvirtio-(non-)transitional = */ + switch ((virDomainInputModel)input->model) { + case VIR_DOMAIN_INPUT_MODEL_VIRTIO_TRANSITIONAL: + case VIR_DOMAIN_INPUT_MODEL_VIRTIO_NON_TRANSITIONAL: + switch ((virDomainInputType)input->type) { + case VIR_DOMAIN_INPUT_TYPE_MOUSE: + case VIR_DOMAIN_INPUT_TYPE_TABLET: + case VIR_DOMAIN_INPUT_TYPE_KBD: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("virtio (non-)transitional models are not " + "supported for input type=3D%s"), + virDomainInputTypeToString(input->type)); + return -1; + case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportEnumRangeError(virDomainInputType, + input->type); + return -1; + } + break; + case VIR_DOMAIN_INPUT_MODEL_VIRTIO: + case VIR_DOMAIN_INPUT_MODEL_DEFAULT: + break; + case VIR_DOMAIN_INPUT_MODEL_LAST: + default: + virReportEnumRangeError(virDomainInputModel, + input->model); + return -1; + } + + switch ((virDomainInputType)input->type) { + case VIR_DOMAIN_INPUT_TYPE_MOUSE: + baseName =3D "virtio-mouse"; + cap =3D QEMU_CAPS_VIRTIO_MOUSE; + ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW; + break; + case VIR_DOMAIN_INPUT_TYPE_TABLET: + baseName =3D "virtio-tablet"; + cap =3D QEMU_CAPS_VIRTIO_TABLET; + ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW; + break; + case VIR_DOMAIN_INPUT_TYPE_KBD: + baseName =3D "virtio-keyboard"; + cap =3D QEMU_CAPS_VIRTIO_KEYBOARD; + ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_KEYBOARD_CCW; + break; + case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + baseName =3D "virtio-input-host"; + cap =3D QEMU_CAPS_VIRTIO_INPUT_HOST; + ccwCap =3D QEMU_CAPS_LAST; + break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportEnumRangeError(virDomainInputType, + input->type); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, cap) || + (input->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && + !virQEMUCapsGet(qemuCaps, ccwCap))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s is not supported by this QEMU binary"), + baseName); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefMemballoon(const virDomainMemballoonDef *membal= loon, + virQEMUCapsPtr qemuCaps) +{ + if (!memballoon || + memballoon->model =3D=3D VIR_DOMAIN_MEMBALLOON_MODEL_NONE) { + return 0; + } + + if (memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO && + memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_TRANSITI= ONAL && + memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_NON_TRAN= SITIONAL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Memory balloon device type '%s' is not supported= by this version of qemu"), + virDomainMemballoonModelTypeToString(memballoon->mo= del)); + return -1; + } + + if (memballoon->autodeflate !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("deflate-on-oom is not supported by this QEMU bin= ary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + switch (iommu->model) { + case VIR_DOMAIN_IOMMU_MODEL_INTEL: + if (!qemuDomainIsQ35(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is only supported with " + "Q35 machines"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is not supported with " + "this QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; + + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + if (!qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is only supported with " + "ARM Virt machines"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is not supported with " + "this QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; + + case VIR_DOMAIN_IOMMU_MODEL_LAST: + default: + virReportEnumRangeError(virDomainIOMMUModel, iommu->model); + return -1; + } + + /* These capability checks ensure we're not trying to use features + * of Intel IOMMU that the QEMU binary does not support, but they + * also make sure we report an error when trying to use features + * that are not implemented by SMMUv3 */ + + if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: interrupt remapping is not supported " + "with this QEMU binary")); + return -1; + } + if (iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_CACHING_MODE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: caching mode is not supported " + "with this QEMU binary")); + return -1; + } + if (iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: eim is not supported " + "with this QEMU binary")); + return -1; + } + if (iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_DEVICE_IOTLB)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: device IOTLB is not supported " + "with this QEMU binary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr nvram, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (!nvram) + return 0; + + if (qemuDomainIsPSeries(def)) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("nvram device is not supported by " + "this QEMU binary")); + return -1; + } + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("nvram device is only supported for PPC64")); + return -1; + } + + if (!(nvram->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO = && + nvram->info.addr.spaprvio.has_reg)) { + + virReportError(VIR_ERR_XML_ERROR, "%s", + _("nvram address type must be spaprvio")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, + virQEMUCapsPtr qemuCaps) +{ + if (hub->type !=3D VIR_DOMAIN_HUB_TYPE_USB) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("hub type %s not supported"), + virDomainHubTypeToString(hub->type)); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_HUB)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("usb-hub not supported by QEMU binary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, + virQEMUCapsPtr qemuCaps) +{ + if (mem->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_NVDIMM && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("nvdimm isn't supported by this QEMU binary")); + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index e61a932809..ac4eb9b772 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -62,3 +62,24 @@ int qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr sound, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefVsock(const virDomainVsockDef *vsock, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefMemballoon(const virDomainMemballoonDef *me= mballoon, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr nvram, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); --=20 2.25.1