diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/gating.yaml b/gating.yaml deleted file mode 100644 index 766a02f..0000000 --- a/gating.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# recipients: libvirt-qe ---- !Policy -product_versions: - - rhel-9 -decision_context: osci_compose_gate -subject_type: brew-build -rules: - - !PassingTestCaseRule {test_case_name: libvirt-ci.libvirt.brew-build.gating.x86_64.tier1.functional} - - !PassingTestCaseRule {test_case_name: libvirt-ci.libvirt-python.brew-build.gating.x86_64.tier1.functional} - - !PassingTestCaseRule {test_case_name: libvirt-ci.libvirt.brew-build.gating.s390x.tier1.functional} diff --git a/libvirt-Fix-documentation-of-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES.patch b/libvirt-Fix-documentation-of-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES.patch new file mode 100644 index 0000000..335895b --- /dev/null +++ b/libvirt-Fix-documentation-of-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES.patch @@ -0,0 +1,73 @@ +From 7a8f13f443843e8903ab18d5917f6f8bc4192dd6 Mon Sep 17 00:00:00 2001 +Message-ID: <7a8f13f443843e8903ab18d5917f6f8bc4192dd6.1780571167.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Tue, 26 May 2026 15:38:59 +0200 +Subject: [PATCH] Fix documentation of + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES + +The flag is designed for expanding the CPU model used by host-model. But +the documentation was sometimes describing it as showing all CPU +features supported on the host, which is wrong as the host may support +features that would not be enabled in host-model. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 090183a7dc4a64cca83937eff9a4e93a45b4d712) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + docs/manpages/virsh.rst | 5 +++-- + src/libvirt-domain.c | 6 +++--- + tools/virsh-host.c | 2 +- + 3 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst +index 85fa6ab011..7169b6bc05 100644 +--- a/docs/manpages/virsh.rst ++++ b/docs/manpages/virsh.rst +@@ -640,8 +640,9 @@ flagged as deprecated for the CPU model by the hypervisor. These + features will be paired with the "disable" policy. + + The **--expand-cpu-features** option will cause the host-model CPU definition +-to contain all CPU features supported on the host including those implicitly +-enabled by the selected CPU model. ++to contain all required CPU features including those implicitly enabled by the ++selected CPU model. Without this flag features that are part of the CPU model ++itself will not be listed. + + + pool-capabilities +diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c +index 034f126dd5..e146fa7e82 100644 +--- a/src/libvirt-domain.c ++++ b/src/libvirt-domain.c +@@ -12331,9 +12331,9 @@ virDomainSetUserPassword(virDomainPtr dom, + * passthrough and so on. + * + * If @flags includes VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES, +- * libvirt will explicitly list all CPU features (in host-model CPU definition) +- * that are supported on the host. Without this flag features that are part of +- * the CPU model itself will not be listed. ++ * libvirt will explicitly list all CPU features that will be enabled for ++ * host-model CPU mode. Without this flag features that are part of the CPU ++ * model itself will not be listed. + * + * Returns NULL in case of error or an XML string + * defining the capabilities. +diff --git a/tools/virsh-host.c b/tools/virsh-host.c +index dd98917fa8..5dbeb54ae5 100644 +--- a/tools/virsh-host.c ++++ b/tools/virsh-host.c +@@ -120,7 +120,7 @@ static const vshCmdOptDef opts_domcapabilities[] = { + }, + {.name = "expand-cpu-features", + .type = VSH_OT_BOOL, +- .help = N_("show all features in host CPU model"), ++ .help = N_("expand 'host-model' CPU to also show features enabled by the CPU model"), + }, + {.name = NULL} + }; +-- +2.54.0 diff --git a/libvirt-Introduce-EXPAND_CPU_FEATURES-flag-for-domain-capabilities.patch b/libvirt-Introduce-EXPAND_CPU_FEATURES-flag-for-domain-capabilities.patch new file mode 100644 index 0000000..e9a7c04 --- /dev/null +++ b/libvirt-Introduce-EXPAND_CPU_FEATURES-flag-for-domain-capabilities.patch @@ -0,0 +1,54 @@ +From 9644e7aceda1ca2b88d9eb699a274c5b4eafbda1 Mon Sep 17 00:00:00 2001 +Message-ID: <9644e7aceda1ca2b88d9eb699a274c5b4eafbda1.1780571166.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Wed, 11 Mar 2026 11:31:06 +0100 +Subject: [PATCH] Introduce EXPAND_CPU_FEATURES flag for domain capabilities + +The new VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES flag for +virConnectGetDomainCapabilities can be used to request the host-model +CPU definition to include all supported features (normally only extra +features relative to the selected CPU model are listed). + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 8aa13d1b16b08feea37ecacc85540671e7995bb8) + +https://issues.redhat.com/browse/RHEL-153653 + +Signed-off-by: Jiri Denemark +--- + include/libvirt/libvirt-domain.h | 2 ++ + src/libvirt-domain.c | 5 +++++ + 2 files changed, 7 insertions(+) + +diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h +index 8e62bd23d4..1c5dbdc26e 100644 +--- a/include/libvirt/libvirt-domain.h ++++ b/include/libvirt/libvirt-domain.h +@@ -1517,6 +1517,8 @@ int virDomainMigrateStartPostCopy(virDomainPtr domain, + typedef enum { + /* Report host model with deprecated features disabled. (Since: 11.0.0) */ + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0), ++ /* Report all host model CPU features. (Since: 12.2.0) */ ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES = (1 << 1), + } virConnectGetDomainCapabilitiesFlags; + + char * virConnectGetDomainCapabilities(virConnectPtr conn, +diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c +index c7451fee05..034f126dd5 100644 +--- a/src/libvirt-domain.c ++++ b/src/libvirt-domain.c +@@ -12330,6 +12330,11 @@ virDomainSetUserPassword(virDomainPtr dom, + * instance, if host, libvirt and qemu is capable of VFIO + * passthrough and so on. + * ++ * If @flags includes VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES, ++ * libvirt will explicitly list all CPU features (in host-model CPU definition) ++ * that are supported on the host. Without this flag features that are part of ++ * the CPU model itself will not be listed. ++ * + * Returns NULL in case of error or an XML string + * defining the capabilities. + * +-- +2.54.0 diff --git a/libvirt-Introduce-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES-flag.patch b/libvirt-Introduce-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES-flag.patch new file mode 100644 index 0000000..16c6f06 --- /dev/null +++ b/libvirt-Introduce-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES-flag.patch @@ -0,0 +1,59 @@ +From f4588f45d48037050c88624e37f7b13e15138b0e Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Fri, 29 May 2026 12:52:39 +0200 +Subject: [PATCH] Introduce + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES flag + +Some CPU features may be enabled explicitly, but should not +automatically become part of a host-model CPU. Users can now request +such features to be shown in the host-model CPU in domain capabilities +by VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES flag. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit e1efd79e837456d209115c536fc7e5f14abcbc63) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + include/libvirt/libvirt-domain.h | 3 +++ + src/libvirt-domain.c | 8 ++++++++ + 2 files changed, 11 insertions(+) + +diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h +index 1c5dbdc26e..4d7c0099ef 100644 +--- a/include/libvirt/libvirt-domain.h ++++ b/include/libvirt/libvirt-domain.h +@@ -1519,6 +1519,9 @@ typedef enum { + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0), + /* Report all host model CPU features. (Since: 12.2.0) */ + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES = (1 << 1), ++ /* Report all CPU features supported on the host, even those that will not ++ * be enabled by host-model CPU mode. (Since: 12.5.0) */ ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES = (1 << 2), + } virConnectGetDomainCapabilitiesFlags; + + char * virConnectGetDomainCapabilities(virConnectPtr conn, +diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c +index e146fa7e82..0ae48654df 100644 +--- a/src/libvirt-domain.c ++++ b/src/libvirt-domain.c +@@ -12335,6 +12335,14 @@ virDomainSetUserPassword(virDomainPtr dom, + * host-model CPU mode. Without this flag features that are part of the CPU + * model itself will not be listed. + * ++ * Adding VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES to @flags ++ * tells libvirt to update the host-model CPU definition with features that are ++ * supported on the host, but will not be enabled by default when starting a ++ * domain with host-model CPU. Use both ++ * VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES and ++ * VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES flags to get a ++ * complete list of features that can be enabled on the host. ++ * + * Returns NULL in case of error or an XML string + * defining the capabilities. + * +-- +2.54.0 diff --git a/libvirt-conf-Add-iommufd-fdgroup-support.patch b/libvirt-conf-Add-iommufd-fdgroup-support.patch new file mode 100644 index 0000000..7683e91 --- /dev/null +++ b/libvirt-conf-Add-iommufd-fdgroup-support.patch @@ -0,0 +1,160 @@ +From 99ca73f9c43c7a266cf65f0012a5350197d0f229 Mon Sep 17 00:00:00 2001 +Message-ID: <99ca73f9c43c7a266cf65f0012a5350197d0f229.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Fri, 13 Mar 2026 15:28:17 +0100 +Subject: [PATCH] conf: Add iommufd fdgroup support + +This will allow management applications running libvirt without +necessary permissions to pass FD for /dev/iommu with per-process +locked memory accounting enabled. + +Kernel uses per-user locked memory accounting by default which may +cause error while starting multiple VMs with host devices using IOMMUFD. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit 58875a6df679c5272f61028d33bf1380c51b0d5b) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + docs/formatdomain.rst | 8 +++++++- + src/conf/domain_conf.c | 6 ++++++ + src/conf/domain_conf.h | 1 + + src/conf/domain_validate.c | 16 ++++++++++++++++ + src/conf/schemas/domaincommon.rng | 3 +++ + tests/genericxml2xmlindata/iommufd.xml | 2 +- + 6 files changed, 34 insertions(+), 2 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 86b3bad903..225152e0f2 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -1368,7 +1368,7 @@ Host Device IOMMUFD + + + ... +- ++ + ... + + +@@ -1382,6 +1382,12 @@ Host Device IOMMUFD + This controls IOMMUFD usage for all host devices, each device can change this + global default by setting ``iommufd`` attribute for ``driver`` element. + ++ Optional ``fdgroup`` attribute can be used together with ++ `virDomainFDAssociate `__ ++ to pass /dev/iommu FD instead of letting libvirt to open it. Caller is ++ responsible for setting per-process locked memory accounting otherwise ++ starting multiple VMs with host devices using IOMMUFD may fail. ++ + Resource partitioning + --------------------- + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 1e91561fea..cec0f88f0f 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -4192,6 +4192,8 @@ void virDomainDefFree(virDomainDef *def) + g_free(def->kvm_features); + g_free(def->tcg_features); + ++ g_free(def->iommufd_fdgroup); ++ + virBlkioDeviceArrayClear(def->blkio.devices, + def->blkio.ndevices); + g_free(def->blkio.devices); +@@ -19765,6 +19767,8 @@ virDomainDefIommufdParse(virDomainDef *def, + if (virXMLPropTristateBool(nodes[0], "enabled", VIR_XML_PROP_REQUIRED, &def->iommufd) < 0) + return -1; + ++ def->iommufd_fdgroup = virXMLPropString(nodes[0], "fdgroup"); ++ + return 0; + } + +@@ -27998,6 +28002,8 @@ virDomainDefIommufdFormat(virBuffer *buf, + virBufferAsprintf(&attrBuf, " enabled='%s'", + virTristateBoolTypeToString(def->iommufd)); + ++ virBufferEscapeString(&attrBuf, " fdgroup='%s'", def->iommufd_fdgroup); ++ + virXMLFormatElement(buf, "iommufd", &attrBuf, NULL); + } + +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index e12064a3ab..8c8c11c0cf 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -3232,6 +3232,7 @@ struct _virDomainDef { + virDomainFeatureTCG *tcg_features; + + virTristateBool iommufd; ++ char *iommufd_fdgroup; + + bool tseg_specified; + unsigned long long tseg_size; +diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c +index 4558e7b210..3e6ba5e609 100644 +--- a/src/conf/domain_validate.c ++++ b/src/conf/domain_validate.c +@@ -1995,6 +1995,19 @@ virDomainDefValidateThrottleGroups(const virDomainDef *def) + } + + ++static int ++virDomainDefValidateIommufd(const virDomainDef *def) ++{ ++ if (def->iommufd == VIR_TRISTATE_BOOL_NO && def->iommufd_fdgroup) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("Setting 'fdgroup' when 'iommufd' is disabled is not supported.")); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ + static int + virDomainDefValidateInternal(const virDomainDef *def, + virDomainXMLOption *xmlopt) +@@ -2056,6 +2069,9 @@ virDomainDefValidateInternal(const virDomainDef *def, + if (virDomainDefValidateThrottleGroups(def) < 0) + return -1; + ++ if (virDomainDefValidateIommufd(def) < 0) ++ return -1; ++ + return 0; + } + +diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng +index 81b57a937a..9fde565d94 100644 +--- a/src/conf/schemas/domaincommon.rng ++++ b/src/conf/schemas/domaincommon.rng +@@ -1353,6 +1353,9 @@ + + + ++ ++ ++ + + + +diff --git a/tests/genericxml2xmlindata/iommufd.xml b/tests/genericxml2xmlindata/iommufd.xml +index 63ea839383..10d59ca548 100644 +--- a/tests/genericxml2xmlindata/iommufd.xml ++++ b/tests/genericxml2xmlindata/iommufd.xml +@@ -4,7 +4,7 @@ + 219136 + 219136 + 1 +- ++ + + hvm + +-- +2.54.0 diff --git a/libvirt-conf-Introduce-domain-iommufd-element.patch b/libvirt-conf-Introduce-domain-iommufd-element.patch new file mode 100644 index 0000000..29b86d0 --- /dev/null +++ b/libvirt-conf-Introduce-domain-iommufd-element.patch @@ -0,0 +1,218 @@ +From 28b77cb65fd0eedbd017d97d803256265ce3cbf4 Mon Sep 17 00:00:00 2001 +Message-ID: <28b77cb65fd0eedbd017d97d803256265ce3cbf4.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Fri, 13 Mar 2026 11:57:57 +0100 +Subject: [PATCH] conf: Introduce domain iommufd element + +In addition to configuring IOMMUFD for each host device add +configuration for the whole VM. This will be extended to add support for +passing FD to libvirt from management applications. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit c03b8f0804f648a2bbc2eb7e957f2f8821b8e167) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + docs/formatdomain.rst | 21 ++++++++++++ + src/conf/domain_conf.c | 46 ++++++++++++++++++++++++++ + src/conf/domain_conf.h | 2 ++ + src/conf/schemas/domaincommon.rng | 12 +++++++ + tests/genericxml2xmlindata/iommufd.xml | 18 ++++++++++ + tests/genericxml2xmltest.c | 2 ++ + 6 files changed, 101 insertions(+) + create mode 100644 tests/genericxml2xmlindata/iommufd.xml + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 5ec9a41aac..86b3bad903 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -1361,6 +1361,27 @@ Block I/O Tuning + ``write_iops_sec`` + Write I/O operations per second limit. :since:`Since 1.2.2` + ++Host Device IOMMUFD ++------------------- ++ ++:: ++ ++ ++ ... ++ ++ ... ++ ++ ++``iommufd`` ++ :since:`Since 12.2.0 (QEMU/KVM only)` The optional ``iommufd`` element with ++ mandatory ``enabled`` attribute can be used to enable IOMMUFD backend for ++ VFIO host devices. This provides an interface to propagate DMA mappings to ++ kernel for assigned devices. Libvirt will open the /dev/iommu and VFIO device ++ cdev and pass associated file descriptors to QEMU. ++ ++ This controls IOMMUFD usage for all host devices, each device can change this ++ global default by setting ``iommufd`` attribute for ``driver`` element. ++ + Resource partitioning + --------------------- + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 576a1bd79b..1e91561fea 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -19743,6 +19743,31 @@ virDomainDefControllersParse(virDomainDef *def, + return 0; + } + ++static int ++virDomainDefIommufdParse(virDomainDef *def, ++ xmlXPathContextPtr ctxt) ++{ ++ int n; ++ g_autofree xmlNodePtr *nodes = NULL; ++ ++ if ((n = virXPathNodeSet("./iommufd", ctxt, &nodes)) < 0) ++ return -1; ++ ++ if (n > 1) { ++ virReportError(VIR_ERR_XML_ERROR, "%s", ++ _("only one 'iommufd' element is supported")); ++ return -1; ++ } ++ ++ if (n == 0) ++ return 0; ++ ++ if (virXMLPropTristateBool(nodes[0], "enabled", VIR_XML_PROP_REQUIRED, &def->iommufd) < 0) ++ return -1; ++ ++ return 0; ++} ++ + static virDomainDef * + virDomainDefParseXML(xmlXPathContextPtr ctxt, + virDomainXMLOption *xmlopt, +@@ -19821,6 +19846,9 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, + !virDomainIOThreadIDArrayHasPin(def)) + def->placement_mode = VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO; + ++ if (virDomainDefIommufdParse(def, ctxt) < 0) ++ return NULL; ++ + if ((n = virXPathNodeSet("./resource", ctxt, &nodes)) < 0) + return NULL; + +@@ -27958,6 +27986,22 @@ virDomainHubDefFormat(virBuffer *buf, + } + + ++static void ++virDomainDefIommufdFormat(virBuffer *buf, ++ virDomainDef *def) ++{ ++ g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; ++ ++ if (def->iommufd == VIR_TRISTATE_BOOL_ABSENT) ++ return; ++ ++ virBufferAsprintf(&attrBuf, " enabled='%s'", ++ virTristateBoolTypeToString(def->iommufd)); ++ ++ virXMLFormatElement(buf, "iommufd", &attrBuf, NULL); ++} ++ ++ + static void + virDomainResourceDefFormat(virBuffer *buf, + virDomainResourceDef *def) +@@ -29482,6 +29526,8 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def, + if (virDomainNumatuneFormatXML(buf, def->numa) < 0) + return -1; + ++ virDomainDefIommufdFormat(buf, def); ++ + virDomainResourceDefFormat(buf, def->resource); + + for (i = 0; i < def->nsysinfo; i++) { +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index f1c8478208..e12064a3ab 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -3231,6 +3231,8 @@ struct _virDomainDef { + virTristateSwitch apic_eoi; + virDomainFeatureTCG *tcg_features; + ++ virTristateBool iommufd; ++ + bool tseg_specified; + unsigned long long tseg_size; + +diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng +index afdf7bfc1a..81b57a937a 100644 +--- a/src/conf/schemas/domaincommon.rng ++++ b/src/conf/schemas/domaincommon.rng +@@ -1001,6 +1001,10 @@ + + + ++ ++ ++ ++ + + + +@@ -1344,6 +1348,14 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/genericxml2xmlindata/iommufd.xml b/tests/genericxml2xmlindata/iommufd.xml +new file mode 100644 +index 0000000000..63ea839383 +--- /dev/null ++++ b/tests/genericxml2xmlindata/iommufd.xml +@@ -0,0 +1,18 @@ ++ ++ foo ++ c7a5fdbd-edaf-9455-926a-d65c16db1809 ++ 219136 ++ 219136 ++ 1 ++ ++ ++ hvm ++ ++ ++ ++ destroy ++ restart ++ destroy ++ ++ ++ +diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c +index 6757fc44de..6be694cac5 100644 +--- a/tests/genericxml2xmltest.c ++++ b/tests/genericxml2xmltest.c +@@ -263,6 +263,8 @@ mymain(void) + + DO_TEST("iothreadids"); + ++ DO_TEST("iommufd"); ++ + virObjectUnref(caps); + virObjectUnref(xmlopt); + +-- +2.54.0 diff --git a/libvirt-conf-Move-and-rename-virStorageSourceFDTuple-object.patch b/libvirt-conf-Move-and-rename-virStorageSourceFDTuple-object.patch new file mode 100644 index 0000000..24d95ad --- /dev/null +++ b/libvirt-conf-Move-and-rename-virStorageSourceFDTuple-object.patch @@ -0,0 +1,330 @@ +From 15b1edcb2dca52b4d2276359c1eeaa97d66ac400 Mon Sep 17 00:00:00 2001 +Message-ID: <15b1edcb2dca52b4d2276359c1eeaa97d66ac400.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Fri, 13 Mar 2026 16:59:01 +0100 +Subject: [PATCH] conf: Move and rename virStorageSourceFDTuple object + +Associating FD can be used by other parts of VM so rename it to generic +virDomainFDTuple. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit f89e3dbce809f64246a8fe5ef0d05a63a28a05c0) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/conf/meson.build | 1 + + src/conf/storage_source_conf.c | 42 --------------------------- + src/conf/storage_source_conf.h | 24 ++-------------- + src/conf/virdomainfd.c | 52 ++++++++++++++++++++++++++++++++++ + src/conf/virdomainfd.h | 27 ++++++++++++++++++ + src/libvirt_private.syms | 5 +++- + src/qemu/qemu_backup.c | 2 +- + src/qemu/qemu_domain.c | 2 +- + src/qemu/qemu_driver.c | 6 ++-- + tests/testutilsqemu.c | 2 +- + 10 files changed, 92 insertions(+), 71 deletions(-) + create mode 100644 src/conf/virdomainfd.c + create mode 100644 src/conf/virdomainfd.h + +diff --git a/src/conf/meson.build b/src/conf/meson.build +index 5116c23fe3..6f95b23cce 100644 +--- a/src/conf/meson.build ++++ b/src/conf/meson.build +@@ -20,6 +20,7 @@ domain_conf_sources = [ + 'numa_conf.c', + 'snapshot_conf.c', + 'virdomaincheckpointobjlist.c', ++ 'virdomainfd.c', + 'virdomainjob.c', + 'virdomainmomentobjlist.c', + 'virdomainobjlist.c', +diff --git a/src/conf/storage_source_conf.c b/src/conf/storage_source_conf.c +index 24d4b0de6a..493b1411b3 100644 +--- a/src/conf/storage_source_conf.c ++++ b/src/conf/storage_source_conf.c +@@ -1413,48 +1413,6 @@ virStorageSourceInitiatorClear(virStorageSourceInitiatorDef *initiator) + VIR_FREE(initiator->iqn); + } + +-G_DEFINE_TYPE(virStorageSourceFDTuple, vir_storage_source_fd_tuple, G_TYPE_OBJECT); +- +-static void +-vir_storage_source_fd_tuple_init(virStorageSourceFDTuple *fdt G_GNUC_UNUSED) +-{ +-} +- +- +-static void +-virStorageSourceFDTupleFinalize(GObject *object) +-{ +- virStorageSourceFDTuple *fdt = VIR_STORAGE_SOURCE_FD_TUPLE(object); +- size_t i; +- +- if (!fdt) +- return; +- +- for (i = 0; i < fdt->nfds; i++) +- VIR_FORCE_CLOSE(fdt->fds[i]); +- +- g_free(fdt->fds); +- g_free(fdt->testfds); +- g_free(fdt->selinuxLabel); +- G_OBJECT_CLASS(vir_storage_source_fd_tuple_parent_class)->finalize(object); +-} +- +- +-static void +-vir_storage_source_fd_tuple_class_init(virStorageSourceFDTupleClass *klass) +-{ +- GObjectClass *obj = G_OBJECT_CLASS(klass); +- +- obj->finalize = virStorageSourceFDTupleFinalize; +-} +- +- +-virStorageSourceFDTuple * +-virStorageSourceFDTupleNew(void) +-{ +- return g_object_new(vir_storage_source_fd_tuple_get_type(), NULL); +-} +- + + /** + * virStorageSourceNetworkProtocolPathSplit: +diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h +index 5a4b088eeb..b47313bae5 100644 +--- a/src/conf/storage_source_conf.h ++++ b/src/conf/storage_source_conf.h +@@ -24,6 +24,7 @@ + #include "storage_encryption_conf.h" + #include "virbitmap.h" + #include "virconftypes.h" ++#include "virdomainfd.h" + #include "virenum.h" + #include "virobject.h" + #include "virpci.h" +@@ -268,27 +269,6 @@ struct _virStorageSourceSlice { + void + virStorageSourceSliceFree(virStorageSourceSlice *slice); + +-struct _virStorageSourceFDTuple { +- GObject parent; +- int *fds; +- size_t nfds; +- int *testfds; /* populated by tests to ensure stable FDs */ +- +- bool writable; +- bool tryRestoreLabel; +- +- /* connection this FD tuple is associated with for auto-closing */ +- virConnect *conn; +- +- /* original selinux label when we relabel the image */ +- char *selinuxLabel; +-}; +-G_DECLARE_FINAL_TYPE(virStorageSourceFDTuple, vir_storage_source_fd_tuple, VIR, STORAGE_SOURCE_FD_TUPLE, GObject); +- +-virStorageSourceFDTuple * +-virStorageSourceFDTupleNew(void); +- +- + typedef struct _virStorageSource virStorageSource; + + /* Stores information related to a host resource. In the case of backing +@@ -441,7 +421,7 @@ struct _virStorageSource { + * one event for it */ + bool thresholdEventWithIndex; + +- virStorageSourceFDTuple *fdtuple; ++ virDomainFDTuple *fdtuple; + + /* Setting 'seclabelSkipRemember' to true will cause the security driver to + * not remember the security label even if it otherwise were to be +diff --git a/src/conf/virdomainfd.c b/src/conf/virdomainfd.c +new file mode 100644 +index 0000000000..13c3161e6a +--- /dev/null ++++ b/src/conf/virdomainfd.c +@@ -0,0 +1,52 @@ ++/* ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#include ++ ++#include "virdomainfd.h" ++ ++#include "virfile.h" ++ ++G_DEFINE_TYPE(virDomainFDTuple, vir_domain_fd_tuple, G_TYPE_OBJECT); ++ ++ ++static void ++vir_domain_fd_tuple_init(virDomainFDTuple *fdt G_GNUC_UNUSED) ++{ ++} ++ ++ ++static void ++virDomainFDTupleFinalize(GObject *object) ++{ ++ virDomainFDTuple *fdt = VIR_DOMAIN_FD_TUPLE(object); ++ size_t i; ++ ++ if (!fdt) ++ return; ++ ++ for (i = 0; i < fdt->nfds; i++) ++ VIR_FORCE_CLOSE(fdt->fds[i]); ++ ++ g_free(fdt->fds); ++ g_free(fdt->testfds); ++ g_free(fdt->selinuxLabel); ++ G_OBJECT_CLASS(vir_domain_fd_tuple_parent_class)->finalize(object); ++} ++ ++ ++static void ++vir_domain_fd_tuple_class_init(virDomainFDTupleClass *klass) ++{ ++ GObjectClass *obj = G_OBJECT_CLASS(klass); ++ ++ obj->finalize = virDomainFDTupleFinalize; ++} ++ ++ ++virDomainFDTuple * ++virDomainFDTupleNew(void) ++{ ++ return g_object_new(vir_domain_fd_tuple_get_type(), NULL); ++} +diff --git a/src/conf/virdomainfd.h b/src/conf/virdomainfd.h +new file mode 100644 +index 0000000000..0c0d475ed6 +--- /dev/null ++++ b/src/conf/virdomainfd.h +@@ -0,0 +1,27 @@ ++/* ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#pragma once ++ ++#include "internal.h" ++ ++struct _virDomainFDTuple { ++ GObject parent; ++ int *fds; ++ size_t nfds; ++ int *testfds; /* populated by tests to ensure stable FDs */ ++ ++ bool writable; ++ bool tryRestoreLabel; ++ ++ /* connection this FD tuple is associated with for auto-closing */ ++ virConnect *conn; ++ ++ /* original selinux label when we relabel the image */ ++ char *selinuxLabel; ++}; ++G_DECLARE_FINAL_TYPE(virDomainFDTuple, vir_domain_fd_tuple, VIR, DOMAIN_FD_TUPLE, GObject); ++ ++virDomainFDTuple * ++virDomainFDTupleNew(void); +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index effe44fe57..386e757d81 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -1177,7 +1177,6 @@ virStorageSourceChainHasManagedPR; + virStorageSourceChainHasNVMe; + virStorageSourceClear; + virStorageSourceCopy; +-virStorageSourceFDTupleNew; + virStorageSourceGetActualType; + virStorageSourceGetSecurityLabelDef; + virStorageSourceHasBacking; +@@ -1230,6 +1229,10 @@ virDomainCheckpointUpdateRelations; + virDomainListCheckpoints; + + ++# conf/virdomainfd.h ++virDomainFDTupleNew; ++ ++ + #conf/virdomainjob.h + virDomainAgentJobTypeToString; + virDomainAsyncJobTypeFromString; +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index c3566bcd57..eebf6cdc06 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -876,7 +876,7 @@ qemuBackupBegin(virDomainObj *vm, + priv->backup = g_steal_pointer(&def); + + if (pull && priv->backup->server->fdgroup) { +- virStorageSourceFDTuple *fdt = NULL; ++ virDomainFDTuple *fdt = NULL; + VIR_AUTOCLOSE fdcopy = -1; + + if (!(fdt = virHashLookup(priv->fds, priv->backup->server->fdgroup))) { +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index ccbfc8bac7..5c9f4831fd 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -9835,7 +9835,7 @@ qemuDomainPrepareStorageSourceFDs(virStorageSource *src, + { + qemuDomainStorageSourcePrivate *srcpriv = NULL; + virStorageType actualType = virStorageSourceGetActualType(src); +- virStorageSourceFDTuple *fdt = NULL; ++ virDomainFDTuple *fdt = NULL; + size_t i; + + if (actualType != VIR_STORAGE_TYPE_FILE && +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index ecd19663ce..8db9cbb6a2 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -20241,7 +20241,7 @@ qemuDomainFDHashCloseConnect(virDomainObj *vm, + virConnectPtr conn) + { + qemuDomainObjPrivate *priv = QEMU_DOMAIN_PRIVATE(vm); +- virStorageSourceFDTuple *data; ++ virDomainFDTuple *data; + GHashTableIter htitr; + + if (!priv->fds) +@@ -20265,7 +20265,7 @@ qemuDomainFDAssociate(virDomainPtr domain, + { + virDomainObj *vm = NULL; + qemuDomainObjPrivate *priv; +- g_autoptr(virStorageSourceFDTuple) new = NULL; ++ g_autoptr(virDomainFDTuple) new = NULL; + size_t i; + int ret = -1; + +@@ -20283,7 +20283,7 @@ qemuDomainFDAssociate(virDomainPtr domain, + + priv = vm->privateData; + +- new = virStorageSourceFDTupleNew(); ++ new = virDomainFDTupleNew(); + new->nfds = nfds; + new->fds = g_new0(int, new->nfds); + for (i = 0; i < new->nfds; i++) { +diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c +index 78ec521266..fc51e0e3df 100644 +--- a/tests/testutilsqemu.c ++++ b/tests/testutilsqemu.c +@@ -713,7 +713,7 @@ testQemuInfoSetArgs(testQemuInfo *info, + break; + + case ARG_FD_GROUP: { +- virStorageSourceFDTuple *new = virStorageSourceFDTupleNew(); ++ virDomainFDTuple *new = virDomainFDTupleNew(); + const char *fdname = va_arg(argptr, char *); + VIR_AUTOCLOSE fakefd = open("/dev/zero", O_RDWR); + bool writable = va_arg(argptr, int); +-- +2.54.0 diff --git a/libvirt-conf-Parse-hyperv-features-even-for-host-model.patch b/libvirt-conf-Parse-hyperv-features-even-for-host-model.patch new file mode 100644 index 0000000..6414cdd --- /dev/null +++ b/libvirt-conf-Parse-hyperv-features-even-for-host-model.patch @@ -0,0 +1,113 @@ +From b60749c749a3312148c72471b99bd76469a6aff2 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Michal Privoznik +Date: Wed, 11 Feb 2026 10:16:28 +0100 +Subject: [PATCH] conf: Parse hyperv features even for host-model + +As it turns out, some users of the hyperv "host-model" mode might +want to override the hypervisor defaults. For instance disable a +feature that's on by default, or vice versa. Currently, this is +not possible because as soon as our XML parser sees the +"host-model" mode it exits early and skips parsing of individual +features (for "custom" mode). Well, do not return early and parse +the rest. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +(cherry picked from commit 380fb8939009a420f598175e63994a5bf197fd56) +Resolves: https://issues.redhat.com/browse/RHEL-151688 +Signed-off-by: Michal Privoznik +--- + docs/formatdomain.rst | 3 +++ + src/conf/domain_conf.c | 3 +-- + src/conf/schemas/domaincommon.rng | 8 ++++---- + tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml | 6 +++++- + tests/qemuxmlconfdata/hyperv-host-model.xml | 6 +++++- + 5 files changed, 18 insertions(+), 8 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 31232deb3c..5ec9a41aac 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -2197,6 +2197,9 @@ are: + enlightenments are supported by hypervisor and expands them on domain + startup into the live XML. In a sense, this is similar to ``host-model`` + CPU mode (See `CPU model and topology`_). :since:`Since 11.9.0` ++ It is also possible to set features, like in ``custom`` mode. These are ++ then left untouched and no expansion is done for them. :since:`Since ++ 12.1.0` + + The ``mode`` attribute can be omitted and will default to ``custom``. + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index df05d96f01..1f7b1ca340 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -17269,8 +17269,7 @@ virDomainFeaturesHyperVDefParse(virDomainDef *def, + + def->features[VIR_DOMAIN_FEATURE_HYPERV] = mode; + +- if (mode == VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH || +- mode == VIR_DOMAIN_HYPERV_MODE_HOST_MODEL) ++ if (mode == VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH) + return 0; + + node = xmlFirstElementChild(node); +diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng +index 441328a08e..afdf7bfc1a 100644 +--- a/src/conf/schemas/domaincommon.rng ++++ b/src/conf/schemas/domaincommon.rng +@@ -8063,13 +8063,13 @@ + + passthrough + +- +- host-model +- + + + +- custom ++ ++ custom ++ host-model ++ + + + +diff --git a/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml b/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml +index 453a43b3c9..9535cee02a 100644 +--- a/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml ++++ b/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml +@@ -10,7 +10,11 @@ + + + +- ++ ++ ++ ++ ++ + + + qemu64 +diff --git a/tests/qemuxmlconfdata/hyperv-host-model.xml b/tests/qemuxmlconfdata/hyperv-host-model.xml +index fae00d86dd..473a41892d 100644 +--- a/tests/qemuxmlconfdata/hyperv-host-model.xml ++++ b/tests/qemuxmlconfdata/hyperv-host-model.xml +@@ -10,7 +10,11 @@ + + + +- ++ ++ ++ ++ ++ + + + destroy +-- +2.54.0 diff --git a/libvirt-conf-Refactor-virHostdevIsPCIDevice.patch b/libvirt-conf-Refactor-virHostdevIsPCIDevice.patch new file mode 100644 index 0000000..585632c --- /dev/null +++ b/libvirt-conf-Refactor-virHostdevIsPCIDevice.patch @@ -0,0 +1,80 @@ +From 7af5a1f92b63d250922e04b56cae67bfb65fa4f4 Mon Sep 17 00:00:00 2001 +Message-ID: <7af5a1f92b63d250922e04b56cae67bfb65fa4f4.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Wed, 18 Mar 2026 11:47:21 +0100 +Subject: [PATCH] conf: Refactor virHostdevIsPCIDevice + +Future patches will need to check if the host device uses IOMMUFD or not +but we also need to keep a function that will check only if it is PCI device. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit d0afa0a842ce8a6dcb3f881d7dccdf5198f78fa7) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/conf/domain_conf.c | 34 +++++++++++++++++++++++++++++----- + 1 file changed, 29 insertions(+), 5 deletions(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 35de8bab6b..59df028192 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -32782,6 +32782,33 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev) + } + + ++static bool ++virHostdevPCIDevHasIOMMUFD(const virDomainHostdevDef *hostdev) ++{ ++ return hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && ++ hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES; ++} ++ ++ ++static bool ++virHostdevIsPCIDeviceImpl(const virDomainHostdevDef *hostdev, ++ virTristateBool iommufd) ++{ ++ if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) ++ return false; ++ ++ if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) ++ return false; ++ ++ if (iommufd != VIR_TRISTATE_BOOL_ABSENT) { ++ bool hasIOMMUFD = iommufd == VIR_TRISTATE_BOOL_YES; ++ return hasIOMMUFD == virHostdevPCIDevHasIOMMUFD(hostdev); ++ } ++ ++ return true; ++} ++ ++ + /** + * virHostdevIsPCIDevice: + * @hostdev: host device to check +@@ -32791,8 +32818,7 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev) + bool + virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev) + { +- return hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && +- hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; ++ return virHostdevIsPCIDeviceImpl(hostdev, VIR_TRISTATE_BOOL_ABSENT); + } + + +@@ -32805,9 +32831,7 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev) + bool + virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev) + { +- return virHostdevIsPCIDevice(hostdev) && +- hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && +- hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES; ++ return virHostdevIsPCIDeviceImpl(hostdev, VIR_TRISTATE_BOOL_YES); + } + + +-- +2.54.0 diff --git a/libvirt-cpu-Introduce-virCPUUpdateFeatures.patch b/libvirt-cpu-Introduce-virCPUUpdateFeatures.patch new file mode 100644 index 0000000..c9693f9 --- /dev/null +++ b/libvirt-cpu-Introduce-virCPUUpdateFeatures.patch @@ -0,0 +1,158 @@ +From 353e7eb26cb922bd342c050273afbcc4ed4dd20e Mon Sep 17 00:00:00 2001 +Message-ID: <353e7eb26cb922bd342c050273afbcc4ed4dd20e.1780571167.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Mon, 25 May 2026 14:22:58 +0200 +Subject: [PATCH] cpu: Introduce virCPUUpdateFeatures + +This new API can be used to update an existing CPU definition with +features described by CPU data. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 6be1be4938338477bff14ff24c7ed2a05bc1dadc) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/cpu/cpu.c | 34 ++++++++++++++++++++++++++++++++++ + src/cpu/cpu.h | 12 ++++++++++++ + src/cpu/cpu_x86.c | 23 +++++++++++++++++++++++ + src/libvirt_private.syms | 1 + + 4 files changed, 70 insertions(+) + +diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c +index d81e620a1d..3e9affa1cd 100644 +--- a/src/cpu/cpu.c ++++ b/src/cpu/cpu.c +@@ -1359,6 +1359,40 @@ virCPUGetCanonicalModel(virArch arch, + } + + ++/** virCPUUpdateFeatures: ++ * ++ * @arch: CPU architecture ++ * @cpu: CPU definition to update ++ * @cpuData: CPU data describing features ++ * @policy: to be used by the updated features ++ * ++ * Updates features described in @cpuData to use the specified @policy. Missing ++ * features will be automatically added to the CPU definition. ++ * ++ * Returns 0 on success, -1 otherwise. ++ */ ++int ++virCPUUpdateFeatures(virArch arch, ++ virCPUDef *cpu, ++ virCPUData *cpuData, ++ virCPUFeaturePolicy policy) ++{ ++ struct cpuArchDriver *driver; ++ ++ VIR_DEBUG("arch=%s, cpu=%p, model=%s, policy=%s", ++ virArchToString(arch), cpu, NULLSTR(cpu->model), ++ virCPUFeaturePolicyTypeToString(policy)); ++ ++ if (!(driver = cpuGetSubDriver(arch))) ++ return -1; ++ ++ if (!driver->updateFeatures) ++ return 0; ++ ++ return driver->updateFeatures(cpu, cpuData, policy); ++} ++ ++ + /** + * virCPUArchIsSupported: + * +diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h +index 36fd123675..65711ac085 100644 +--- a/src/cpu/cpu.h ++++ b/src/cpu/cpu.h +@@ -143,6 +143,11 @@ typedef int + typedef const char * + (*virCPUArchGetCanonicalModel)(const char *model); + ++typedef int ++(*virCPUArchUpdateFeatures)(virCPUDef *cpu, ++ virCPUData *cpuData, ++ virCPUFeaturePolicy policy); ++ + struct cpuArchDriver { + const char *name; + const virArch *arch; +@@ -172,6 +177,7 @@ struct cpuArchDriver { + virCPUArchDataGetHost dataGetHost; + virCPUArchGetCheckMode getCheckMode; + virCPUArchGetCanonicalModel getCanonicalModel; ++ virCPUArchUpdateFeatures updateFeatures; + }; + + +@@ -332,6 +338,12 @@ const char * + virCPUGetCanonicalModel(virArch arch, + const char *model); + ++int ++virCPUUpdateFeatures(virArch arch, ++ virCPUDef *cpu, ++ virCPUData *cpuData, ++ virCPUFeaturePolicy policy); ++ + bool + virCPUArchIsSupported(virArch arch); + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index e5825fbb4d..6e860de458 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3790,6 +3790,28 @@ virCPUx86GetCanonicalModel(const char *modelName) + } + + ++static int ++virCPUx86UpdateFeatures(virCPUDef *cpu, ++ virCPUData *cpuData, ++ virCPUFeaturePolicy policy) ++{ ++ virCPUx86Data *data = &cpuData->data.x86; ++ virCPUx86Map *map; ++ size_t i; ++ ++ if (!(map = virCPUx86GetMap())) ++ return -1; ++ ++ for (i = 0; i < map->nfeatures; i++) { ++ virCPUx86Feature *feature = map->features[i]; ++ if (x86DataIsSubset(data, &feature->data)) ++ virCPUDefUpdateFeature(cpu, feature->name, policy); ++ } ++ ++ return 0; ++} ++ ++ + struct cpuArchDriver cpuDriverX86 = { + .name = "x86", + .arch = archs, +@@ -3824,4 +3846,5 @@ struct cpuArchDriver cpuDriverX86 = { + #endif + .getCheckMode = virCPUx86GetCheckMode, + .getCanonicalModel = virCPUx86GetCanonicalModel, ++ .updateFeatures = virCPUx86UpdateFeatures, + }; +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index 3eb6943440..4a0f9065fa 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -1586,6 +1586,7 @@ virCPUGetVendorForModel; + virCPUProbeHost; + virCPUTranslate; + virCPUUpdate; ++virCPUUpdateFeatures; + virCPUUpdateLive; + virCPUValidateFeatures; + +-- +2.54.0 diff --git a/libvirt-cpu_conf-Introduce-virCPUDefSortFeatures.patch b/libvirt-cpu_conf-Introduce-virCPUDefSortFeatures.patch new file mode 100644 index 0000000..1bc8942 --- /dev/null +++ b/libvirt-cpu_conf-Introduce-virCPUDefSortFeatures.patch @@ -0,0 +1,109 @@ +From 6a2bd2d2e74d8c07266558c62d3fb724e677e256 Mon Sep 17 00:00:00 2001 +Message-ID: <6a2bd2d2e74d8c07266558c62d3fb724e677e256.1780571166.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Fri, 29 May 2026 13:00:10 +0200 +Subject: [PATCH] cpu_conf: Introduce virCPUDefSortFeatures + +Separate the sorting code from virCPUExpandFeatures into a standalone +function. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 0900cc4f2dca2c17e8854330d45dffa4cc7952c4) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/conf/cpu_conf.c | 20 ++++++++++++++++++++ + src/conf/cpu_conf.h | 3 +++ + src/cpu/cpu.c | 15 +-------------- + src/libvirt_private.syms | 1 + + 4 files changed, 25 insertions(+), 14 deletions(-) + +diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c +index 7aeedf64f5..f5a2004ee6 100644 +--- a/src/conf/cpu_conf.c ++++ b/src/conf/cpu_conf.c +@@ -1277,3 +1277,23 @@ virCPUDefListFree(virCPUDef **cpus) + + g_free(cpus); + } ++ ++ ++static int ++virCPUFeatureDefCompare(const void *p1, ++ const void *p2, ++ void *opaque G_GNUC_UNUSED) ++{ ++ const virCPUFeatureDef *f1 = p1; ++ const virCPUFeatureDef *f2 = p2; ++ ++ return strcmp(f1->name, f2->name); ++} ++ ++ ++void ++virCPUDefSortFeatures(virCPUDef *cpu) ++{ ++ g_qsort_with_data(cpu->features, cpu->nfeatures, sizeof(*cpu->features), ++ virCPUFeatureDefCompare, NULL); ++} +diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h +index cfb8f1a461..0cac1a1489 100644 +--- a/src/conf/cpu_conf.h ++++ b/src/conf/cpu_conf.h +@@ -280,3 +280,6 @@ virCPUDefListParse(const char **xmlCPUs, + virCPUType cpuType); + void + virCPUDefListFree(virCPUDef **cpus); ++ ++void ++virCPUDefSortFeatures(virCPUDef *cpu); +diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c +index 233686485d..d81e620a1d 100644 +--- a/src/cpu/cpu.c ++++ b/src/cpu/cpu.c +@@ -1125,18 +1125,6 @@ virCPUConvertLegacy(virArch arch, + } + + +-static int +-virCPUFeatureCompare(const void *p1, +- const void *p2, +- void *opaque G_GNUC_UNUSED) +-{ +- const virCPUFeatureDef *f1 = p1; +- const virCPUFeatureDef *f2 = p2; +- +- return strcmp(f1->name, f2->name); +-} +- +- + /** + * virCPUExpandFeatures: + * +@@ -1168,8 +1156,7 @@ virCPUExpandFeatures(virArch arch, + driver->expandFeatures(cpu) < 0) + return -1; + +- g_qsort_with_data(cpu->features, cpu->nfeatures, sizeof(*cpu->features), +- virCPUFeatureCompare, NULL); ++ virCPUDefSortFeatures(cpu); + + VIR_DEBUG("nfeatures=%zu", cpu->nfeatures); + return 0; +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index d2563e587a..1733286bad 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -118,6 +118,7 @@ virCPUDefNew; + virCPUDefParseXML; + virCPUDefParseXMLString; + virCPUDefRef; ++virCPUDefSortFeatures; + virCPUDefStealModel; + virCPUDefUpdateFeature; + virCPUMaxPhysAddrModeTypeFromString; +-- +2.54.0 diff --git a/libvirt-cpu_x86-Introduce-virCPUx86DataAddMSR.patch b/libvirt-cpu_x86-Introduce-virCPUx86DataAddMSR.patch new file mode 100644 index 0000000..4572d2e --- /dev/null +++ b/libvirt-cpu_x86-Introduce-virCPUx86DataAddMSR.patch @@ -0,0 +1,109 @@ +From d34cc77ac31f6df5195dad6b53d5aed00bda7dd7 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Mon, 25 May 2026 13:17:47 +0200 +Subject: [PATCH] cpu_x86: Introduce virCPUx86DataAddMSR + +This just makes the relevant part of virCPUx86GetHost reusable in other +places. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit a8952076d8e5062a2fac08e11597ad47871c2236) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/cpu/cpu_x86.c | 40 ++++++++++++++++++++++++++++------------ + src/cpu/cpu_x86.h | 4 ++++ + src/libvirt_private.syms | 1 + + 3 files changed, 33 insertions(+), 12 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 0f7eb8f48b..e5825fbb4d 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2912,18 +2912,8 @@ virCPUx86GetHost(virCPUDef *cpu, + /* This is best effort since there might be no way to read the MSR + * when we are not running as root. */ + for (i = 0; i < nmsrs; i++) { +- if (virHostCPUGetMSR(msrs[i], &msr) == 0) { +- virCPUx86DataItem item = { +- .type = VIR_CPU_X86_DATA_MSR, +- .data.msr = { +- .index = msrs[i], +- .eax = msr & 0xffffffff, +- .edx = msr >> 32, +- }, +- }; +- +- virCPUx86DataAdd(cpuData, &item); +- } ++ if (virHostCPUGetMSR(msrs[i], &msr) == 0) ++ virCPUx86DataAddMSR(cpuData, msrs[i], msr); + } + + ret = x86DecodeCPUData(cpu, cpuData, models); +@@ -3461,6 +3451,32 @@ virCPUx86DataAdd(virCPUData *cpuData, + } + + ++/** ++ * virCPUx86DataAddMSR: ++ * @cpuData: CPU data to update ++ * @index: MSR index ++ * @value: content of the @index MSR ++ * ++ * Adds the specified MSR content to CPU data. ++ */ ++void ++virCPUx86DataAddMSR(virCPUData *cpuData, ++ uint32_t index, ++ uint64_t value) ++{ ++ virCPUx86DataItem item = { ++ .type = VIR_CPU_X86_DATA_MSR, ++ .data.msr = { ++ .index = index, ++ .eax = value & 0xffffffff, ++ .edx = value >> 32, ++ }, ++ }; ++ ++ virCPUx86DataAdd(cpuData, &item); ++} ++ ++ + void + virCPUx86DataSetSignature(virCPUData *cpuData, + unsigned int family, +diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h +index 2cd965fea4..bbc2a16447 100644 +--- a/src/cpu/cpu_x86.h ++++ b/src/cpu/cpu_x86.h +@@ -28,6 +28,10 @@ extern struct cpuArchDriver cpuDriverX86; + void virCPUx86DataAdd(virCPUData *cpuData, + const virCPUx86DataItem *cpuid); + ++void virCPUx86DataAddMSR(virCPUData *cpuData, ++ uint32_t index, ++ uint64_t value); ++ + void virCPUx86DataSetSignature(virCPUData *cpuData, + unsigned int family, + unsigned int model, +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index 3eca15f066..3eb6943440 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -1592,6 +1592,7 @@ virCPUValidateFeatures; + + # cpu/cpu_x86.h + virCPUx86DataAdd; ++virCPUx86DataAddMSR; + virCPUx86DataGetSignature; + virCPUx86DataSetSignature; + virCPUx86DataSetVendor; +-- +2.54.0 diff --git a/libvirt-docs-Clarify-host-model-description-in-domain-capabilities.patch b/libvirt-docs-Clarify-host-model-description-in-domain-capabilities.patch new file mode 100644 index 0000000..5f5f78e --- /dev/null +++ b/libvirt-docs-Clarify-host-model-description-in-domain-capabilities.patch @@ -0,0 +1,34 @@ +From 4c6ab1e34ea5e57dc0f9880f178354538adf55f7 Mon Sep 17 00:00:00 2001 +Message-ID: <4c6ab1e34ea5e57dc0f9880f178354538adf55f7.1780571166.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Wed, 11 Mar 2026 12:13:45 +0100 +Subject: [PATCH] docs: Clarify host-model description in domain capabilities + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 0b54c9d535b9b7c832ff8422dca28c84eb75ed2e) + +https://issues.redhat.com/browse/RHEL-153653 + +Signed-off-by: Jiri Denemark +--- + docs/formatdomaincaps.rst | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst +index 6ba7f84f96..add550a4a5 100644 +--- a/docs/formatdomaincaps.rst ++++ b/docs/formatdomaincaps.rst +@@ -244,6 +244,10 @@ more details about it: + reports physical address size of the host CPU if this value is available and + applicable for the requested domain type. This is useful for computing + baseline CPU definition which should be compatible with several hosts. ++ Consistently with all other CPU definitions used by libvirt, features ++ implicitly enabled by the selected CPU model (in ``model`` sub element) are ++ not listed. Use ``--expand-cpu-features`` virsh option or the equivalent API ++ flag to request all supported features to be listed in the CPU definition. + ``custom`` + The ``mode`` element contains a list of supported CPU models, each described + by a dedicated ``model`` element. The ``usable`` attribute specifies whether +-- +2.54.0 diff --git a/libvirt-domaincapstest-Test-EXPAND_CPU_FEATURES-flag.patch b/libvirt-domaincapstest-Test-EXPAND_CPU_FEATURES-flag.patch new file mode 100644 index 0000000..7115fd3 --- /dev/null +++ b/libvirt-domaincapstest-Test-EXPAND_CPU_FEATURES-flag.patch @@ -0,0 +1,24245 @@ +From 70f708877205ddb781080ea7035677c4e199b75c Mon Sep 17 00:00:00 2001 +Message-ID: <70f708877205ddb781080ea7035677c4e199b75c.1780571167.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Thu, 28 May 2026 14:49:17 +0200 +Subject: [PATCH] domaincapstest: Test EXPAND_CPU_FEATURES flag + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit ed3ae648a9c974274cd5e960d0bdbefbe6730d9f) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Conflicts: + tests/domaincapsdata/* + - domain capabilities for QEMU 11.0 as missing downstream + and 7.1, 7.0, and 6.2 were already removed upstream + - the rest of the files included capabilities that do not + exist in downstream XMLs + +Signed-off-by: Jiri Denemark +--- + ...qemu_10.0.0-q35.x86_64+amdsev-expanded.xml | 1113 ++++++++ + .../qemu_10.0.0-q35.x86_64-expanded.xml | 1969 ++++++++++++++ + ...mu_10.1.0-q35.x86_64+inteltdx-expanded.xml | 1191 +++++++++ + .../qemu_10.1.0-q35.x86_64-expanded.xml | 2318 +++++++++++++++++ + .../qemu_10.2.0-q35.x86_64+mshv-expanded.xml | 227 ++ + .../qemu_10.2.0-q35.x86_64-expanded.xml | 1340 ++++++++++ + .../qemu_6.2.0-q35.x86_64-expanded.xml | 1245 +++++++++ + .../qemu_7.0.0-q35.x86_64-expanded.xml | 1282 +++++++++ + .../qemu_7.1.0-q35.x86_64-expanded.xml | 1240 +++++++++ + .../qemu_7.2.0-q35.x86_64-expanded.xml | 1247 +++++++++ + .../qemu_8.0.0-q35.x86_64-expanded.xml | 1356 ++++++++++ + .../qemu_8.1.0-q35.x86_64-expanded.xml | 1614 ++++++++++++ + .../qemu_8.2.0-q35.x86_64-expanded.xml | 1616 ++++++++++++ + .../qemu_9.0.0-q35.x86_64-expanded.xml | 1617 ++++++++++++ + .../qemu_9.1.0-q35.x86_64-expanded.xml | 1753 +++++++++++++ + .../qemu_9.2.0-q35.x86_64+amdsev-expanded.xml | 993 +++++++ + .../qemu_9.2.0-q35.x86_64-expanded.xml | 1811 +++++++++++++ + tests/domaincapstest.c | 48 +- + 18 files changed, 23965 insertions(+), 15 deletions(-) + create mode 100644 tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_10.0.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_10.1.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_10.2.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_6.2.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_7.0.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_7.1.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_7.2.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_8.0.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_8.1.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_8.2.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_9.0.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_9.1.0-q35.x86_64-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-expanded.xml + create mode 100644 tests/domaincapsdata/qemu_9.2.0-q35.x86_64-expanded.xml + +diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-expanded.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-expanded.xml +new file mode 100644 +index 0000000000..0508746641 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-expanded.xml +@@ -0,0 +1,1113 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Genoa ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ Broadwell-noTSX ++ Broadwell-noTSX-IBRS ++ Broadwell-v1 ++ ++ ++ ++ ++ Broadwell-v2 ++ Broadwell-v3 ++ ++ ++ ++ ++ Broadwell-v4 ++ Cascadelake-Server ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-Genoa ++ EPYC-Genoa-v1 ++ EPYC-IBPB ++ EPYC-Milan ++ EPYC-Milan-v1 ++ EPYC-Milan-v2 ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ EPYC-Rome-v3 ++ EPYC-Rome-v4 ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ EPYC-v4 ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ Haswell-noTSX ++ Haswell-noTSX-IBRS ++ Haswell-v1 ++ ++ ++ ++ ++ Haswell-v2 ++ Haswell-v3 ++ ++ ++ ++ ++ Haswell-v4 ++ Icelake-Server ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ Icelake-Server-v1 ++ ++ ++ ++ ++ Icelake-Server-v2 ++ Icelake-Server-v3 ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ Skylake-Client-v1 ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ Skylake-Client-v3 ++ Skylake-Client-v4 ++ Skylake-Server ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ Skylake-Server-v1 ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ Skylake-Server-v3 ++ Skylake-Server-v4 ++ Skylake-Server-v5 ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 51 ++ 1 ++ 59 ++ 450 ++ BlAwmcr4Ruya3YvEGe2EBxuWjMAfIYolslNNM92RsIKxLkWDDRqivqSBOD+qQRCYS9joBYSHMD1g+rmjY+MmVw== ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ sev ++ sev-snp ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..df8258822c +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1969 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-expanded.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-expanded.xml +new file mode 100644 +index 0000000000..351d0023db +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-expanded.xml +@@ -0,0 +1,1191 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ GraniteRapids ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ Broadwell-IBRS ++ Broadwell-noTSX ++ Broadwell-noTSX-IBRS ++ Broadwell-v1 ++ Broadwell-v2 ++ Broadwell-v3 ++ Broadwell-v4 ++ Cascadelake-Server ++ Cascadelake-Server-noTSX ++ Cascadelake-Server-v1 ++ Cascadelake-Server-v2 ++ Cascadelake-Server-v3 ++ Cascadelake-Server-v4 ++ Cascadelake-Server-v5 ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ Cooperlake-v1 ++ Cooperlake-v2 ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ ++ ++ ++ ++ ++ ++ ++ ++ Dhyana-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ Dhyana-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Turin ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Turin-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ Haswell-IBRS ++ Haswell-noTSX ++ Haswell-noTSX-IBRS ++ Haswell-v1 ++ Haswell-v2 ++ Haswell-v3 ++ Haswell-v4 ++ Icelake-Server ++ Icelake-Server-noTSX ++ Icelake-Server-v1 ++ Icelake-Server-v2 ++ Icelake-Server-v3 ++ Icelake-Server-v4 ++ Icelake-Server-v5 ++ Icelake-Server-v6 ++ Icelake-Server-v7 ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ ++ ++ ++ ++ Opteron_G3-v1 ++ ++ ++ ++ ++ Opteron_G4 ++ ++ ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ SapphireRapids-v1 ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ Skylake-Client-IBRS ++ Skylake-Client-noTSX-IBRS ++ Skylake-Client-v1 ++ Skylake-Client-v2 ++ Skylake-Client-v3 ++ Skylake-Client-v4 ++ Skylake-Server ++ Skylake-Server-IBRS ++ Skylake-Server-noTSX-IBRS ++ Skylake-Server-v1 ++ Skylake-Server-v2 ++ Skylake-Server-v3 ++ Skylake-Server-v4 ++ Skylake-Server-v5 ++ Snowridge ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ Snowridge-v4 ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ ++ core2duo ++ core2duo-v1 ++ coreduo ++ coreduo-v1 ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ n270-v1 ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ vnc ++ rdp ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ ++ pty ++ unix ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ yes ++ yes ++ yes ++ 500732 ++ ++
++
++
++
++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ evmcs ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..a1651541da +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-expanded.xml +@@ -0,0 +1,2318 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-Rome-v5 ++ ++ ++ ++ EPYC-Turin ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Turin-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ EPYC-v5 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-expanded.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-expanded.xml +new file mode 100644 +index 0000000000..6914726a8b +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-expanded.xml +@@ -0,0 +1,227 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.2 ++ x86_64 ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ vnc ++ rdp ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ spinlocks ++ vendor_id ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..9e5a82bd24 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1340 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Turin ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ EPYC-Genoa-v2 ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ EPYC-Milan-v3 ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ EPYC-Rome-v3 ++ EPYC-Rome-v4 ++ EPYC-Rome-v5 ++ EPYC-Turin ++ ++ ++ ++ ++ EPYC-Turin-v1 ++ ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ EPYC-v4 ++ EPYC-v5 ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..4028d2fd7e +--- /dev/null ++++ b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1245 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-6.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Client ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Client-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ spice ++ egl-headless ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 1.2 ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..85500ecdd7 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1282 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-7.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Client ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Client-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ no ++ yes ++ no ++ 524288 ++ ++
++
++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..9994a3cb4a +--- /dev/null ++++ b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1240 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-7.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..da90eed457 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1247 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-7.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..741302cd2e +--- /dev/null ++++ b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1356 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-8.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ off ++ off ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..6e101f8f5e +--- /dev/null ++++ b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1614 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-8.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..2528cc352f +--- /dev/null ++++ b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1616 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-8.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..9883ed4c7c +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1617 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..f256f3e869 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1753 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-expanded.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-expanded.xml +new file mode 100644 +index 0000000000..5d1bcd6b19 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-expanded.xml +@@ -0,0 +1,993 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Genoa ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ Broadwell-noTSX ++ Broadwell-noTSX-IBRS ++ Broadwell-v1 ++ ++ ++ ++ ++ Broadwell-v2 ++ Broadwell-v3 ++ ++ ++ ++ ++ Broadwell-v4 ++ Cascadelake-Server ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-Genoa ++ EPYC-Genoa-v1 ++ EPYC-IBPB ++ EPYC-Milan ++ EPYC-Milan-v1 ++ EPYC-Milan-v2 ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ EPYC-Rome-v3 ++ EPYC-Rome-v4 ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ EPYC-v4 ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ Haswell-noTSX ++ Haswell-noTSX-IBRS ++ Haswell-v1 ++ ++ ++ ++ ++ Haswell-v2 ++ Haswell-v3 ++ ++ ++ ++ ++ Haswell-v4 ++ Icelake-Server ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ Icelake-Server-v1 ++ ++ ++ ++ ++ Icelake-Server-v2 ++ Icelake-Server-v3 ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ Skylake-Client-v1 ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ Skylake-Client-v3 ++ Skylake-Client-v4 ++ Skylake-Server ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ Skylake-Server-v1 ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ Skylake-Server-v3 ++ Skylake-Server-v4 ++ Skylake-Server-v5 ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 51 ++ 1 ++ 59 ++ 450 ++ BlAwmcr4Ruya3YvEGe2EBxuWjMAfIYolslNNM92RsIKxLkWDDRqivqSBOD+qQRCYS9joBYSHMD1g+rmjY+MmVw== ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ sev ++ sev-snp ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64-expanded.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64-expanded.xml +new file mode 100644 +index 0000000000..06e59de521 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64-expanded.xml +@@ -0,0 +1,1811 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c +index f2248c2435..9bbba6e89c 100644 +--- a/tests/domaincapstest.c ++++ b/tests/domaincapstest.c +@@ -72,7 +72,8 @@ fillQemuCaps(virDomainCaps *domCaps, + const char *arch, + const char *variant, + const char *machine, +- virQEMUDriverConfig *cfg) ++ virQEMUDriverConfig *cfg, ++ unsigned int flags) + { + g_autofree char *path = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; +@@ -101,7 +102,7 @@ fillQemuCaps(virDomainCaps *domCaps, + + if (virQEMUCapsFillDomainCaps(cfg, + qemuCaps, domCaps->arch, domCaps, +- false, 0) < 0) ++ false, flags) < 0) + return -1; + + /* As of f05b6a918e28 we are expecting to see OVMF_CODE.fd file which +@@ -176,6 +177,7 @@ struct testData { + const char *arch; + const char *variant; + virDomainVirtType type; ++ unsigned int flags; + enum testCapsType capsType; + const char *capsName; + void *capsOpaque; +@@ -203,7 +205,7 @@ test_virDomainCapsFormat(const void *opaque) + case CAPS_QEMU: + #if WITH_QEMU + if (fillQemuCaps(domCaps, data->capsName, data->arch, data->variant, +- data->machine, data->capsOpaque) < 0) ++ data->machine, data->capsOpaque, data->flags) < 0) + return -1; + #endif + break; +@@ -240,12 +242,14 @@ doTestQemuInternal(const char *version, + const char *arch, + const char *variant, + virDomainVirtType type, ++ unsigned int flags, + void *opaque) + { + g_autofree char *name = NULL; + g_autofree char *capsName = g_strdup_printf("caps_%s", version); + g_autofree char *emulator = g_strdup_printf("/usr/bin/qemu-system-%s", arch); + const char *typestr = NULL; ++ const char *flag = NULL; + g_autofree char *mach = NULL; + int rc; + struct testData data = { +@@ -254,6 +258,7 @@ doTestQemuInternal(const char *version, + .arch = arch, + .variant = variant, + .type = type, ++ .flags = flags, + .capsType = CAPS_QEMU, + .capsName = capsName, + .capsOpaque = opaque, +@@ -282,8 +287,14 @@ doTestQemuInternal(const char *version, + else + mach = g_strdup(""); + +- data.name = name = g_strdup_printf("qemu_%s%s%s.%s%s", +- version, typestr, mach, arch, variant); ++ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) ++ flag = "-expanded"; ++ else ++ flag = ""; ++ ++ data.name = name = g_strdup_printf("qemu_%s%s%s.%s%s%s", ++ version, typestr, mach, arch, variant, ++ flag); + + if (STRPREFIX(version, "3.") || + STRPREFIX(version, "4.") || +@@ -333,21 +344,28 @@ doTestQemu(const char *inputDir G_GNUC_UNUSED, + */ + if (hvf) { + if (doTestQemuInternal(version, NULL, arch, variant, +- VIR_DOMAIN_VIRT_HVF, opaque) < 0) ++ VIR_DOMAIN_VIRT_HVF, 0, opaque) < 0) + ret = -1; + } else { + if (doTestQemuInternal(version, NULL, arch, variant, +- VIR_DOMAIN_VIRT_KVM, opaque) < 0) ++ VIR_DOMAIN_VIRT_KVM, 0, opaque) < 0) + ret = -1; + + if (doTestQemuInternal(version, "q35", arch, variant, +- VIR_DOMAIN_VIRT_KVM, opaque) < 0) ++ VIR_DOMAIN_VIRT_KVM, 0, opaque) < 0) ++ ret = -1; ++ ++ if (doTestQemuInternal(version, "q35", arch, variant, ++ VIR_DOMAIN_VIRT_KVM, ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES, ++ opaque) < 0) + ret = -1; + } + + if (doTestQemuInternal(version, NULL, arch, variant, +- VIR_DOMAIN_VIRT_QEMU, opaque) < 0) ++ VIR_DOMAIN_VIRT_QEMU, 0, opaque) < 0) + ret = -1; ++ + } else if (STREQ(arch, "aarch64")) { + /* For aarch64 based on the test variant we test: + * +@@ -360,15 +378,15 @@ doTestQemu(const char *inputDir G_GNUC_UNUSED, + */ + if (hvf) { + if (doTestQemuInternal(version, NULL, arch, variant, +- VIR_DOMAIN_VIRT_HVF, opaque) < 0) ++ VIR_DOMAIN_VIRT_HVF, 0, opaque) < 0) + ret = -1; + } else { + if (doTestQemuInternal(version, NULL, arch, variant, +- VIR_DOMAIN_VIRT_KVM, opaque) < 0) ++ VIR_DOMAIN_VIRT_KVM, 0, opaque) < 0) + ret = -1; + + if (doTestQemuInternal(version, "virt", arch, variant, +- VIR_DOMAIN_VIRT_KVM, opaque) < 0) ++ VIR_DOMAIN_VIRT_KVM, 0, opaque) < 0) + ret = -1; + } + } else if (STRPREFIX(arch, "riscv") || STRPREFIX(arch, "loongarch64")) { +@@ -379,15 +397,15 @@ doTestQemu(const char *inputDir G_GNUC_UNUSED, + * - TCG with virt machine + */ + if (doTestQemuInternal(version, "virt", arch, variant, +- VIR_DOMAIN_VIRT_KVM, opaque) < 0) ++ VIR_DOMAIN_VIRT_KVM, 0, opaque) < 0) + ret = -1; + + if (doTestQemuInternal(version, "virt", arch, variant, +- VIR_DOMAIN_VIRT_QEMU, opaque) < 0) ++ VIR_DOMAIN_VIRT_QEMU, 0, opaque) < 0) + ret = -1; + } else { + if (doTestQemuInternal(version, NULL, arch, variant, +- VIR_DOMAIN_VIRT_KVM, opaque) < 0) ++ VIR_DOMAIN_VIRT_KVM, 0, opaque) < 0) + ret = -1; + } + +-- +2.54.0 diff --git a/libvirt-domaincapstest-Test-SUPPORTED_CPU_FEATURES-flag.patch b/libvirt-domaincapstest-Test-SUPPORTED_CPU_FEATURES-flag.patch new file mode 100644 index 0000000..dc74420 --- /dev/null +++ b/libvirt-domaincapstest-Test-SUPPORTED_CPU_FEATURES-flag.patch @@ -0,0 +1,22680 @@ +From 1ae4195ad9bcc31695c761a1be0f52c77cb3747c Mon Sep 17 00:00:00 2001 +Message-ID: <1ae4195ad9bcc31695c761a1be0f52c77cb3747c.1780571167.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Fri, 29 May 2026 13:10:44 +0200 +Subject: [PATCH] domaincapstest: Test SUPPORTED_CPU_FEATURES flag + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 241318232ccd2d7968a7318e9df579ea057fc027) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Conflicts: + tests/domaincapsdata/* + - domain capabilities for QEMU 11.0 as missing downstream + and 7.1, 7.0, and 6.2 were already removed upstream + - the rest of the files included capabilities that do not + exist in downstream xmls + +Signed-off-by: Jiri Denemark +--- + ...emu_10.0.0-q35.x86_64+amdsev-supported.xml | 1005 ++++++++ + .../qemu_10.0.0-q35.x86_64-supported.xml | 1893 ++++++++++++++ + ...u_10.1.0-q35.x86_64+inteltdx-supported.xml | 1005 ++++++++ + .../qemu_10.1.0-q35.x86_64-supported.xml | 2242 +++++++++++++++++ + .../qemu_10.2.0-q35.x86_64+mshv-supported.xml | 227 ++ + .../qemu_10.2.0-q35.x86_64-supported.xml | 1214 +++++++++ + .../qemu_6.2.0-q35.x86_64-supported.xml | 1169 +++++++++ + .../qemu_7.0.0-q35.x86_64-supported.xml | 1206 +++++++++ + .../qemu_7.1.0-q35.x86_64-supported.xml | 1164 +++++++++ + .../qemu_7.2.0-q35.x86_64-supported.xml | 1171 +++++++++ + .../qemu_8.0.0-q35.x86_64-supported.xml | 1280 ++++++++++ + .../qemu_8.1.0-q35.x86_64-supported.xml | 1538 +++++++++++ + .../qemu_8.2.0-q35.x86_64-supported.xml | 1540 +++++++++++ + .../qemu_9.0.0-q35.x86_64-supported.xml | 1541 +++++++++++ + .../qemu_9.1.0-q35.x86_64-supported.xml | 1677 ++++++++++++ + ...qemu_9.2.0-q35.x86_64+amdsev-supported.xml | 885 +++++++ + .../qemu_9.2.0-q35.x86_64-supported.xml | 1735 +++++++++++++ + tests/domaincapstest.c | 8 + + 18 files changed, 22500 insertions(+) + create mode 100644 tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-supported.xml + create mode 100644 tests/domaincapsdata/qemu_10.0.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-supported.xml + create mode 100644 tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-supported.xml + create mode 100644 tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_6.2.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_7.0.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_7.1.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_7.2.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_8.0.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_8.1.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_8.2.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_9.0.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_9.1.0-q35.x86_64-supported.xml + create mode 100644 tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-supported.xml + create mode 100644 tests/domaincapsdata/qemu_9.2.0-q35.x86_64-supported.xml + +diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-supported.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-supported.xml +new file mode 100644 +index 0000000000..4f854ab11d +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev-supported.xml +@@ -0,0 +1,1005 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Genoa ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ Broadwell-noTSX ++ Broadwell-noTSX-IBRS ++ Broadwell-v1 ++ ++ ++ ++ ++ Broadwell-v2 ++ Broadwell-v3 ++ ++ ++ ++ ++ Broadwell-v4 ++ Cascadelake-Server ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-Genoa ++ EPYC-Genoa-v1 ++ EPYC-IBPB ++ EPYC-Milan ++ EPYC-Milan-v1 ++ EPYC-Milan-v2 ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ EPYC-Rome-v3 ++ EPYC-Rome-v4 ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ EPYC-v4 ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ Haswell-noTSX ++ Haswell-noTSX-IBRS ++ Haswell-v1 ++ ++ ++ ++ ++ Haswell-v2 ++ Haswell-v3 ++ ++ ++ ++ ++ Haswell-v4 ++ Icelake-Server ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ Icelake-Server-v1 ++ ++ ++ ++ ++ Icelake-Server-v2 ++ Icelake-Server-v3 ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ Skylake-Client-v1 ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ Skylake-Client-v3 ++ Skylake-Client-v4 ++ Skylake-Server ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ Skylake-Server-v1 ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ Skylake-Server-v3 ++ Skylake-Server-v4 ++ Skylake-Server-v5 ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 51 ++ 1 ++ 59 ++ 450 ++ BlAwmcr4Ruya3YvEGe2EBxuWjMAfIYolslNNM92RsIKxLkWDDRqivqSBOD+qQRCYS9joBYSHMD1g+rmjY+MmVw== ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ sev ++ sev-snp ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..8214cf90b2 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64-supported.xml +@@ -0,0 +1,1893 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-supported.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-supported.xml +new file mode 100644 +index 0000000000..f7f437eb28 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx-supported.xml +@@ -0,0 +1,1005 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ GraniteRapids ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ Broadwell-IBRS ++ Broadwell-noTSX ++ Broadwell-noTSX-IBRS ++ Broadwell-v1 ++ Broadwell-v2 ++ Broadwell-v3 ++ Broadwell-v4 ++ Cascadelake-Server ++ Cascadelake-Server-noTSX ++ Cascadelake-Server-v1 ++ Cascadelake-Server-v2 ++ Cascadelake-Server-v3 ++ Cascadelake-Server-v4 ++ Cascadelake-Server-v5 ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ Cooperlake-v1 ++ Cooperlake-v2 ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ ++ ++ ++ ++ ++ ++ ++ ++ Dhyana-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ Dhyana-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Turin ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Turin-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ Haswell-IBRS ++ Haswell-noTSX ++ Haswell-noTSX-IBRS ++ Haswell-v1 ++ Haswell-v2 ++ Haswell-v3 ++ Haswell-v4 ++ Icelake-Server ++ Icelake-Server-noTSX ++ Icelake-Server-v1 ++ Icelake-Server-v2 ++ Icelake-Server-v3 ++ Icelake-Server-v4 ++ Icelake-Server-v5 ++ Icelake-Server-v6 ++ Icelake-Server-v7 ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ ++ ++ ++ ++ Opteron_G3-v1 ++ ++ ++ ++ ++ Opteron_G4 ++ ++ ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ SapphireRapids-v1 ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ Skylake-Client-IBRS ++ Skylake-Client-noTSX-IBRS ++ Skylake-Client-v1 ++ Skylake-Client-v2 ++ Skylake-Client-v3 ++ Skylake-Client-v4 ++ Skylake-Server ++ Skylake-Server-IBRS ++ Skylake-Server-noTSX-IBRS ++ Skylake-Server-v1 ++ Skylake-Server-v2 ++ Skylake-Server-v3 ++ Skylake-Server-v4 ++ Skylake-Server-v5 ++ Snowridge ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ Snowridge-v4 ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ ++ core2duo ++ core2duo-v1 ++ coreduo ++ coreduo-v1 ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ n270-v1 ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ vnc ++ rdp ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ ++ pty ++ unix ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ yes ++ yes ++ yes ++ 500732 ++ ++
++
++
++
++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ evmcs ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..244fce575b +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml +@@ -0,0 +1,2242 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-Rome-v5 ++ ++ ++ ++ EPYC-Turin ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Turin-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ EPYC-v5 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-supported.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-supported.xml +new file mode 100644 +index 0000000000..6914726a8b +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv-supported.xml +@@ -0,0 +1,227 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.2 ++ x86_64 ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ vnc ++ rdp ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ spinlocks ++ vendor_id ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..9389141012 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml +@@ -0,0 +1,1214 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-10.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Turin ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ClearwaterForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ClearwaterForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ EPYC-Genoa-v2 ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ EPYC-Milan-v3 ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ EPYC-Rome-v3 ++ EPYC-Rome-v4 ++ EPYC-Rome-v5 ++ EPYC-Turin ++ ++ ++ ++ ++ EPYC-Turin-v1 ++ ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ EPYC-v4 ++ EPYC-v5 ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ YongFeng ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ YongFeng-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ tdx ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..f721f16740 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64-supported.xml +@@ -0,0 +1,1169 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-6.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Client ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Client-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ spice ++ egl-headless ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 1.2 ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..738aac802f +--- /dev/null ++++ b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64-supported.xml +@@ -0,0 +1,1206 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-7.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Client ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Client-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ no ++ yes ++ no ++ 524288 ++ ++
++
++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..3ef878cc52 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64-supported.xml +@@ -0,0 +1,1164 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-7.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..e3d4beb1cd +--- /dev/null ++++ b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64-supported.xml +@@ -0,0 +1,1171 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-7.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..fb5e2184b3 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64-supported.xml +@@ -0,0 +1,1280 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-8.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ off ++ off ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..d651b112b9 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64-supported.xml +@@ -0,0 +1,1538 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-8.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..ef53e39080 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64-supported.xml +@@ -0,0 +1,1540 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-8.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..a52d498e66 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64-supported.xml +@@ -0,0 +1,1541 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..97d0758e80 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64-supported.xml +@@ -0,0 +1,1677 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.1 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-supported.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-supported.xml +new file mode 100644 +index 0000000000..eafb7bde7b +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev-supported.xml +@@ -0,0 +1,885 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Genoa ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ Broadwell-noTSX ++ Broadwell-noTSX-IBRS ++ Broadwell-v1 ++ ++ ++ ++ ++ Broadwell-v2 ++ Broadwell-v3 ++ ++ ++ ++ ++ Broadwell-v4 ++ Cascadelake-Server ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ Denverton-v2 ++ Denverton-v3 ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ EPYC ++ EPYC-Genoa ++ EPYC-Genoa-v1 ++ EPYC-IBPB ++ EPYC-Milan ++ EPYC-Milan-v1 ++ EPYC-Milan-v2 ++ EPYC-Rome ++ EPYC-Rome-v1 ++ EPYC-Rome-v2 ++ EPYC-Rome-v3 ++ EPYC-Rome-v4 ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ EPYC-v4 ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ Haswell-noTSX ++ Haswell-noTSX-IBRS ++ Haswell-v1 ++ ++ ++ ++ ++ Haswell-v2 ++ Haswell-v3 ++ ++ ++ ++ ++ Haswell-v4 ++ Icelake-Server ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ Icelake-Server-v1 ++ ++ ++ ++ ++ Icelake-Server-v2 ++ Icelake-Server-v3 ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ IvyBridge-IBRS ++ IvyBridge-v1 ++ IvyBridge-v2 ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ Nehalem-v1 ++ Nehalem-v2 ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ SandyBridge-v1 ++ SandyBridge-v2 ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ Skylake-Client-v1 ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ Skylake-Client-v3 ++ Skylake-Client-v4 ++ Skylake-Server ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ Skylake-Server-v1 ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ Skylake-Server-v3 ++ Skylake-Server-v4 ++ Skylake-Server-v5 ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ Westmere-v1 ++ Westmere-v2 ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 51 ++ 1 ++ 59 ++ 450 ++ BlAwmcr4Ruya3YvEGe2EBxuWjMAfIYolslNNM92RsIKxLkWDDRqivqSBOD+qQRCYS9joBYSHMD1g+rmjY+MmVw== ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ sev ++ sev-snp ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64-supported.xml +new file mode 100644 +index 0000000000..9a0035c3d8 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64-supported.xml +@@ -0,0 +1,1735 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-9.2 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /obviously/fake/firmware1.fd ++ /obviously/fake/firmware2.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ ++ on ++ off ++ ++ ++ ++ EPYC-Rome ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 486 ++ 486-v1 ++ Broadwell ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-noTSX ++ ++ ++ ++ ++ ++ Broadwell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Broadwell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v2 ++ ++ ++ ++ ++ ++ Broadwell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Broadwell-v4 ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cascadelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Conroe ++ Conroe-v1 ++ Cooperlake ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cooperlake-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Denverton ++ ++ ++ ++ ++ ++ Denverton-v1 ++ ++ ++ ++ ++ ++ Denverton-v2 ++ ++ ++ ++ ++ Denverton-v3 ++ ++ ++ ++ ++ ++ Dhyana ++ Dhyana-v1 ++ Dhyana-v2 ++ ++ ++ ++ EPYC ++ EPYC-Genoa ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Genoa-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-IBPB ++ EPYC-Milan ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Milan-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ EPYC-Rome ++ ++ ++ ++ EPYC-Rome-v1 ++ ++ ++ ++ EPYC-Rome-v2 ++ ++ ++ ++ ++ EPYC-Rome-v3 ++ ++ ++ ++ ++ EPYC-Rome-v4 ++ ++ ++ ++ EPYC-v1 ++ EPYC-v2 ++ EPYC-v3 ++ ++ ++ ++ EPYC-v4 ++ ++ ++ ++ GraniteRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ GraniteRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell ++ ++ ++ ++ ++ ++ ++ ++ Haswell-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-noTSX ++ ++ ++ ++ ++ ++ Haswell-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Haswell-v1 ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v2 ++ ++ ++ ++ ++ ++ Haswell-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ Haswell-v4 ++ ++ ++ ++ ++ ++ ++ Icelake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-noTSX ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v6 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Icelake-Server-v7 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ IvyBridge ++ ++ ++ ++ IvyBridge-IBRS ++ ++ ++ ++ ++ IvyBridge-v1 ++ ++ ++ ++ IvyBridge-v2 ++ ++ ++ ++ ++ KnightsMill ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ KnightsMill-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Nehalem ++ Nehalem-IBRS ++ ++ ++ ++ Nehalem-v1 ++ Nehalem-v2 ++ ++ ++ ++ Opteron_G1 ++ Opteron_G1-v1 ++ Opteron_G2 ++ Opteron_G2-v1 ++ Opteron_G3 ++ Opteron_G3-v1 ++ Opteron_G4 ++ ++ ++ ++ ++ Opteron_G4-v1 ++ ++ ++ ++ ++ Opteron_G5 ++ ++ ++ ++ ++ ++ Opteron_G5-v1 ++ ++ ++ ++ ++ ++ Penryn ++ Penryn-v1 ++ SandyBridge ++ SandyBridge-IBRS ++ ++ ++ ++ SandyBridge-v1 ++ SandyBridge-v2 ++ ++ ++ ++ SapphireRapids ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SapphireRapids-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ SierraForest-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v1 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v3 ++ ++ ++ ++ ++ ++ ++ Skylake-Client-v4 ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-noTSX-IBRS ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Skylake-Server-v5 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v2 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Snowridge-v4 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Westmere ++ Westmere-IBRS ++ ++ ++ ++ Westmere-v1 ++ Westmere-v2 ++ ++ ++ ++ athlon ++ ++ ++ ++ ++ athlon-v1 ++ ++ ++ ++ ++ core2duo ++ ++ ++ ++ core2duo-v1 ++ ++ ++ ++ coreduo ++ ++ ++ ++ coreduo-v1 ++ ++ ++ ++ kvm32 ++ kvm32-v1 ++ kvm64 ++ kvm64-v1 ++ n270 ++ ++ ++ ++ n270-v1 ++ ++ ++ ++ pentium ++ pentium-v1 ++ pentium2 ++ pentium2-v1 ++ pentium3 ++ pentium3-v1 ++ phenom ++ ++ ++ ++ ++ phenom-v1 ++ ++ ++ ++ ++ qemu32 ++ qemu32-v1 ++ qemu64 ++ qemu64-v1 ++ ++ ++ ++ ++ file ++ anonymous ++ memfd ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ nvme ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ rdp ++ spice ++ egl-headless ++ dbus ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ builtin ++ ++ ++ ++ ++ path ++ handle ++ virtiofs ++ ++ ++ ++ ++ tpm-tis ++ tpm-crb ++ ++ ++ passthrough ++ emulator ++ external ++ ++ ++ 2.0 ++ ++ ++ ++ ++ usb ++ ++ ++ ++ ++ pty ++ unix ++ spicevmc ++ ++ ++ ++ ++ virtio ++ ++ ++ qemu ++ ++ ++ builtin ++ lkcf ++ ++ ++ ++ ++ default ++ passt ++ ++ ++ ++ ++ isa ++ hyperv ++ pvpanic ++ ++ ++ ++ ++ null ++ vc ++ pty ++ dev ++ file ++ pipe ++ stdio ++ udp ++ tcp ++ unix ++ spicevmc ++ spiceport ++ qemu-vdagent ++ dbus ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ relaxed ++ vapic ++ spinlocks ++ vpindex ++ runtime ++ synic ++ stimer ++ reset ++ vendor_id ++ frequencies ++ reenlightenment ++ tlbflush ++ ipi ++ avic ++ emsr_bitmap ++ xmm_input ++ ++ ++ 4095 ++ on ++ on ++ on ++ Linux KVM Hv ++ ++ ++ ++ ++ +diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c +index 9bbba6e89c..ed0210678f 100644 +--- a/tests/domaincapstest.c ++++ b/tests/domaincapstest.c +@@ -289,6 +289,8 @@ doTestQemuInternal(const char *version, + + if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) + flag = "-expanded"; ++ else if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES) ++ flag = "-supported"; + else + flag = ""; + +@@ -360,6 +362,12 @@ doTestQemu(const char *inputDir G_GNUC_UNUSED, + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES, + opaque) < 0) + ret = -1; ++ ++ if (doTestQemuInternal(version, "q35", arch, variant, ++ VIR_DOMAIN_VIRT_KVM, ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES, ++ opaque) < 0) ++ ret = -1; + } + + if (doTestQemuInternal(version, NULL, arch, variant, +-- +2.54.0 diff --git a/libvirt-hypervisor-Call-virWaitForDevices-after-detaching-host-devices.patch b/libvirt-hypervisor-Call-virWaitForDevices-after-detaching-host-devices.patch new file mode 100644 index 0000000..4b8b4fd --- /dev/null +++ b/libvirt-hypervisor-Call-virWaitForDevices-after-detaching-host-devices.patch @@ -0,0 +1,45 @@ +From b338719eb9908c7dfd493d5ab4a1b0bcc2258d9b Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Thu, 26 Mar 2026 14:32:36 +0100 +Subject: [PATCH] hypervisor: Call virWaitForDevices() after detaching host + devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +On systems with selinux enabled starting a VM with managed host device +using IOMMUFD backend can run into race-condition where both libvirt and +udev are setting selinux label on /dev/vfio/devices/vfioX device. If +udev is the last one to set selinux label starting VM fails with: + +error: internal error: QEMU unexpectedly closed the monitor (vm='test'): 2026-03-26T15:47:36.620422Z qemu-kvm: -device {"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"20","bus":"pci.7","addr":"0x0"}: vfio hostdev0: Failed to add fd 20 to KVM VFIO device: Invalid argument + +We need to wait for udev to finish processing all events. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Ján Tomko +(cherry picked from commit b96ea4db3aabac4790d6e1d53e2f309f5e73efae) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/hypervisor/virhostdev.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c +index 43155ceb6c..981ca4cd20 100644 +--- a/src/hypervisor/virhostdev.c ++++ b/src/hypervisor/virhostdev.c +@@ -782,6 +782,9 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr, + } + } + ++ /* Step 2.5: Wait for udev to handle all events for devices. */ ++ virWaitForDevices(); ++ + /* At this point, all devices are attached to the stub driver and have + * been marked as inactive */ + +-- +2.54.0 diff --git a/libvirt-hypervisor-Fix-virHostdevNeedsVFIO-detection.patch b/libvirt-hypervisor-Fix-virHostdevNeedsVFIO-detection.patch new file mode 100644 index 0000000..f2192b8 --- /dev/null +++ b/libvirt-hypervisor-Fix-virHostdevNeedsVFIO-detection.patch @@ -0,0 +1,98 @@ +From 2f8eef47f391248abf5253c6836520100d5d49c1 Mon Sep 17 00:00:00 2001 +Message-ID: <2f8eef47f391248abf5253c6836520100d5d49c1.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Wed, 18 Mar 2026 11:57:43 +0100 +Subject: [PATCH] hypervisor: Fix virHostdevNeedsVFIO detection + +Function virHostdevNeedsVFIO is used only in QEMU to figure out if the +host device needs access to /dev/vfio/vfio, for PCI host devices that is +true only if libvirt is not using IOMMUFD. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit ffa8020d3665f7ff27c6b82e88d3a93674155c8d) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/conf/domain_conf.c | 13 +++++++++++++ + src/conf/domain_conf.h | 3 +++ + src/hypervisor/virhostdev.c | 9 ++++++++- + src/libvirt_private.syms | 1 + + 4 files changed, 25 insertions(+), 1 deletion(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 59df028192..99d2a0aa53 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -32835,6 +32835,19 @@ virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev) + } + + ++/** ++ * virHostdevIsPCIDeviceWithIOMMUFD: ++ * @hostdev: host device to check ++ * ++ * Returns true if @hostdev is a PCI device with IOMMUFD disabled, false otherwise. ++ */ ++bool ++virHostdevIsPCIDeviceWithoutIOMMUFD(const virDomainHostdevDef *hostdev) ++{ ++ return virHostdevIsPCIDeviceImpl(hostdev, VIR_TRISTATE_BOOL_NO); ++} ++ ++ + static void + virDomainObjGetMessagesIOErrorsSrc(virStorageSource *src, + const char *diskdst, +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index 69a8e79c6d..8f5780ee4c 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -4719,6 +4719,9 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev) + bool + virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev) + ATTRIBUTE_NONNULL(1); ++bool ++virHostdevIsPCIDeviceWithoutIOMMUFD(const virDomainHostdevDef *hostdev) ++ ATTRIBUTE_NONNULL(1); + + void + virDomainObjGetMessagesIOErrorsChain(virStorageSource *src, +diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c +index 7d7df4418d..43155ceb6c 100644 +--- a/src/hypervisor/virhostdev.c ++++ b/src/hypervisor/virhostdev.c +@@ -2510,10 +2510,17 @@ virHostdevUpdateActiveNVMeDevices(virHostdevManager *hostdev_mgr, + goto cleanup; + } + ++/** ++ * virHostdevNeedsVFIO: ++ * @hostdev: host device to check ++ * ++ * Returns true if using the @hostdev requires access to /dev/vfio/vfio, ++ * otherwise false. ++ */ + bool + virHostdevNeedsVFIO(const virDomainHostdevDef *hostdev) + { +- return virHostdevIsPCIDevice(hostdev) || ++ return virHostdevIsPCIDeviceWithoutIOMMUFD(hostdev) || + virHostdevIsMdevDevice(hostdev); + } + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index 386e757d81..ea1e2d8586 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -814,6 +814,7 @@ virDomainQemuMonitorEventStateRegisterID; + virHostdevIsMdevDevice; + virHostdevIsPCIDevice; + virHostdevIsPCIDeviceWithIOMMUFD; ++virHostdevIsPCIDeviceWithoutIOMMUFD; + virHostdevIsSCSIDevice; + + +-- +2.54.0 diff --git a/libvirt-qemu-Expand-call-to-qemuDomainNeedsVFIO.patch b/libvirt-qemu-Expand-call-to-qemuDomainNeedsVFIO.patch new file mode 100644 index 0000000..b26a1c3 --- /dev/null +++ b/libvirt-qemu-Expand-call-to-qemuDomainNeedsVFIO.patch @@ -0,0 +1,51 @@ +From 5512f4ffa8f4ea8a4afd354e4592b69dc5c39c61 Mon Sep 17 00:00:00 2001 +Message-ID: <5512f4ffa8f4ea8a4afd354e4592b69dc5c39c61.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Wed, 18 Mar 2026 12:52:05 +0100 +Subject: [PATCH] qemu: Expand call to qemuDomainNeedsVFIO + +The function qemuDomainNeedsVFIO() was originally used by other parts +of qemu code to figure out if the VM needs /dev/vfio/vfio. + +Later it was also used by code calculating locked memory limit for all +architectures, and after that change again and used only for PPC64. + +Now it needs to be changed again due to IOMMUFD support, the +/dev/vfio/vfio device is used by QEMU only if IOMMUFD is not used +but for accounting we still need consider all PCI host devices +because if IOMMUFD is used it still requires increasing locked +memory limit. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit c89b2bf1a80e3261bd18cdb352be1ffce9f4639e) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_domain.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 5c9f4831fd..57f18a02b6 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -8259,8 +8259,14 @@ getPPC64MemLockLimitBytes(virDomainDef *def) + passthroughLimit = maxMemory + + 128 * (1ULL<<30) / 512 * nPCIHostBridges + + 8192; +- } else if (qemuDomainNeedsVFIO(def) || virDomainDefHasVDPANet(def)) { +- /* For regular (non-NVLink2 present) VFIO passthrough, the value ++ } else if (virDomainDefHasPCIHostdev(def) || ++ virDomainDefHasMdevHostdev(def) || ++ virDomainDefHasNVMeDisk(def) || ++ virDomainDefHasVDPANet(def)) { ++ /* Not using qemuDomainNeedsVFIO() as that doesn't take PCI host ++ * devices with IOMMFD into account. ++ * ++ * For regular (non-NVLink2 present) VFIO passthrough, the value + * of passthroughLimit is: + * + * passthroughLimit := max( 2 GiB * #PHBs, (c) +-- +2.54.0 diff --git a/libvirt-qemu-Fix-IOMMUFD-and-VFIO-security-labels.patch b/libvirt-qemu-Fix-IOMMUFD-and-VFIO-security-labels.patch new file mode 100644 index 0000000..4846b02 --- /dev/null +++ b/libvirt-qemu-Fix-IOMMUFD-and-VFIO-security-labels.patch @@ -0,0 +1,245 @@ +From 39dd90e66f661ce816592c1ee7cfd5bba54ea6f5 Mon Sep 17 00:00:00 2001 +Message-ID: <39dd90e66f661ce816592c1ee7cfd5bba54ea6f5.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Fri, 27 Feb 2026 17:55:34 +0100 +Subject: [PATCH] qemu: Fix IOMMUFD and VFIO security labels +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When IOMMUFD support was introduced it incorrectly tried to label +`/dev/iommu` and `/dev/vfio/devices/vfioX` but they are not added to +QEMU namespace because libvirt opens FDs and passes these FDs to QEMU. + +We need to label these FDs instead. + +Fixes: 7d2f91f9cb572ab95d0916bdd1a46dd198874529 +Signed-off-by: Pavel Hrdina +Reviewed-by: Ján Tomko +(cherry picked from commit 03f2672ab4eff8ee01410c9acba6288bfb4fa231) + +Resolves: https://redhat.atlassian.net/browse/RHEL-159902 +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_hotplug.c | 2 +- + src/qemu/qemu_process.c | 16 ++++++++++++---- + src/qemu/qemu_process.h | 3 ++- + src/security/security_apparmor.c | 12 ------------ + src/security/security_dac.c | 27 --------------------------- + src/security/security_selinux.c | 23 ----------------------- + 6 files changed, 15 insertions(+), 68 deletions(-) + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index 845f42bf20..994cc749f6 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -1621,7 +1621,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, + } + + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { +- if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) ++ if (qemuProcessOpenVfioDeviceFd(vm, hostdev) < 0) + goto error; + + if (!priv->iommufdState) { +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 29601683a0..0a69063a4b 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7691,13 +7691,16 @@ int + qemuProcessOpenIommuFd(virDomainObj *vm) + { + qemuDomainObjPrivate *priv = vm->privateData; +- int iommufd; ++ VIR_AUTOCLOSE iommufd = -1; + + VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name); + + if ((iommufd = virIOMMUFDOpenDevice()) < 0) + return -1; + ++ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, iommufd) < 0) ++ return -1; ++ + priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd); + + return 0; +@@ -7712,16 +7715,21 @@ qemuProcessOpenIommuFd(virDomainObj *vm) + * Returns: 0 on success, -1 on failure + */ + int +-qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) ++qemuProcessOpenVfioDeviceFd(virDomainObj *vm, ++ virDomainHostdevDef *hostdev) + { ++ qemuDomainObjPrivate *priv = vm->privateData; + qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); + virDomainHostdevSubsysPCI *pci = &hostdev->source.subsys.u.pci; + g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias); +- int vfioDeviceFd; ++ VIR_AUTOCLOSE vfioDeviceFd = -1; + + if ((vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0) + return -1; + ++ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, vfioDeviceFd) < 0) ++ return -1; ++ + hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd); + + return 0; +@@ -7739,7 +7747,7 @@ qemuProcessPrepareHostHostdev(virDomainObj *vm) + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + /* Open VFIO device FD */ +- if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) ++ if (qemuProcessOpenVfioDeviceFd(vm, hostdev) < 0) + return -1; + } + break; +diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h +index 1023b7cb25..dc16622ed9 100644 +--- a/src/qemu/qemu_process.h ++++ b/src/qemu/qemu_process.h +@@ -136,7 +136,8 @@ int qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm, + + int qemuProcessOpenIommuFd(virDomainObj *vm); + +-int qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev); ++int qemuProcessOpenVfioDeviceFd(virDomainObj *vm, ++ virDomainHostdevDef *hostdev); + + int qemuProcessPrepareHost(virQEMUDriver *driver, + virDomainObj *vm, +diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c +index 1c3496893c..40f13ec1a5 100644 +--- a/src/security/security_apparmor.c ++++ b/src/security/security_apparmor.c +@@ -45,7 +45,6 @@ + #include "virstring.h" + #include "virscsi.h" + #include "virmdev.h" +-#include "viriommufd.h" + + #define VIR_FROM_THIS VIR_FROM_SECURITY + +@@ -856,17 +855,6 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + + if (AppArmorSetSecurityPCILabel(pci, vfioGroupDev, ptr) < 0) + return -1; +- } else { +- g_autofree char *vfiofdDev = NULL; +- +- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) +- return -1; +- +- if (AppArmorSetSecurityPCILabel(pci, vfiofdDev, ptr) < 0) +- return -1; +- +- if (AppArmorSetSecurityPCILabel(pci, VIR_IOMMU_DEV_PATH, ptr) < 0) +- return -1; + } + } else { + if (virPCIDeviceFileIterate(pci, AppArmorSetSecurityPCILabel, ptr) < 0) +diff --git a/src/security/security_dac.c b/src/security/security_dac.c +index 2a4c7f6a3c..d8cf117fc4 100644 +--- a/src/security/security_dac.c ++++ b/src/security/security_dac.c +@@ -41,7 +41,6 @@ + #include "virscsivhost.h" + #include "virstring.h" + #include "virutil.h" +-#include "viriommufd.h" + + #define VIR_FROM_THIS VIR_FROM_SECURITY + +@@ -1295,17 +1294,6 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + &cbdata) < 0) { + return -1; + } +- } else { +- g_autofree char *vfiofdDev = NULL; +- +- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) +- return -1; +- +- if (virSecurityDACSetHostdevLabelHelper(vfiofdDev, false, &cbdata) < 0) +- return -1; +- +- if (virSecurityDACSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &cbdata) < 0) +- return -1; + } + } else { + if (virPCIDeviceFileIterate(pci, +@@ -1476,21 +1464,6 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + vfioGroupDev, false) < 0) { + return -1; + } +- } else { +- g_autofree char *vfiofdDev = NULL; +- +- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) +- return -1; +- +- if (virSecurityDACRestoreFileLabelInternal(mgr, NULL, +- vfiofdDev, false) < 0) { +- return -1; +- } +- +- if (virSecurityDACRestoreFileLabelInternal(mgr, NULL, +- VIR_IOMMU_DEV_PATH, false) < 0) { +- return -1; +- } + } + } else { + if (virPCIDeviceFileIterate(pci, virSecurityDACRestorePCILabel, mgr) < 0) +diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c +index 96ca59a7a4..0fa50630f7 100644 +--- a/src/security/security_selinux.c ++++ b/src/security/security_selinux.c +@@ -41,7 +41,6 @@ + #include "virconf.h" + #include "virtpm.h" + #include "virstring.h" +-#include "viriommufd.h" + + #define VIR_FROM_THIS VIR_FROM_SECURITY + +@@ -2267,17 +2266,6 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + &data) < 0) { + return -1; + } +- } else { +- g_autofree char *vfiofdDev = NULL; +- +- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) +- return -1; +- +- if (virSecuritySELinuxSetHostdevLabelHelper(vfiofdDev, false, &data) < 0) +- return -1; +- +- if (virSecuritySELinuxSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &data) < 0) +- return -1; + } + } else { + if (virPCIDeviceFileIterate(pci, virSecuritySELinuxSetPCILabel, &data) < 0) +@@ -2519,17 +2507,6 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + + if (virSecuritySELinuxRestoreFileLabel(mgr, vfioGroupDev, false, false) < 0) + return -1; +- } else { +- g_autofree char *vfiofdDev = NULL; +- +- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) +- return -1; +- +- if (virSecuritySELinuxRestoreFileLabel(mgr, vfiofdDev, false, false) < 0) +- return -1; +- +- if (virSecuritySELinuxRestoreFileLabel(mgr, VIR_IOMMU_DEV_PATH, false, false) < 0) +- return -1; + } + } else { + if (virPCIDeviceFileIterate(pci, virSecuritySELinuxRestorePCILabel, mgr) < 0) +-- +2.54.0 diff --git a/libvirt-qemu-Fix-job-handling-when-domain-dies-in-post-copy-migration.patch b/libvirt-qemu-Fix-job-handling-when-domain-dies-in-post-copy-migration.patch new file mode 100644 index 0000000..bf493ac --- /dev/null +++ b/libvirt-qemu-Fix-job-handling-when-domain-dies-in-post-copy-migration.patch @@ -0,0 +1,60 @@ +From 0c8a23f5f3e063b35b890d5538e5497f51d1095c Mon Sep 17 00:00:00 2001 +Message-ID: <0c8a23f5f3e063b35b890d5538e5497f51d1095c.1780571166.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Mon, 23 Feb 2026 16:23:10 +0100 +Subject: [PATCH] qemu: Fix job handling when domain dies in post-copy + migration + +When a domain is in post-copy migration phase, we need to keep the job +active if something fails to protect the domain from changes. +Unfortunately, there is a race between migration code and +qemuProcessStop that can cause the job to stay active even when the +domain is gone and thus preventing the domain from being started again +(until virtqemud is restarted). The race is caused by unlocking the vm +object when calling virConnectUnregisterCloseCallback. While the domain +is unlocked qemuProcessStop can finish its work and the domain may no +longer be active when we get the lock back. The post-copy path does not +properly check if a domain is still active. + +Instead of adding the virDomainObjIsActive check in all places where +this could happen, we can add it in virDomainObjIsPostcopy and +virDomainObjIsFailedPostcopy and let the code take the pre-copy cleanup +path. Clearly an inactive domain can never be in (failed) post-copy +migration. + +https://issues.redhat.com/browse/RHEL-145179 + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 3d1e6d92de784e5c9d2a5e4bc18829c92278343a) +Signed-off-by: Jiri Denemark +--- + src/conf/domain_conf.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 1f7b1ca340..35de8bab6b 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -30493,6 +30493,9 @@ bool + virDomainObjIsFailedPostcopy(virDomainObj *dom, + virDomainJobObj *job) + { ++ if (!virDomainObjIsActive(dom)) ++ return false; ++ + if (job && job->asyncPaused && + (job->asyncJob == VIR_ASYNC_JOB_MIGRATION_IN || + job->asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT)) +@@ -30509,6 +30512,9 @@ bool + virDomainObjIsPostcopy(virDomainObj *dom, + virDomainJobObj *job) + { ++ if (!virDomainObjIsActive(dom)) ++ return false; ++ + if (virDomainObjIsFailedPostcopy(dom, job)) + return true; + +-- +2.54.0 diff --git a/libvirt-qemu-Implement-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES.patch b/libvirt-qemu-Implement-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES.patch new file mode 100644 index 0000000..4f429e7 --- /dev/null +++ b/libvirt-qemu-Implement-VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES.patch @@ -0,0 +1,47 @@ +From eccea5104691012040f130ee0d400c2cc0b174f7 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Wed, 11 Mar 2026 12:12:40 +0100 +Subject: [PATCH] qemu: Implement + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 3215fee34967c49f37a965154879fc5860293cac) + +https://issues.redhat.com/browse/RHEL-153653 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_driver.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index f3e7410f9e..ecd19663ce 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -16720,7 +16720,8 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, + virDomainVirtType virttype; + g_autoptr(virDomainCaps) domCaps = NULL; + +- virCheckFlags(VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES, ++ virCheckFlags(VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES | ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES, + NULL); + + if (virConnectGetDomainCapabilitiesEnsureACL(conn) < 0) +@@ -16746,6 +16747,12 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, + VIR_CPU_FEATURE_DISABLE); + } + ++ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) { ++ virCPUDef *cpu = domCaps->cpu.hostModel; ++ if (cpu && virCPUExpandFeatures(arch, cpu) < 0) ++ return NULL; ++ } ++ + return virDomainCapsFormat(domCaps); + } + +-- +2.54.0 diff --git a/libvirt-qemu-Implement-iommufd-fdgroup.patch b/libvirt-qemu-Implement-iommufd-fdgroup.patch new file mode 100644 index 0000000..7afa014 --- /dev/null +++ b/libvirt-qemu-Implement-iommufd-fdgroup.patch @@ -0,0 +1,127 @@ +From 8cdc3bb132898c37fe17762aba7dabb59819ce0a Mon Sep 17 00:00:00 2001 +Message-ID: <8cdc3bb132898c37fe17762aba7dabb59819ce0a.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Mon, 16 Mar 2026 15:29:32 +0100 +Subject: [PATCH] qemu: Implement iommufd fdgroup + +When fdgroup is used for iommufd we will start QEMU with -object iommufd +even if the VM has no host device. When virDomainFDAssociate() is used +the FD libvirt is holding is closed with connection. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit 0a83b28795f0c18592f9d842927528f0676cc56d) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_command.c | 4 +++- + src/qemu/qemu_hotplug.c | 4 ++-- + src/qemu/qemu_process.c | 47 ++++++++++++++++++++++++++++++++++++++--- + 3 files changed, 49 insertions(+), 6 deletions(-) + +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index 23e799de3c..db72407ecc 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -5360,8 +5360,10 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd, + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(virJSONValue) props = NULL; + +- if (!virDomainDefHasPCIHostdevWithIOMMUFD(def)) ++ if (!virDomainDefHasPCIHostdevWithIOMMUFD(def) && ++ !def->iommufd_fdgroup) { + return 0; ++ } + + qemuFDPassDirectTransferCommand(priv->iommufd, cmd); + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index 25fe699bb3..8944062aa4 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -1624,7 +1624,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, + if (qemuProcessOpenVfioDeviceFd(vm, hostdev) < 0) + goto error; + +- if (!priv->iommufdState) { ++ if (!priv->iommufdState && !vm->def->iommufd_fdgroup) { + if (qemuProcessOpenIommuFd(vm) < 0) + goto error; + +@@ -5031,7 +5031,7 @@ qemuDomainRemoveHostDevice(virQEMUDriver *driver, + } + } + +- if (priv->iommufdState && ++ if (priv->iommufdState && !vm->def->iommufd_fdgroup && + !virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) { + qemuDomainObjEnterMonitor(vm); + ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false)); +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index d13bce8fcf..e4746374f6 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7706,6 +7706,44 @@ qemuProcessOpenIommuFd(virDomainObj *vm) + return 0; + } + ++/** ++ * qemuProcessGetPassedIommuFd: ++ * @vm: domain object ++ * ++ * Find passed FD via virDomainFDAssociate() API for the VM. ++ * ++ * Returns: 0 on success, -1 on failure ++ */ ++static int ++qemuProcessGetPassedIommuFd(virDomainObj *vm) ++{ ++ qemuDomainObjPrivate *priv = vm->privateData; ++ virDomainFDTuple *fdt = virHashLookup(priv->fds, vm->def->iommufd_fdgroup); ++ VIR_AUTOCLOSE iommufd = -1; ++ ++ if (!fdt) { ++ virReportError(VIR_ERR_INVALID_ARG, ++ _("file descriptor group '%1$s' was not associated with the domain"), ++ vm->def->iommufd_fdgroup); ++ return -1; ++ } ++ ++ if (fdt->nfds != 1) { ++ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", ++ _("Only one file descriptor needs to be associated with iommufd")); ++ return -1; ++ } ++ ++ iommufd = dup(fdt->fds[0]); ++ ++ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, iommufd) < 0) ++ return -1; ++ ++ priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd); ++ ++ return 0; ++} ++ + /** + * qemuProcessOpenVfioDeviceFd: + * @hostdev: host device definition +@@ -7761,9 +7799,12 @@ qemuProcessPrepareHostHostdev(virDomainObj *vm) + } + + /* Open IOMMU FD */ +- if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def) && +- qemuProcessOpenIommuFd(vm) < 0) { +- return -1; ++ if (vm->def->iommufd_fdgroup) { ++ if (qemuProcessGetPassedIommuFd(vm) < 0) ++ return -1; ++ } else if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) { ++ if (qemuProcessOpenIommuFd(vm) < 0) ++ return -1; + } + + return 0; +-- +2.54.0 diff --git a/libvirt-qemu-Implement-iommufd.patch b/libvirt-qemu-Implement-iommufd.patch new file mode 100644 index 0000000..353349f --- /dev/null +++ b/libvirt-qemu-Implement-iommufd.patch @@ -0,0 +1,119 @@ +From e52edf2ed7f3e1e379fb85ae0c0870113912c9d6 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Wed, 18 Mar 2026 17:59:01 +0100 +Subject: [PATCH] qemu: Implement iommufd + +Ideally this should be done in qemuDomainHostdevDefPostParse but that +would require a lot of refactoring mainly due to how interface backed by +hostdev works. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit fc516031ed865f78d590068424ada19a941046ba) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_domain.c | 12 +++++++++--- + src/qemu/qemu_domain.h | 3 ++- + src/qemu/qemu_hotplug.c | 2 +- + src/qemu/qemu_process.c | 4 ++-- + 4 files changed, 14 insertions(+), 7 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index a61939aa15..495cbd4f7d 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -10120,10 +10120,12 @@ qemuDomainPrepareHostdevSCSI(virDomainHostdevDef *hostdev, + + + static int +-qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev, ++qemuDomainPrepareHostdevPCI(const virDomainDef *def, ++ virDomainHostdevDef *hostdev, + virQEMUCaps *qemuCaps) + { + virDeviceHostdevPCIDriverName *driverName = &hostdev->source.subsys.u.pci.driver.name; ++ virDomainHostdevSubsysPCI *pcisrc = &hostdev->source.subsys.u.pci; + + /* assign defaults for hostdev passthrough */ + switch (*driverName) { +@@ -10160,12 +10162,16 @@ qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev, + return -1; + } + ++ if (pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_ABSENT) ++ pcisrc->driver.iommufd = def->iommufd; ++ + return 0; + } + + + int +-qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev, ++qemuDomainPrepareHostdev(const virDomainDef *def, ++ virDomainHostdevDef *hostdev, + qemuDomainObjPrivate *priv) + { + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) +@@ -10175,7 +10181,7 @@ qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev, + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: + return qemuDomainPrepareHostdevSCSI(hostdev, priv); + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: +- return qemuDomainPrepareHostdevPCI(hostdev, priv->qemuCaps); ++ return qemuDomainPrepareHostdevPCI(def, hostdev, priv->qemuCaps); + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: +diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h +index 62c5252b9f..8cd221062c 100644 +--- a/src/qemu/qemu_domain.h ++++ b/src/qemu/qemu_domain.h +@@ -1048,7 +1048,8 @@ qemuDomainDiskCachemodeFlags(virDomainDiskCache cachemode, + bool *noflush); + + int +-qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev, ++qemuDomainPrepareHostdev(const virDomainDef *def, ++ virDomainHostdevDef *hostdev, + qemuDomainObjPrivate *priv); + + char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivate *priv); +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index 994cc749f6..25fe699bb3 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -2900,7 +2900,7 @@ qemuDomainAttachHostDevice(virQEMUDriver *driver, + return -1; + } + +- if (qemuDomainPrepareHostdev(hostdev, vm->privateData) < 0) ++ if (qemuDomainPrepareHostdev(vm->def, hostdev, vm->privateData) < 0) + return -1; + + switch (hostdev->source.subsys.type) { +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 9b8b378b1f..d13bce8fcf 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -6050,7 +6050,7 @@ qemuProcessPrepareDomainNetwork(virDomainObj *vm) + /* For hostdev present in qemuProcessPrepareDomain() phase this was + * done already, but this code runs after that, so we have to call + * it ourselves. */ +- if (qemuDomainPrepareHostdev(hostdev, priv) < 0) ++ if (qemuDomainPrepareHostdev(def, hostdev, priv) < 0) + return -1; + + virDomainHostdevInsert(def, hostdev); +@@ -6838,7 +6838,7 @@ qemuProcessPrepareDomainHostdevs(virDomainObj *vm, + for (i = 0; i < vm->def->nhostdevs; i++) { + virDomainHostdevDef *hostdev = vm->def->hostdevs[i]; + +- if (qemuDomainPrepareHostdev(hostdev, priv) < 0) ++ if (qemuDomainPrepareHostdev(vm->def, hostdev, priv) < 0) + return -1; + } + +-- +2.54.0 diff --git a/libvirt-qemu-Move-domain-caps-flags-handling-to-virQEMUCapsFillDomainCPUHostModel.patch b/libvirt-qemu-Move-domain-caps-flags-handling-to-virQEMUCapsFillDomainCPUHostModel.patch new file mode 100644 index 0000000..00dbc8c --- /dev/null +++ b/libvirt-qemu-Move-domain-caps-flags-handling-to-virQEMUCapsFillDomainCPUHostModel.patch @@ -0,0 +1,196 @@ +From 9ec1c8fc52cd3150712f5ada134e070fbdabb7bb Mon Sep 17 00:00:00 2001 +Message-ID: <9ec1c8fc52cd3150712f5ada134e070fbdabb7bb.1780571166.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Thu, 21 May 2026 12:36:48 +0200 +Subject: [PATCH] qemu: Move domain caps flags handling to + virQEMUCapsFillDomainCPUHostModel + +We will need to generate the capabilities in a different way based on +the flags. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit b4d3572198848e6a2886352e1a48b46afa37bec1) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 34 ++++++++++++++++++++++++---------- + src/qemu/qemu_capabilities.h | 3 ++- + src/qemu/qemu_conf.c | 6 ++++-- + src/qemu/qemu_conf.h | 3 ++- + src/qemu/qemu_driver.c | 15 ++------------- + tests/domaincapstest.c | 2 +- + 6 files changed, 35 insertions(+), 28 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 0b32296cc8..c17b55420d 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -6584,14 +6584,26 @@ virQEMUCapsFillDomainCPUMaximum(virDomainCaps *domCaps) + + static void + virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, +- virDomainCaps *domCaps) ++ virDomainCaps *domCaps, ++ unsigned int flags) + { +- virCPUDef *cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype, +- VIR_QEMU_CAPS_HOST_CPU_REPORTED); ++ virQEMUCapsHostCPUType cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED; ++ virCPUDef *cpu; + +- domCaps->cpu.hostModel = virCPUDefCopy(cpu); +- domCaps->cpu.hostModel->addr = virQEMUCapsGetHostPhysAddr(qemuCaps, +- domCaps->virttype); ++ cpu = virCPUDefCopy(virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype, ++ cpuType)); ++ ++ cpu->addr = virQEMUCapsGetHostPhysAddr(qemuCaps, domCaps->virttype); ++ ++ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) { ++ virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, domCaps->virttype, ++ cpu, VIR_CPU_FEATURE_DISABLE); ++ } ++ ++ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) ++ virCPUExpandFeatures(domCaps->arch, cpu); ++ ++ domCaps->cpu.hostModel = cpu; + } + + +@@ -6616,7 +6628,8 @@ virQEMUCapsFillDomainCPUCustom(virQEMUCaps *qemuCaps, + static void + virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps, + virArch hostarch, +- virDomainCaps *domCaps) ++ virDomainCaps *domCaps, ++ unsigned int flags) + { + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, + VIR_CPU_MODE_HOST_PASSTHROUGH, +@@ -6633,7 +6646,7 @@ virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps, + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, + VIR_CPU_MODE_HOST_MODEL, + domCaps->machine)) { +- virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps); ++ virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps, flags); + } + + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, +@@ -7263,7 +7276,8 @@ virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg, + virQEMUCaps *qemuCaps, + virArch hostarch, + virDomainCaps *domCaps, +- bool privileged) ++ bool privileged, ++ unsigned int flags) + { + virDomainCapsOS *os = &domCaps->os; + virDomainCapsDeviceDisk *disk = &domCaps->disk; +@@ -7305,7 +7319,7 @@ virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg, + firmwares, nfirmwares) < 0) + return -1; + +- virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps); ++ virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps, flags); + virQEMUCapsFillDomainMemoryBackingCaps(qemuCaps, memoryBacking); + virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk); + virQEMUCapsFillDomainDeviceGraphicsCaps(cfg, qemuCaps, graphics); +diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h +index f7c8680f94..bc3ecbb89f 100644 +--- a/src/qemu/qemu_capabilities.h ++++ b/src/qemu/qemu_capabilities.h +@@ -896,7 +896,8 @@ int virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg, + virQEMUCaps *qemuCaps, + virArch hostarch, + virDomainCaps *domCaps, +- bool privileged); ++ bool privileged, ++ unsigned int flags); + + void virQEMUCapsFillDomainMemoryBackingCaps(virQEMUCaps *qemuCaps, + virDomainCapsMemoryBacking *memoryBacking); +diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c +index 242955200a..5e40635871 100644 +--- a/src/qemu/qemu_conf.c ++++ b/src/qemu/qemu_conf.c +@@ -1708,7 +1708,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver, + virQEMUCaps *qemuCaps, + const char *machine, + virArch arch, +- virDomainVirtType virttype) ++ virDomainVirtType virttype, ++ unsigned int flags) + { + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + g_autoptr(virDomainCaps) domCaps = NULL; +@@ -1742,7 +1743,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver, + qemuCaps, + driver->hostarch, + domCaps, +- driver->privileged) < 0) ++ driver->privileged, ++ flags) < 0) + return NULL; + + return g_steal_pointer(&domCaps); +diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h +index edb65c99f4..36d7808e10 100644 +--- a/src/qemu/qemu_conf.h ++++ b/src/qemu/qemu_conf.h +@@ -375,7 +375,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver, + virQEMUCaps *qemuCaps, + const char *machine, + virArch arch, +- virDomainVirtType virttype); ++ virDomainVirtType virttype, ++ unsigned int flags); + + int qemuDriverAllocateID(virQEMUDriver *driver); + virDomainXMLOption *virQEMUDriverCreateXMLConf(virQEMUDriver *driver, +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 8db9cbb6a2..0a61f97666 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -16738,21 +16738,10 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, + + if (!(domCaps = virQEMUDriverGetDomainCapabilities(driver, + qemuCaps, machine, +- arch, virttype))) ++ arch, virttype, ++ flags))) + return NULL; + +- if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) { +- virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, virttype, +- domCaps->cpu.hostModel, +- VIR_CPU_FEATURE_DISABLE); +- } +- +- if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) { +- virCPUDef *cpu = domCaps->cpu.hostModel; +- if (cpu && virCPUExpandFeatures(arch, cpu) < 0) +- return NULL; +- } +- + return virDomainCapsFormat(domCaps); + } + +diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c +index 5b2fc80f0a..f2248c2435 100644 +--- a/tests/domaincapstest.c ++++ b/tests/domaincapstest.c +@@ -101,7 +101,7 @@ fillQemuCaps(virDomainCaps *domCaps, + + if (virQEMUCapsFillDomainCaps(cfg, + qemuCaps, domCaps->arch, domCaps, +- false) < 0) ++ false, 0) < 0) + return -1; + + /* As of f05b6a918e28 we are expecting to see OVMF_CODE.fd file which +-- +2.54.0 diff --git a/libvirt-qemu-Update-qemuDomainNeedsVFIO-to-ignore-PCI-hostdev-with-IOMMUFD.patch b/libvirt-qemu-Update-qemuDomainNeedsVFIO-to-ignore-PCI-hostdev-with-IOMMUFD.patch new file mode 100644 index 0000000..16eb2bd --- /dev/null +++ b/libvirt-qemu-Update-qemuDomainNeedsVFIO-to-ignore-PCI-hostdev-with-IOMMUFD.patch @@ -0,0 +1,107 @@ +From 84c12b67bed448ae5129e3b7c18b52fa397cf217 Mon Sep 17 00:00:00 2001 +Message-ID: <84c12b67bed448ae5129e3b7c18b52fa397cf217.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Wed, 18 Mar 2026 13:10:37 +0100 +Subject: [PATCH] qemu: Update qemuDomainNeedsVFIO to ignore PCI hostdev with + IOMMUFD + +This function is used to figure out if VM needs access to /dev/vfio/vfio. +In case of PCI host devices that is true only if IOMMUFD is not enabled. + +This fixes error when hotplugging PCI host device with IOMMUFD disabled +to a VM that already has PCI host device with IOMMIFD enabled: + + Could not open '/dev/vfio/vfio': No such file or directory + +The function is used in this case to check if /dev/vfio/vfio was already +made available to QEMU or not. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit d1fb5cf127d7681fa6c27e5b163ef410132aea49) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/conf/domain_conf.c | 14 ++++++++++++++ + src/conf/domain_conf.h | 3 +++ + src/libvirt_private.syms | 1 + + src/qemu/qemu_domain.c | 9 ++++++++- + 4 files changed, 26 insertions(+), 1 deletion(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 99d2a0aa53..576a1bd79b 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -32520,6 +32520,20 @@ virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def) + } + + ++bool ++virDomainDefHasPCIHostdevWithoutIOMMUFD(const virDomainDef *def) ++{ ++ size_t i; ++ ++ for (i = 0; i < def->nhostdevs; i++) { ++ if (virHostdevIsPCIDeviceWithoutIOMMUFD(def->hostdevs[i])) ++ return true; ++ } ++ ++ return false; ++} ++ ++ + bool + virDomainDefHasMdevHostdev(const virDomainDef *def) + { +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index 8f5780ee4c..f1c8478208 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -4658,6 +4658,9 @@ virDomainDefHasPCIHostdev(const virDomainDef *def); + bool + virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def); + ++bool ++virDomainDefHasPCIHostdevWithoutIOMMUFD(const virDomainDef *def); ++ + bool + virDomainDefHasMdevHostdev(const virDomainDef *def); + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index ea1e2d8586..d2563e587a 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -349,6 +349,7 @@ virDomainDefHasOldStyleROUEFI; + virDomainDefHasOldStyleUEFI; + virDomainDefHasPCIHostdev; + virDomainDefHasPCIHostdevWithIOMMUFD; ++virDomainDefHasPCIHostdevWithoutIOMMUFD; + virDomainDefHasTimer; + virDomainDefHasUSB; + virDomainDefHasVcpusOffline; +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 57f18a02b6..a61939aa15 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -9284,10 +9284,17 @@ qemuDomainSupportsVideoVga(const virDomainVideoDef *video, + } + + ++/** ++ * qemuDomainNeedsVFIO: ++ * @def: domain definition to check ++ * ++ * Check the domain definition to figure out if QEMU needs access ++ * to /dev/vfio/vfio. It's not required if IOMMUFD is used. ++ */ + bool + qemuDomainNeedsVFIO(const virDomainDef *def) + { +- return virDomainDefHasPCIHostdev(def) || ++ return virDomainDefHasPCIHostdevWithoutIOMMUFD(def) || + virDomainDefHasMdevHostdev(def) || + virDomainDefHasNVMeDisk(def); + } +-- +2.54.0 diff --git a/libvirt-qemu-Wire-up-new-hyperv-host-model-mode-behavior.patch b/libvirt-qemu-Wire-up-new-hyperv-host-model-mode-behavior.patch new file mode 100644 index 0000000..51b95d0 --- /dev/null +++ b/libvirt-qemu-Wire-up-new-hyperv-host-model-mode-behavior.patch @@ -0,0 +1,59 @@ +From dbaf42b6deae0149f88a3be8fbf52a5e94eb799d Mon Sep 17 00:00:00 2001 +Message-ID: +From: Michal Privoznik +Date: Wed, 11 Feb 2026 10:16:34 +0100 +Subject: [PATCH] qemu: Wire up new hyperv host-model mode behavior + +Since some hyperv features might be already enabled/disabled when +entering qemuProcessEnableDomainFeatures() only those which are +not set in domain XML (i.e. are VIR_TRISTATE_SWITCH_ABSENT) +should be modified. Furthermore, some features are not a simple +on/off switch, but a number or a string even. Well, that doesn't +matter really as the logic for setting them is the same: only set +their value iff they are not already set. + +Resolves: https://issues.redhat.com/browse/RHEL-148219 +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +(cherry picked from commit 11057abfd13f6aad15f9821235b66c68e6211af6) +Resolves: https://issues.redhat.com/browse/RHEL-151688 +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_process.c | 8 +++++++- + .../qemuxmlconfdata/hyperv-host-model.x86_64-latest.args | 2 +- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 1aff3a277b..29601683a0 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -6964,7 +6964,13 @@ qemuProcessEnableDomainFeatures(virDomainObj *vm) + if (!VIR_DOMAIN_CAPS_ENUM_IS_SET(hv->features, i)) + continue; + +- vm->def->hyperv.features[i] = VIR_TRISTATE_SWITCH_ON; ++ if (vm->def->hyperv.features[i] == VIR_TRISTATE_SWITCH_ABSENT) { ++ vm->def->hyperv.features[i] = VIR_TRISTATE_SWITCH_ON; ++ } else { ++ /* if the user provided already config for this we skip the ++ * auto-population code */ ++ continue; ++ } + + if (i == VIR_DOMAIN_HYPERV_SPINLOCKS) { + if (hv->spinlocks != 0) { +diff --git a/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.args b/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.args +index 58502ff51e..d1f2326da1 100644 +--- a/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.args +@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ + -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=on \ + -accel tcg \ +--cpu 'qemu64,hv-time=on,hv-relaxed=on,hv-vapic=on,hv-spinlocks=0xfff,hv-vpindex=on,hv-runtime=on,hv-synic=on,hv-stimer=on,hv-stimer-direct=on,hv-reset=on,hv-vendor-id=Linux KVM Hv,hv-frequencies=on,hv-reenlightenment=on,hv-tlbflush=on,hv-tlbflush-direct=on,hv-tlbflush-ext=on,hv-ipi=on,hv-avic=on,hv-emsr-bitmap=on,hv-xmm-input=on' \ ++-cpu 'qemu64,hv-time=on,hv-relaxed=on,hv-vapic=on,hv-spinlocks=0x2000,hv-vpindex=on,hv-runtime=on,hv-synic=on,hv-stimer=on,hv-stimer-direct=on,hv-reset=on,hv-vendor-id=Linux KVM Hv,hv-frequencies=on,hv-reenlightenment=on,hv-tlbflush=on,hv-tlbflush-direct=on,hv-tlbflush-ext=on,hv-ipi=on,hv-avic=on,hv-emsr-bitmap=on' \ + -m size=219136k \ + -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ + -overcommit mem-lock=off \ +-- +2.54.0 diff --git a/libvirt-qemuMigrationSrcBeginPhase-Don-t-call-qemuBlockNodesEnsureActive-with-offline-VM.patch b/libvirt-qemuMigrationSrcBeginPhase-Don-t-call-qemuBlockNodesEnsureActive-with-offline-VM.patch new file mode 100644 index 0000000..63cdf9f --- /dev/null +++ b/libvirt-qemuMigrationSrcBeginPhase-Don-t-call-qemuBlockNodesEnsureActive-with-offline-VM.patch @@ -0,0 +1,46 @@ +From 3e6b8f45de2cef2a8f08f84d62915b3cbaa050de Mon Sep 17 00:00:00 2001 +Message-ID: <3e6b8f45de2cef2a8f08f84d62915b3cbaa050de.1780571166.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Wed, 18 Mar 2026 08:54:16 +0100 +Subject: [PATCH] qemuMigrationSrcBeginPhase: Don't call + 'qemuBlockNodesEnsureActive' with offline VM + +Commits 7b5566ce67b18a and f879d5f40385358 ( v11.8.0-92-gf879d5f403 ) +moved around code for re-activating block backends after migration. +While previously it was done when migration failed now we do it when we +need qemu to do some block operations. + +'qemuBlockNodesEnsureActive' is thus called also when 'VIR_MIGRATE_OFFLINE' +is used. This doesn't cause failure similar to previous patch only due +to a conincidence as 'qemuCaps' wasn't initialized yet and thus we +assume that QEMU doesn't support 'blockdev-set-active' and skip all +monitor code. + +Make the code more robust and explicit by calling +'qemuBlockNodesEnsureActive' only on active VMs during migration. + +Fixes: 7b5566ce67b18a2bebe68fdb07e046f25185f8d3 +Signed-off-by: Peter Krempa +Reviewed-by: Jiri Denemark +(cherry picked from commit 4537c0b8708851136b8246b1869c6008a56240ae) +https://redhat.atlassian.net/browse/RHEL-173433 +--- + src/qemu/qemu_migration.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c +index 1fd9b1dd55..2b3f464fa6 100644 +--- a/src/qemu/qemu_migration.c ++++ b/src/qemu/qemu_migration.c +@@ -2868,7 +2868,8 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver, + vm->newDef && !qemuDomainVcpuHotplugIsInOrder(vm->newDef))) + cookieFlags |= QEMU_MIGRATION_COOKIE_CPU_HOTPLUG; + +- if (qemuBlockNodesEnsureActive(vm, vm->job->asyncJob) < 0) ++ if (virDomainObjIsActive(vm) && ++ qemuBlockNodesEnsureActive(vm, vm->job->asyncJob) < 0) + return NULL; + + return qemuMigrationSrcBeginXML(vm, xmlin, +-- +2.54.0 diff --git a/libvirt-qemuMigrationSrcBeginXML-Don-t-call-qemuMigrationSrcBeginPhaseBlockDirtyBitmaps-with-offline-VM.patch b/libvirt-qemuMigrationSrcBeginXML-Don-t-call-qemuMigrationSrcBeginPhaseBlockDirtyBitmaps-with-offline-VM.patch new file mode 100644 index 0000000..a919095 --- /dev/null +++ b/libvirt-qemuMigrationSrcBeginXML-Don-t-call-qemuMigrationSrcBeginPhaseBlockDirtyBitmaps-with-offline-VM.patch @@ -0,0 +1,45 @@ +From f875d6f1e560dd9d73e373d576f2c784f6f8cb4c Mon Sep 17 00:00:00 2001 +Message-ID: +From: Peter Krempa +Date: Mon, 23 Mar 2026 22:39:58 +0100 +Subject: [PATCH] qemuMigrationSrcBeginXML: Don't call + 'qemuMigrationSrcBeginPhaseBlockDirtyBitmaps' with offline VM + +Commit a4f610ff3fe190058f1 made the call to +'qemuMigrationSrcBeginPhaseBlockDirtyBitmaps' inside +'qemuMigrationSrcBeginXML' unconditional. This unfortunately means that +it was called also with 'VIR_MIGRATE_OFFLINE'. + +Attempting to enter the monitor in such case results in an error: + + error: operation failed: domain is no longer running + +Restrict the call only to non-offline migration. + +Fixes: a4f610ff3fe190058f18baea18b095d0bc69441b +Resolves: https://redhat.atlassian.net/browse/RHEL-156800 +Closes: https://gitlab.com/libvirt/libvirt/-/work_items/865 +Signed-off-by: Peter Krempa +Reviewed-by: Jiri Denemark +(cherry picked from commit 59fde80f39567101010e7ba4dece4fd68b50090d) +https://redhat.atlassian.net/browse/RHEL-173433 +--- + src/qemu/qemu_migration.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c +index 2a4df1191d..1fd9b1dd55 100644 +--- a/src/qemu/qemu_migration.c ++++ b/src/qemu/qemu_migration.c +@@ -2689,7 +2689,8 @@ qemuMigrationSrcBeginXML(virDomainObj *vm, + if (!(mig = qemuMigrationCookieNew(vm->def, priv->origname))) + return NULL; + +- if (qemuMigrationSrcBeginPhaseBlockDirtyBitmaps(mig, vm) < 0) ++ if (!(flags & VIR_MIGRATE_OFFLINE) && ++ qemuMigrationSrcBeginPhaseBlockDirtyBitmaps(mig, vm) < 0) + return NULL; + + if (qemuMigrationCookieFormat(mig, driver, vm, +-- +2.54.0 diff --git a/libvirt-qemu_capabilities-Always-sort-features-in-host-model-CPU.patch b/libvirt-qemu_capabilities-Always-sort-features-in-host-model-CPU.patch new file mode 100644 index 0000000..2098e37 --- /dev/null +++ b/libvirt-qemu_capabilities-Always-sort-features-in-host-model-CPU.patch @@ -0,0 +1,3806 @@ +From e6a0a49faf7a372015a2173add7a84d725c201aa Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Fri, 29 May 2026 14:19:30 +0200 +Subject: [PATCH] qemu_capabilities: Always sort features in host-model CPU + +Expanding a CPU model always produces a sorted list of features so the +features in host-model CPU capabilities were either sorted or not +depending on flags passed to virConnectGetDomainCapabilities. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 003b573108d8e0f09b6069d69fd31ca637afe21c) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Conflicts: + tests/domaincapsdata/* + - test files for old QEMU releases were removed upstream + - test files for new QEMU are missing downstream + - a few features are missing in QEMU 10.[12] caps downstream + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 1 + + .../qemu_10.0.0-q35.x86_64+amdsev.xml | 48 +++++----- + .../domaincapsdata/qemu_10.0.0-q35.x86_64.xml | 50 +++++----- + .../qemu_10.0.0-tcg.x86_64+amdsev.xml | 60 ++++++------ + .../domaincapsdata/qemu_10.0.0-tcg.x86_64.xml | 60 ++++++------ + tests/domaincapsdata/qemu_10.0.0.s390x.xml | 94 +++++++++---------- + .../qemu_10.0.0.x86_64+amdsev.xml | 48 +++++----- + tests/domaincapsdata/qemu_10.0.0.x86_64.xml | 50 +++++----- + .../qemu_10.1.0-q35.x86_64+inteltdx.xml | 52 +++++----- + .../domaincapsdata/qemu_10.1.0-q35.x86_64.xml | 40 ++++---- + .../qemu_10.1.0-tcg.x86_64+inteltdx.xml | 66 ++++++------- + .../domaincapsdata/qemu_10.1.0-tcg.x86_64.xml | 66 ++++++------- + .../qemu_10.1.0.x86_64+inteltdx.xml | 52 +++++----- + tests/domaincapsdata/qemu_10.1.0.x86_64.xml | 40 ++++---- + .../domaincapsdata/qemu_10.2.0-q35.x86_64.xml | 24 ++--- + .../qemu_10.2.0-tcg.x86_64+mshv.xml | 66 ++++++------- + .../domaincapsdata/qemu_10.2.0-tcg.x86_64.xml | 66 ++++++------- + tests/domaincapsdata/qemu_10.2.0.x86_64.xml | 24 ++--- + .../domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 28 +++--- + .../domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 64 ++++++------- + tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 28 +++--- + .../domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 30 +++--- + .../domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 66 ++++++------- + tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 30 +++--- + .../domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 32 +++---- + .../domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 66 ++++++------- + tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 32 +++---- + .../qemu_7.2.0-hvf.x86_64+hvf.xml | 36 +++---- + .../domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 36 +++---- + .../qemu_7.2.0-tcg.x86_64+hvf.xml | 46 ++++----- + .../domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 46 ++++----- + tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 36 +++---- + .../domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 36 +++---- + .../domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 54 +++++------ + tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 36 +++---- + .../domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 38 ++++---- + .../domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 60 ++++++------ + tests/domaincapsdata/qemu_8.1.0.s390x.xml | 62 ++++++------ + tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 38 ++++---- + .../domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 40 ++++---- + .../domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 58 ++++++------ + tests/domaincapsdata/qemu_8.2.0.s390x.xml | 62 ++++++------ + tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 40 ++++---- + .../domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 40 ++++---- + .../domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 62 ++++++------ + tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 40 ++++---- + .../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 48 +++++----- + .../domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 60 ++++++------ + tests/domaincapsdata/qemu_9.1.0.s390x.xml | 94 +++++++++---------- + tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 48 +++++----- + .../qemu_9.2.0-q35.x86_64+amdsev.xml | 48 +++++----- + .../domaincapsdata/qemu_9.2.0-q35.x86_64.xml | 50 +++++----- + .../qemu_9.2.0-tcg.x86_64+amdsev.xml | 60 ++++++------ + .../domaincapsdata/qemu_9.2.0-tcg.x86_64.xml | 60 ++++++------ + tests/domaincapsdata/qemu_9.2.0.s390x.xml | 94 +++++++++---------- + .../qemu_9.2.0.x86_64+amdsev.xml | 48 +++++----- + tests/domaincapsdata/qemu_9.2.0.x86_64.xml | 50 +++++----- + 57 files changed, 1405 insertions(+), 1404 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index c17b55420d..6951e50c03 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -6603,6 +6603,7 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, + if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) + virCPUExpandFeatures(domCaps->arch, cpu); + ++ virCPUDefSortFeatures(cpu); + domCaps->cpu.hostModel = cpu; + } + +diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml +index aeccdf612d..4f854ab11d 100644 +--- a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml ++++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml +@@ -44,37 +44,37 @@ + EPYC-Genoa + AMD + +- +- +- +- +- +- +- + +- + +- +- +- +- +- +- +- ++ + ++ ++ ++ ++ ++ ++ ++ + ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml +index 86a740099b..8214cf90b2 100644 +--- a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml +@@ -44,37 +44,37 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml +index 5d9ce948f8..e4d1ed0dcc 100644 +--- a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml ++++ b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml +@@ -37,39 +37,39 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml +index 3915ec38cf..0e48e5e00c 100644 +--- a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml +@@ -37,39 +37,39 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.0.0.s390x.xml b/tests/domaincapsdata/qemu_10.0.0.s390x.xml +index 220afb9d7d..bc88468201 100644 +--- a/tests/domaincapsdata/qemu_10.0.0.s390x.xml ++++ b/tests/domaincapsdata/qemu_10.0.0.s390x.xml +@@ -37,61 +37,61 @@ + + + gen16a-base +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- +- +- +- +- + +- +- ++ + + +- +- +- +- +- +- +- +- +- ++ + +- ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ + + + gen15a +diff --git a/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml +index 9dcc7f2e44..9297ed6d46 100644 +--- a/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml ++++ b/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml +@@ -43,37 +43,37 @@ + EPYC-Genoa + AMD + +- +- +- +- +- +- +- + +- + +- +- +- +- +- +- +- ++ + ++ ++ ++ ++ ++ ++ ++ + ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.0.0.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0.x86_64.xml +index c0c3a2e6db..85c0e8a8e1 100644 +--- a/tests/domaincapsdata/qemu_10.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.0.0.x86_64.xml +@@ -43,37 +43,37 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml +index 346a94c1ec..f7f437eb28 100644 +--- a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml +@@ -44,40 +44,40 @@ + GraniteRapids + Intel + +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- ++ ++ ++ ++ + +- +- ++ ++ + + +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ + ++ + + +- +- +- +- +- +- ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml +index fc82987630..244fce575b 100644 +--- a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml +@@ -44,30 +44,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ + +- +- +- +- +- ++ ++ ++ ++ + + +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml +index 07fe65d429..4518281672 100644 +--- a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml ++++ b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml +@@ -37,42 +37,42 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml +index 34e5812613..eca7f35c67 100644 +--- a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml +@@ -37,42 +37,42 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml b/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml +index 1d476275a2..9b7b6a95d6 100644 +--- a/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml ++++ b/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml +@@ -43,40 +43,40 @@ + GraniteRapids + Intel + +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- ++ ++ ++ ++ + +- +- ++ ++ + + +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ + ++ + + +- +- +- +- +- +- ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.1.0.x86_64.xml b/tests/domaincapsdata/qemu_10.1.0.x86_64.xml +index 3be5e34fe6..cbdebe9da5 100644 +--- a/tests/domaincapsdata/qemu_10.1.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.1.0.x86_64.xml +@@ -43,30 +43,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ + +- +- +- +- +- ++ ++ ++ ++ + + +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml +index baf8f458db..9389141012 100644 +--- a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml +@@ -44,21 +44,21 @@ + EPYC-Turin + AMD + +- +- +- +- +- +- +- +- + ++ ++ + +- +- +- +- + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml +index 35331dc4d4..84c5084452 100644 +--- a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml ++++ b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml +@@ -37,42 +37,42 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml +index 7fba7f45f3..ae91b4c984 100644 +--- a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml +@@ -37,42 +37,42 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_10.2.0.x86_64.xml b/tests/domaincapsdata/qemu_10.2.0.x86_64.xml +index 354653d49a..dd3bfec565 100644 +--- a/tests/domaincapsdata/qemu_10.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_10.2.0.x86_64.xml +@@ -43,21 +43,21 @@ + EPYC-Turin + AMD + +- +- +- +- +- +- +- +- + ++ ++ + +- +- +- +- + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml +index 0b66b77e73..f721f16740 100644 +--- a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml +@@ -44,23 +44,23 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml +index ce4b14f28c..a4b75bce0f 100644 +--- a/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml +@@ -37,44 +37,44 @@ + + Opteron_G3 + AMD +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- +- +- +- +- + +- +- ++ ++ ++ ++ + + +- +- +- +- +- + +- +- +- +- +- +- +- ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_6.2.0.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0.x86_64.xml +index 33b2e4905e..475ba48555 100644 +--- a/tests/domaincapsdata/qemu_6.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_6.2.0.x86_64.xml +@@ -43,23 +43,23 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml +index 2d7519ae94..738aac802f 100644 +--- a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml +@@ -44,24 +44,24 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml +index 01975a5e34..0f249bc278 100644 +--- a/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml +@@ -37,45 +37,45 @@ + + Opteron_G3 + AMD +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- +- +- +- +- + +- +- ++ ++ ++ ++ + + +- +- +- +- +- +- + +- +- +- +- +- +- +- ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.0.0.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0.x86_64.xml +index 8fa3d3e0f4..fec64cbb03 100644 +--- a/tests/domaincapsdata/qemu_7.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.0.0.x86_64.xml +@@ -43,24 +43,24 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml +index 1991133a62..3ef878cc52 100644 +--- a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml +@@ -44,25 +44,25 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml +index 41bfdbecb6..31b40552c2 100644 +--- a/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml +@@ -37,45 +37,45 @@ + + Opteron_G3 + AMD +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- +- +- +- +- + +- +- ++ ++ ++ ++ + + +- +- +- +- +- +- + +- +- +- +- +- +- +- ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.1.0.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0.x86_64.xml +index 54e8e9d87a..4cf33e2c8f 100644 +--- a/tests/domaincapsdata/qemu_7.1.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.1.0.x86_64.xml +@@ -43,25 +43,25 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml b/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml +index 58ef1bde99..3bf8873f07 100644 +--- a/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml ++++ b/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml +@@ -43,30 +43,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ + + +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml +index 7c325b52aa..e3d4beb1cd 100644 +--- a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml +@@ -44,30 +44,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ + + +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml +index 27ecea6fe0..b3caa8014c 100644 +--- a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml ++++ b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml +@@ -37,34 +37,34 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- +- ++ ++ ++ ++ ++ + + +- +- +- +- ++ ++ + +- +- ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml +index 27ecea6fe0..b3caa8014c 100644 +--- a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml +@@ -37,34 +37,34 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- +- ++ ++ ++ ++ ++ + + +- +- +- +- ++ ++ + +- +- ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_7.2.0.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0.x86_64.xml +index b9a174368a..b67fae39a4 100644 +--- a/tests/domaincapsdata/qemu_7.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_7.2.0.x86_64.xml +@@ -43,30 +43,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ + + +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml +index 60893adebf..fb5e2184b3 100644 +--- a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml +@@ -44,30 +44,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ + + +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml +index 23e41eb13c..eb1cb17485 100644 +--- a/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml +@@ -37,38 +37,38 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- +- ++ ++ ++ ++ ++ + + +- +- +- +- ++ ++ + +- +- ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_8.0.0.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0.x86_64.xml +index daa91d428f..f0153262ec 100644 +--- a/tests/domaincapsdata/qemu_8.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.0.0.x86_64.xml +@@ -43,30 +43,30 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ + + +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml +index df003825ea..d651b112b9 100644 +--- a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml +@@ -44,31 +44,31 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ ++ ++ + + +- +- +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml +index 10330281bd..95163de537 100644 +--- a/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml +@@ -37,39 +37,39 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_8.1.0.s390x.xml b/tests/domaincapsdata/qemu_8.1.0.s390x.xml +index c86f0113f3..adbc1e220b 100644 +--- a/tests/domaincapsdata/qemu_8.1.0.s390x.xml ++++ b/tests/domaincapsdata/qemu_8.1.0.s390x.xml +@@ -37,44 +37,44 @@ + + + gen15a-base +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ + ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- + ++ + ++ ++ ++ ++ ++ ++ + + + gen15a +diff --git a/tests/domaincapsdata/qemu_8.1.0.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0.x86_64.xml +index 205334e84b..1b311db3ce 100644 +--- a/tests/domaincapsdata/qemu_8.1.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.1.0.x86_64.xml +@@ -43,31 +43,31 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ + +- +- ++ ++ ++ + + +- +- +- +- +- ++ + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml +index bd9dbf8cba..ef53e39080 100644 +--- a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml +@@ -44,32 +44,32 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ ++ + +- +- ++ ++ ++ + + +- +- +- +- +- ++ + + +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml +index 60e5cb8632..ce7acaf22e 100644 +--- a/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml +@@ -37,38 +37,38 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_8.2.0.s390x.xml b/tests/domaincapsdata/qemu_8.2.0.s390x.xml +index ad80492e30..b055e00cc4 100644 +--- a/tests/domaincapsdata/qemu_8.2.0.s390x.xml ++++ b/tests/domaincapsdata/qemu_8.2.0.s390x.xml +@@ -37,44 +37,44 @@ + + + gen15a-base +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ + ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- + ++ + ++ ++ ++ ++ ++ ++ + + + gen15a +diff --git a/tests/domaincapsdata/qemu_8.2.0.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0.x86_64.xml +index c6558915c1..4a9040afb9 100644 +--- a/tests/domaincapsdata/qemu_8.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_8.2.0.x86_64.xml +@@ -43,32 +43,32 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ ++ + +- +- ++ ++ ++ + + +- +- +- +- +- ++ + + +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml +index 930014727d..a52d498e66 100644 +--- a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml +@@ -44,32 +44,32 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ ++ + +- +- ++ ++ ++ + + +- +- +- +- +- ++ + + +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml +index 19adcfe249..c5b2cc8c52 100644 +--- a/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml +@@ -37,40 +37,40 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_9.0.0.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0.x86_64.xml +index bc4e7fa1ee..0c9ed2f150 100644 +--- a/tests/domaincapsdata/qemu_9.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.0.0.x86_64.xml +@@ -43,32 +43,32 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ ++ + +- +- ++ ++ ++ + + +- +- +- +- +- ++ + + +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml +index 927c1b4fab..97d0758e80 100644 +--- a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml +@@ -44,36 +44,36 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml +index a8b1bfed73..f2da0c8731 100644 +--- a/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml +@@ -37,39 +37,39 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_9.1.0.s390x.xml b/tests/domaincapsdata/qemu_9.1.0.s390x.xml +index 2854713ca3..993762ecce 100644 +--- a/tests/domaincapsdata/qemu_9.1.0.s390x.xml ++++ b/tests/domaincapsdata/qemu_9.1.0.s390x.xml +@@ -37,61 +37,61 @@ + + + gen16a-base +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- +- +- +- +- + +- +- ++ + + +- +- +- +- +- +- +- +- +- ++ + +- ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ + + + gen15a +diff --git a/tests/domaincapsdata/qemu_9.1.0.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0.x86_64.xml +index e4d36b95ac..e13d43c6b9 100644 +--- a/tests/domaincapsdata/qemu_9.1.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.1.0.x86_64.xml +@@ -43,36 +43,36 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml +index 39bdb2615b..eafb7bde7b 100644 +--- a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml ++++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml +@@ -44,37 +44,37 @@ + EPYC-Genoa + AMD + +- +- +- +- +- +- +- + +- + +- +- +- +- +- +- +- ++ + ++ ++ ++ ++ ++ ++ ++ + ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml +index cc31c01dee..9a0035c3d8 100644 +--- a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml +@@ -44,37 +44,37 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml +index d01e029394..5665847e50 100644 +--- a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml ++++ b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml +@@ -37,39 +37,39 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml +index 6088c4b905..7a7ee2ed68 100644 +--- a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml +@@ -37,39 +37,39 @@ + + EPYC + AMD +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_9.2.0.s390x.xml b/tests/domaincapsdata/qemu_9.2.0.s390x.xml +index ef379afe69..865f718ae6 100644 +--- a/tests/domaincapsdata/qemu_9.2.0.s390x.xml ++++ b/tests/domaincapsdata/qemu_9.2.0.s390x.xml +@@ -37,61 +37,61 @@ + + + gen16a-base +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ + +- +- +- +- +- +- +- +- + +- +- ++ + + +- +- +- +- +- +- +- +- +- ++ + +- ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ + + + gen15a +diff --git a/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml +index c0485f8ffa..555a302bba 100644 +--- a/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml ++++ b/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml +@@ -43,37 +43,37 @@ + EPYC-Genoa + AMD + +- +- +- +- +- +- +- + +- + +- +- +- +- +- +- +- ++ + ++ ++ ++ ++ ++ ++ ++ + ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + 486 +diff --git a/tests/domaincapsdata/qemu_9.2.0.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0.x86_64.xml +index dcb78a93c6..0c83e12d9a 100644 +--- a/tests/domaincapsdata/qemu_9.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_9.2.0.x86_64.xml +@@ -43,37 +43,37 @@ + EPYC-Rome + AMD + +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- +- +- +- +- +- +- +- +- +- ++ ++ ++ + + + +-- +2.54.0 diff --git a/libvirt-qemu_capabilities-Cache-expanded-CPU.patch b/libvirt-qemu_capabilities-Cache-expanded-CPU.patch new file mode 100644 index 0000000..723b460 --- /dev/null +++ b/libvirt-qemu_capabilities-Cache-expanded-CPU.patch @@ -0,0 +1,158 @@ +From fba9c200834d8d31ed34e632470563a0074fe528 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Thu, 21 May 2026 17:55:28 +0200 +Subject: [PATCH] qemu_capabilities: Cache expanded CPU + +When probing host model CPU we already expand it to get a list of all +CPU features. Let's store the expanded CPU definition in virQEMUCaps and +copy it to domain capabilities when requested by the +VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES flag instead of +expanding the CPU over and over on each request. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 312000a739aebaa9de655bb1f6a539326ea8783d) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 39 ++++++++++++++++++++++++++---------- + src/qemu/qemu_capabilities.h | 3 +++ + 2 files changed, 31 insertions(+), 11 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 2e8f220abc..555723cafb 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -788,6 +788,9 @@ struct _virQEMUCapsHostCPUData { + unsigned int physAddrSize; + /* Host CPU definition reported in domain capabilities. */ + virCPUDef *reported; ++ /* Expanded host CPU definition with features that are implicitly enabled ++ * by the selected CPU model. */ ++ virCPUDef *expanded; + /* Migratable host CPU definition used for updating guest CPU. */ + virCPUDef *migratable; + /* CPU definition with features detected by libvirt using virCPUGetHost +@@ -1962,6 +1965,9 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUData *dst, + if (src->reported) + dst->reported = virCPUDefCopy(src->reported); + ++ if (src->expanded) ++ dst->expanded = virCPUDefCopy(src->expanded); ++ + if (src->migratable) + dst->migratable = virCPUDefCopy(src->migratable); + +@@ -1975,6 +1981,7 @@ virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUData *cpuData) + { + qemuMonitorCPUModelInfoFree(cpuData->info); + virCPUDefFree(cpuData->reported); ++ virCPUDefFree(cpuData->expanded); + virCPUDefFree(cpuData->migratable); + virCPUDefFree(cpuData->full); + +@@ -2301,6 +2308,9 @@ virQEMUCapsGetHostModel(virQEMUCaps *qemuCaps, + /* 'full' is non-NULL only if we have data from both QEMU and + * virCPUGetHost */ + return cpuData->full ? cpuData->full : cpuData->reported; ++ ++ case VIR_QEMU_CAPS_HOST_CPU_EXPANDED: ++ return cpuData->expanded; + } + + return NULL; +@@ -2312,6 +2322,7 @@ virQEMUCapsSetHostModel(virQEMUCaps *qemuCaps, + virDomainVirtType type, + unsigned int physAddrSize, + virCPUDef *reported, ++ virCPUDef *expanded, + virCPUDef *migratable, + virCPUDef *full) + { +@@ -2320,6 +2331,7 @@ virQEMUCapsSetHostModel(virQEMUCaps *qemuCaps, + cpuData = &virQEMUCapsGetAccel(qemuCaps, type)->hostCPU; + cpuData->physAddrSize = physAddrSize; + cpuData->reported = reported; ++ cpuData->expanded = expanded; + cpuData->migratable = migratable; + cpuData->full = full; + } +@@ -4123,16 +4135,18 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + + virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures, + &qemuCaps->arch); +- } else if (virQEMUCapsTypeIsAccelerated(type) && +- virCPUGetHostIsSupported(qemuCaps->arch)) { ++ } ++ ++ cpuExpanded = virCPUDefCopy(cpu); ++ if (virCPUExpandFeatures(qemuCaps->arch, cpuExpanded) < 0) ++ goto error; ++ ++ if (rc == 0 && ++ virQEMUCapsTypeIsAccelerated(type) && ++ virCPUGetHostIsSupported(qemuCaps->arch)) { + if (!(fullCPU = virQEMUCapsProbeHostCPU(qemuCaps->arch, NULL))) + goto error; + +- cpuExpanded = virCPUDefCopy(cpu); +- +- if (virCPUExpandFeatures(qemuCaps->arch, cpuExpanded) < 0) +- goto error; +- + for (i = 0; i < cpuExpanded->nfeatures; i++) { + if (cpuExpanded->features[i].policy == VIR_CPU_FEATURE_REQUIRE) + virCPUDefUpdateFeature(fullCPU, cpuExpanded->features[i].name, +@@ -4171,6 +4185,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + + virQEMUCapsSetHostModel(qemuCaps, type, physAddrSize, + g_steal_pointer(&cpu), ++ g_steal_pointer(&cpuExpanded), + g_steal_pointer(&migCPU), + g_steal_pointer(&fullCPU)); + +@@ -6587,9 +6602,14 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, + virDomainCaps *domCaps, + unsigned int flags) + { +- virQEMUCapsHostCPUType cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED; ++ virQEMUCapsHostCPUType cpuType; + virCPUDef *cpu; + ++ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) ++ cpuType = VIR_QEMU_CAPS_HOST_CPU_EXPANDED; ++ else ++ cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED; ++ + cpu = virCPUDefCopy(virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype, + cpuType)); + +@@ -6600,9 +6620,6 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, + cpu, VIR_CPU_FEATURE_DISABLE); + } + +- if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) +- virCPUExpandFeatures(domCaps->arch, cpu); +- + virCPUDefSortFeatures(cpu); + domCaps->cpu.hostModel = cpu; + } +diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h +index bc3ecbb89f..8822bf120b 100644 +--- a/src/qemu/qemu_capabilities.h ++++ b/src/qemu/qemu_capabilities.h +@@ -788,6 +788,9 @@ typedef enum { + * combined with features reported by QEMU. This is used for backward + * compatible comparison between a guest CPU and a host CPU. */ + VIR_QEMU_CAPS_HOST_CPU_FULL, ++ /* Expanded host CPU definition with features that are implicitly enabled ++ * by the selected CPU model. */ ++ VIR_QEMU_CAPS_HOST_CPU_EXPANDED, + } virQEMUCapsHostCPUType; + + virCPUDef *virQEMUCapsGetHostModel(virQEMUCaps *qemuCaps, +-- +2.54.0 diff --git a/libvirt-qemu_capabilities-Fix-domain-capabilities-on-AMD-CPUs.patch b/libvirt-qemu_capabilities-Fix-domain-capabilities-on-AMD-CPUs.patch new file mode 100644 index 0000000..8e3bd6a --- /dev/null +++ b/libvirt-qemu_capabilities-Fix-domain-capabilities-on-AMD-CPUs.patch @@ -0,0 +1,156 @@ +From ce373eb396f931d5ebdd03105a3f1950eb842cfd Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Mon, 25 May 2026 14:31:07 +0200 +Subject: [PATCH] qemu_capabilities: Fix domain capabilities on AMD CPUs + +The arch-capabilities MSR is not defined on AMD CPUs, but KVM has always +been emulating them. Unfortunately, this may cause Windows to crash so +QEMU (since 10.1, commit d3a24134e37d57abd3e7445842cda2717f49e96d) +decided to mask the MSR by default with some additional compatibility +code for older machine types. + +This is all mostly transparent except for probing when we run QEMU +without a machine type and expand the "host" CPU model. With QEMU 10.1 +and newer none of the arch-capabilities features will be shown as +enabled, which may cause unexpected issues for users (such as KubeVirt) +that get the list of all supported features from the host-model CPU +definition in domain capabilities to select possible target nodes for +migration. As a result of the change, no AMD host with new QEMU will be +shown as available for incoming migration from older hosts. + +Since the features are supported on the host (it's possible to +explicitly enable them), but they should not be enabled by default in +host-model CPU, we only add the to domain capabilities when +VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES flag is set. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 54ff2058d6f7bb2547afebbd9c65c7b4b501e372) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Conflicts: + tests/domaincapsdata/qemu_11.0.0-q35.x86_64+sgx-supported.xml + tests/domaincapsdata/qemu_11.0.0-q35.x86_64-supported.xml + - QEMU 11.0 data do not exist downstream + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 24 +++++++++++++++++++ + src/qemu/qemu_driver.c | 3 ++- + .../qemu_10.1.0-q35.x86_64-supported.xml | 7 ++++++ + .../qemu_10.2.0-q35.x86_64-supported.xml | 7 ++++++ + 4 files changed, 40 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 555723cafb..f06f376dd7 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -6604,6 +6604,7 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, + { + virQEMUCapsHostCPUType cpuType; + virCPUDef *cpu; ++ virArch arch = domCaps->arch; + + if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) + cpuType = VIR_QEMU_CAPS_HOST_CPU_EXPANDED; +@@ -6620,6 +6621,29 @@ virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, + cpu, VIR_CPU_FEATURE_DISABLE); + } + ++ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES) { ++ uint32_t index = 0x10a; /* arch-capabilities MSR */ ++ uint64_t msr = 0; ++ ++ /* While the arch-capabilities MSR is not defined on AMD CPUs, KVM has ++ * always been emulating them. Unfortunately, this may cause some ++ * Windows version to crash so QEMU decided to mask the MSR by default. ++ * When asked for all CPU features supported on a host we need to add ++ * the affected features to the host-model. ++ */ ++ if (ARCH_IS_X86(arch) && ++ STREQ_NULLABLE(cpu->vendor, "AMD") && ++ virCPUCheckFeature(arch, cpu, "arch-capabilities") == 0 && ++ virHostCPUGetMSRFromKVM(index, &msr) == 0) { ++ g_autoptr(virCPUData) data = virCPUDataNew(arch); ++ virCPUFeaturePolicy policy = VIR_CPU_FEATURE_REQUIRE; ++ ++ virCPUx86DataAddMSR(data, index, msr); ++ virCPUUpdateFeatures(arch, cpu, data, policy); ++ virCPUDefUpdateFeature(cpu, "arch-capabilities", policy); ++ } ++ } ++ + virCPUDefSortFeatures(cpu); + domCaps->cpu.hostModel = cpu; + } +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 0a61f97666..dcb49a9d42 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -16721,7 +16721,8 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, + g_autoptr(virDomainCaps) domCaps = NULL; + + virCheckFlags(VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES | +- VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES, ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES | ++ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES, + NULL); + + if (virConnectGetDomainCapabilitiesEnsureACL(conn) < 0) +diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml +index 244fce575b..4ea61a6cbe 100644 +--- a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml ++++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64-supported.xml +@@ -45,17 +45,24 @@ + AMD + + ++ + + ++ + + + + + ++ + + + + ++ ++ ++ ++ + + + +diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml +index 9389141012..d9c0ea6f1d 100644 +--- a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml ++++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64-supported.xml +@@ -44,12 +44,19 @@ + EPYC-Turin + AMD + ++ + + ++ + + + ++ + ++ ++ ++ ++ + + + +-- +2.54.0 diff --git a/libvirt-qemu_capabilities-Split-conditions-in-virQEMUCapsInitHostCPUModel.patch b/libvirt-qemu_capabilities-Split-conditions-in-virQEMUCapsInitHostCPUModel.patch new file mode 100644 index 0000000..e18a134 --- /dev/null +++ b/libvirt-qemu_capabilities-Split-conditions-in-virQEMUCapsInitHostCPUModel.patch @@ -0,0 +1,71 @@ +From 1b72f3955f62a442b8482eed46e6456ba2e1c14b Mon Sep 17 00:00:00 2001 +Message-ID: <1b72f3955f62a442b8482eed46e6456ba2e1c14b.1780571167.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Thu, 21 May 2026 17:30:21 +0200 +Subject: [PATCH] qemu_capabilities: Split conditions in + virQEMUCapsInitHostCPUModel + +Having 'else' after goto is useless. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 8b4f56447f32171671e18b82fbdfd478f2ec4293) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 2265dae7ba..2e8f220abc 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -4102,9 +4102,17 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + if (!(cpu = virQEMUCapsNewHostCPUModel())) + goto error; + +- if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) { ++ if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) + goto error; +- } else if (rc == 1) { ++ ++ if (rc == 2) { ++ VIR_DEBUG("QEMU does not provide CPU model for arch=%s virttype=%s", ++ virArchToString(qemuCaps->arch), ++ virDomainVirtTypeToString(type)); ++ goto error; ++ } ++ ++ if (rc == 1) { + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; + + VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); +@@ -4115,11 +4123,6 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + + virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures, + &qemuCaps->arch); +- } else if (rc == 2) { +- VIR_DEBUG("QEMU does not provide CPU model for arch=%s virttype=%s", +- virArchToString(qemuCaps->arch), +- virDomainVirtTypeToString(type)); +- goto error; + } else if (virQEMUCapsTypeIsAccelerated(type) && + virCPUGetHostIsSupported(qemuCaps->arch)) { + if (!(fullCPU = virQEMUCapsProbeHostCPU(qemuCaps->arch, NULL))) +@@ -4140,9 +4143,10 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + if (!(migCPU = virQEMUCapsNewHostCPUModel())) + goto error; + +- if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, migCPU, true)) < 0) { ++ if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, migCPU, true)) < 0) + goto error; +- } else if (rc == 1) { ++ ++ if (rc == 1) { + VIR_DEBUG("CPU migratability not provided by QEMU"); + + virCPUDefFree(migCPU); +-- +2.54.0 diff --git a/libvirt-qemu_capabilities-Split-virQEMUCapsFillDomainCPUCaps.patch b/libvirt-qemu_capabilities-Split-virQEMUCapsFillDomainCPUCaps.patch new file mode 100644 index 0000000..7c72db1 --- /dev/null +++ b/libvirt-qemu_capabilities-Split-virQEMUCapsFillDomainCPUCaps.patch @@ -0,0 +1,150 @@ +From b41da9180160e455bf36d9db7870b64457a6ca8c Mon Sep 17 00:00:00 2001 +Message-ID: +From: Jiri Denemark +Date: Thu, 21 May 2026 12:24:25 +0200 +Subject: [PATCH] qemu_capabilities: Split virQEMUCapsFillDomainCPUCaps + +Each CPU mode is filled in its own dedicated function. + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit 354ac21caba1da52d3d48e57c7395f899efc9ca4) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 96 ++++++++++++++++++++++++------------ + 1 file changed, 64 insertions(+), 32 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index ed6aa86da2..0b32296cc8 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -6553,6 +6553,66 @@ virQEMUCapsFillDomainOSCaps(virDomainCapsOS *os, + } + + ++static void ++virQEMUCapsFillDomainCPUHostPassthrough(virQEMUCaps *qemuCaps, ++ virDomainCaps *domCaps) ++{ ++ domCaps->cpu.hostPassthrough = true; ++ ++ domCaps->cpu.hostPassthroughMigratable.report = true; ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_MIGRATABLE)) { ++ VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.hostPassthroughMigratable, ++ VIR_TRISTATE_SWITCH_ON); ++ } ++ VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.hostPassthroughMigratable, ++ VIR_TRISTATE_SWITCH_OFF); ++} ++ ++ ++static void ++virQEMUCapsFillDomainCPUMaximum(virDomainCaps *domCaps) ++{ ++ domCaps->cpu.maximum = true; ++ ++ domCaps->cpu.maximumMigratable.report = true; ++ VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.maximumMigratable, ++ VIR_TRISTATE_SWITCH_ON); ++ VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.maximumMigratable, ++ VIR_TRISTATE_SWITCH_OFF); ++} ++ ++ ++static void ++virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps, ++ virDomainCaps *domCaps) ++{ ++ virCPUDef *cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype, ++ VIR_QEMU_CAPS_HOST_CPU_REPORTED); ++ ++ domCaps->cpu.hostModel = virCPUDefCopy(cpu); ++ domCaps->cpu.hostModel->addr = virQEMUCapsGetHostPhysAddr(qemuCaps, ++ domCaps->virttype); ++} ++ ++ ++static void ++virQEMUCapsFillDomainCPUCustom(virQEMUCaps *qemuCaps, ++ virDomainCaps *domCaps) ++{ ++ const char *forbidden[] = { "host", NULL }; ++ g_auto(GStrv) models = NULL; ++ ++ if (virCPUGetModels(domCaps->arch, &models) >= 0) { ++ domCaps->cpu.custom = virQEMUCapsGetCPUModels(qemuCaps, ++ domCaps->virttype, ++ (const char **)models, ++ forbidden); ++ } else { ++ domCaps->cpu.custom = NULL; ++ } ++} ++ ++ + static void + virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps, + virArch hostarch, +@@ -6561,53 +6621,25 @@ virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps, + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, + VIR_CPU_MODE_HOST_PASSTHROUGH, + domCaps->machine)) { +- domCaps->cpu.hostPassthrough = true; +- +- domCaps->cpu.hostPassthroughMigratable.report = true; +- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_MIGRATABLE)) { +- VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.hostPassthroughMigratable, +- VIR_TRISTATE_SWITCH_ON); +- } +- VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.hostPassthroughMigratable, +- VIR_TRISTATE_SWITCH_OFF); ++ virQEMUCapsFillDomainCPUHostPassthrough(qemuCaps, domCaps); + } + + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, + VIR_CPU_MODE_MAXIMUM, + domCaps->machine)) { +- domCaps->cpu.maximum = true; +- +- domCaps->cpu.maximumMigratable.report = true; +- VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.maximumMigratable, +- VIR_TRISTATE_SWITCH_ON); +- VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.maximumMigratable, +- VIR_TRISTATE_SWITCH_OFF); ++ virQEMUCapsFillDomainCPUMaximum(domCaps); + } + + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, + VIR_CPU_MODE_HOST_MODEL, + domCaps->machine)) { +- virCPUDef *cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype, +- VIR_QEMU_CAPS_HOST_CPU_REPORTED); +- domCaps->cpu.hostModel = virCPUDefCopy(cpu); +- domCaps->cpu.hostModel->addr = virQEMUCapsGetHostPhysAddr(qemuCaps, +- domCaps->virttype); ++ virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps); + } + + if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype, + VIR_CPU_MODE_CUSTOM, + domCaps->machine)) { +- const char *forbidden[] = { "host", NULL }; +- g_auto(GStrv) models = NULL; +- +- if (virCPUGetModels(domCaps->arch, &models) >= 0) { +- domCaps->cpu.custom = virQEMUCapsGetCPUModels(qemuCaps, +- domCaps->virttype, +- (const char **)models, +- forbidden); +- } else { +- domCaps->cpu.custom = NULL; +- } ++ virQEMUCapsFillDomainCPUCustom(qemuCaps, domCaps); + } + } + +-- +2.54.0 diff --git a/libvirt-qemu_capabilities-Use-g_autoptr-in-virQEMUCapsInitHostCPUModel.patch b/libvirt-qemu_capabilities-Use-g_autoptr-in-virQEMUCapsInitHostCPUModel.patch new file mode 100644 index 0000000..16b4819 --- /dev/null +++ b/libvirt-qemu_capabilities-Use-g_autoptr-in-virQEMUCapsInitHostCPUModel.patch @@ -0,0 +1,65 @@ +From 2141acf3d9891c1451d741abc1d043e35b1ed074 Mon Sep 17 00:00:00 2001 +Message-ID: <2141acf3d9891c1451d741abc1d043e35b1ed074.1780571167.git.jdenemar@redhat.com> +From: Jiri Denemark +Date: Thu, 21 May 2026 14:15:01 +0200 +Subject: [PATCH] qemu_capabilities: Use g_autoptr in + virQEMUCapsInitHostCPUModel + +Signed-off-by: Jiri Denemark +Reviewed-by: Peter Krempa +(cherry picked from commit eca4c6672d3f373bb9cff271adfc2cd8b13cb4bc) + +https://redhat.atlassian.net/browse/RHEL-177364 + +Signed-off-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 6951e50c03..2265dae7ba 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -4087,11 +4087,11 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + virArch hostArch, + virDomainVirtType type) + { +- virCPUDef *cpu = NULL; +- virCPUDef *cpuExpanded = NULL; +- virCPUDef *migCPU = NULL; +- virCPUDef *hostCPU = NULL; +- virCPUDef *fullCPU = NULL; ++ g_autoptr(virCPUDef) cpu = NULL; ++ g_autoptr(virCPUDef) cpuExpanded = NULL; ++ g_autoptr(virCPUDef) migCPU = NULL; ++ g_autoptr(virCPUDef) hostCPU = NULL; ++ g_autoptr(virCPUDef) fullCPU = NULL; + unsigned int physAddrSize = 0; + size_t i; + int rc; +@@ -4165,19 +4165,15 @@ virQEMUCapsInitHostCPUModel(virQEMUCaps *qemuCaps, + if (virQEMUCapsTypeIsAccelerated(type)) + virHostCPUGetPhysAddrSize(hostArch, &physAddrSize); + +- virQEMUCapsSetHostModel(qemuCaps, type, physAddrSize, cpu, migCPU, fullCPU); ++ virQEMUCapsSetHostModel(qemuCaps, type, physAddrSize, ++ g_steal_pointer(&cpu), ++ g_steal_pointer(&migCPU), ++ g_steal_pointer(&fullCPU)); + +- cleanup: +- virCPUDefFree(cpuExpanded); +- virCPUDefFree(hostCPU); + return; + + error: +- virCPUDefFree(cpu); +- virCPUDefFree(migCPU); +- virCPUDefFree(fullCPU); + virResetLastError(); +- goto cleanup; + } + + +-- +2.54.0 diff --git a/libvirt-security-Cleanup-hostdev-label-error-logic.patch b/libvirt-security-Cleanup-hostdev-label-error-logic.patch new file mode 100644 index 0000000..09fcf00 --- /dev/null +++ b/libvirt-security-Cleanup-hostdev-label-error-logic.patch @@ -0,0 +1,611 @@ +From ab58ab56b88b4a5fc4a2d5dc85b249220951ce36 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Mon, 2 Mar 2026 12:46:00 +0100 +Subject: [PATCH] security: Cleanup hostdev label error logic +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Current code used mix of return, goto, break and setting ret variable. +Simplify the logic to just return -1 on error. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Ján Tomko +(cherry picked from commit b7483e6558acbb0d80e2ff2c3648ca63cb7f41f9) + +Resolves: https://redhat.atlassian.net/browse/RHEL-159902 +Signed-off-by: Pavel Hrdina +--- + src/security/security_apparmor.c | 56 +++++++++-------- + src/security/security_dac.c | 103 ++++++++++++++++++------------- + src/security/security_selinux.c | 87 ++++++++++++++------------ + 3 files changed, 139 insertions(+), 107 deletions(-) + +diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c +index 74c5b10063..1c3496893c 100644 +--- a/src/security/security_apparmor.c ++++ b/src/security/security_apparmor.c +@@ -800,7 +800,6 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + const char *vroot) + { + g_autofree struct SDPDOP *ptr = NULL; +- int ret = -1; + virSecurityLabelDef *secdef = + virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); + virDomainHostdevSubsysUSB *usbsrc = &dev->source.subsys.u.usb; +@@ -834,9 +833,10 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + g_autoptr(virUSBDevice) usb = + virUSBDeviceNew(usbsrc->bus, usbsrc->device, vroot); + if (!usb) +- goto done; ++ return -1; + +- ret = virUSBDeviceFileIterate(usb, AppArmorSetSecurityUSBLabel, ptr); ++ if (virUSBDeviceFileIterate(usb, AppArmorSetSecurityUSBLabel, ptr) < 0) ++ return -1; + break; + } + +@@ -845,30 +845,32 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + virPCIDeviceNew(&pcisrc->addr); + + if (!pci) +- goto done; ++ return -1; + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { + if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { + g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + +- if (!vfioGroupDev) { +- goto done; +- } +- ret = AppArmorSetSecurityPCILabel(pci, vfioGroupDev, ptr); ++ if (!vfioGroupDev) ++ return -1; ++ ++ if (AppArmorSetSecurityPCILabel(pci, vfioGroupDev, ptr) < 0) ++ return -1; + } else { + g_autofree char *vfiofdDev = NULL; + + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) +- goto done; ++ return -1; + +- ret = AppArmorSetSecurityPCILabel(pci, vfiofdDev, ptr); +- if (ret < 0) +- goto done; ++ if (AppArmorSetSecurityPCILabel(pci, vfiofdDev, ptr) < 0) ++ return -1; + +- ret = AppArmorSetSecurityPCILabel(pci, VIR_IOMMU_DEV_PATH, ptr); ++ if (AppArmorSetSecurityPCILabel(pci, VIR_IOMMU_DEV_PATH, ptr) < 0) ++ return -1; + } + } else { +- ret = virPCIDeviceFileIterate(pci, AppArmorSetSecurityPCILabel, ptr); ++ if (virPCIDeviceFileIterate(pci, AppArmorSetSecurityPCILabel, ptr) < 0) ++ return -1; + } + break; + } +@@ -881,10 +883,11 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + scsihostsrc->target, scsihostsrc->unit, + dev->readonly, dev->shareable); + +- if (!scsi) +- goto done; ++ if (!scsi) ++ return -1; + +- ret = virSCSIDeviceFileIterate(scsi, AppArmorSetSecuritySCSILabel, ptr); ++ if (virSCSIDeviceFileIterate(scsi, AppArmorSetSecuritySCSILabel, ptr) < 0) ++ return -1; + break; + } + +@@ -892,11 +895,13 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + g_autoptr(virSCSIVHostDevice) host = virSCSIVHostDeviceNew(hostsrc->wwpn); + + if (!host) +- goto done; ++ return -1; + +- ret = virSCSIVHostDeviceFileIterate(host, +- AppArmorSetSecurityHostLabel, +- ptr); ++ if (virSCSIVHostDeviceFileIterate(host, ++ AppArmorSetSecurityHostLabel, ++ ptr) < 0) { ++ return -1; ++ } + break; + } + +@@ -904,19 +909,18 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + g_autofree char *vfiodev = NULL; + + if (!(vfiodev = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) +- goto done; ++ return -1; + +- ret = AppArmorSetSecurityHostdevLabelHelper(vfiodev, ptr); ++ if (AppArmorSetSecurityHostdevLabelHelper(vfiodev, ptr) < 0) ++ return -1; + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: +- ret = 0; + break; + } + +- done: +- return ret; ++ return 0; + } + + +diff --git a/src/security/security_dac.c b/src/security/security_dac.c +index 704c8dbfec..2a4c7f6a3c 100644 +--- a/src/security/security_dac.c ++++ b/src/security/security_dac.c +@@ -1234,7 +1234,6 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + virDomainHostdevSubsysSCSI *scsisrc = &dev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSIVHost *hostsrc = &dev->source.subsys.u.scsi_host; + virDomainHostdevSubsysMediatedDev *mdevsrc = &dev->source.subsys.u.mdev; +- int ret = -1; + + if (!priv->dynamicOwnership) + return 0; +@@ -1265,9 +1264,11 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + if (!(usb = virUSBDeviceNew(usbsrc->bus, usbsrc->device, vroot))) + return -1; + +- ret = virUSBDeviceFileIterate(usb, +- virSecurityDACSetUSBLabel, +- &cbdata); ++ if (virUSBDeviceFileIterate(usb, ++ virSecurityDACSetUSBLabel, ++ &cbdata) < 0) { ++ return -1; ++ } + break; + } + +@@ -1275,7 +1276,7 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + g_autoptr(virPCIDevice) pci = NULL; + + if (!virPCIDeviceExists(&pcisrc->addr)) +- break; ++ return -1; + + pci = virPCIDeviceNew(&pcisrc->addr); + +@@ -1289,25 +1290,29 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + if (!vfioGroupDev) + return -1; + +- ret = virSecurityDACSetHostdevLabelHelper(vfioGroupDev, +- false, +- &cbdata); ++ if (virSecurityDACSetHostdevLabelHelper(vfioGroupDev, ++ false, ++ &cbdata) < 0) { ++ return -1; ++ } + } else { + g_autofree char *vfiofdDev = NULL; + + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) + return -1; + +- ret = virSecurityDACSetHostdevLabelHelper(vfiofdDev, false, &cbdata); +- if (ret < 0) +- break; ++ if (virSecurityDACSetHostdevLabelHelper(vfiofdDev, false, &cbdata) < 0) ++ return -1; + +- ret = virSecurityDACSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &cbdata); ++ if (virSecurityDACSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &cbdata) < 0) ++ return -1; + } + } else { +- ret = virPCIDeviceFileIterate(pci, +- virSecurityDACSetPCILabel, +- &cbdata); ++ if (virPCIDeviceFileIterate(pci, ++ virSecurityDACSetPCILabel, ++ &cbdata) < 0) { ++ return -1; ++ } + } + break; + } +@@ -1323,9 +1328,11 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + if (!scsi) + return -1; + +- ret = virSCSIDeviceFileIterate(scsi, +- virSecurityDACSetSCSILabel, +- &cbdata); ++ if (virSCSIDeviceFileIterate(scsi, ++ virSecurityDACSetSCSILabel, ++ &cbdata) < 0) { ++ return -1; ++ } + break; + } + +@@ -1335,9 +1342,11 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + if (!host) + return -1; + +- ret = virSCSIVHostDeviceFileIterate(host, +- virSecurityDACSetHostLabel, +- &cbdata); ++ if (virSCSIVHostDeviceFileIterate(host, ++ virSecurityDACSetHostLabel, ++ &cbdata) < 0) { ++ return -1; ++ } + break; + } + +@@ -1347,16 +1356,16 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + if (!(vfiodev = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) + return -1; + +- ret = virSecurityDACSetHostdevLabelHelper(vfiodev, false, &cbdata); ++ if (virSecurityDACSetHostdevLabelHelper(vfiodev, false, &cbdata) < 0) ++ return -1; + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: +- ret = 0; + break; + } + +- return ret; ++ return 0; + } + + +@@ -1414,7 +1423,6 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + virDomainHostdevSubsysSCSI *scsisrc = &dev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSIVHost *hostsrc = &dev->source.subsys.u.scsi_host; + virDomainHostdevSubsysMediatedDev *mdevsrc = &dev->source.subsys.u.mdev; +- int ret = -1; + + secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_DAC_NAME); + +@@ -1441,7 +1449,8 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + if (!(usb = virUSBDeviceNew(usbsrc->bus, usbsrc->device, vroot))) + return -1; + +- ret = virUSBDeviceFileIterate(usb, virSecurityDACRestoreUSBLabel, mgr); ++ if (virUSBDeviceFileIterate(usb, virSecurityDACRestoreUSBLabel, mgr) < 0) ++ return -1; + break; + } + +@@ -1449,7 +1458,7 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + g_autoptr(virPCIDevice) pci = NULL; + + if (!virPCIDeviceExists(&pcisrc->addr)) +- break; ++ return -1; + + pci = virPCIDeviceNew(&pcisrc->addr); + +@@ -1463,24 +1472,29 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + if (!vfioGroupDev) + return -1; + +- ret = virSecurityDACRestoreFileLabelInternal(mgr, NULL, +- vfioGroupDev, false); ++ if (virSecurityDACRestoreFileLabelInternal(mgr, NULL, ++ vfioGroupDev, false) < 0) { ++ return -1; ++ } + } else { + g_autofree char *vfiofdDev = NULL; + + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) + return -1; + +- ret = virSecurityDACRestoreFileLabelInternal(mgr, NULL, +- vfiofdDev, false); +- if (ret < 0) +- break; ++ if (virSecurityDACRestoreFileLabelInternal(mgr, NULL, ++ vfiofdDev, false) < 0) { ++ return -1; ++ } + +- ret = virSecurityDACRestoreFileLabelInternal(mgr, NULL, +- VIR_IOMMU_DEV_PATH, false); ++ if (virSecurityDACRestoreFileLabelInternal(mgr, NULL, ++ VIR_IOMMU_DEV_PATH, false) < 0) { ++ return -1; ++ } + } + } else { +- ret = virPCIDeviceFileIterate(pci, virSecurityDACRestorePCILabel, mgr); ++ if (virPCIDeviceFileIterate(pci, virSecurityDACRestorePCILabel, mgr) < 0) ++ return -1; + } + break; + } +@@ -1496,7 +1510,8 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + if (!scsi) + return -1; + +- ret = virSCSIDeviceFileIterate(scsi, virSecurityDACRestoreSCSILabel, mgr); ++ if (virSCSIDeviceFileIterate(scsi, virSecurityDACRestoreSCSILabel, mgr) < 0) ++ return -1; + break; + } + +@@ -1506,9 +1521,11 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + if (!host) + return -1; + +- ret = virSCSIVHostDeviceFileIterate(host, +- virSecurityDACRestoreHostLabel, +- mgr); ++ if (virSCSIVHostDeviceFileIterate(host, ++ virSecurityDACRestoreHostLabel, ++ mgr) < 0) { ++ return -1; ++ } + break; + } + +@@ -1518,16 +1535,16 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + if (!(vfiodev = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) + return -1; + +- ret = virSecurityDACRestoreFileLabelInternal(mgr, NULL, vfiodev, false); ++ if (virSecurityDACRestoreFileLabelInternal(mgr, NULL, vfiodev, false) < 0) ++ return -1; + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: +- ret = 0; + break; + } + +- return ret; ++ return 0; + } + + +diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c +index 4a5f61d16b..96ca59a7a4 100644 +--- a/src/security/security_selinux.c ++++ b/src/security/security_selinux.c +@@ -2219,8 +2219,6 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + virDomainHostdevSubsysMediatedDev *mdevsrc = &dev->source.subsys.u.mdev; + virSecuritySELinuxCallbackData data = {.mgr = mgr, .def = def}; + +- int ret = -1; +- + /* Like virSecuritySELinuxSetImageLabelInternal() for a networked + * disk, do nothing for an iSCSI hostdev + */ +@@ -2241,7 +2239,8 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + if (!usb) + return -1; + +- ret = virUSBDeviceFileIterate(usb, virSecuritySELinuxSetUSBLabel, &data); ++ if (virUSBDeviceFileIterate(usb, virSecuritySELinuxSetUSBLabel, &data) < 0) ++ return -1; + break; + } + +@@ -2249,7 +2248,7 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + g_autoptr(virPCIDevice) pci = NULL; + + if (!virPCIDeviceExists(&pcisrc->addr)) +- break; ++ return -1; + + pci = virPCIDeviceNew(&pcisrc->addr); + +@@ -2263,23 +2262,26 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + if (!vfioGroupDev) + return -1; + +- ret = virSecuritySELinuxSetHostdevLabelHelper(vfioGroupDev, +- false, +- &data); ++ if (virSecuritySELinuxSetHostdevLabelHelper(vfioGroupDev, ++ false, ++ &data) < 0) { ++ return -1; ++ } + } else { + g_autofree char *vfiofdDev = NULL; + + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) + return -1; + +- ret = virSecuritySELinuxSetHostdevLabelHelper(vfiofdDev, false, &data); +- if (ret) +- break; ++ if (virSecuritySELinuxSetHostdevLabelHelper(vfiofdDev, false, &data) < 0) ++ return -1; + +- ret = virSecuritySELinuxSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &data); ++ if (virSecuritySELinuxSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &data) < 0) ++ return -1; + } + } else { +- ret = virPCIDeviceFileIterate(pci, virSecuritySELinuxSetPCILabel, &data); ++ if (virPCIDeviceFileIterate(pci, virSecuritySELinuxSetPCILabel, &data) < 0) ++ return -1; + } + break; + } +@@ -2296,9 +2298,11 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + if (!scsi) + return -1; + +- ret = virSCSIDeviceFileIterate(scsi, +- virSecuritySELinuxSetSCSILabel, +- &data); ++ if (virSCSIDeviceFileIterate(scsi, ++ virSecuritySELinuxSetSCSILabel, ++ &data) < 0) { ++ return -1; ++ } + break; + } + +@@ -2308,9 +2312,11 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + if (!host) + return -1; + +- ret = virSCSIVHostDeviceFileIterate(host, +- virSecuritySELinuxSetHostLabel, +- &data); ++ if (virSCSIVHostDeviceFileIterate(host, ++ virSecuritySELinuxSetHostLabel, ++ &data) < 0) { ++ return -1; ++ } + break; + } + +@@ -2318,18 +2324,18 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + g_autofree char *vfiodev = NULL; + + if (!(vfiodev = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) +- return ret; ++ return -1; + +- ret = virSecuritySELinuxSetHostdevLabelHelper(vfiodev, false, &data); ++ if (virSecuritySELinuxSetHostdevLabelHelper(vfiodev, false, &data) < 0) ++ return -1; + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: +- ret = 0; + break; + } + +- return ret; ++ return 0; + } + + +@@ -2467,7 +2473,6 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + virDomainHostdevSubsysSCSI *scsisrc = &dev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSIVHost *hostsrc = &dev->source.subsys.u.scsi_host; + virDomainHostdevSubsysMediatedDev *mdevsrc = &dev->source.subsys.u.mdev; +- int ret = -1; + + /* Like virSecuritySELinuxRestoreImageLabelInt() for a networked + * disk, do nothing for an iSCSI hostdev +@@ -2489,7 +2494,8 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + if (!usb) + return -1; + +- ret = virUSBDeviceFileIterate(usb, virSecuritySELinuxRestoreUSBLabel, mgr); ++ if (virUSBDeviceFileIterate(usb, virSecuritySELinuxRestoreUSBLabel, mgr) < 0) ++ return -1; + break; + } + +@@ -2497,7 +2503,7 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + g_autoptr(virPCIDevice) pci = NULL; + + if (!virPCIDeviceExists(&pcisrc->addr)) +- break; ++ return -1; + + pci = virPCIDeviceNew(&pcisrc->addr); + +@@ -2511,21 +2517,23 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + if (!vfioGroupDev) + return -1; + +- ret = virSecuritySELinuxRestoreFileLabel(mgr, vfioGroupDev, false, false); ++ if (virSecuritySELinuxRestoreFileLabel(mgr, vfioGroupDev, false, false) < 0) ++ return -1; + } else { + g_autofree char *vfiofdDev = NULL; + + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) + return -1; + +- ret = virSecuritySELinuxRestoreFileLabel(mgr, vfiofdDev, false, false); +- if (ret < 0) +- break; ++ if (virSecuritySELinuxRestoreFileLabel(mgr, vfiofdDev, false, false) < 0) ++ return -1; + +- ret = virSecuritySELinuxRestoreFileLabel(mgr, VIR_IOMMU_DEV_PATH, false, false); ++ if (virSecuritySELinuxRestoreFileLabel(mgr, VIR_IOMMU_DEV_PATH, false, false) < 0) ++ return -1; + } + } else { +- ret = virPCIDeviceFileIterate(pci, virSecuritySELinuxRestorePCILabel, mgr); ++ if (virPCIDeviceFileIterate(pci, virSecuritySELinuxRestorePCILabel, mgr) < 0) ++ return -1; + } + break; + } +@@ -2541,7 +2549,8 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + if (!scsi) + return -1; + +- ret = virSCSIDeviceFileIterate(scsi, virSecuritySELinuxRestoreSCSILabel, mgr); ++ if (virSCSIDeviceFileIterate(scsi, virSecuritySELinuxRestoreSCSILabel, mgr) < 0) ++ return -1; + break; + } + +@@ -2551,9 +2560,11 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + if (!host) + return -1; + +- ret = virSCSIVHostDeviceFileIterate(host, +- virSecuritySELinuxRestoreHostLabel, +- mgr); ++ if (virSCSIVHostDeviceFileIterate(host, ++ virSecuritySELinuxRestoreHostLabel, ++ mgr) < 0) { ++ return -1; ++ } + break; + } + +@@ -2563,16 +2574,16 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + if (!(vfiodev = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) + return -1; + +- ret = virSecuritySELinuxRestoreFileLabel(mgr, vfiodev, false, false); ++ if (virSecuritySELinuxRestoreFileLabel(mgr, vfiodev, false, false) < 0) ++ return -1; + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: +- ret = 0; + break; + } + +- return ret; ++ return 0; + } + + +-- +2.54.0 diff --git a/libvirt-security_apparmor-Use-g_auto-in-AppArmorSetSecurityHostdevLabel.patch b/libvirt-security_apparmor-Use-g_auto-in-AppArmorSetSecurityHostdevLabel.patch new file mode 100644 index 0000000..016f7b4 --- /dev/null +++ b/libvirt-security_apparmor-Use-g_auto-in-AppArmorSetSecurityHostdevLabel.patch @@ -0,0 +1,118 @@ +From b2037dd33febe910a6dad3521549b747322d37cb Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Mon, 2 Mar 2026 12:47:43 +0100 +Subject: [PATCH] security_apparmor: Use g_auto* in + AppArmorSetSecurityHostdevLabel +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Pavel Hrdina +Reviewed-by: Ján Tomko +(cherry picked from commit 75f698c77f0705ae9793331eadb08fbbf89572f6) + +Resolves: https://redhat.atlassian.net/browse/RHEL-159902 +Signed-off-by: Pavel Hrdina +--- + src/security/security_apparmor.c | 20 ++++++-------------- + 1 file changed, 6 insertions(+), 14 deletions(-) + +diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c +index 6c5da2a650..74c5b10063 100644 +--- a/src/security/security_apparmor.c ++++ b/src/security/security_apparmor.c +@@ -799,7 +799,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + virDomainHostdevDef *dev, + const char *vroot) + { +- struct SDPDOP *ptr; ++ g_autofree struct SDPDOP *ptr = NULL; + int ret = -1; + virSecurityLabelDef *secdef = + virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); +@@ -831,13 +831,12 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + + switch (dev->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { +- virUSBDevice *usb = ++ g_autoptr(virUSBDevice) usb = + virUSBDeviceNew(usbsrc->bus, usbsrc->device, vroot); + if (!usb) + goto done; + + ret = virUSBDeviceFileIterate(usb, AppArmorSetSecurityUSBLabel, ptr); +- virUSBDeviceFree(usb); + break; + } + +@@ -850,13 +849,12 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { + if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { +- char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); ++ g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + + if (!vfioGroupDev) { + goto done; + } + ret = AppArmorSetSecurityPCILabel(pci, vfioGroupDev, ptr); +- VIR_FREE(vfioGroupDev); + } else { + g_autofree char *vfiofdDev = NULL; + +@@ -877,7 +875,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: { + virDomainHostdevSubsysSCSIHost *scsihostsrc = &scsisrc->u.host; +- virSCSIDevice *scsi = ++ g_autoptr(virSCSIDevice) scsi = + virSCSIDeviceNew(NULL, + scsihostsrc->adapter, scsihostsrc->bus, + scsihostsrc->target, scsihostsrc->unit, +@@ -887,13 +885,11 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + goto done; + + ret = virSCSIDeviceFileIterate(scsi, AppArmorSetSecuritySCSILabel, ptr); +- virSCSIDeviceFree(scsi); +- + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: { +- virSCSIVHostDevice *host = virSCSIVHostDeviceNew(hostsrc->wwpn); ++ g_autoptr(virSCSIVHostDevice) host = virSCSIVHostDeviceNew(hostsrc->wwpn); + + if (!host) + goto done; +@@ -901,19 +897,16 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + ret = virSCSIVHostDeviceFileIterate(host, + AppArmorSetSecurityHostLabel, + ptr); +- virSCSIVHostDeviceFree(host); + break; + } + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: { +- char *vfiodev = NULL; ++ g_autofree char *vfiodev = NULL; + + if (!(vfiodev = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) + goto done; + + ret = AppArmorSetSecurityHostdevLabelHelper(vfiodev, ptr); +- +- VIR_FREE(vfiodev); + break; + } + +@@ -923,7 +916,6 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + } + + done: +- VIR_FREE(ptr); + return ret; + } + +-- +2.54.0 diff --git a/libvirt-src-Use-virHostdevIsPCIDeviceWith-to-check-for-IOMMUFD.patch b/libvirt-src-Use-virHostdevIsPCIDeviceWith-to-check-for-IOMMUFD.patch new file mode 100644 index 0000000..94e08d6 --- /dev/null +++ b/libvirt-src-Use-virHostdevIsPCIDeviceWith-to-check-for-IOMMUFD.patch @@ -0,0 +1,152 @@ +From 8442235a61de81d3572cc955a0b40969347fa6a1 Mon Sep 17 00:00:00 2001 +Message-ID: <8442235a61de81d3572cc955a0b40969347fa6a1.1780571166.git.jdenemar@redhat.com> +From: Pavel Hrdina +Date: Fri, 13 Mar 2026 12:25:13 +0100 +Subject: [PATCH] src: Use virHostdevIsPCIDeviceWith* to check for IOMMUFD + +Use virHostdevIsPCIDeviceWithIOMMUFD where we need to check if hostdev +is PCI device using IOMMUFD and virHostdevIsPCIDeviceWithoutIOMMUFD +where we need to check if hostdev is PCI device not using IOMMUFD. + +Fixes: 7d2f91f9cb572ab95d0916bdd1a46dd198874529 +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit c1d38e9428783730f063b59ad32f08d2e80aff9f) + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_cgroup.c | 2 +- + src/qemu/qemu_command.c | 2 +- + src/qemu/qemu_namespace.c | 2 +- + src/qemu/qemu_validate.c | 2 +- + src/security/security_apparmor.c | 2 +- + src/security/security_dac.c | 4 ++-- + src/security/security_selinux.c | 4 ++-- + src/security/virt-aa-helper.c | 2 +- + 8 files changed, 10 insertions(+), 10 deletions(-) + +diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c +index 6148990f19..0e1815f571 100644 +--- a/src/qemu/qemu_cgroup.c ++++ b/src/qemu/qemu_cgroup.c +@@ -479,7 +479,7 @@ qemuSetupHostdevCgroup(virDomainObj *vm, + g_autofree char *path = NULL; + int perms; + +- if (dev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) ++ if (virHostdevIsPCIDeviceWithIOMMUFD(dev)) + return 0; + + if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DEVICES)) +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index db512f6757..23e799de3c 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -5259,7 +5259,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd, + if (qemuCommandAddExtDevice(cmd, hostdev->info, def, qemuCaps) < 0) + return -1; + +- if (subsys->u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); + + qemuFDPassDirectTransferCommand(hostdevPriv->vfioDeviceFd, cmd); +diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c +index fb0734193d..4a063064f1 100644 +--- a/src/qemu/qemu_namespace.c ++++ b/src/qemu/qemu_namespace.c +@@ -345,7 +345,7 @@ qemuDomainSetupHostdev(virDomainObj *vm, + { + g_autofree char *path = NULL; + +- if (hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) ++ if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) + return 0; + + if (qemuDomainGetHostdevPath(hostdev, &path, NULL) < 0) +diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c +index 5c8c21335d..63c5f8e037 100644 +--- a/src/qemu/qemu_validate.c ++++ b/src/qemu/qemu_validate.c +@@ -2722,7 +2722,7 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, + return -1; + } + +- if (hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_IOMMUFD)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IOMMUFD is not supported by this version of qemu")); +diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c +index 40f13ec1a5..e53486ee0c 100644 +--- a/src/security/security_apparmor.c ++++ b/src/security/security_apparmor.c +@@ -847,7 +847,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, + return -1; + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { +- if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithoutIOMMUFD(dev)) { + g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + + if (!vfioGroupDev) +diff --git a/src/security/security_dac.c b/src/security/security_dac.c +index d8cf117fc4..b891f6f121 100644 +--- a/src/security/security_dac.c ++++ b/src/security/security_dac.c +@@ -1283,7 +1283,7 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, + return -1; + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { +- if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithoutIOMMUFD(dev)) { + g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + + if (!vfioGroupDev) +@@ -1454,7 +1454,7 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, + return -1; + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { +- if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithoutIOMMUFD(dev)) { + g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + + if (!vfioGroupDev) +diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c +index 0fa50630f7..2b801aecd5 100644 +--- a/src/security/security_selinux.c ++++ b/src/security/security_selinux.c +@@ -2255,7 +2255,7 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, + return -1; + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { +- if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithoutIOMMUFD(dev)) { + g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + + if (!vfioGroupDev) +@@ -2499,7 +2499,7 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, + return -1; + + if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO) { +- if (dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { ++ if (virHostdevIsPCIDeviceWithoutIOMMUFD(dev)) { + g_autofree char *vfioGroupDev = virPCIDeviceGetIOMMUGroupDev(pci); + + if (!vfioGroupDev) +diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c +index 29e844c7ff..af95a64c42 100644 +--- a/src/security/virt-aa-helper.c ++++ b/src/security/virt-aa-helper.c +@@ -1117,7 +1117,7 @@ get_files(vahControl * ctl) + + if ((driverName == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO || + driverName == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_DEFAULT) && +- dev->source.subsys.u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES) { ++ virHostdevIsPCIDeviceWithoutIOMMUFD(dev)) { + needsVfio = true; + } + +-- +2.54.0 diff --git a/libvirt-tests-Add-iommufd-fdgroup-test.patch b/libvirt-tests-Add-iommufd-fdgroup-test.patch new file mode 100644 index 0000000..6c04626 --- /dev/null +++ b/libvirt-tests-Add-iommufd-fdgroup-test.patch @@ -0,0 +1,266 @@ +From c0d508913546c66014f4cad54779ff4ad1549d7a Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Mon, 16 Mar 2026 15:30:18 +0100 +Subject: [PATCH] tests: Add iommufd fdgroup test + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit 406b7fb0bd82251d94ce1fcb5fd7e35d51e1a1b7) + +Conflicts: + - tests/qemuxmlconftest.c + missing upstream commit 6d6da1cbac4f0194ca257c8ff8f5038a96791a62 + +Resolves: https://redhat.atlassian.net/browse/RHEL-156803 +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_process.c | 14 +++-- + src/qemu/qemu_processpriv.h | 2 + + .../iommufd-q35-fd.x86_64-latest.args | 41 +++++++++++++ + .../iommufd-q35-fd.x86_64-latest.xml | 60 +++++++++++++++++++ + tests/qemuxmlconfdata/iommufd-q35-fd.xml | 38 ++++++++++++ + tests/qemuxmlconftest.c | 9 ++- + 6 files changed, 159 insertions(+), 5 deletions(-) + create mode 100644 tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.args + create mode 100644 tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.xml + create mode 100644 tests/qemuxmlconfdata/iommufd-q35-fd.xml + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index e4746374f6..b56e79ed1c 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7712,9 +7712,11 @@ qemuProcessOpenIommuFd(virDomainObj *vm) + * + * Find passed FD via virDomainFDAssociate() API for the VM. + * ++ * Exported only to be used in tests. ++ * + * Returns: 0 on success, -1 on failure + */ +-static int ++int + qemuProcessGetPassedIommuFd(virDomainObj *vm) + { + qemuDomainObjPrivate *priv = vm->privateData; +@@ -7734,10 +7736,14 @@ qemuProcessGetPassedIommuFd(virDomainObj *vm) + return -1; + } + +- iommufd = dup(fdt->fds[0]); ++ if (fdt->testfds) { ++ iommufd = dup2(fdt->fds[0], fdt->testfds[0]); ++ } else { ++ iommufd = dup(fdt->fds[0]); + +- if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, iommufd) < 0) +- return -1; ++ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, iommufd) < 0) ++ return -1; ++ } + + priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd); + +diff --git a/src/qemu/qemu_processpriv.h b/src/qemu/qemu_processpriv.h +index 0ba5897f40..4bef5025b9 100644 +--- a/src/qemu/qemu_processpriv.h ++++ b/src/qemu/qemu_processpriv.h +@@ -37,3 +37,5 @@ void qemuProcessHandleDeviceDeleted(qemuMonitor *mon, + const char *devAlias); + + int qemuProcessQMPInitMonitor(qemuMonitor *mon); ++ ++int qemuProcessGetPassedIommuFd(virDomainObj *vm); +diff --git a/tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.args b/tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.args +new file mode 100644 +index 0000000000..7df3d173f3 +--- /dev/null ++++ b/tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.args +@@ -0,0 +1,41 @@ ++LC_ALL=C \ ++PATH=/bin \ ++HOME=/var/lib/libvirt/qemu/domain--1-q35-test \ ++USER=test \ ++LOGNAME=test \ ++XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-q35-test/.local/share \ ++XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-q35-test/.cache \ ++XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-q35-test/.config \ ++/usr/bin/qemu-system-x86_64 \ ++-name guest=q35-test,debug-threads=on \ ++-S \ ++-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-q35-test/master-key.aes"}' \ ++-machine q35,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ ++-accel tcg \ ++-cpu qemu64 \ ++-m size=2097152k \ ++-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":2147483648}' \ ++-overcommit mem-lock=off \ ++-smp 2,sockets=2,cores=1,threads=1 \ ++-uuid 11dbdcdd-4c3b-482b-8903-9bdb8c0a2774 \ ++-display none \ ++-no-user-config \ ++-nodefaults \ ++-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ ++-mon chardev=charmonitor,id=monitor,mode=control \ ++-rtc base=utc \ ++-no-shutdown \ ++-boot strict=on \ ++-device '{"driver":"pcie-root-port","port":16,"chassis":1,"id":"pci.1","bus":"pcie.0","multifunction":true,"addr":"0x2"}' \ ++-device '{"driver":"pcie-root-port","port":17,"chassis":2,"id":"pci.2","bus":"pcie.0","addr":"0x2.0x1"}' \ ++-device '{"driver":"qemu-xhci","id":"usb","bus":"pci.1","addr":"0x0"}' \ ++-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","read-only":false}' \ ++-device '{"driver":"ide-hd","bus":"ide.0","drive":"libvirt-1-storage","id":"sata0-0-0","bootindex":1}' \ ++-audiodev '{"id":"audio1","driver":"none"}' \ ++-device '{"driver":"qxl-vga","id":"video0","max_outputs":1,"ram_size":67108864,"vram_size":33554432,"vram64_size_mb":0,"vgamem_mb":8,"bus":"pcie.0","addr":"0x1"}' \ ++-global ICH9-LPC.noreboot=off \ ++-watchdog-action reset \ ++-object '{"qom-type":"iommufd","id":"iommufd0","fd":"20"}' \ ++-device '{"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x3"}' \ ++-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ ++-msg timestamp=on +diff --git a/tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.xml b/tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.xml +new file mode 100644 +index 0000000000..a6be49cbb3 +--- /dev/null ++++ b/tests/qemuxmlconfdata/iommufd-q35-fd.x86_64-latest.xml +@@ -0,0 +1,60 @@ ++ ++ q35-test ++ 11dbdcdd-4c3b-482b-8903-9bdb8c0a2774 ++ 2097152 ++ 2097152 ++ 2 ++ ++ ++ hvm ++ ++ ++ ++ qemu64 ++ ++ ++ destroy ++ restart ++ destroy ++ ++ /usr/bin/qemu-system-x86_64 ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++
++ ++ ++
++ ++ ++ ++