Devel
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- 13 participants
- 40168 discussions
This is v3 from:
https://listman.redhat.com/archives/libvir-list/2021-May/msg00324.html
v1 here:
https://listman.redhat.com/archives/libvir-list/2021-April/msg01307.html
Diff to v2:
- Fixed formatting
- Enable xml test call
Kristina Hanicova (3):
qemu_capabilities: Add QEMU_CAPS_INPUT_LINUX
conf: Parse/format XML input type 'evdev'
qemu: Build command line for object input-linux
docs/formatdomain.rst | 37 ++++++----
docs/schemas/domaincommon.rng | 20 ++++++
src/conf/domain_audit.c | 1 +
src/conf/domain_conf.c | 69 ++++++++++++++++---
src/conf/domain_conf.h | 12 ++++
src/conf/domain_validate.c | 8 +++
src/libvirt_private.syms | 2 +
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_cgroup.c | 2 +
src/qemu/qemu_command.c | 33 ++++++++-
src/qemu/qemu_domain_address.c | 1 +
src/qemu/qemu_hotplug.c | 1 +
src/qemu/qemu_validate.c | 6 ++
src/security/security_apparmor.c | 1 +
src/security/security_dac.c | 2 +
src/security/security_selinux.c | 2 +
src/security/virt-aa-helper.c | 3 +-
.../caps_2.11.0.s390x.xml | 1 +
.../caps_2.11.0.x86_64.xml | 1 +
.../caps_2.12.0.aarch64.xml | 1 +
.../caps_2.12.0.ppc64.xml | 1 +
.../caps_2.12.0.s390x.xml | 1 +
.../caps_2.12.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 1 +
.../caps_3.0.0.riscv32.xml | 1 +
.../caps_3.0.0.riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 1 +
.../caps_3.0.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 1 +
.../caps_3.1.0.x86_64.xml | 1 +
.../caps_4.0.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 1 +
.../caps_4.0.0.riscv32.xml | 1 +
.../caps_4.0.0.riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 1 +
.../caps_4.0.0.x86_64.xml | 1 +
.../caps_4.1.0.x86_64.xml | 1 +
.../caps_4.2.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 +
.../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 +
.../caps_4.2.0.x86_64.xml | 1 +
.../caps_5.0.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 +
.../caps_5.0.0.riscv64.xml | 1 +
.../caps_5.0.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_5.1.0.sparc.xml | 1 +
.../caps_5.1.0.x86_64.xml | 1 +
.../caps_5.2.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_5.2.0.ppc64.xml | 1 +
.../caps_5.2.0.riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_5.2.0.s390x.xml | 1 +
.../caps_5.2.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_6.0.0.s390x.xml | 1 +
.../caps_6.0.0.x86_64.xml | 1 +
.../caps_6.1.0.x86_64.xml | 1 +
.../input-linux.x86_64-latest.args | 34 +++++++++
tests/qemuxml2argvdata/input-linux.xml | 31 +++++++++
tests/qemuxml2argvtest.c | 2 +
tests/qemuxml2xmloutdata/input-linux.xml | 1 +
tests/qemuxml2xmltest.c | 2 +
61 files changed, 287 insertions(+), 24 deletions(-)
create mode 100644 tests/qemuxml2argvdata/input-linux.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/input-linux.xml
create mode 120000 tests/qemuxml2xmloutdata/input-linux.xml
--
2.31.1
2
5
21 May '21
Kristina Hanicova (2):
qemu: Use qemuDomainOpenFile() in qemuPrepareNVRAM()
qemu: Return -EINVAL to keep qemuDomainOpenFile() consistent
src/qemu/qemu_domain.c | 2 +-
src/qemu/qemu_process.c | 21 +++++++++++----------
2 files changed, 12 insertions(+), 11 deletions(-)
--
2.31.1
2
3
21 May '21
When building a commandline for a DIMM memory device with
non-default access mode, the qemuBuildMemoryBackendProps() will
tell QEMU to allocate memory from per-domain memory backing dir.
But later, when preparing the host, the
qemuProcessNeedMemoryBackingPath() does not check for memory
devices at all resulting in per-domain memory backing dir not
being created which upsets QEMU.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1961114
Signed-off-by: Kristina Hanicova <khanicov(a)redhat.com>
---
src/qemu/qemu_process.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b69a9d1927..35213f81ec 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3938,6 +3938,11 @@ qemuProcessNeedMemoryBackingPath(virDomainDef *def,
return true;
}
+ for (i = 0; i < def->nmems; i++) {
+ if (def->mems[i]->access != VIR_DOMAIN_MEMORY_ACCESS_DEFAULT)
+ return true;
+ }
+
if (mem) {
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
--
2.31.1
2
1
This patch series introduces the launch security type s390-pv.
Specifying s390-pv as launch security type in an s390 domain prepares for
running the guest in protected virtualization secure mode, also known as
IBM Secure Execution.
Boris Fiuczynski (4):
conf: refactor launch security to allow more types
qemu: add s390-pv-guest capability
conf: add s390-pv as launch security type
docs: add s390-pv documentation
docs/formatdomain.rst | 7 +
docs/kbase/s390_protected_virt.rst | 55 +++++-
docs/schemas/domaincommon.rng | 13 +-
src/conf/domain_conf.c | 164 +++++++++++-------
src/conf/domain_conf.h | 14 +-
src/conf/virconftypes.h | 2 +
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_cgroup.c | 4 +-
src/qemu/qemu_command.c | 64 ++++++-
src/qemu/qemu_driver.c | 2 +-
src/qemu/qemu_firmware.c | 4 +-
src/qemu/qemu_namespace.c | 21 ++-
src/qemu/qemu_process.c | 36 +++-
src/qemu/qemu_validate.c | 30 +++-
src/security/security_dac.c | 4 +-
.../launch-security-s390-pv-ignore-policy.xml | 24 +++
.../launch-security-s390-pv.xml | 18 ++
.../launch-security-s390-pv-ignore-policy.xml | 1 +
tests/genericxml2xmltest.c | 2 +
.../qemucapabilitiesdata/caps_6.0.0.s390x.xml | 1 +
...ty-s390-pv-ignore-policy.s390x-latest.args | 35 ++++
.../launch-security-s390-pv-ignore-policy.xml | 33 ++++
.../launch-security-s390-pv.s390x-latest.args | 35 ++++
.../launch-security-s390-pv.xml | 30 ++++
...urity-sev-missing-policy.x86_64-2.12.0.err | 1 +
.../launch-security-sev-missing-policy.xml | 34 ++++
tests/qemuxml2argvtest.c | 4 +
28 files changed, 538 insertions(+), 103 deletions(-)
create mode 100644 tests/genericxml2xmlindata/launch-security-s390-pv-ignore-policy.xml
create mode 100644 tests/genericxml2xmlindata/launch-security-s390-pv.xml
create mode 120000 tests/genericxml2xmloutdata/launch-security-s390-pv-ignore-policy.xml
create mode 100644 tests/qemuxml2argvdata/launch-security-s390-pv-ignore-policy.s390x-latest.args
create mode 100644 tests/qemuxml2argvdata/launch-security-s390-pv-ignore-policy.xml
create mode 100644 tests/qemuxml2argvdata/launch-security-s390-pv.s390x-latest.args
create mode 100644 tests/qemuxml2argvdata/launch-security-s390-pv.xml
create mode 100644 tests/qemuxml2argvdata/launch-security-sev-missing-policy.x86_64-2.12.0.err
create mode 100644 tests/qemuxml2argvdata/launch-security-sev-missing-policy.xml
--
2.30.2
3
16
[PATCH v2] virNodeDevCapMdevParseXML: Use virXMLPropEnum() for ./start/@type
by Michal Privoznik 20 May '21
by Michal Privoznik 20 May '21
20 May '21
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
v2 of:
https://listman.redhat.com/archives/libvir-list/2021-May/msg00604.html
diff to v1:
- Switch from virXMLPropEnum() to virXMLPropEnumDefault() per Peter's
review
src/conf/node_device_conf.c | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 5598d420fe..af72e160a5 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -1919,7 +1919,7 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
g_autofree xmlNodePtr *attrs = NULL;
size_t i;
g_autofree char *uuidstr = NULL;
- g_autofree char *starttype = NULL;
+ xmlNodePtr startNode = NULL;
ctxt->node = node;
@@ -1941,17 +1941,15 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
virUUIDFormat(uuidbuf, mdev->uuid);
}
- if ((starttype = virXPathString("string(./start[1]/@type)", ctxt))) {
- int tmp;
- if ((tmp = virNodeDevMdevStartTypeFromString(starttype)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown mdev start type '%s' for '%s'"), starttype, def->name);
- return -1;
- }
+ mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL;
- mdev->start = tmp;
- } else {
- mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL;
+ startNode = virXPathNode("./start[1]", ctxt);
+ if (startNode &&
+ virXMLPropEnumDefault(startNode, "type",
+ virNodeDevMdevStartTypeFromString,
+ VIR_XML_PROP_NONE, &mdev->start,
+ VIR_NODE_DEV_MDEV_START_MANUAL) < 0) {
+ return -1;
}
/* 'iommuGroup' is optional, only report an error if the supplied value is
--
2.26.3
3
2
*** BLURB HERE ***
Michal PrÃvoznÃk (4):
include: Fix copy-paste error in comment to virDomainCoreDumpFormat
enum
lib: Add win-dmp crashdump format
virsh: Expose new win-dmp dump format
NEWS: Document new memory dump format
NEWS.rst | 5 +++++
docs/manpages/virsh.rst | 5 +++--
include/libvirt/libvirt-domain.h | 3 ++-
src/qemu/qemu_driver.c | 1 +
tools/virsh-domain.c | 2 ++
5 files changed, 13 insertions(+), 3 deletions(-)
--
2.26.3
2
6
Remove comments for silencing coverity and static assers which are no
longer needed.
CI pipelines:
Yesterday's all-green:
https://gitlab.com/pipo.sk/libvirt/-/pipelines/305953275
New run started when I've rebased this to current master:
https://gitlab.com/pipo.sk/libvirt/-/pipelines/306458103
Peter Krempa (2):
Drop magic comments for coverity
Remove static analysis assertions
src/conf/domain_conf.c | 13 -------------
src/conf/virdomainobjlist.c | 2 --
src/conf/virnwfilterbindingobjlist.c | 1 -
src/cpu/cpu_x86.c | 1 -
src/libxl/libxl_driver.c | 9 ---------
src/qemu/qemu_command.c | 2 --
src/qemu/qemu_driver.c | 2 --
src/qemu/qemu_monitor.c | 3 ---
src/qemu/qemu_process.c | 2 --
src/remote/remote_driver.c | 1 -
src/rpc/virnetserver.c | 4 ----
src/storage/parthelper.c | 2 --
src/util/vircommand.c | 3 ---
src/util/virconf.c | 6 ------
src/util/virhostmem.c | 2 --
src/util/virnetdev.c | 1 -
src/util/virobject.c | 1 -
src/util/virprocess.c | 1 -
src/util/virutil.c | 3 ---
tests/commandtest.c | 2 --
tests/virdrivermoduletest.c | 1 -
tools/virsh.c | 1 -
tools/virt-admin.c | 1 -
tools/vsh.c | 1 -
24 files changed, 65 deletions(-)
--
2.31.1
3
4
[PATCH] virNodeDevCapMdevParseXML: Use virXMLPropEnum() for ./start/@type
by Michal Privoznik 20 May '21
by Michal Privoznik 20 May '21
20 May '21
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
Initially, this started as a fix for broken build, but Peter beat me to
it. I figured it's worth sending anyway.
src/conf/node_device_conf.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 5598d420fe..d9b7aff7db 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -1919,7 +1919,7 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
g_autofree xmlNodePtr *attrs = NULL;
size_t i;
g_autofree char *uuidstr = NULL;
- g_autofree char *starttype = NULL;
+ xmlNodePtr startNode = NULL;
ctxt->node = node;
@@ -1941,17 +1941,14 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
virUUIDFormat(uuidbuf, mdev->uuid);
}
- if ((starttype = virXPathString("string(./start[1]/@type)", ctxt))) {
- int tmp;
- if ((tmp = virNodeDevMdevStartTypeFromString(starttype)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown mdev start type '%s' for '%s'"), starttype, def->name);
- return -1;
- }
+ mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL;
- mdev->start = tmp;
- } else {
- mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL;
+ startNode = virXPathNode("./start[1]", ctxt);
+ if (startNode &&
+ virXMLPropEnum(startNode, "type",
+ virNodeDevMdevStartTypeFromString,
+ VIR_XML_PROP_NONE, &mdev->start) < 0) {
+ return -1;
}
/* 'iommuGroup' is optional, only report an error if the supplied value is
--
2.26.3
2
1
20 May '21
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1942367
Signed-off-by: Kristina Hanicova <khanicov(a)redhat.com>
---
src/conf/domain_conf.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7044701fac..e21b9fb946 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15781,38 +15781,45 @@ virDomainNetFindIdx(virDomainDef *def, virDomainNetDef *net)
if (matchidx < 0) {
if (MACAddrSpecified && PCIAddrSpecified) {
virReportError(VIR_ERR_DEVICE_MISSING,
- _("no device matching MAC address %s found on "
+ _("no device matching MAC address %s and alias %s found on "
VIR_PCI_DEVICE_ADDRESS_FMT),
virMacAddrFormat(&net->mac, mac),
+ NULLSTR(net->info.alias),
net->info.addr.pci.domain,
net->info.addr.pci.bus,
net->info.addr.pci.slot,
net->info.addr.pci.function);
} else if (MACAddrSpecified && CCWAddrSpecified) {
virReportError(VIR_ERR_DEVICE_MISSING,
- _("no device matching MAC address %s found on "
+ _("no device matching MAC address %s and alias %s found on "
VIR_CCW_DEVICE_ADDRESS_FMT),
virMacAddrFormat(&net->mac, mac),
+ NULLSTR(net->info.alias),
net->info.addr.ccw.cssid,
net->info.addr.ccw.ssid,
net->info.addr.ccw.devno);
} else if (PCIAddrSpecified) {
virReportError(VIR_ERR_DEVICE_MISSING,
- _("no device found on " VIR_PCI_DEVICE_ADDRESS_FMT),
+ _("no device matching alias %s found on "
+ VIR_PCI_DEVICE_ADDRESS_FMT),
+ NULLSTR(net->info.alias),
net->info.addr.pci.domain,
net->info.addr.pci.bus,
net->info.addr.pci.slot,
net->info.addr.pci.function);
} else if (CCWAddrSpecified) {
virReportError(VIR_ERR_DEVICE_MISSING,
- _("no device found on " VIR_CCW_DEVICE_ADDRESS_FMT),
+ _("no device matching alias %s found on "
+ VIR_CCW_DEVICE_ADDRESS_FMT),
+ NULLSTR(net->info.alias),
net->info.addr.ccw.cssid,
net->info.addr.ccw.ssid,
net->info.addr.ccw.devno);
} else if (MACAddrSpecified) {
virReportError(VIR_ERR_DEVICE_MISSING,
- _("no device matching MAC address %s found"),
- virMacAddrFormat(&net->mac, mac));
+ _("no device matching MAC address %s and alias %s found"),
+ virMacAddrFormat(&net->mac, mac),
+ NULLSTR(net->info.alias));
} else {
virReportError(VIR_ERR_DEVICE_MISSING, "%s",
_("no matching device found"));
--
2.31.1
3
6
Clang complains:
../libvirt/src/conf/node_device_conf.c:1945:74: error: result of comparison of unsigned enum expression < 0 is always false [-Werror,-Wtautological-unsigned-enum-zero-compare]
if ((mdev->start = virNodeDevMdevStartTypeFromString(starttype)) < 0) {
Fixes: 42a55854993
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/conf/node_device_conf.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
Pushed as fix for a build-breaker.
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 4e2b37c612..5598d420fe 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -1942,11 +1942,14 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
}
if ((starttype = virXPathString("string(./start[1]/@type)", ctxt))) {
- if ((mdev->start = virNodeDevMdevStartTypeFromString(starttype)) < 0) {
+ int tmp;
+ if ((tmp = virNodeDevMdevStartTypeFromString(starttype)) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown mdev start type '%s' for '%s'"), starttype, def->name);
return -1;
}
+
+ mdev->start = tmp;
} else {
mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL;
}
--
2.31.1
1
0
[libvirt PATCH 00/10] Refactor more XML parsing boilerplate code, part XII
by Tim Wiederhake 20 May '21
by Tim Wiederhake 20 May '21
20 May '21
For background, see
https://listman.redhat.com/archives/libvir-list/2021-April/msg00668.html
Tim Wiederhake (10):
virDomainAudioPulseAudioParse: Use virXMLProp*
virDomainAudioDef: Change type of "type" to virDomainAudioType
virDomainAudioDef: Change type of "sdl.driver" to
virDomainAudioSDLDriver
virDomainAudioDefParseXML: Use virXMLProp*
virDomainAudioDefParseXML: Don't ignore return value of
virDomainAudio*Parse()
virDomainIOMMUDefParseXML: Use virXMLProp*
virStorageAdapterParseXML: Use g_autofree
virStorageAdapterFCHost: Change type of "type" to
virStorageAdapterType
virStorageAdapterParseXML: Use virXMLProp*
virDomainDeviceSpaprVioAddressParseXML: Use virXMLProp*
src/bhyve/bhyve_command.c | 2 +-
src/conf/device_conf.c | 14 +--
src/conf/domain_conf.c | 202 +++++++++++---------------------
src/conf/domain_conf.h | 4 +-
src/conf/storage_adapter_conf.c | 38 ++----
src/conf/storage_adapter_conf.h | 2 +-
src/qemu/qemu_command.c | 4 +-
src/qemu/qemu_validate.c | 2 +-
8 files changed, 97 insertions(+), 171 deletions(-)
--
2.26.3
2
13
virNetDevOpenvswitchInterfaceGetMaster is declared twice in
src/util/virnetdevopenvswitch.h. Remove the last one.
Signed-off-by: Peng Liang <liangpeng10(a)huawei.com>
---
src/util/virnetdevopenvswitch.h | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitch.h
index 35717085827e..75253768558f 100644
--- a/src/util/virnetdevopenvswitch.h
+++ b/src/util/virnetdevopenvswitch.h
@@ -57,9 +57,6 @@ int virNetDevOpenvswitchInterfaceStats(const char *ifname,
virDomainInterfaceStatsPtr stats)
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
-int virNetDevOpenvswitchInterfaceGetMaster(const char *ifname, char **master)
- ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
-
int
virNetDevOpenvswitchMaybeUnescapeReply(char *reply)
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
--
2.31.1
2
1
[libvirt PATCH] qemu: fs: do not try to fill binary path if we have a socket
by Ján Tomko 20 May '21
by Ján Tomko 20 May '21
20 May '21
We do not need to look for a suitable binary in the vhost-user
description files, if we aren't the ones starting it.
Otherwise startup will fail with:
error: Failed to start domain 'vm1'
error: operation failed: Unable to find a satisfying virtiofsd
https://bugzilla.redhat.com/show_bug.cgi?id=1855789
Signed-off-by: Ján Tomko <jtomko(a)redhat.com>
---
src/qemu/qemu_virtiofs.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c
index e310f2e7aa..edaedf0304 100644
--- a/src/qemu/qemu_virtiofs.c
+++ b/src/qemu/qemu_virtiofs.c
@@ -322,7 +322,7 @@ int
qemuVirtioFSPrepareDomain(virQEMUDriver *driver,
virDomainFSDef *fs)
{
- if (fs->binary)
+ if (fs->binary || fs->sock)
return 0;
return qemuVhostUserFillDomainFS(driver, fs);
--
2.31.1
2
1
Currently src/libxl/ allocates a bunch of buffers with variants of g_new0() or g_strdup(), which will be consumed by libxenlight.so. Once the objects which contain these buffers are not needed anymore, libxenlight.so will release them with ordinary calls to free() in its *_dispose() API. In other words: libxenlight.so does not use glib.
While the g_malloc docs of today's glib state that (apparently) the mistake of using a private allocator was recognized and corrected in glib 2.46, the same mistake might occur again in the future.
I wonder if a patch will be accepted which will add simple wrappers around calloc, strdup, like libxlCallocWrap and libxlStrupWrap, which provides the buffers expected by libxenlight.so and which it can simply free() again. Just so that it looks more "symmetric", as opposed to g_new0()/free() pairs.
Maybe this issue was already evaluated at the time libvirt was converted from virAlloc to g_new?
Olaf
2
1
libxl objects are supposed to be initialized and disposed.
Adjust libxlMakeNic to use an already initialized object, it is owned by
the caller.
Adjust libxlMakeNicList to initialize the list of objects, before they
are filled by libxlMakeNic. In case of error the objects are disposed
by libxl_domain_config_dispose.
The usage of g_new0 is suspicious in the context of libxl because the
memory allocated via glib is released with plain free() inside libxl.
Signed-off-by: Olaf Hering <olaf(a)aepfle.de>
---
src/libxl/libxl_conf.c | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 2d2aab7e66..e4afa578b0 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1345,8 +1345,6 @@ libxlMakeNic(virDomainDef *def,
return -1;
}
- libxl_device_nic_init(x_nic);
-
virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
/*
@@ -1532,39 +1530,39 @@ libxlMakeNicList(virDomainDef *def, libxl_domain_config *d_config)
{
virDomainNetDef **l_nics = def->nets;
size_t nnics = def->nnets;
- libxl_device_nic *x_nics;
size_t i, nvnics = 0;
-
- x_nics = g_new0(libxl_device_nic, nnics);
+ int ret = -1;
for (i = 0; i < nnics; i++) {
if (virDomainNetGetActualType(l_nics[i]) == VIR_DOMAIN_NET_TYPE_HOSTDEV)
continue;
+ nvnics++;
+ }
+ if (!nvnics)
+ return 0;
+
+ d_config->nics = g_new0(libxl_device_nic, nvnics);
+ d_config->num_nics = nvnics;
+
+ for (i = 0; i < nvnics; i++)
+ libxl_device_nic_init(&d_config->nics[i]);
- if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics], false))
+ for (i = 0; i < nvnics; i++) {
+ if (libxlMakeNic(def, l_nics[i], &d_config->nics[i], false))
goto error;
/*
* The devid (at least right now) will not get initialized by
* libxl in the setup case but is required for starting the
* device-model.
*/
- if (x_nics[nvnics].devid < 0)
- x_nics[nvnics].devid = nvnics;
-
- nvnics++;
+ if (d_config->nics[i].devid < 0)
+ d_config->nics[i].devid = i;
}
- VIR_SHRINK_N(x_nics, nnics, nnics - nvnics);
- d_config->nics = x_nics;
- d_config->num_nics = nvnics;
-
- return 0;
+ ret = 0;
error:
- for (i = 0; i < nnics; i++)
- libxl_device_nic_dispose(&x_nics[i]);
- VIR_FREE(x_nics);
- return -1;
+ return ret;
}
int
2
1
libxl objects are supposed to be initialized and disposed.
Correct the usage of libxl_device_disk objects which are allocated on
the stack. Initialize each one prior usage, and dispose them once done.
Adjust libxlMakeDisk to use an already initialized object, it is owned
by the caller.
Adjust libxlMakeDiskList to initialize the list of objects, before they
are filled by libxlMakeDisk. In case of error, the objects are disposed
by libxl_domain_config_dispose.
The usage of g_new0 is suspicious in the context of libxl because the
memory allocated via glib is released with plain free() inside libxl.
Signed-off-by: Olaf Hering <olaf(a)aepfle.de>
---
src/libxl/libxl_conf.c | 22 +++++++++-------------
src/libxl/libxl_driver.c | 6 ++++++
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 3149ee3b4a..2d2aab7e66 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1114,8 +1114,6 @@ libxlMakeDisk(virDomainDiskDef *l_disk, libxl_device_disk *x_disk)
int format = virDomainDiskGetFormat(l_disk);
int actual_type = virStorageSourceGetActualType(l_disk->src);
- libxl_device_disk_init(x_disk);
-
if (actual_type == VIR_STORAGE_TYPE_NETWORK) {
if (STRNEQ_NULLABLE(driver, "qemu")) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -1265,26 +1263,24 @@ libxlMakeDiskList(virDomainDef *def, libxl_domain_config *d_config)
{
virDomainDiskDef **l_disks = def->disks;
int ndisks = def->ndisks;
- libxl_device_disk *x_disks;
size_t i;
+ int ret = -1;
+
+ d_config->disks = g_new0(libxl_device_disk, ndisks);
+ d_config->num_disks = ndisks;
- x_disks = g_new0(libxl_device_disk, ndisks);
+ for (i = 0; i < ndisks; i++)
+ libxl_device_disk_init(&d_config->disks[i]);
for (i = 0; i < ndisks; i++) {
- if (libxlMakeDisk(l_disks[i], &x_disks[i]) < 0)
+ if (libxlMakeDisk(l_disks[i], &d_config->disks[i]) < 0)
goto error;
}
- d_config->disks = x_disks;
- d_config->num_disks = ndisks;
-
- return 0;
+ ret = 0;
error:
- for (i = 0; i < ndisks; i++)
- libxl_device_disk_dispose(&x_disks[i]);
- VIR_FREE(x_disks);
- return -1;
+ return ret;
}
/*
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index d54cd41785..2b844bb3b5 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -2978,6 +2978,7 @@ libxlDomainChangeEjectableMedia(virDomainObj *vm, virDomainDiskDef *disk)
size_t i;
int ret = -1;
+ libxl_device_disk_init(&x_disk);
for (i = 0; i < vm->def->ndisks; i++) {
if (vm->def->disks[i]->bus == disk->bus &&
STREQ(vm->def->disks[i]->dst, disk->dst)) {
@@ -3018,6 +3019,7 @@ libxlDomainChangeEjectableMedia(virDomainObj *vm, virDomainDiskDef *disk)
ret = 0;
cleanup:
+ libxl_device_disk_dispose(&x_disk);
virObjectUnref(cfg);
return ret;
}
@@ -3030,6 +3032,7 @@ libxlDomainAttachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
libxl_device_disk x_disk;
int ret = -1;
+ libxl_device_disk_init(&x_disk);
switch (l_disk->device) {
case VIR_DOMAIN_DISK_DEVICE_CDROM:
ret = libxlDomainChangeEjectableMedia(vm, l_disk);
@@ -3091,6 +3094,7 @@ libxlDomainAttachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
}
cleanup:
+ libxl_device_disk_dispose(&x_disk);
virObjectUnref(cfg);
return ret;
}
@@ -3329,6 +3333,7 @@ libxlDomainDetachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
int idx;
int ret = -1;
+ libxl_device_disk_init(&x_disk);
switch (dev->data.disk->device) {
case VIR_DOMAIN_DISK_DEVICE_DISK:
if (dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
@@ -3380,6 +3385,7 @@ libxlDomainDetachDeviceDiskLive(virDomainObj *vm, virDomainDeviceDef *dev)
}
cleanup:
+ libxl_device_disk_dispose(&x_disk);
virObjectUnref(cfg);
return ret;
}
2
1
[PATCH v1] libxl: remove libxl_domain_config_init from libxlBuildDomainConfig
by Olaf Hering 20 May '21
by Olaf Hering 20 May '21
20 May '21
The passed libxl_domain_config is owned, and already initialized, by the
caller.
Signed-off-by: Olaf Hering <olaf(a)aepfle.de>
---
src/libxl/libxl_conf.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 8ea9b35292..3149ee3b4a 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -2529,7 +2529,6 @@ libxlBuildDomainConfig(virPortAllocatorRange *graphicsports,
{
virCaps *caps = cfg->caps;
libxl_ctx *ctx = cfg->ctx;
- libxl_domain_config_init(d_config);
if (libxlMakeDomCreateInfo(ctx, def, &d_config->c_info) < 0)
return -1;
2
1
[libvirt PATCH 0/2] storage_driver: add support for cluster_size QCOW2 option
by Pavel Hrdina 19 May '21
by Pavel Hrdina 19 May '21
19 May '21
Pavel Hrdina (2):
storage: add support for QCOW2 cluster_size option
storage_file: add support to probe cluster_size from QCOW2 images
docs/formatstorage.html.in | 6 ++
docs/schemas/storagecommon.rng | 7 +++
docs/schemas/storagevol.rng | 3 +
src/conf/storage_conf.c | 12 ++++
src/storage/storage_util.c | 8 +++
src/storage_file/storage_file_probe.c | 55 +++++++++++++------
.../qcow2-clusterSize.argv | 6 ++
tests/storagevolxml2argvtest.c | 4 ++
.../vol-qcow2-clusterSize.xml | 17 ++++++
.../vol-qcow2-clusterSize.xml | 17 ++++++
tests/storagevolxml2xmltest.c | 1 +
11 files changed, 120 insertions(+), 16 deletions(-)
create mode 100644 tests/storagevolxml2argvdata/qcow2-clusterSize.argv
create mode 100644 tests/storagevolxml2xmlin/vol-qcow2-clusterSize.xml
create mode 100644 tests/storagevolxml2xmlout/vol-qcow2-clusterSize.xml
--
2.31.1
3
7
We are getting close to the next release of libvirt. To aim for the
release on Jun 01 I suggest entering the freeze on Tuesday May 25 and
tagging RC2 on Thursday May 27.
I hope this works for everyone.
Jirka
1
0
This is v2 from:
https://listman.redhat.com/archives/libvir-list/2021-April/msg01307.html
Changes since v1:
- formats command line for -object 'input-linux' in JSON representation
- change of xml representation from 'input-linux' to 'evdev' as
suggested by Daniel for future compatibility
- fix of typos pointed out by Jonathon
Kristina Hanicova (3):
qemu_capabilities: Add QEMU_CAPS_INPUT_LINUX
conf: Parse/format XML input type 'evdev'
qemu: Build command line for object input-linux
docs/formatdomain.rst | 37 +++++++----
docs/schemas/domaincommon.rng | 20 ++++++
src/conf/domain_audit.c | 1 +
src/conf/domain_conf.c | 66 ++++++++++++++++---
src/conf/domain_conf.h | 12 ++++
src/conf/domain_validate.c | 8 +++
src/libvirt_private.syms | 2 +
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_cgroup.c | 2 +
src/qemu/qemu_command.c | 33 +++++++++-
src/qemu/qemu_domain_address.c | 1 +
src/qemu/qemu_hotplug.c | 1 +
src/qemu/qemu_validate.c | 6 ++
src/security/security_apparmor.c | 1 +
src/security/security_dac.c | 2 +
src/security/security_selinux.c | 2 +
src/security/virt-aa-helper.c | 3 +-
.../caps_2.11.0.s390x.xml | 1 +
.../caps_2.11.0.x86_64.xml | 1 +
.../caps_2.12.0.aarch64.xml | 1 +
.../caps_2.12.0.ppc64.xml | 1 +
.../caps_2.12.0.s390x.xml | 1 +
.../caps_2.12.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 1 +
.../caps_3.0.0.riscv32.xml | 1 +
.../caps_3.0.0.riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 1 +
.../caps_3.0.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 1 +
.../caps_3.1.0.x86_64.xml | 1 +
.../caps_4.0.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 1 +
.../caps_4.0.0.riscv32.xml | 1 +
.../caps_4.0.0.riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 1 +
.../caps_4.0.0.x86_64.xml | 1 +
.../caps_4.1.0.x86_64.xml | 1 +
.../caps_4.2.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 +
.../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 +
.../caps_4.2.0.x86_64.xml | 1 +
.../caps_5.0.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 +
.../caps_5.0.0.riscv64.xml | 1 +
.../caps_5.0.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_5.1.0.sparc.xml | 1 +
.../caps_5.1.0.x86_64.xml | 1 +
.../caps_5.2.0.aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_5.2.0.ppc64.xml | 1 +
.../caps_5.2.0.riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_5.2.0.s390x.xml | 1 +
.../caps_5.2.0.x86_64.xml | 1 +
.../caps_6.0.0.x86_64.xml | 1 +
.../input-linux.x86_64-latest.args | 34 ++++++++++
tests/qemuxml2argvdata/input-linux.xml | 24 +++++++
tests/qemuxml2argvtest.c | 2 +
tests/qemuxml2xmloutdata/input-linux.xml | 1 +
58 files changed, 273 insertions(+), 24 deletions(-)
create mode 100644 tests/qemuxml2argvdata/input-linux.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/input-linux.xml
create mode 120000 tests/qemuxml2xmloutdata/input-linux.xml
--
2.31.1
2
4
[PATCH libvirt v2] tests: Add capabilities for QEMU 6.0.0 on s390x
by Shalini Chellathurai Saroja 19 May '21
by Shalini Chellathurai Saroja 19 May '21
19 May '21
Introduce replies and xml files for QEMU 6.0.0 on s390x.
Signed-off-by: Shalini Chellathurai Saroja <shalini(a)linux.ibm.com>
---
The replies file is removed from this patch and is available in
https://gitlab.com/shalinichellathurai/libvirt/-/commit/3fb78dee79a668cae08…
tests/domaincapsdata/qemu_6.0.0.s390x.xml | 238 +
.../caps_6.0.0.s390x.replies | 27223 ++++++++++++++++
.../qemucapabilitiesdata/caps_6.0.0.s390x.xml | 3305 ++
...default-video-type-s390x.s390x-latest.args | 6 +-
.../disk-error-policy-s390x.s390x-latest.args | 4 +-
.../fs9p-ccw.s390x-latest.args | 4 +-
...tdev-subsys-mdev-vfio-ap.s390x-latest.args | 4 +-
...ubsys-mdev-vfio-ccw-boot.s390x-latest.args | 4 +-
...othreads-virtio-scsi-ccw.s390x-latest.args | 8 +-
...t-cpu-kvm-ccw-virtio-2.7.s390x-latest.args | 4 +-
...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 6 +-
...t-cpu-tcg-ccw-virtio-2.7.s390x-latest.args | 4 +-
...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 4 +-
.../s390x-ccw-graphics.s390x-latest.args | 6 +-
.../s390x-ccw-headless.s390x-latest.args | 6 +-
.../vhost-vsock-ccw-auto.s390x-latest.args | 4 +-
.../vhost-vsock-ccw-iommu.s390x-latest.args | 4 +-
.../vhost-vsock-ccw.s390x-latest.args | 4 +-
18 files changed, 30802 insertions(+), 36 deletions(-)
create mode 100644 tests/domaincapsdata/qemu_6.0.0.s390x.xml
create mode 100644 tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies
create mode 100644 tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
diff --git a/tests/domaincapsdata/qemu_6.0.0.s390x.xml b/tests/domaincapsdata/qemu_6.0.0.s390x.xml
new file mode 100644
index 00000000..00b8f2c9
--- /dev/null
+++ b/tests/domaincapsdata/qemu_6.0.0.s390x.xml
@@ -0,0 +1,238 @@
+<domainCapabilities>
+ <path>/usr/bin/qemu-system-s390x</path>
+ <domain>kvm</domain>
+ <machine>s390-ccw-virtio-6.0</machine>
+ <arch>s390x</arch>
+ <vcpu max='248'/>
+ <iothreads supported='yes'/>
+ <os supported='yes'>
+ <enum name='firmware'/>
+ <loader supported='yes'>
+ <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
+ <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
+ <value>/usr/share/OVMF/OVMF_CODE.fd</value>
+ <enum name='type'>
+ <value>rom</value>
+ <value>pflash</value>
+ </enum>
+ <enum name='readonly'>
+ <value>yes</value>
+ <value>no</value>
+ </enum>
+ <enum name='secure'>
+ <value>no</value>
+ </enum>
+ </loader>
+ </os>
+ <cpu>
+ <mode name='host-passthrough' supported='yes'>
+ <enum name='hostPassthroughMigratable'>
+ <value>off</value>
+ </enum>
+ </mode>
+ <mode name='maximum' supported='yes'>
+ <enum name='maximumMigratable'>
+ <value>on</value>
+ <value>off</value>
+ </enum>
+ </mode>
+ <mode name='host-model' supported='yes'>
+ <model fallback='forbid'>gen15a-base</model>
+ <feature policy='require' name='aen'/>
+ <feature policy='require' name='cmmnt'/>
+ <feature policy='require' name='vxpdeh'/>
+ <feature policy='require' name='aefsi'/>
+ <feature policy='require' name='diag318'/>
+ <feature policy='require' name='csske'/>
+ <feature policy='require' name='mepoch'/>
+ <feature policy='require' name='msa9'/>
+ <feature policy='require' name='msa8'/>
+ <feature policy='require' name='msa7'/>
+ <feature policy='require' name='msa6'/>
+ <feature policy='require' name='msa5'/>
+ <feature policy='require' name='msa4'/>
+ <feature policy='require' name='msa3'/>
+ <feature policy='require' name='msa2'/>
+ <feature policy='require' name='msa1'/>
+ <feature policy='require' name='sthyi'/>
+ <feature policy='require' name='edat'/>
+ <feature policy='require' name='ri'/>
+ <feature policy='require' name='deflate'/>
+ <feature policy='require' name='edat2'/>
+ <feature policy='require' name='etoken'/>
+ <feature policy='require' name='vx'/>
+ <feature policy='require' name='ipter'/>
+ <feature policy='require' name='mepochptff'/>
+ <feature policy='require' name='ap'/>
+ <feature policy='require' name='vxeh'/>
+ <feature policy='require' name='vxpd'/>
+ <feature policy='require' name='esop'/>
+ <feature policy='require' name='msa9_pckmo'/>
+ <feature policy='require' name='vxeh2'/>
+ <feature policy='require' name='esort'/>
+ <feature policy='require' name='apqi'/>
+ <feature policy='require' name='apft'/>
+ <feature policy='require' name='els'/>
+ <feature policy='require' name='iep'/>
+ <feature policy='require' name='apqci'/>
+ <feature policy='require' name='cte'/>
+ <feature policy='require' name='ais'/>
+ <feature policy='require' name='bpb'/>
+ <feature policy='require' name='gs'/>
+ <feature policy='require' name='ppa15'/>
+ <feature policy='require' name='zpci'/>
+ <feature policy='require' name='sea_esop2'/>
+ <feature policy='require' name='te'/>
+ <feature policy='require' name='cmm'/>
+ </mode>
+ <mode name='custom' supported='yes'>
+ <model usable='yes'>z800-base</model>
+ <model usable='yes'>z890.2-base</model>
+ <model usable='yes'>z9EC.2</model>
+ <model usable='yes'>z13.2</model>
+ <model usable='yes'>z990.5-base</model>
+ <model usable='yes'>z9BC-base</model>
+ <model usable='yes'>z890.2</model>
+ <model usable='yes'>z890</model>
+ <model usable='yes'>z9BC</model>
+ <model usable='yes'>z13</model>
+ <model usable='yes'>z196</model>
+ <model usable='yes'>z13s</model>
+ <model usable='yes'>z990.3</model>
+ <model usable='yes'>z13s-base</model>
+ <model usable='yes'>z9EC</model>
+ <model usable='yes'>gen15a</model>
+ <model usable='yes'>z14ZR1-base</model>
+ <model usable='yes'>z14.2-base</model>
+ <model usable='yes'>z900.3-base</model>
+ <model usable='yes'>z13.2-base</model>
+ <model usable='yes'>z196.2-base</model>
+ <model usable='yes'>zBC12-base</model>
+ <model usable='yes'>z9BC.2-base</model>
+ <model usable='yes'>z900.2-base</model>
+ <model usable='yes'>z9EC.3</model>
+ <model usable='yes'>zEC12</model>
+ <model usable='yes'>z900</model>
+ <model usable='yes'>z114-base</model>
+ <model usable='yes'>zEC12-base</model>
+ <model usable='yes'>z10EC.2</model>
+ <model usable='yes'>z10EC-base</model>
+ <model usable='yes'>z900.3</model>
+ <model usable='yes'>z14ZR1</model>
+ <model usable='yes'>z10BC</model>
+ <model usable='yes'>z10BC.2-base</model>
+ <model usable='yes'>z9BC.2</model>
+ <model usable='yes'>z990</model>
+ <model usable='yes'>z990.2</model>
+ <model usable='yes'>z14</model>
+ <model usable='yes'>gen15b-base</model>
+ <model usable='yes'>z990.4</model>
+ <model usable='yes'>max</model>
+ <model usable='yes'>z10EC.2-base</model>
+ <model usable='yes'>gen15a-base</model>
+ <model usable='yes'>z800</model>
+ <model usable='yes'>z10EC</model>
+ <model usable='yes'>zEC12.2</model>
+ <model usable='yes'>z990.2-base</model>
+ <model usable='yes'>z900-base</model>
+ <model usable='yes'>z10BC.2</model>
+ <model usable='yes'>z9EC-base</model>
+ <model usable='yes'>z9EC.3-base</model>
+ <model usable='yes'>z114</model>
+ <model usable='yes'>z890.3</model>
+ <model usable='yes'>z196-base</model>
+ <model usable='yes'>z9EC.2-base</model>
+ <model usable='yes'>z196.2</model>
+ <model usable='yes'>z14.2</model>
+ <model usable='yes'>z990-base</model>
+ <model usable='yes'>z900.2</model>
+ <model usable='yes'>z890-base</model>
+ <model usable='yes'>z10EC.3</model>
+ <model usable='yes'>z14-base</model>
+ <model usable='yes'>z990.4-base</model>
+ <model usable='yes'>z10EC.3-base</model>
+ <model usable='yes'>z10BC-base</model>
+ <model usable='yes'>z13-base</model>
+ <model usable='yes'>z990.3-base</model>
+ <model usable='yes'>zEC12.2-base</model>
+ <model usable='yes'>zBC12</model>
+ <model usable='yes'>z890.3-base</model>
+ <model usable='yes'>z990.5</model>
+ <model usable='yes'>gen15b</model>
+ <model usable='yes'>qemu</model>
+ </mode>
+ </cpu>
+ <devices>
+ <disk supported='yes'>
+ <enum name='diskDevice'>
+ <value>disk</value>
+ <value>cdrom</value>
+ <value>floppy</value>
+ <value>lun</value>
+ </enum>
+ <enum name='bus'>
+ <value>fdc</value>
+ <value>scsi</value>
+ <value>virtio</value>
+ </enum>
+ <enum name='model'>
+ <value>virtio</value>
+ <value>virtio-transitional</value>
+ <value>virtio-non-transitional</value>
+ </enum>
+ </disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>egl-headless</value>
+ </enum>
+ </graphics>
+ <video supported='yes'>
+ <enum name='modelType'>
+ <value>virtio</value>
+ <value>none</value>
+ </enum>
+ </video>
+ <hostdev supported='yes'>
+ <enum name='mode'>
+ <value>subsystem</value>
+ </enum>
+ <enum name='startupPolicy'>
+ <value>default</value>
+ <value>mandatory</value>
+ <value>requisite</value>
+ <value>optional</value>
+ </enum>
+ <enum name='subsysType'>
+ <value>pci</value>
+ <value>scsi</value>
+ </enum>
+ <enum name='capsType'/>
+ <enum name='pciBackend'>
+ <value>default</value>
+ <value>vfio</value>
+ </enum>
+ </hostdev>
+ <rng supported='yes'>
+ <enum name='model'>
+ <value>virtio</value>
+ <value>virtio-transitional</value>
+ <value>virtio-non-transitional</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>random</value>
+ <value>egd</value>
+ <value>builtin</value>
+ </enum>
+ </rng>
+ </devices>
+ <features>
+ <gic supported='no'/>
+ <vmcoreinfo supported='no'/>
+ <genid supported='no'/>
+ <backingStoreInput supported='yes'/>
+ <backup supported='no'/>
+ <sev supported='no'/>
+ </features>
+</domainCapabilities>
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies
new file mode 100644
index 00000000..2f832b91
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies
@@ -0,0 +1,27223 @@
[...]
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
new file mode 100644
index 00000000..4c056c48
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
@@ -0,0 +1,3305 @@
+<qemuCaps>
+ <emulator>/usr/bin/qemu-system-s390x</emulator>
+ <qemuctime>0</qemuctime>
+ <selfctime>0</selfctime>
+ <selfvers>0</selfvers>
+ <flag name='kvm'/>
+ <flag name='virtio-tx-alg'/>
+ <flag name='virtio-blk-pci.ioeventfd'/>
+ <flag name='virtio-blk-pci.event_idx'/>
+ <flag name='virtio-net-pci.event_idx'/>
+ <flag name='usb-redir'/>
+ <flag name='virtio-blk-pci.scsi'/>
+ <flag name='scsi-disk.channel'/>
+ <flag name='scsi-block'/>
+ <flag name='dump-guest-memory'/>
+ <flag name='virtio-scsi-pci'/>
+ <flag name='blockio'/>
+ <flag name='usb-redir.filter'/>
+ <flag name='scsi-disk.wwn'/>
+ <flag name='seccomp-sandbox'/>
+ <flag name='reboot-timeout'/>
+ <flag name='vnc'/>
+ <flag name='s390-sclp'/>
+ <flag name='nbd-server'/>
+ <flag name='virtio-rng'/>
+ <flag name='rng-random'/>
+ <flag name='rng-egd'/>
+ <flag name='virtio-ccw'/>
+ <flag name='pci-bridge'/>
+ <flag name='vfio-pci'/>
+ <flag name='mem-merge'/>
+ <flag name='drive-discard'/>
+ <flag name='boot-strict'/>
+ <flag name='msg-timestamp'/>
+ <flag name='active-commit'/>
+ <flag name='change-backing-file'/>
+ <flag name='memory-backend-ram'/>
+ <flag name='numa'/>
+ <flag name='memory-backend-file'/>
+ <flag name='splash-timeout'/>
+ <flag name='iothread'/>
+ <flag name='migrate-rdma'/>
+ <flag name='drive-iotune-max'/>
+ <flag name='aes-key-wrap'/>
+ <flag name='dea-key-wrap'/>
+ <flag name='migration-event'/>
+ <flag name='virtio-net'/>
+ <flag name='incoming-defer'/>
+ <flag name='virtio-gpu'/>
+ <flag name='virtio-gpu.virgl'/>
+ <flag name='virtio-keyboard'/>
+ <flag name='virtio-mouse'/>
+ <flag name='virtio-tablet'/>
+ <flag name='virtio-input-host'/>
+ <flag name='chardev-file-append'/>
+ <flag name='vserport-change-event'/>
+ <flag name='virtio-balloon-pci.deflate-on-oom'/>
+ <flag name='chardev-logfile'/>
+ <flag name='debug-threads'/>
+ <flag name='secret'/>
+ <flag name='virtio-scsi-pci.iothread'/>
+ <flag name='name-guest'/>
+ <flag name='drive-detect-zeroes'/>
+ <flag name='tls-creds-x509'/>
+ <flag name='virtio-pci-disable-legacy'/>
+ <flag name='query-hotpluggable-cpus'/>
+ <flag name='virtio-net.rx_queue_size'/>
+ <flag name='drive-iotune-max-length'/>
+ <flag name='gluster.debug_level'/>
+ <flag name='vhost-scsi'/>
+ <flag name='drive-iotune-group'/>
+ <flag name='query-cpu-model-expansion'/>
+ <flag name='virtio-net.host_mtu'/>
+ <flag name='query-cpu-definitions'/>
+ <flag name='block-write-threshold'/>
+ <flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='virtio.iommu_platform'/>
+ <flag name='virtio.ats'/>
+ <flag name='loadparm'/>
+ <flag name='vnc-multi-servers'/>
+ <flag name='virtio-net.tx_queue_size'/>
+ <flag name='chardev-reconnect'/>
+ <flag name='virtio-gpu.max_outputs'/>
+ <flag name='virtio-blk.num-queues'/>
+ <flag name='sclplmconsole'/>
+ <flag name='disk-share-rw'/>
+ <flag name='iscsi.password-secret'/>
+ <flag name='dump-completed'/>
+ <flag name='virtio-gpu-ccw'/>
+ <flag name='virtio-keyboard-ccw'/>
+ <flag name='virtio-mouse-ccw'/>
+ <flag name='virtio-tablet-ccw'/>
+ <flag name='qcow2-luks'/>
+ <flag name='seccomp-blacklist'/>
+ <flag name='query-cpus-fast'/>
+ <flag name='disk-write-cache'/>
+ <flag name='nbd-tls'/>
+ <flag name='pr-manager-helper'/>
+ <flag name='qom-list-properties'/>
+ <flag name='memory-backend-file.discard-data'/>
+ <flag name='virtual-css-bridge'/>
+ <flag name='virtual-css-bridge.cssid-unrestricted'/>
+ <flag name='vfio-ccw'/>
+ <flag name='screendump_device'/>
+ <flag name='blockdev-del'/>
+ <flag name='vhost-vsock'/>
+ <flag name='chardev-fd-pass'/>
+ <flag name='vfio-pci.display'/>
+ <flag name='blockdev'/>
+ <flag name='vfio-ap'/>
+ <flag name='zpci'/>
+ <flag name='memory-backend-memfd'/>
+ <flag name='memory-backend-memfd.hugetlb'/>
+ <flag name='iothread.poll-max-ns'/>
+ <flag name='egl-headless.rendernode'/>
+ <flag name='memory-backend-file.align'/>
+ <flag name='scsi-disk.device_id'/>
+ <flag name='virtio-pci-non-transitional'/>
+ <flag name='overcommit'/>
+ <flag name='query-current-machine'/>
+ <flag name='bitmap-merge'/>
+ <flag name='nbd-bitmap'/>
+ <flag name='migration-file-drop-cache'/>
+ <flag name='dbus-vmstate'/>
+ <flag name='vhost-user-gpu'/>
+ <flag name='query-cpu-model-baseline'/>
+ <flag name='query-cpu-model-comparison'/>
+ <flag name='blockdev-file-dynamic-auto-read-only'/>
+ <flag name='savevm-monitor-nodes'/>
+ <flag name='drive-nvme'/>
+ <flag name='smp-dies'/>
+ <flag name='rng-builtin'/>
+ <flag name='virtio-net.failover'/>
+ <flag name='vhost-user-fs'/>
+ <flag name='query-named-block-nodes.flat'/>
+ <flag name='blockdev-snapshot.allow-write-only-overlay'/>
+ <flag name='storage.werror'/>
+ <flag name='fsdev.multidevs'/>
+ <flag name='virtio.packed'/>
+ <flag name='aio.io_uring'/>
+ <flag name='tcg'/>
+ <flag name='virtio-blk-pci.scsi.default.disabled'/>
+ <flag name='fw_cfg'/>
+ <flag name='migration-param.bandwidth'/>
+ <flag name='migration-param.downtime'/>
+ <flag name='migration-param.xbzrle-cache-size'/>
+ <flag name='numa.hmat'/>
+ <flag name='blockdev-hostdev-scsi'/>
+ <flag name='virtio-balloon.free-page-reporting'/>
+ <flag name='block-export-add'/>
+ <flag name='netdev.vhost-vdpa'/>
+ <flag name='fsdev.createmode'/>
+ <flag name='vhost-user-fs.bootindex'/>
+ <flag name='vhost-user-blk'/>
+ <flag name='cpu-max'/>
+ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/>
+ <flag name='vnc-opts'/>
+ <flag name='migration-param.block-bitmap-mapping'/>
+ <flag name='vnc-power-control'/>
+ <flag name='audiodev'/>
+ <flag name='blockdev-backup'/>
+ <flag name='object.qapified'/>
+ <flag name='rotation-rate'/>
+ <flag name='compat-deprecated'/>
+ <flag name='acpi-index'/>
+ <version>6000000</version>
+ <kvmVersion>0</kvmVersion>
+ <microcodeVersion>39100242</microcodeVersion>
+ <package>qemu-6.0.0-20210517.1.4ff77070.fc33</package>
+ <arch>s390x</arch>
+ <hostCPU type='kvm' model='gen15a-base' migratability='no'>
+ <property name='aen' type='boolean' value='true'/>
+ <property name='cmmnt' type='boolean' value='true'/>
+ <property name='vxpdeh' type='boolean' value='true'/>
+ <property name='aefsi' type='boolean' value='true'/>
+ <property name='diag318' type='boolean' value='true'/>
+ <property name='csske' type='boolean' value='true'/>
+ <property name='mepoch' type='boolean' value='true'/>
+ <property name='msa9' type='boolean' value='true'/>
+ <property name='msa8' type='boolean' value='true'/>
+ <property name='msa7' type='boolean' value='true'/>
+ <property name='msa6' type='boolean' value='true'/>
+ <property name='msa5' type='boolean' value='true'/>
+ <property name='msa4' type='boolean' value='true'/>
+ <property name='msa3' type='boolean' value='true'/>
+ <property name='msa2' type='boolean' value='true'/>
+ <property name='msa1' type='boolean' value='true'/>
+ <property name='sthyi' type='boolean' value='true'/>
+ <property name='edat' type='boolean' value='true'/>
+ <property name='ri' type='boolean' value='true'/>
+ <property name='deflate' type='boolean' value='true'/>
+ <property name='edat2' type='boolean' value='true'/>
+ <property name='etoken' type='boolean' value='true'/>
+ <property name='vx' type='boolean' value='true'/>
+ <property name='ipter' type='boolean' value='true'/>
+ <property name='mepochptff' type='boolean' value='true'/>
+ <property name='ap' type='boolean' value='true'/>
+ <property name='vxeh' type='boolean' value='true'/>
+ <property name='vxpd' type='boolean' value='true'/>
+ <property name='esop' type='boolean' value='true'/>
+ <property name='msa9_pckmo' type='boolean' value='true'/>
+ <property name='vxeh2' type='boolean' value='true'/>
+ <property name='esort' type='boolean' value='true'/>
+ <property name='apqi' type='boolean' value='true'/>
+ <property name='apft' type='boolean' value='true'/>
+ <property name='els' type='boolean' value='true'/>
+ <property name='iep' type='boolean' value='true'/>
+ <property name='apqci' type='boolean' value='true'/>
+ <property name='cte' type='boolean' value='true'/>
+ <property name='ais' type='boolean' value='true'/>
+ <property name='bpb' type='boolean' value='true'/>
+ <property name='gs' type='boolean' value='true'/>
+ <property name='ppa15' type='boolean' value='true'/>
+ <property name='zpci' type='boolean' value='true'/>
+ <property name='sea_esop2' type='boolean' value='true'/>
+ <property name='te' type='boolean' value='true'/>
+ <property name='cmm' type='boolean' value='true'/>
+ </hostCPU>
+ <cpu type='kvm' name='z800-base' typename='z800-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.2-base' typename='z890.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.2' typename='z9EC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13.2' typename='z13.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.5-base' typename='z990.5-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC-base' typename='z9BC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.2' typename='z890.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890' typename='z890-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC' typename='z9BC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13' typename='z13-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196' typename='z196-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13s' typename='z13s-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='host' typename='host-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.3' typename='z990.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13s-base' typename='z13s-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC' typename='z9EC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15a' typename='gen15a-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14ZR1-base' typename='z14ZR1-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14.2-base' typename='z14.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.3-base' typename='z900.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13.2-base' typename='z13.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196.2-base' typename='z196.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zBC12-base' typename='zBC12-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC.2-base' typename='z9BC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.2-base' typename='z900.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.3' typename='z9EC.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12' typename='zEC12-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900' typename='z900-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z114-base' typename='z114-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12-base' typename='zEC12-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.2' typename='z10EC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC-base' typename='z10EC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.3' typename='z900.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14ZR1' typename='z14ZR1-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC' typename='z10BC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC.2-base' typename='z10BC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC.2' typename='z9BC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990' typename='z990-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.2' typename='z990.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14' typename='z14-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15b-base' typename='gen15b-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.4' typename='z990.4-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='max' typename='max-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.2-base' typename='z10EC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15a-base' typename='gen15a-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z800' typename='z800-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC' typename='z10EC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12.2' typename='zEC12.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.2-base' typename='z990.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900-base' typename='z900-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC.2' typename='z10BC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC-base' typename='z9EC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.3-base' typename='z9EC.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z114' typename='z114-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.3' typename='z890.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196-base' typename='z196-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.2-base' typename='z9EC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196.2' typename='z196.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14.2' typename='z14.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990-base' typename='z990-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.2' typename='z900.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890-base' typename='z890-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.3' typename='z10EC.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14-base' typename='z14-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.4-base' typename='z990.4-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.3-base' typename='z10EC.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC-base' typename='z10BC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13-base' typename='z13-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.3-base' typename='z990.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12.2-base' typename='zEC12.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zBC12' typename='zBC12-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.3-base' typename='z890.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.5' typename='z990.5-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15b' typename='gen15b-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='qemu' typename='qemu-s390x-cpu' usable='yes'/>
+ <machine type='kvm' name='s390-ccw-virtio-6.0' alias='s390-ccw-virtio' hotplugCpus='yes' maxCpus='248' default='yes' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-4.0' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-5.2' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-3.1' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.6' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.12' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.9' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-5.1' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-3.0' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-4.2' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.5' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.11' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.8' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-5.0' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-4.1' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.4' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.10' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.7' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <hostCPU type='tcg' model='z13.2-base' migratability='no'>
+ <property name='dateh2' type='boolean' value='false'/>
+ <property name='aen' type='boolean' value='true'/>
+ <property name='gen13ptff' type='boolean' value='false'/>
+ <property name='kmac-tdea-192' type='boolean' value='false'/>
+ <property name='kmc-tdea-192' type='boolean' value='false'/>
+ <property name='parseh' type='boolean' value='false'/>
+ <property name='aefsi' type='boolean' value='true'/>
+ <property name='csske' type='boolean' value='false'/>
+ <property name='hfpm' type='boolean' value='false'/>
+ <property name='hfpue' type='boolean' value='false'/>
+ <property name='dfp' type='boolean' value='false'/>
+ <property name='km-dea' type='boolean' value='false'/>
+ <property name='vx' type='boolean' value='true'/>
+ <property name='emon' type='boolean' value='false'/>
+ <property name='kimd-sha-1' type='boolean' value='false'/>
+ <property name='cmpsceh' type='boolean' value='false'/>
+ <property name='dfppc' type='boolean' value='false'/>
+ <property name='dfpzc' type='boolean' value='false'/>
+ <property name='dfphp' type='boolean' value='false'/>
+ <property name='kmc-dea' type='boolean' value='false'/>
+ <property name='klmd-sha-1' type='boolean' value='false'/>
+ <property name='asnlxr' type='boolean' value='false'/>
+ <property name='minste2' type='boolean' value='true'/>
+ <property name='esop' type='boolean' value='true'/>
+ <property name='km-tdea-192' type='boolean' value='false'/>
+ <property name='km-tdea-128' type='boolean' value='false'/>
+ <property name='kmac-dea' type='boolean' value='false'/>
+ <property name='iep' type='boolean' value='true'/>
+ <property name='kmc-tdea-128' type='boolean' value='false'/>
+ <property name='ais' type='boolean' value='true'/>
+ <property name='kmac-tdea-128' type='boolean' value='false'/>
+ <property name='zpci' type='boolean' value='true'/>
+ <property name='nonqks' type='boolean' value='false'/>
+ <property name='sea_esop2' type='boolean' value='true'/>
+ <property name='pfpo' type='boolean' value='false'/>
+ <property name='msa8-base' type='boolean' value='true'/>
+ <property name='msa4-base' type='boolean' value='true'/>
+ <property name='msa3-base' type='boolean' value='true'/>
+ <property name='msa5-base' type='boolean' value='true'/>
+ <property name='tods' type='boolean' value='false'/>
+ </hostCPU>
+ <cpu type='tcg' name='z800-base' typename='z800-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z890.2-base' typename='z890.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.2' typename='z9EC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13.2' typename='z13.2-s390x-cpu' usable='no'>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990.5-base' typename='z990.5-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC-base' typename='z9BC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z890.2' typename='z890.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z890' typename='z890-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC' typename='z9BC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13' typename='z13-s390x-cpu' usable='no'>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z196' typename='z196-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='sthyi'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13s' typename='z13s-s390x-cpu' usable='no'>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='host' typename='host-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z990.3' typename='z990.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z13s-base' typename='z13s-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC' typename='z9EC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='gen15a' typename='gen15a-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='etoken'/>
+ <blocker name='vxpdeh'/>
+ <blocker name='vxeh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='deflate'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa9_pckmo'/>
+ <blocker name='msa9'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z14ZR1-base' typename='z14ZR1-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z14.2-base' typename='z14.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z900.3-base' typename='z900.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z13.2-base' typename='z13.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z196.2-base' typename='z196.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zBC12-base' typename='zBC12-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC.2-base' typename='z9BC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900.2-base' typename='z900.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z9EC.3' typename='z9EC.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12' typename='zEC12-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900' typename='z900-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z114-base' typename='z114-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12-base' typename='zEC12-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.2' typename='z10EC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC-base' typename='z10EC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900.3' typename='z900.3-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z14ZR1' typename='z14ZR1-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC' typename='z10BC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC.2-base' typename='z10BC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC.2' typename='z9BC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990' typename='z990-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z990.2' typename='z990.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z14' typename='z14-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='gen15b-base' typename='gen15b-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.4' typename='z990.4-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='max' typename='max-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z10EC.2-base' typename='z10EC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='gen15a-base' typename='gen15a-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z800' typename='z800-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z10EC' typename='z10EC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12.2' typename='zEC12.2-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990.2-base' typename='z990.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z900-base' typename='z900-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z10BC.2' typename='z10BC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC-base' typename='z9EC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.3-base' typename='z9EC.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z114' typename='z114-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='sthyi'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z890.3' typename='z890.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z196-base' typename='z196-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.2-base' typename='z9EC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z196.2' typename='z196.2-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='sthyi'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z14.2' typename='z14.2-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990-base' typename='z990-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z900.2' typename='z900.2-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z890-base' typename='z890-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.3' typename='z10EC.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z14-base' typename='z14-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.4-base' typename='z990.4-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.3-base' typename='z10EC.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC-base' typename='z10BC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13-base' typename='z13-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990.3-base' typename='z990.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12.2-base' typename='zEC12.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zBC12' typename='zBC12-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z890.3-base' typename='z890.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z990.5' typename='z990.5-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='gen15b' typename='gen15b-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='etoken'/>
+ <blocker name='vxpdeh'/>
+ <blocker name='vxeh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='deflate'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa9_pckmo'/>
+ <blocker name='msa9'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='qemu' typename='qemu-s390x-cpu' usable='yes'/>
+ <machine type='tcg' name='s390-ccw-virtio-6.0' alias='s390-ccw-virtio' hotplugCpus='yes' maxCpus='248' default='yes' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-4.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-5.2' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-3.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.6' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.12' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.9' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-5.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-3.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-4.2' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.5' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.11' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.8' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-5.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-4.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.4' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.10' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.7' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+</qemuCaps>
diff --git a/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args b/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args
index 891eb605..5bb93537 100644
--- a/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args
+++ b/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-default-video-type-s/.config \
/usr/bin/qemu-system-s390x \
-name guest=default-video-type-s390x-test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-default-video-type-s/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-default-video-type-s/master-key.aes"}' \
-machine s390-ccw-virtio,accel=kvm,usb=off,dump-guest-core=off,memory-backend=s390.ram \
--cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
+-cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,diag318=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
-m 1024 \
--object memory-backend-ram,id=s390.ram,size=1073741824 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":1073741824}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f \
diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args
index 792e454f..d8101b8b 100644
--- a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args
+++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
/usr/bin/qemu-system-s390x \
-name guest=guest,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
diff --git a/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args b/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args
index 1e9c7ab9..38da926e 100644
--- a/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args
+++ b/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args
index e7bac2f5..7300a4bd 100644
--- a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 512 \
--object memory-backend-ram,id=s390.ram,size=536870912 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":536870912}' \
-overcommit mem-lock=off \
-smp 2,sockets=2,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args
index dc6f54cf..3b0e2623 100644
--- a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 512 \
--object memory-backend-ram,id=s390.ram,size=536870912 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":536870912}' \
-overcommit mem-lock=off \
-smp 2,sockets=2,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args b/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args
index 01cee4d7..4d35ed57 100644
--- a/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args
+++ b/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args
@@ -9,15 +9,15 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
--object iothread,id=iothread1 \
--object iothread,id=iothread2 \
+-object '{"qom-type":"iothread","id":"iothread1"}' \
+-object '{"qom-type":"iothread","id":"iothread2"}' \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-display none \
-no-user-config \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args
index b31d4fb8..6eefbb89 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-2.7,accel=kvm,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu host \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
index f1833d62..e20ff871 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-4.2,accel=kvm,usb=off,dump-guest-core=off,memory-backend=s390.ram \
--cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
+-cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,diag318=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args
index 871b2daf..730e75bb 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-2.7,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args
index 85bc0492..3bfef9c5 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-4.2,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args b/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args
index e1485325..090399aa 100644
--- a/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
/usr/bin/qemu-system-s390x \
-name guest=guest,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 4096 \
--object memory-backend-ram,id=s390.ram,size=4294967296 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":4294967296}' \
-overcommit mem-lock=off \
-smp 4,sockets=4,cores=1,threads=1 \
-uuid a7ca230a-fbe0-48b8-8ea6-25836f8cbc32 \
@@ -40,7 +40,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
-vnc 127.0.0.1:0,audiodev=audio1 \
-device virtio-gpu-ccw,id=video0,max_outputs=1,devno=fe.0.0002 \
-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0006 \
--object rng-random,id=objrng0,filename=/dev/urandom \
+-object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"}' \
-device virtio-rng-ccw,rng=objrng0,id=rng0,devno=fe.0.0007 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args b/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args
index 10d632bb..3a196d8b 100644
--- a/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
/usr/bin/qemu-system-s390x \
-name guest=guest,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 4096 \
--object memory-backend-ram,id=s390.ram,size=4294967296 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":4294967296}' \
-overcommit mem-lock=off \
-smp 4,sockets=4,cores=1,threads=1 \
-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
@@ -37,7 +37,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
-device sclpconsole,chardev=charconsole0,id=console0 \
-audiodev id=audio1,driver=none \
-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0003 \
--object rng-random,id=objrng0,filename=/dev/urandom \
+-object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"}' \
-device virtio-rng-ccw,rng=objrng0,id=rng0,devno=fe.0.0004 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args b/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args
index ab65ea62..e770d3d7 100644
--- a/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args
+++ b/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args b/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args
index bbae3f05..7b6ae2c0 100644
--- a/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args
+++ b/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args b/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args
index cd076909..2a4c7d7d 100644
--- a/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args
+++ b/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
--
2.30.2
2
2
libxl objects are supposed to be initialized and disposed.
Adjust libxlMakeNic to use an already initialized object, it is owned by
the caller.
Adjust libxlMakeNicList to initialize the list of objects, before they
are filled by libxlMakeNic. In case of error the objects are disposed
by libxl_domain_config_dispose.
The usage of g_new0 is suspicious in the context of libxl because the
memory allocated via glib is released with plain free() inside libxl.
Signed-off-by: Olaf Hering <olaf(a)aepfle.de>
---
src/libxl/libxl_conf.c | 37 +++++++++++++++++--------------------
1 file changed, 17 insertions(+), 20 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 2d2aab7e66..a2e73c8b4d 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1345,8 +1345,6 @@ libxlMakeNic(virDomainDef *def,
return -1;
}
- libxl_device_nic_init(x_nic);
-
virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
/*
@@ -1532,39 +1530,38 @@ libxlMakeNicList(virDomainDef *def, libxl_domain_config *d_config)
{
virDomainNetDef **l_nics = def->nets;
size_t nnics = def->nnets;
- libxl_device_nic *x_nics;
size_t i, nvnics = 0;
-
- x_nics = g_new0(libxl_device_nic, nnics);
+ int ret = -1;
for (i = 0; i < nnics; i++) {
if (virDomainNetGetActualType(l_nics[i]) == VIR_DOMAIN_NET_TYPE_HOSTDEV)
- continue;
+ nvnics++;
+ }
+ if (!nvnics)
+ return 0;
+
+ d_config->nics = g_new0(libxl_device_nic, nvnics);
+ d_config->num_nics = nvnics;
- if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics], false))
+ for (i = 0; i < nvnics; i++)
+ libxl_device_nic_init(&d_config->nics[i]);
+
+ for (i = 0; i < nvnics; i++) {
+ if (libxlMakeNic(def, l_nics[i], &d_config->nics[i], false))
goto error;
/*
* The devid (at least right now) will not get initialized by
* libxl in the setup case but is required for starting the
* device-model.
*/
- if (x_nics[nvnics].devid < 0)
- x_nics[nvnics].devid = nvnics;
-
- nvnics++;
+ if (d_config->nics[i].devid < 0)
+ d_config->nics[i].devid = i;
}
- VIR_SHRINK_N(x_nics, nnics, nnics - nvnics);
- d_config->nics = x_nics;
- d_config->num_nics = nvnics;
-
- return 0;
+ ret = 0;
error:
- for (i = 0; i < nnics; i++)
- libxl_device_nic_dispose(&x_nics[i]);
- VIR_FREE(x_nics);
- return -1;
+ return ret;
}
int
1
1
19 May '21
In my commit of v7.1.0-rc1~376 I've simplified the logic of
handling @flags. My assumption back then was that calling
virDomainSetMemory() is equivalent to
virDomainSetMemoryFlags(flags = 0). But that is not the case,
because it is equivalent to virDomainSetMemoryFlags(flags =
VIR_DOMAIN_AFFECT_LIVE). Fix the condition that calls the old
API.
Fixes: b5e267e8c59a257652f88d034cb1e0ce1ed4b58a
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1961118
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tools/virsh-domain.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 0825f82522..bd9325a1d8 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -9025,7 +9025,7 @@ cmdSetmem(vshControl *ctl, const vshCmd *cmd)
}
kibibytes = VIR_DIV_UP(bytes, 1024);
- if (flags == 0) {
+ if (flags == VIR_DOMAIN_AFFECT_LIVE) {
if (virDomainSetMemory(dom, kibibytes) != 0)
ret = false;
} else {
--
2.26.3
5
7
18 May '21
The initial variant of libxlDomainChangeEjectableMedia could just leave
the function earlier. With refcounting this does not work anymore.
Fixes commit a5bf06ba34dbb226ac1b2fb63f5026c5d493bc65
Signed-off-by: Olaf Hering <olaf(a)aepfle.de>
---
src/libxl/libxl_driver.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 99a170ff2a..d54cd41785 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -2997,7 +2997,7 @@ libxlDomainChangeEjectableMedia(virDomainObj *vm, virDomainDiskDef *disk)
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Removable media not supported for %s device"),
virDomainDiskDeviceTypeToString(disk->device));
- return -1;
+ goto cleanup;
}
if (libxlMakeDisk(disk, &x_disk) < 0)
2
1
[libvirt PATCH 00/10] Refactor more XML parsing boilerplate code, part XI
by Tim Wiederhake 18 May '21
by Tim Wiederhake 18 May '21
18 May '21
For background, see
https://listman.redhat.com/archives/libvir-list/2021-April/msg00668.html
Tim Wiederhake (10):
virDomainHostdevDef: Change type of startupPolicy to
virDomainStartupPolicy
virDomainHostdevSubsysUSBDefParseXML: Use virXMLProp*
virDomainDeviceUSBMasterParseXML: Use virXMLProp*
virDomainDiskDef: Change type of geometry.trans to
virDomainDiskGeometryTrans
virDomainDiskDefGeometryParse: Use virXMLProp*
virDomainChrSourceReconnectDefParseXML: Use virXMLProp*
virDomainChrDefParseTargetXML: Use virXMLProp*
virDomainAudioCoreAudioParse: Use virXMLProp*
virDomainAudioOSSParse: Use virXMLProp*
virNodeDevCapPCIDevIommuGroupParseXML: Use virXMLProp*
src/conf/domain_conf.c | 168 +++++++++---------------------------
src/conf/domain_conf.h | 23 +++--
src/conf/node_device_conf.c | 15 +---
3 files changed, 52 insertions(+), 154 deletions(-)
--
2.26.3
2
12
Since Xen 4.5 libxl allows to set affinities during domain creation.
This enables Xen to allocate the domain memory on NUMA systems close to
the specified pcpus.
Libvirt can now handle <domain/cputune/vcpupin> in domU.xml correctly.
Without this change, Xen will create the domU and assign NUMA memory and
vcpu affinities on its own. Later libvirt will adjust the affinity,
which may move the vcpus away from the assigned NUMA node.
Signed-off-by: Olaf Hering <olaf(a)aepfle.de>
---
src/libxl/libxl_conf.c | 53 ++++++++++++++++++++++++++++++++++++++++
src/libxl/libxl_domain.c | 46 ----------------------------------
src/libxl/libxl_domain.h | 4 ---
3 files changed, 53 insertions(+), 50 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 6392d7795d..2a99626f92 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -283,6 +283,56 @@ libxlMakeChrdevStr(virDomainChrDef *def, char **buf)
return 0;
}
+static int
+libxlSetVcpuAffinities(virDomainDef *def,
+ libxl_ctx *ctx,
+ libxl_domain_build_info *b_info)
+{
+ libxl_bitmap *vcpu_affinity_array;
+ unsigned int vcpuid;
+ unsigned int vcpu_idx = 0;
+ virDomainVcpuDef *vcpu;
+ bool has_vcpu_pin = false;
+
+ /* Get highest vcpuid with cpumask */
+ for (vcpuid = 0; vcpuid < b_info->max_vcpus; vcpuid++) {
+ vcpu = virDomainDefGetVcpu(def, vcpuid);
+ if (!vcpu)
+ continue;
+ if (!vcpu->cpumask)
+ continue;
+ vcpu_idx = vcpuid;
+ has_vcpu_pin = true;
+ }
+ /* Nothing to do */
+ if (!has_vcpu_pin)
+ return 0;
+
+ /* Adjust index */
+ vcpu_idx++;
+
+ b_info->num_vcpu_hard_affinity = vcpu_idx;
+ /* Will be released by libxl_domain_config_dispose */
+ b_info->vcpu_hard_affinity = g_new0(libxl_bitmap, vcpu_idx);
+ vcpu_affinity_array = b_info->vcpu_hard_affinity;
+
+ for (vcpuid = 0; vcpuid < vcpu_idx; vcpuid++) {
+ libxl_bitmap *map = &vcpu_affinity_array[vcpuid];
+ libxl_bitmap_init(map);
+ /* libxl owns the bitmap */
+ if (libxl_cpu_bitmap_alloc(ctx, map, 0))
+ return -1;
+ vcpu = virDomainDefGetVcpu(def, vcpuid);
+ /* Apply the given mask, or allow unhandled vcpus to run anywhere */
+ if (vcpu && vcpu->cpumask)
+ virBitmapToDataBuf(vcpu->cpumask, map->map, map->size);
+ else
+ libxl_bitmap_set_any(map);
+ }
+ libxl_defbool_set(&b_info->numa_placement, false);
+ return 0;
+}
+
static int
libxlMakeDomBuildInfo(virDomainDef *def,
libxlDriverConfig *cfg,
@@ -320,6 +370,9 @@ libxlMakeDomBuildInfo(virDomainDef *def,
for (i = 0; i < virDomainDefGetVcpus(def); i++)
libxl_bitmap_set((&b_info->avail_vcpus), i);
+ if (libxlSetVcpuAffinities(def, ctx, b_info))
+ return -1;
+
switch ((virDomainClockOffsetType) clock.offset) {
case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE:
if (clock.data.variable.basis == VIR_DOMAIN_CLOCK_BASIS_LOCALTIME)
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index d78765ad84..625e04a9b0 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -967,49 +967,6 @@ libxlDomainAutoCoreDump(libxlDriverPrivate *driver,
return 0;
}
-int
-libxlDomainSetVcpuAffinities(libxlDriverPrivate *driver, virDomainObj *vm)
-{
- g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
- virDomainVcpuDef *vcpu;
- libxl_bitmap map;
- virBitmap *cpumask = NULL;
- size_t i;
- int ret = -1;
-
- libxl_bitmap_init(&map);
-
- for (i = 0; i < virDomainDefGetVcpus(vm->def); ++i) {
- vcpu = virDomainDefGetVcpu(vm->def, i);
-
- if (!vcpu->online)
- continue;
-
- if (!(cpumask = vcpu->cpumask))
- cpumask = vm->def->cpumask;
-
- if (!cpumask)
- continue;
-
- if (virBitmapToData(cpumask, &map.map, (int *)&map.size) < 0)
- goto cleanup;
-
- if (libxl_set_vcpuaffinity(cfg->ctx, vm->def->id, i, &map, NULL) != 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to pin vcpu '%zu' with libxenlight"), i);
- goto cleanup;
- }
-
- libxl_bitmap_dispose(&map); /* Also returns to freshly-init'd state */
- }
-
- ret = 0;
-
- cleanup:
- libxl_bitmap_dispose(&map);
- return ret;
-}
-
static int
libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config)
{
@@ -1460,9 +1417,6 @@ libxlDomainStart(libxlDriverPrivate *driver,
goto destroy_dom;
}
- if (libxlDomainSetVcpuAffinities(driver, vm) < 0)
- goto destroy_dom;
-
if (!start_paused) {
libxlDomainUnpauseWrapper(cfg->ctx, domid);
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h
index cbe7ba19ba..928ee8f5cd 100644
--- a/src/libxl/libxl_domain.h
+++ b/src/libxl/libxl_domain.h
@@ -124,10 +124,6 @@ int
libxlDomainAutoCoreDump(libxlDriverPrivate *driver,
virDomainObj *vm);
-int
-libxlDomainSetVcpuAffinities(libxlDriverPrivate *driver,
- virDomainObj *vm);
-
int
libxlDomainStartNew(libxlDriverPrivate *driver,
virDomainObj *vm,
3
2
*** BLURB HERE ***
Michal PrÃvoznÃk (2):
qemu_capabilities: Update QEMU_MIN_* macros
domaincapsdata: Drop expected outputs for old QEMUs
src/qemu/qemu_capabilities.c | 4 +-
.../domaincapsdata/qemu_1.5.3-q35.x86_64.xml | 142 ------------
.../domaincapsdata/qemu_1.5.3-tcg.x86_64.xml | 138 ------------
tests/domaincapsdata/qemu_1.5.3.x86_64.xml | 142 ------------
.../domaincapsdata/qemu_1.6.0-q35.x86_64.xml | 142 ------------
.../domaincapsdata/qemu_1.6.0-tcg.x86_64.xml | 138 ------------
tests/domaincapsdata/qemu_1.6.0.x86_64.xml | 142 ------------
.../domaincapsdata/qemu_1.7.0-q35.x86_64.xml | 142 ------------
.../domaincapsdata/qemu_1.7.0-tcg.x86_64.xml | 138 ------------
tests/domaincapsdata/qemu_1.7.0.x86_64.xml | 142 ------------
.../domaincapsdata/qemu_2.1.1-q35.x86_64.xml | 143 ------------
.../domaincapsdata/qemu_2.1.1-tcg.x86_64.xml | 139 ------------
tests/domaincapsdata/qemu_2.1.1.x86_64.xml | 143 ------------
.../domaincapsdata/qemu_2.10.0-q35.x86_64.xml | 172 ---------------
.../domaincapsdata/qemu_2.10.0-tcg.x86_64.xml | 187 ----------------
.../qemu_2.10.0-virt.aarch64.xml | 151 -------------
tests/domaincapsdata/qemu_2.10.0.aarch64.xml | 145 ------------
tests/domaincapsdata/qemu_2.10.0.ppc64.xml | 117 ----------
tests/domaincapsdata/qemu_2.10.0.s390x.xml | 206 ------------------
tests/domaincapsdata/qemu_2.10.0.x86_64.xml | 172 ---------------
20 files changed, 2 insertions(+), 2843 deletions(-)
delete mode 100644 tests/domaincapsdata/qemu_1.5.3-q35.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.5.3-tcg.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.5.3.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.6.0-q35.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.6.0-tcg.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.6.0.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.7.0-q35.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.7.0-tcg.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_1.7.0.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.1.1-q35.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.1.1-tcg.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.1.1.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0-q35.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0-tcg.x86_64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0-virt.aarch64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0.aarch64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0.ppc64.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0.s390x.xml
delete mode 100644 tests/domaincapsdata/qemu_2.10.0.x86_64.xml
--
2.26.3
2
3
[PATCH libvirt v1] tests: add capabilities for QEMU 6.0.0 on s390x
by Shalini Chellathurai Saroja 18 May '21
by Shalini Chellathurai Saroja 18 May '21
18 May '21
Add replies and xml files for QEMU 6.0.0 on s390x.
Signed-off-by: Shalini Chellathurai Saroja <shalini(a)linux.ibm.com>
---
The replies file is removed from this patch and is available in
https://gitlab.com/shalinichellathurai/libvirt/-/commit/ad5883c66c80e9945be…
tests/domaincapsdata/qemu_6.0.0.s390x.xml | 238 +
.../caps_6.0.0.s390x.replies | 27084 ++++++++++++++++
.../qemucapabilitiesdata/caps_6.0.0.s390x.xml | 3304 ++
...default-video-type-s390x.s390x-latest.args | 6 +-
.../disk-error-policy-s390x.s390x-latest.args | 4 +-
.../fs9p-ccw.s390x-latest.args | 4 +-
...tdev-subsys-mdev-vfio-ap.s390x-latest.args | 4 +-
...ubsys-mdev-vfio-ccw-boot.s390x-latest.args | 4 +-
...othreads-virtio-scsi-ccw.s390x-latest.args | 8 +-
...t-cpu-kvm-ccw-virtio-2.7.s390x-latest.args | 4 +-
...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 6 +-
...t-cpu-tcg-ccw-virtio-2.7.s390x-latest.args | 4 +-
...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 4 +-
.../s390x-ccw-graphics.s390x-latest.args | 6 +-
.../s390x-ccw-headless.s390x-latest.args | 6 +-
.../vhost-vsock-ccw-auto.s390x-latest.args | 4 +-
.../vhost-vsock-ccw-iommu.s390x-latest.args | 4 +-
.../vhost-vsock-ccw.s390x-latest.args | 4 +-
18 files changed, 30662 insertions(+), 36 deletions(-)
create mode 100644 tests/domaincapsdata/qemu_6.0.0.s390x.xml
create mode 100644 tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies
create mode 100644 tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
diff --git a/tests/domaincapsdata/qemu_6.0.0.s390x.xml b/tests/domaincapsdata/qemu_6.0.0.s390x.xml
new file mode 100644
index 00000000..d3d16d60
--- /dev/null
+++ b/tests/domaincapsdata/qemu_6.0.0.s390x.xml
@@ -0,0 +1,238 @@
+<domainCapabilities>
+ <path>/usr/bin/qemu-system-s390x</path>
+ <domain>kvm</domain>
+ <machine>s390-ccw-virtio-6.0</machine>
+ <arch>s390x</arch>
+ <vcpu max='248'/>
+ <iothreads supported='yes'/>
+ <os supported='yes'>
+ <enum name='firmware'/>
+ <loader supported='yes'>
+ <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
+ <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
+ <value>/usr/share/OVMF/OVMF_CODE.fd</value>
+ <enum name='type'>
+ <value>rom</value>
+ <value>pflash</value>
+ </enum>
+ <enum name='readonly'>
+ <value>yes</value>
+ <value>no</value>
+ </enum>
+ <enum name='secure'>
+ <value>no</value>
+ </enum>
+ </loader>
+ </os>
+ <cpu>
+ <mode name='host-passthrough' supported='yes'>
+ <enum name='hostPassthroughMigratable'>
+ <value>off</value>
+ </enum>
+ </mode>
+ <mode name='maximum' supported='yes'>
+ <enum name='maximumMigratable'>
+ <value>on</value>
+ <value>off</value>
+ </enum>
+ </mode>
+ <mode name='host-model' supported='yes'>
+ <model fallback='forbid'>gen15a-base</model>
+ <feature policy='require' name='aen'/>
+ <feature policy='require' name='cmmnt'/>
+ <feature policy='require' name='vxpdeh'/>
+ <feature policy='require' name='aefsi'/>
+ <feature policy='require' name='diag318'/>
+ <feature policy='require' name='csske'/>
+ <feature policy='require' name='mepoch'/>
+ <feature policy='require' name='msa9'/>
+ <feature policy='require' name='msa8'/>
+ <feature policy='require' name='msa7'/>
+ <feature policy='require' name='msa6'/>
+ <feature policy='require' name='msa5'/>
+ <feature policy='require' name='msa4'/>
+ <feature policy='require' name='msa3'/>
+ <feature policy='require' name='msa2'/>
+ <feature policy='require' name='msa1'/>
+ <feature policy='require' name='sthyi'/>
+ <feature policy='require' name='edat'/>
+ <feature policy='require' name='ri'/>
+ <feature policy='require' name='deflate'/>
+ <feature policy='require' name='edat2'/>
+ <feature policy='require' name='etoken'/>
+ <feature policy='require' name='vx'/>
+ <feature policy='require' name='ipter'/>
+ <feature policy='require' name='mepochptff'/>
+ <feature policy='require' name='ap'/>
+ <feature policy='require' name='vxeh'/>
+ <feature policy='require' name='vxpd'/>
+ <feature policy='require' name='esop'/>
+ <feature policy='require' name='msa9_pckmo'/>
+ <feature policy='require' name='vxeh2'/>
+ <feature policy='require' name='esort'/>
+ <feature policy='require' name='apqi'/>
+ <feature policy='require' name='apft'/>
+ <feature policy='require' name='els'/>
+ <feature policy='require' name='iep'/>
+ <feature policy='require' name='apqci'/>
+ <feature policy='require' name='cte'/>
+ <feature policy='require' name='ais'/>
+ <feature policy='require' name='bpb'/>
+ <feature policy='require' name='gs'/>
+ <feature policy='require' name='ppa15'/>
+ <feature policy='require' name='zpci'/>
+ <feature policy='require' name='sea_esop2'/>
+ <feature policy='require' name='te'/>
+ <feature policy='require' name='cmm'/>
+ </mode>
+ <mode name='custom' supported='yes'>
+ <model usable='yes'>z800-base</model>
+ <model usable='yes'>z890.2-base</model>
+ <model usable='yes'>z9EC.2</model>
+ <model usable='yes'>z13.2</model>
+ <model usable='yes'>z9BC-base</model>
+ <model usable='yes'>z990.5-base</model>
+ <model usable='yes'>z890.2</model>
+ <model usable='yes'>z890</model>
+ <model usable='yes'>z9BC</model>
+ <model usable='yes'>z13</model>
+ <model usable='yes'>z196</model>
+ <model usable='yes'>z13s</model>
+ <model usable='yes'>z990.3</model>
+ <model usable='yes'>z13s-base</model>
+ <model usable='yes'>z9EC</model>
+ <model usable='yes'>gen15a</model>
+ <model usable='yes'>z14ZR1-base</model>
+ <model usable='yes'>z14.2-base</model>
+ <model usable='yes'>z900.3-base</model>
+ <model usable='yes'>z13.2-base</model>
+ <model usable='yes'>z196.2-base</model>
+ <model usable='yes'>zBC12-base</model>
+ <model usable='yes'>z9BC.2-base</model>
+ <model usable='yes'>z900.2-base</model>
+ <model usable='yes'>z9EC.3</model>
+ <model usable='yes'>zEC12</model>
+ <model usable='yes'>z900</model>
+ <model usable='yes'>z114-base</model>
+ <model usable='yes'>zEC12-base</model>
+ <model usable='yes'>z10EC.2</model>
+ <model usable='yes'>z10EC-base</model>
+ <model usable='yes'>z900.3</model>
+ <model usable='yes'>z14ZR1</model>
+ <model usable='yes'>z10BC</model>
+ <model usable='yes'>z10BC.2-base</model>
+ <model usable='yes'>z9BC.2</model>
+ <model usable='yes'>z990</model>
+ <model usable='yes'>z990.2</model>
+ <model usable='yes'>z14</model>
+ <model usable='yes'>gen15b-base</model>
+ <model usable='yes'>z990.4</model>
+ <model usable='yes'>max</model>
+ <model usable='yes'>z990.2-base</model>
+ <model usable='yes'>z10EC.2-base</model>
+ <model usable='yes'>gen15a-base</model>
+ <model usable='yes'>z800</model>
+ <model usable='yes'>z10EC</model>
+ <model usable='yes'>zEC12.2</model>
+ <model usable='yes'>z900-base</model>
+ <model usable='yes'>z10BC.2</model>
+ <model usable='yes'>z9EC-base</model>
+ <model usable='yes'>z9EC.3-base</model>
+ <model usable='yes'>z114</model>
+ <model usable='yes'>z890.3</model>
+ <model usable='yes'>z196-base</model>
+ <model usable='yes'>z9EC.2-base</model>
+ <model usable='yes'>z196.2</model>
+ <model usable='yes'>z14.2</model>
+ <model usable='yes'>z990-base</model>
+ <model usable='yes'>z900.2</model>
+ <model usable='yes'>z890-base</model>
+ <model usable='yes'>z10EC.3</model>
+ <model usable='yes'>z14-base</model>
+ <model usable='yes'>z990.4-base</model>
+ <model usable='yes'>z10EC.3-base</model>
+ <model usable='yes'>z10BC-base</model>
+ <model usable='yes'>z13-base</model>
+ <model usable='yes'>z990.3-base</model>
+ <model usable='yes'>zEC12.2-base</model>
+ <model usable='yes'>zBC12</model>
+ <model usable='yes'>z890.3-base</model>
+ <model usable='yes'>z990.5</model>
+ <model usable='yes'>gen15b</model>
+ <model usable='yes'>qemu</model>
+ </mode>
+ </cpu>
+ <devices>
+ <disk supported='yes'>
+ <enum name='diskDevice'>
+ <value>disk</value>
+ <value>cdrom</value>
+ <value>floppy</value>
+ <value>lun</value>
+ </enum>
+ <enum name='bus'>
+ <value>fdc</value>
+ <value>scsi</value>
+ <value>virtio</value>
+ </enum>
+ <enum name='model'>
+ <value>virtio</value>
+ <value>virtio-transitional</value>
+ <value>virtio-non-transitional</value>
+ </enum>
+ </disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>egl-headless</value>
+ </enum>
+ </graphics>
+ <video supported='yes'>
+ <enum name='modelType'>
+ <value>virtio</value>
+ <value>none</value>
+ </enum>
+ </video>
+ <hostdev supported='yes'>
+ <enum name='mode'>
+ <value>subsystem</value>
+ </enum>
+ <enum name='startupPolicy'>
+ <value>default</value>
+ <value>mandatory</value>
+ <value>requisite</value>
+ <value>optional</value>
+ </enum>
+ <enum name='subsysType'>
+ <value>pci</value>
+ <value>scsi</value>
+ </enum>
+ <enum name='capsType'/>
+ <enum name='pciBackend'>
+ <value>default</value>
+ <value>vfio</value>
+ </enum>
+ </hostdev>
+ <rng supported='yes'>
+ <enum name='model'>
+ <value>virtio</value>
+ <value>virtio-transitional</value>
+ <value>virtio-non-transitional</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>random</value>
+ <value>egd</value>
+ <value>builtin</value>
+ </enum>
+ </rng>
+ </devices>
+ <features>
+ <gic supported='no'/>
+ <vmcoreinfo supported='no'/>
+ <genid supported='no'/>
+ <backingStoreInput supported='yes'/>
+ <backup supported='no'/>
+ <sev supported='no'/>
+ </features>
+</domainCapabilities>
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies
new file mode 100644
index 00000000..80705749
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.replies
@@ -0,0 +1,27084 @@
[...]
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
new file mode 100644
index 00000000..f3fff17d
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
@@ -0,0 +1,3304 @@
+<qemuCaps>
+ <emulator>/usr/bin/qemu-system-s390x</emulator>
+ <qemuctime>0</qemuctime>
+ <selfctime>0</selfctime>
+ <selfvers>0</selfvers>
+ <flag name='kvm'/>
+ <flag name='virtio-tx-alg'/>
+ <flag name='virtio-blk-pci.ioeventfd'/>
+ <flag name='virtio-blk-pci.event_idx'/>
+ <flag name='virtio-net-pci.event_idx'/>
+ <flag name='usb-redir'/>
+ <flag name='virtio-blk-pci.scsi'/>
+ <flag name='scsi-disk.channel'/>
+ <flag name='scsi-block'/>
+ <flag name='dump-guest-memory'/>
+ <flag name='virtio-scsi-pci'/>
+ <flag name='blockio'/>
+ <flag name='usb-redir.filter'/>
+ <flag name='scsi-disk.wwn'/>
+ <flag name='seccomp-sandbox'/>
+ <flag name='reboot-timeout'/>
+ <flag name='vnc'/>
+ <flag name='s390-sclp'/>
+ <flag name='nbd-server'/>
+ <flag name='virtio-rng'/>
+ <flag name='rng-random'/>
+ <flag name='rng-egd'/>
+ <flag name='virtio-ccw'/>
+ <flag name='pci-bridge'/>
+ <flag name='vfio-pci'/>
+ <flag name='mem-merge'/>
+ <flag name='drive-discard'/>
+ <flag name='boot-strict'/>
+ <flag name='msg-timestamp'/>
+ <flag name='active-commit'/>
+ <flag name='change-backing-file'/>
+ <flag name='memory-backend-ram'/>
+ <flag name='numa'/>
+ <flag name='memory-backend-file'/>
+ <flag name='splash-timeout'/>
+ <flag name='iothread'/>
+ <flag name='migrate-rdma'/>
+ <flag name='drive-iotune-max'/>
+ <flag name='aes-key-wrap'/>
+ <flag name='dea-key-wrap'/>
+ <flag name='migration-event'/>
+ <flag name='virtio-net'/>
+ <flag name='incoming-defer'/>
+ <flag name='virtio-gpu'/>
+ <flag name='virtio-gpu.virgl'/>
+ <flag name='virtio-keyboard'/>
+ <flag name='virtio-mouse'/>
+ <flag name='virtio-tablet'/>
+ <flag name='virtio-input-host'/>
+ <flag name='chardev-file-append'/>
+ <flag name='vserport-change-event'/>
+ <flag name='virtio-balloon-pci.deflate-on-oom'/>
+ <flag name='chardev-logfile'/>
+ <flag name='debug-threads'/>
+ <flag name='secret'/>
+ <flag name='virtio-scsi-pci.iothread'/>
+ <flag name='name-guest'/>
+ <flag name='drive-detect-zeroes'/>
+ <flag name='tls-creds-x509'/>
+ <flag name='virtio-pci-disable-legacy'/>
+ <flag name='query-hotpluggable-cpus'/>
+ <flag name='virtio-net.rx_queue_size'/>
+ <flag name='drive-iotune-max-length'/>
+ <flag name='gluster.debug_level'/>
+ <flag name='vhost-scsi'/>
+ <flag name='drive-iotune-group'/>
+ <flag name='query-cpu-model-expansion'/>
+ <flag name='virtio-net.host_mtu'/>
+ <flag name='query-cpu-definitions'/>
+ <flag name='block-write-threshold'/>
+ <flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='virtio.iommu_platform'/>
+ <flag name='virtio.ats'/>
+ <flag name='loadparm'/>
+ <flag name='vnc-multi-servers'/>
+ <flag name='virtio-net.tx_queue_size'/>
+ <flag name='chardev-reconnect'/>
+ <flag name='virtio-gpu.max_outputs'/>
+ <flag name='virtio-blk.num-queues'/>
+ <flag name='sclplmconsole'/>
+ <flag name='disk-share-rw'/>
+ <flag name='iscsi.password-secret'/>
+ <flag name='dump-completed'/>
+ <flag name='virtio-keyboard-ccw'/>
+ <flag name='virtio-mouse-ccw'/>
+ <flag name='virtio-tablet-ccw'/>
+ <flag name='qcow2-luks'/>
+ <flag name='seccomp-blacklist'/>
+ <flag name='query-cpus-fast'/>
+ <flag name='disk-write-cache'/>
+ <flag name='nbd-tls'/>
+ <flag name='pr-manager-helper'/>
+ <flag name='qom-list-properties'/>
+ <flag name='memory-backend-file.discard-data'/>
+ <flag name='virtual-css-bridge'/>
+ <flag name='virtual-css-bridge.cssid-unrestricted'/>
+ <flag name='vfio-ccw'/>
+ <flag name='screendump_device'/>
+ <flag name='blockdev-del'/>
+ <flag name='vhost-vsock'/>
+ <flag name='chardev-fd-pass'/>
+ <flag name='vfio-pci.display'/>
+ <flag name='blockdev'/>
+ <flag name='vfio-ap'/>
+ <flag name='zpci'/>
+ <flag name='memory-backend-memfd'/>
+ <flag name='memory-backend-memfd.hugetlb'/>
+ <flag name='iothread.poll-max-ns'/>
+ <flag name='egl-headless.rendernode'/>
+ <flag name='memory-backend-file.align'/>
+ <flag name='scsi-disk.device_id'/>
+ <flag name='virtio-pci-non-transitional'/>
+ <flag name='overcommit'/>
+ <flag name='query-current-machine'/>
+ <flag name='bitmap-merge'/>
+ <flag name='nbd-bitmap'/>
+ <flag name='migration-file-drop-cache'/>
+ <flag name='dbus-vmstate'/>
+ <flag name='vhost-user-gpu'/>
+ <flag name='query-cpu-model-baseline'/>
+ <flag name='query-cpu-model-comparison'/>
+ <flag name='blockdev-file-dynamic-auto-read-only'/>
+ <flag name='savevm-monitor-nodes'/>
+ <flag name='drive-nvme'/>
+ <flag name='smp-dies'/>
+ <flag name='rng-builtin'/>
+ <flag name='virtio-net.failover'/>
+ <flag name='vhost-user-fs'/>
+ <flag name='query-named-block-nodes.flat'/>
+ <flag name='blockdev-snapshot.allow-write-only-overlay'/>
+ <flag name='storage.werror'/>
+ <flag name='fsdev.multidevs'/>
+ <flag name='virtio.packed'/>
+ <flag name='aio.io_uring'/>
+ <flag name='tcg'/>
+ <flag name='virtio-blk-pci.scsi.default.disabled'/>
+ <flag name='fw_cfg'/>
+ <flag name='migration-param.bandwidth'/>
+ <flag name='migration-param.downtime'/>
+ <flag name='migration-param.xbzrle-cache-size'/>
+ <flag name='numa.hmat'/>
+ <flag name='blockdev-hostdev-scsi'/>
+ <flag name='virtio-balloon.free-page-reporting'/>
+ <flag name='block-export-add'/>
+ <flag name='netdev.vhost-vdpa'/>
+ <flag name='fsdev.createmode'/>
+ <flag name='vhost-user-fs.bootindex'/>
+ <flag name='vhost-user-blk'/>
+ <flag name='cpu-max'/>
+ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/>
+ <flag name='vnc-opts'/>
+ <flag name='migration-param.block-bitmap-mapping'/>
+ <flag name='vnc-power-control'/>
+ <flag name='audiodev'/>
+ <flag name='blockdev-backup'/>
+ <flag name='object.qapified'/>
+ <flag name='rotation-rate'/>
+ <flag name='compat-deprecated'/>
+ <flag name='acpi-index'/>
+ <version>6000000</version>
+ <kvmVersion>0</kvmVersion>
+ <microcodeVersion>39100242</microcodeVersion>
+ <package>qemu-6.0.0-20210506.0.0c7ba01a2f.fc33</package>
+ <arch>s390x</arch>
+ <hostCPU type='kvm' model='gen15a-base' migratability='no'>
+ <property name='aen' type='boolean' value='true'/>
+ <property name='cmmnt' type='boolean' value='true'/>
+ <property name='vxpdeh' type='boolean' value='true'/>
+ <property name='aefsi' type='boolean' value='true'/>
+ <property name='diag318' type='boolean' value='true'/>
+ <property name='csske' type='boolean' value='true'/>
+ <property name='mepoch' type='boolean' value='true'/>
+ <property name='msa9' type='boolean' value='true'/>
+ <property name='msa8' type='boolean' value='true'/>
+ <property name='msa7' type='boolean' value='true'/>
+ <property name='msa6' type='boolean' value='true'/>
+ <property name='msa5' type='boolean' value='true'/>
+ <property name='msa4' type='boolean' value='true'/>
+ <property name='msa3' type='boolean' value='true'/>
+ <property name='msa2' type='boolean' value='true'/>
+ <property name='msa1' type='boolean' value='true'/>
+ <property name='sthyi' type='boolean' value='true'/>
+ <property name='edat' type='boolean' value='true'/>
+ <property name='ri' type='boolean' value='true'/>
+ <property name='deflate' type='boolean' value='true'/>
+ <property name='edat2' type='boolean' value='true'/>
+ <property name='etoken' type='boolean' value='true'/>
+ <property name='vx' type='boolean' value='true'/>
+ <property name='ipter' type='boolean' value='true'/>
+ <property name='mepochptff' type='boolean' value='true'/>
+ <property name='ap' type='boolean' value='true'/>
+ <property name='vxeh' type='boolean' value='true'/>
+ <property name='vxpd' type='boolean' value='true'/>
+ <property name='esop' type='boolean' value='true'/>
+ <property name='msa9_pckmo' type='boolean' value='true'/>
+ <property name='vxeh2' type='boolean' value='true'/>
+ <property name='esort' type='boolean' value='true'/>
+ <property name='apqi' type='boolean' value='true'/>
+ <property name='apft' type='boolean' value='true'/>
+ <property name='els' type='boolean' value='true'/>
+ <property name='iep' type='boolean' value='true'/>
+ <property name='apqci' type='boolean' value='true'/>
+ <property name='cte' type='boolean' value='true'/>
+ <property name='ais' type='boolean' value='true'/>
+ <property name='bpb' type='boolean' value='true'/>
+ <property name='gs' type='boolean' value='true'/>
+ <property name='ppa15' type='boolean' value='true'/>
+ <property name='zpci' type='boolean' value='true'/>
+ <property name='sea_esop2' type='boolean' value='true'/>
+ <property name='te' type='boolean' value='true'/>
+ <property name='cmm' type='boolean' value='true'/>
+ </hostCPU>
+ <cpu type='kvm' name='z800-base' typename='z800-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.2-base' typename='z890.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.2' typename='z9EC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13.2' typename='z13.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC-base' typename='z9BC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.5-base' typename='z990.5-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.2' typename='z890.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890' typename='z890-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC' typename='z9BC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13' typename='z13-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196' typename='z196-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13s' typename='z13s-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='host' typename='host-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.3' typename='z990.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13s-base' typename='z13s-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC' typename='z9EC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15a' typename='gen15a-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14ZR1-base' typename='z14ZR1-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14.2-base' typename='z14.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.3-base' typename='z900.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13.2-base' typename='z13.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196.2-base' typename='z196.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zBC12-base' typename='zBC12-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC.2-base' typename='z9BC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.2-base' typename='z900.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.3' typename='z9EC.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12' typename='zEC12-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900' typename='z900-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z114-base' typename='z114-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12-base' typename='zEC12-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.2' typename='z10EC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC-base' typename='z10EC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.3' typename='z900.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14ZR1' typename='z14ZR1-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC' typename='z10BC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC.2-base' typename='z10BC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9BC.2' typename='z9BC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990' typename='z990-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.2' typename='z990.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14' typename='z14-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15b-base' typename='gen15b-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.4' typename='z990.4-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='max' typename='max-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.2-base' typename='z990.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.2-base' typename='z10EC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15a-base' typename='gen15a-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z800' typename='z800-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC' typename='z10EC-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12.2' typename='zEC12.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900-base' typename='z900-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC.2' typename='z10BC.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC-base' typename='z9EC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.3-base' typename='z9EC.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z114' typename='z114-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.3' typename='z890.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196-base' typename='z196-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z9EC.2-base' typename='z9EC.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z196.2' typename='z196.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14.2' typename='z14.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990-base' typename='z990-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z900.2' typename='z900.2-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890-base' typename='z890-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.3' typename='z10EC.3-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z14-base' typename='z14-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.4-base' typename='z990.4-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10EC.3-base' typename='z10EC.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z10BC-base' typename='z10BC-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z13-base' typename='z13-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.3-base' typename='z990.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zEC12.2-base' typename='zEC12.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='zBC12' typename='zBC12-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z890.3-base' typename='z890.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='z990.5' typename='z990.5-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='gen15b' typename='gen15b-s390x-cpu' usable='yes'/>
+ <cpu type='kvm' name='qemu' typename='qemu-s390x-cpu' usable='yes'/>
+ <machine type='kvm' name='s390-ccw-virtio-6.0' alias='s390-ccw-virtio' hotplugCpus='yes' maxCpus='248' default='yes' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-4.0' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-5.2' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-3.1' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.6' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.12' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.9' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-5.1' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-3.0' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-4.2' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.5' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.11' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.8' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-5.0' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-4.1' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.4' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.10' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='kvm' name='s390-ccw-virtio-2.7' hotplugCpus='yes' maxCpus='248' defaultCPU='host-s390x-cpu' defaultRAMid='s390.ram'/>
+ <hostCPU type='tcg' model='z13.2-base' migratability='no'>
+ <property name='dateh2' type='boolean' value='false'/>
+ <property name='aen' type='boolean' value='true'/>
+ <property name='gen13ptff' type='boolean' value='false'/>
+ <property name='kmac-tdea-192' type='boolean' value='false'/>
+ <property name='kmc-tdea-192' type='boolean' value='false'/>
+ <property name='parseh' type='boolean' value='false'/>
+ <property name='aefsi' type='boolean' value='true'/>
+ <property name='csske' type='boolean' value='false'/>
+ <property name='hfpm' type='boolean' value='false'/>
+ <property name='hfpue' type='boolean' value='false'/>
+ <property name='dfp' type='boolean' value='false'/>
+ <property name='km-dea' type='boolean' value='false'/>
+ <property name='vx' type='boolean' value='true'/>
+ <property name='emon' type='boolean' value='false'/>
+ <property name='kimd-sha-1' type='boolean' value='false'/>
+ <property name='cmpsceh' type='boolean' value='false'/>
+ <property name='dfppc' type='boolean' value='false'/>
+ <property name='dfpzc' type='boolean' value='false'/>
+ <property name='dfphp' type='boolean' value='false'/>
+ <property name='kmc-dea' type='boolean' value='false'/>
+ <property name='klmd-sha-1' type='boolean' value='false'/>
+ <property name='asnlxr' type='boolean' value='false'/>
+ <property name='minste2' type='boolean' value='true'/>
+ <property name='esop' type='boolean' value='true'/>
+ <property name='km-tdea-192' type='boolean' value='false'/>
+ <property name='km-tdea-128' type='boolean' value='false'/>
+ <property name='kmac-dea' type='boolean' value='false'/>
+ <property name='iep' type='boolean' value='true'/>
+ <property name='kmc-tdea-128' type='boolean' value='false'/>
+ <property name='ais' type='boolean' value='true'/>
+ <property name='kmac-tdea-128' type='boolean' value='false'/>
+ <property name='zpci' type='boolean' value='true'/>
+ <property name='nonqks' type='boolean' value='false'/>
+ <property name='sea_esop2' type='boolean' value='true'/>
+ <property name='pfpo' type='boolean' value='false'/>
+ <property name='msa8-base' type='boolean' value='true'/>
+ <property name='msa4-base' type='boolean' value='true'/>
+ <property name='msa3-base' type='boolean' value='true'/>
+ <property name='msa5-base' type='boolean' value='true'/>
+ <property name='tods' type='boolean' value='false'/>
+ </hostCPU>
+ <cpu type='tcg' name='z800-base' typename='z800-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z890.2-base' typename='z890.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.2' typename='z9EC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13.2' typename='z13.2-s390x-cpu' usable='no'>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC-base' typename='z9BC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990.5-base' typename='z990.5-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z890.2' typename='z890.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z890' typename='z890-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC' typename='z9BC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13' typename='z13-s390x-cpu' usable='no'>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z196' typename='z196-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='sthyi'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13s' typename='z13s-s390x-cpu' usable='no'>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='host' typename='host-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z990.3' typename='z990.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z13s-base' typename='z13s-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC' typename='z9EC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='gen15a' typename='gen15a-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='etoken'/>
+ <blocker name='vxpdeh'/>
+ <blocker name='vxeh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='deflate'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa9_pckmo'/>
+ <blocker name='msa9'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z14ZR1-base' typename='z14ZR1-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z14.2-base' typename='z14.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z900.3-base' typename='z900.3-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z13.2-base' typename='z13.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z196.2-base' typename='z196.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zBC12-base' typename='zBC12-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC.2-base' typename='z9BC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900.2-base' typename='z900.2-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z9EC.3' typename='z9EC.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12' typename='zEC12-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900' typename='z900-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z114-base' typename='z114-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12-base' typename='zEC12-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.2' typename='z10EC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC-base' typename='z10EC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900.3' typename='z900.3-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z14ZR1' typename='z14ZR1-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC' typename='z10BC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC.2-base' typename='z10BC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC.2' typename='z9BC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990' typename='z990-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z990.2' typename='z990.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z14' typename='z14-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='gen15b-base' typename='gen15b-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.4' typename='z990.4-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='max' typename='max-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z990.2-base' typename='z990.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.2-base' typename='z10EC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='gen15a-base' typename='gen15a-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z800' typename='z800-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z10EC' typename='z10EC-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12.2' typename='zEC12.2-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z900-base' typename='z900-base-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z10BC.2' typename='z10BC.2-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC-base' typename='z9EC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.3-base' typename='z9EC.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z114' typename='z114-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='sthyi'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z890.3' typename='z890.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z196-base' typename='z196-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.2-base' typename='z9EC.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z196.2' typename='z196.2-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='sthyi'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z14.2' typename='z14.2-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990-base' typename='z990-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z900.2' typename='z900.2-s390x-cpu' usable='yes'/>
+ <cpu type='tcg' name='z890-base' typename='z890-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.3' typename='z10EC.3-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z14-base' typename='z14-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.4-base' typename='z990.4-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.3-base' typename='z10EC.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC-base' typename='z10BC-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z13-base' typename='z13-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z990.3-base' typename='z990.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12.2-base' typename='zEC12.2-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='dateh2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='asnlxr'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='zBC12' typename='zBC12-s390x-cpu' usable='no'>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='bpb'/>
+ <blocker name='ppa15'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='tods'/>
+ </cpu>
+ <cpu type='tcg' name='z890.3-base' typename='z890.3-base-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='z990.5' typename='z990.5-s390x-cpu' usable='no'>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='hfpm'/>
+ </cpu>
+ <cpu type='tcg' name='gen15b' typename='gen15b-s390x-cpu' usable='no'>
+ <blocker name='kma-gcm-eaes-256'/>
+ <blocker name='kma-gcm-eaes-192'/>
+ <blocker name='kma-gcm-eaes-128'/>
+ <blocker name='kma-gcm-aes-256'/>
+ <blocker name='kma-gcm-aes-192'/>
+ <blocker name='kma-gcm-aes-128'/>
+ <blocker name='ppno-sha-512-drng'/>
+ <blocker name='pcc-xts-eaes-256'/>
+ <blocker name='pcc-xts-eaes-128'/>
+ <blocker name='pcc-xts-aes-256'/>
+ <blocker name='pcc-xts-aes-128'/>
+ <blocker name='pcc-cmac-eaes-256'/>
+ <blocker name='pcc-cmac-eaes-192'/>
+ <blocker name='pcc-cmac-eaes-128'/>
+ <blocker name='pcc-cmac-aes-256'/>
+ <blocker name='pcc-cmac-aes-192'/>
+ <blocker name='pcc-cmac-aes-128'/>
+ <blocker name='pcc-cmac-etdea-192'/>
+ <blocker name='pcc-cmac-etdea-128'/>
+ <blocker name='pcc-cmac-edea'/>
+ <blocker name='pcc-cmac-tdea-192'/>
+ <blocker name='pcc-cmac-tdea-128'/>
+ <blocker name='pcc-cmac-dea'/>
+ <blocker name='kmo-eaes-256'/>
+ <blocker name='kmo-eaes-192'/>
+ <blocker name='kmo-eaes-128'/>
+ <blocker name='kmo-aes-256'/>
+ <blocker name='kmo-aes-192'/>
+ <blocker name='kmo-aes-128'/>
+ <blocker name='kmo-etdea-192'/>
+ <blocker name='kmo-etdea-128'/>
+ <blocker name='kmo-edea'/>
+ <blocker name='kmo-tdea-192'/>
+ <blocker name='kmo-tdea-128'/>
+ <blocker name='kmo-dea'/>
+ <blocker name='kmf-eaes-256'/>
+ <blocker name='kmf-eaes-192'/>
+ <blocker name='kmf-eaes-128'/>
+ <blocker name='kmf-aes-256'/>
+ <blocker name='kmf-aes-192'/>
+ <blocker name='kmf-aes-128'/>
+ <blocker name='kmf-etdea-192'/>
+ <blocker name='kmf-etdea-128'/>
+ <blocker name='kmf-edea'/>
+ <blocker name='kmf-tdea-192'/>
+ <blocker name='kmf-tdea-128'/>
+ <blocker name='kmf-dea'/>
+ <blocker name='kmctr-eaes-256'/>
+ <blocker name='kmctr-eaes-192'/>
+ <blocker name='kmctr-eaes-128'/>
+ <blocker name='kmctr-aes-256'/>
+ <blocker name='kmctr-aes-192'/>
+ <blocker name='kmctr-aes-128'/>
+ <blocker name='kmctr-etdea-192'/>
+ <blocker name='kmctr-etdea-128'/>
+ <blocker name='kmctr-edea'/>
+ <blocker name='kmctr-tdea-192'/>
+ <blocker name='kmctr-tdea-128'/>
+ <blocker name='kmctr-dea'/>
+ <blocker name='pckmo-aes-256'/>
+ <blocker name='pckmo-aes-192'/>
+ <blocker name='pckmo-aes-128'/>
+ <blocker name='pckmo-etdea-192'/>
+ <blocker name='pckmo-etdea-128'/>
+ <blocker name='pckmo-edea'/>
+ <blocker name='klmd-sha-1'/>
+ <blocker name='kimd-ghash'/>
+ <blocker name='kimd-sha-1'/>
+ <blocker name='km-xts-eaes-256'/>
+ <blocker name='km-xts-eaes-128'/>
+ <blocker name='km-xts-aes-256'/>
+ <blocker name='km-xts-aes-128'/>
+ <blocker name='km-eaes-256'/>
+ <blocker name='km-eaes-192'/>
+ <blocker name='km-eaes-128'/>
+ <blocker name='km-etdea-192'/>
+ <blocker name='km-etdea-128'/>
+ <blocker name='km-edea'/>
+ <blocker name='km-tdea-192'/>
+ <blocker name='km-tdea-128'/>
+ <blocker name='km-dea'/>
+ <blocker name='kmc-eaes-256'/>
+ <blocker name='kmc-eaes-192'/>
+ <blocker name='kmc-eaes-128'/>
+ <blocker name='kmc-etdea-192'/>
+ <blocker name='kmc-etdea-128'/>
+ <blocker name='kmc-edea'/>
+ <blocker name='kmc-tdea-192'/>
+ <blocker name='kmc-tdea-128'/>
+ <blocker name='kmc-dea'/>
+ <blocker name='kmac-eaes-256'/>
+ <blocker name='kmac-eaes-192'/>
+ <blocker name='kmac-eaes-128'/>
+ <blocker name='kmac-aes-256'/>
+ <blocker name='kmac-aes-192'/>
+ <blocker name='kmac-aes-128'/>
+ <blocker name='kmac-etdea-192'/>
+ <blocker name='kmac-etdea-128'/>
+ <blocker name='kmac-edea'/>
+ <blocker name='kmac-tdea-192'/>
+ <blocker name='kmac-tdea-128'/>
+ <blocker name='kmac-dea'/>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='etoken'/>
+ <blocker name='vxpdeh'/>
+ <blocker name='vxeh2'/>
+ <blocker name='mepoch'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='ppa15'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ri'/>
+ <blocker name='minste3'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='eec'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='opc'/>
+ <blocker name='emon'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='deflate'/>
+ <blocker name='mepochptff'/>
+ <blocker name='msa9_pckmo'/>
+ <blocker name='msa9'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='qemu' typename='qemu-s390x-cpu' usable='yes'/>
+ <machine type='tcg' name='s390-ccw-virtio-6.0' alias='s390-ccw-virtio' hotplugCpus='yes' maxCpus='248' default='yes' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-4.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-5.2' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-3.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.6' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.12' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.9' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-5.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-3.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-4.2' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.5' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.11' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.8' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-5.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-4.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.4' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.10' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+ <machine type='tcg' name='s390-ccw-virtio-2.7' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu' defaultRAMid='s390.ram'/>
+</qemuCaps>
diff --git a/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args b/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args
index 891eb605..5bb93537 100644
--- a/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args
+++ b/tests/qemuxml2argvdata/default-video-type-s390x.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-default-video-type-s/.config \
/usr/bin/qemu-system-s390x \
-name guest=default-video-type-s390x-test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-default-video-type-s/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-default-video-type-s/master-key.aes"}' \
-machine s390-ccw-virtio,accel=kvm,usb=off,dump-guest-core=off,memory-backend=s390.ram \
--cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
+-cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,diag318=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
-m 1024 \
--object memory-backend-ram,id=s390.ram,size=1073741824 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":1073741824}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f \
diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args
index 792e454f..d8101b8b 100644
--- a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args
+++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
/usr/bin/qemu-system-s390x \
-name guest=guest,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
diff --git a/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args b/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args
index 1e9c7ab9..38da926e 100644
--- a/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args
+++ b/tests/qemuxml2argvdata/fs9p-ccw.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args
index e7bac2f5..7300a4bd 100644
--- a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ap.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 512 \
--object memory-backend-ram,id=s390.ram,size=536870912 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":536870912}' \
-overcommit mem-lock=off \
-smp 2,sockets=2,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args
index dc6f54cf..3b0e2623 100644
--- a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args
+++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-boot.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 512 \
--object memory-backend-ram,id=s390.ram,size=536870912 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":536870912}' \
-overcommit mem-lock=off \
-smp 2,sockets=2,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args b/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args
index 01cee4d7..4d35ed57 100644
--- a/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args
+++ b/tests/qemuxml2argvdata/iothreads-virtio-scsi-ccw.s390x-latest.args
@@ -9,15 +9,15 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
--object iothread,id=iothread1 \
--object iothread,id=iothread2 \
+-object '{"qom-type":"iothread","id":"iothread1"}' \
+-object '{"qom-type":"iothread","id":"iothread2"}' \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-display none \
-no-user-config \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args
index b31d4fb8..6eefbb89 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-2.7.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-2.7,accel=kvm,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu host \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
index f1833d62..e20ff871 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-4.2,accel=kvm,usb=off,dump-guest-core=off,memory-backend=s390.ram \
--cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
+-cpu gen15a-base,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,diag318=on,csske=on,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,apqi=on,apft=on,els=on,iep=on,apqci=on,cte=on,ais=on,bpb=on,gs=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args
index 871b2daf..730e75bb 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-2.7.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-2.7,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args
index 85bc0492..3bfef9c5 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \
/usr/bin/qemu-system-s390x \
-name guest=test,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-test/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test/master-key.aes"}' \
-machine s390-ccw-virtio-4.2,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 256 \
--object memory-backend-ram,id=s390.ram,size=268435456 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \
diff --git a/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args b/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args
index e1485325..090399aa 100644
--- a/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390x-ccw-graphics.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
/usr/bin/qemu-system-s390x \
-name guest=guest,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 4096 \
--object memory-backend-ram,id=s390.ram,size=4294967296 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":4294967296}' \
-overcommit mem-lock=off \
-smp 4,sockets=4,cores=1,threads=1 \
-uuid a7ca230a-fbe0-48b8-8ea6-25836f8cbc32 \
@@ -40,7 +40,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
-vnc 127.0.0.1:0,audiodev=audio1 \
-device virtio-gpu-ccw,id=video0,max_outputs=1,devno=fe.0.0002 \
-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0006 \
--object rng-random,id=objrng0,filename=/dev/urandom \
+-object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"}' \
-device virtio-rng-ccw,rng=objrng0,id=rng0,devno=fe.0.0007 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args b/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args
index 10d632bb..3a196d8b 100644
--- a/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390x-ccw-headless.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
/usr/bin/qemu-system-s390x \
-name guest=guest,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 4096 \
--object memory-backend-ram,id=s390.ram,size=4294967296 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":4294967296}' \
-overcommit mem-lock=off \
-smp 4,sockets=4,cores=1,threads=1 \
-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
@@ -37,7 +37,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
-device sclpconsole,chardev=charconsole0,id=console0 \
-audiodev id=audio1,driver=none \
-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0003 \
--object rng-random,id=objrng0,filename=/dev/urandom \
+-object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"}' \
-device virtio-rng-ccw,rng=objrng0,id=rng0,devno=fe.0.0004 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args b/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args
index ab65ea62..e770d3d7 100644
--- a/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args
+++ b/tests/qemuxml2argvdata/vhost-vsock-ccw-auto.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args b/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args
index bbae3f05..7b6ae2c0 100644
--- a/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args
+++ b/tests/qemuxml2argvdata/vhost-vsock-ccw-iommu.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args b/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args
index cd076909..2a4c7d7d 100644
--- a/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args
+++ b/tests/qemuxml2argvdata/vhost-vsock-ccw.s390x-latest.args
@@ -9,11 +9,11 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-s390x \
-name guest=QEMUGuest1,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off,memory-backend=s390.ram \
-cpu qemu \
-m 214 \
--object memory-backend-ram,id=s390.ram,size=224395264 \
+-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
--
2.30.2
3
7
If this looks familiar, that's because it's literally *the
same code* that we used to work around *the same issue* in
readline before 1635dca26f61def3fbf56c70fbbfe514f2b50987 :)
Note that the issue only really affects people building from
source on Apple Silicon: on Intel, Homebrew installs header
files under directories that are part of the default search
path, which explains why our CI pipeline never ran into it.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
Roman, can you please test this? Thanks! :)
meson.build | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/meson.build b/meson.build
index 1f97842319..4f23f9104e 100644
--- a/meson.build
+++ b/meson.build
@@ -1318,6 +1318,41 @@ endif
yajl_version = '2.0.3'
yajl_dep = dependency('yajl', version: '>=' + yajl_version, required: get_option('yajl'))
if yajl_dep.found()
+ # Kludge for yajl include path on non-Linux
+ #
+ # As of 2.1.0, upstream yajl.pc has -I${includedir}/yajl among
+ # its Cflags, which is clearly wrong. This does not affect Linux
+ # because ${includedir} is already part of the default include path,
+ # but on other platforms that's not the case and the result is that
+ # <yajl/yajl.h> can't be located, causing the build to fail.
+ #
+ # Since upstream development for yajl has stopped years ago, there's
+ # little hope of this issue getting fixed by a new upstream release.
+ # Some non-Linux operating systems such as FreeBSD have elected to
+ # carry a small downstream patch, but in the case of Homebrew on
+ # macOS this approach has been rejected[1] and so we're left with no
+ # choice but to work around the issue ourselves.
+ #
+ # [1] https://github.com/Homebrew/homebrew-core/pull/74516
+ if host_machine.system() != 'linux'
+ pkg_config_prog = find_program('pkg-config')
+ rc = run_command(pkg_config_prog, '--cflags', 'yajl', check: true)
+ cflags = rc.stdout().strip()
+ if cflags.contains('include/yajl')
+ rc = run_command(
+ 'python3', '-c',
+ 'print("@0@".replace("@1@", "@2@"))'.format(
+ cflags, 'include/yajl', 'include',
+ ),
+ check: true,
+ )
+ yajl_dep = declare_dependency(
+ compile_args: rc.stdout().strip().split(),
+ dependencies: [ yajl_dep ],
+ )
+ endif
+ endif
+
conf.set('WITH_YAJL', 1)
endif
--
2.26.3
3
2
Kristina Hanicova (2):
conf: domcaps: Report device <filesystem>
qemu: capabilities: fill in domcaps <filesystem>
docs/formatdomaincaps.html.in | 28 +++++++++++++++++++
docs/schemas/domaincaps.rng | 10 +++++++
src/conf/domain_capabilities.c | 13 +++++++++
src/conf/domain_capabilities.h | 8 ++++++
src/qemu/qemu_capabilities.c | 20 +++++++++++++
src/qemu/qemu_capabilities.h | 3 ++
.../domaincapsdata/qemu_1.5.3-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_1.5.3-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_1.5.3.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_1.6.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_1.6.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_1.6.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_1.7.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_1.7.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_1.7.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.1.1-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.1.1-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.1.1.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.10.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.10.0-tcg.x86_64.xml | 7 +++++
.../qemu_2.10.0-virt.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_2.10.0.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_2.10.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_2.10.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_2.10.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.11.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.11.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.11.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_2.11.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.12.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.12.0-tcg.x86_64.xml | 7 +++++
.../qemu_2.12.0-virt.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_2.12.0.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_2.12.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_2.12.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_2.12.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.4.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.4.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.4.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.5.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.5.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.5.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.6.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.6.0-tcg.x86_64.xml | 7 +++++
.../qemu_2.6.0-virt.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_2.6.0.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_2.6.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_2.6.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.7.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.7.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.7.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_2.7.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.8.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.8.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.8.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_2.8.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.9.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_2.9.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_2.9.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_2.9.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_2.9.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_3.0.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_3.0.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_3.0.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_3.0.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_3.0.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_3.1.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_3.1.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_3.1.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_3.1.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_4.0.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_4.0.0-tcg.x86_64.xml | 7 +++++
.../qemu_4.0.0-virt.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_4.0.0.aarch64.xml | 7 +++++
tests/domaincapsdata/qemu_4.0.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_4.0.0.s390x.xml | 7 +++++
tests/domaincapsdata/qemu_4.0.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_4.1.0-q35.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_4.1.0-tcg.x86_64.xml | 7 +++++
tests/domaincapsdata/qemu_4.1.0.x86_64.xml | 7 +++++
.../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 8 ++++++
.../qemu_4.2.0-virt.aarch64.xml | 8 ++++++
tests/domaincapsdata/qemu_4.2.0.aarch64.xml | 8 ++++++
tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 7 +++++
tests/domaincapsdata/qemu_4.2.0.s390x.xml | 8 ++++++
tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_5.0.0-q35.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_5.0.0-tcg.x86_64.xml | 8 ++++++
.../qemu_5.0.0-virt.aarch64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.0.0.aarch64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.0.0.ppc64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.0.0.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_5.1.0-q35.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_5.1.0-tcg.x86_64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.1.0.sparc.xml | 7 +++++
tests/domaincapsdata/qemu_5.1.0.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_5.2.0-q35.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_5.2.0-tcg.x86_64.xml | 8 ++++++
.../qemu_5.2.0-virt.aarch64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.2.0.aarch64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.2.0.ppc64.xml | 8 ++++++
tests/domaincapsdata/qemu_5.2.0.s390x.xml | 8 ++++++
tests/domaincapsdata/qemu_5.2.0.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_6.0.0-q35.x86_64.xml | 8 ++++++
.../domaincapsdata/qemu_6.0.0-tcg.x86_64.xml | 8 ++++++
tests/domaincapsdata/qemu_6.0.0.x86_64.xml | 8 ++++++
107 files changed, 814 insertions(+)
--
2.31.1
2
4
There is a case where qemusecuritytest is skipped - on MacOS and
MinGW. In such case, EXIT_AM_SKIP should be returned. However,
my recent patch of 5d99b157bc completely missed that and made the
test return EXIT_FAILURE even though the test exited early
without performing any test case.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tests/qemusecuritytest.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/tests/qemusecuritytest.c b/tests/qemusecuritytest.c
index f7186700c4..a7e87fdf8f 100644
--- a/tests/qemusecuritytest.c
+++ b/tests/qemusecuritytest.c
@@ -143,15 +143,13 @@ mymain(void)
#endif
int ret = 0;
+ if (!virSecurityXATTRNamespaceDefined())
+ return EXIT_AM_SKIP;
+
if (virInitialize() < 0 ||
qemuTestDriverInit(&driver) < 0)
return -1;
- if (!virSecurityXATTRNamespaceDefined()) {
- ret = EXIT_AM_SKIP;
- goto cleanup;
- }
-
/* Now fix the secdriver */
virObjectUnref(driver.securityManager);
--
2.26.3
2
1
This fixes compiler warnings when building with libtasn1 4.17.0.
Signed-off-by: Luke Yue <lukedyue(a)gmail.com>
---
tests/pkix_asn1_tab.c | 2 +-
tests/virnettlshelpers.c | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/tests/pkix_asn1_tab.c b/tests/pkix_asn1_tab.c
index 5d5ca3db5d..a28d5f20c3 100644
--- a/tests/pkix_asn1_tab.c
+++ b/tests/pkix_asn1_tab.c
@@ -5,7 +5,7 @@
#include <config.h>
#include <libtasn1.h>
-const ASN1_ARRAY_TYPE pkix_asn1_tab[] = {
+const asn1_static_node pkix_asn1_tab[] = {
{ "PKIX1", 536875024, NULL },
{ NULL, 1073741836, NULL },
{ "id-pkix", 1879048204, NULL },
diff --git a/tests/virnettlshelpers.c b/tests/virnettlshelpers.c
index ce38571b0a..905e633e60 100644
--- a/tests/virnettlshelpers.c
+++ b/tests/virnettlshelpers.c
@@ -37,8 +37,8 @@ VIR_LOG_INIT("tests.nettlshelpers");
* These store some static data that is needed when
* encoding extensions in the x509 certs
*/
-ASN1_TYPE pkix_asn1;
-extern const ASN1_ARRAY_TYPE pkix_asn1_tab[];
+asn1_node pkix_asn1;
+extern const asn1_static_node pkix_asn1_tab[];
/*
* To avoid consuming random entropy to generate keys,
@@ -107,7 +107,7 @@ void testTLSCleanup(const char *keyfile)
/*
* Turns an ASN1 object into a DER encoded byte array
*/
-static void testTLSDerEncode(ASN1_TYPE src,
+static void testTLSDerEncode(asn1_node src,
const char *src_name,
gnutls_datum_t * res)
{
@@ -267,7 +267,7 @@ testTLSGenerateCert(struct testTLSCertReq *req,
* the 'critical' field which we want control over
*/
if (req->basicConstraintsEnable) {
- ASN1_TYPE ext = ASN1_TYPE_EMPTY;
+ asn1_node ext = NULL;
asn1_create_element(pkix_asn1, "PKIX1.BasicConstraints", &ext);
asn1_write_value(ext, "cA", req->basicConstraintsIsCA ? "TRUE" : "FALSE", 1);
@@ -292,7 +292,7 @@ testTLSGenerateCert(struct testTLSCertReq *req,
* to be 'critical'
*/
if (req->keyUsageEnable) {
- ASN1_TYPE ext = ASN1_TYPE_EMPTY;
+ asn1_node ext = NULL;
char str[2];
str[0] = req->keyUsageValue & 0xff;
@@ -321,7 +321,7 @@ testTLSGenerateCert(struct testTLSCertReq *req,
* set this the hard way building up ASN1 data ourselves
*/
if (req->keyPurposeEnable) {
- ASN1_TYPE ext = ASN1_TYPE_EMPTY;
+ asn1_node ext = NULL;
asn1_create_element(pkix_asn1, "PKIX1.ExtKeyUsageSyntax", &ext);
if (req->keyPurposeOID1) {
--
2.31.1
2
1
The Xen-related unit tests are failing against the recently released
Xen 4.15. Xen commit 90c9f9f4dd changed the implementation of
libxl_ctx_alloc to use xs_open instead of xs_daemon_open. libvirt has
already mocked xs_daemon-{open,close} and others to allow using libxl
in confined build environments. This patch adds xs_{open,close} to the
list of functions mocked in libxlmock.c
https://github.com/xen-project/xen/commit/90c9f9f4ddd55e11be0506bff10c62375…
Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
---
tests/libxlmock.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/tests/libxlmock.c b/tests/libxlmock.c
index 604dc4bfbe..a52d4bc2ed 100644
--- a/tests/libxlmock.c
+++ b/tests/libxlmock.c
@@ -39,6 +39,14 @@ VIR_MOCK_IMPL_RET_VOID(xs_daemon_open,
return (void*)0x1;
}
+VIR_MOCK_IMPL_RET_ARGS(xs_open,
+ struct xs_handle *,
+ unsigned long, flags)
+{
+ VIR_MOCK_REAL_INIT(xs_open);
+ return (void*)0x1;
+}
+
VIR_MOCK_IMPL_RET_ARGS(xc_interface_open,
xc_interface *,
xentoollog_logger *, logger,
@@ -94,6 +102,9 @@ VIR_MOCK_STUB_RET_ARGS(xc_sharing_used_frames,
VIR_MOCK_STUB_VOID_ARGS(xs_daemon_close,
struct xs_handle *, handle)
+VIR_MOCK_STUB_VOID_ARGS(xs_close,
+ struct xs_handle *, xsh)
+
VIR_MOCK_STUB_RET_ARGS(bind,
int, 0,
int, sockfd,
--
2.31.1
2
1
[PATCH] viridentity: Fix ref/unref imbalance in VIR_IDENTITY_AUTORESTORE
by Michal Privoznik 17 May '21
by Michal Privoznik 17 May '21
17 May '21
The basic use case of VIR_IDENTITY_AUTORESTORE() is in
conjunction with virIdentityElevateCurrent(). What happens is
that virIdentityElevateCurrent() gets current identity (which
increases the refcounter of thread local virIdentity object) and
returns a pointer to it. Later, when the variable goes out of
scope the virIdentityRestoreHelper() is called which calls
virIdentitySetCurrent() over the old identity. But this means
that the refcounter is increased again.
Therefore, we have to explicitly decrease the refcounter by
calling g_object_unref().
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
I've observed this imbalance whilst running qemuxml2argvtest under
valgrind:
==10412== 949 (40 direct, 909 indirect) bytes in 1 blocks are definitely lost in loss record 524 of 539
==10412== at 0x48397EF: malloc (vg_replace_malloc.c:307)
==10412== by 0x50806F8: g_malloc (in /usr/lib64/libglib-2.0.so.0.6600.7)
==10412== by 0x50992FD: g_slice_alloc (in /usr/lib64/libglib-2.0.so.0.6600.7)
==10412== by 0x50999B9: g_slice_alloc0 (in /usr/lib64/libglib-2.0.so.0.6600.7)
==10412== by 0x518D9AB: g_type_create_instance (in /usr/lib64/libgobject-2.0.so.0.6600.7)
==10412== by 0x51739DC: g_object_new_internal (in /usr/lib64/libgobject-2.0.so.0.6600.7)
==10412== by 0x5174F5C: g_object_new_with_properties (in /usr/lib64/libgobject-2.0.so.0.6600.7)
==10412== by 0x5175978: g_object_new (in /usr/lib64/libgobject-2.0.so.0.6600.7)
==10412== by 0x496C3C6: virIdentityNew (viridentity.c:407)
==10412== by 0x496BF1A: virIdentityGetSystem (viridentity.c:318)
==10412== by 0x117CEF: testCompareXMLToArgv (qemuxml2argvtest.c:653)
==10412== by 0x148505: virTestRun (testutils.c:142)
Test #315 doesn't tickle the bug, while test #316 does.
src/util/viridentity.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/util/viridentity.c b/src/util/viridentity.c
index e7e5c31241..eb77f69e2e 100644
--- a/src/util/viridentity.c
+++ b/src/util/viridentity.c
@@ -197,8 +197,12 @@ void virIdentityRestoreHelper(virIdentity **identptr)
{
virIdentity *ident = *identptr;
- if (ident != NULL)
+ if (ident != NULL) {
virIdentitySetCurrent(ident);
+ /* virIdentitySetCurrent() grabs its own reference.
+ * We don't need ours anymore. */
+ g_object_unref(ident);
+ }
}
#define TOKEN_BYTES 16
--
2.26.3
2
1
I'm looking into NUMA code in capabilities and came up with a couple of
cleanups. Technically, 3/4 is not needed yet, but I'll be introducing
new data to vircaps2xmltest where a NUMA node has no CPUs and that's
why the patch is needed.
Michal PrÃvoznÃk (4):
numa_conf: Use virXMLFormatElement() in virDomainNumaDefFormatXML
virnuma: Export virNumaGetMaxCPUs properly
virnumamock: Allow CPU-less NUMA nodes
virCapabilitiesHostNUMAFormat: Bring variables into loops
src/conf/capabilities.c | 9 ++--
src/conf/numa_conf.c | 107 ++++++++++++++++++---------------------
src/libvirt_private.syms | 1 +
src/util/virnuma.h | 2 +-
tests/virnumamock.c | 7 ++-
5 files changed, 61 insertions(+), 65 deletions(-)
--
2.26.3
3
7
[PATCH v1 5/7] docs: mark intention to deprecate TCG tracing functionality
by Alex Bennée 17 May '21
by Alex Bennée 17 May '21
17 May '21
Currently attempts to add a new TCG trace events results in failures
to build. Previous discussions have suggested maybe it's time to mark
the feature as deprecated and push people towards using plugins.
Signed-off-by: Alex Bennée <alex.bennee(a)linaro.org>
Cc: Luis Vilanova <vilanova(a)imperial.ac.uk>
Cc: Stefan Hajnoczi <stefanha(a)redhat.com>
---
docs/devel/tcg-plugins.rst | 2 ++
docs/devel/tracing.rst | 7 +++++++
docs/system/deprecated.rst | 13 +++++++++++++
3 files changed, 22 insertions(+)
diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
index 18c6581d85..edf04e3091 100644
--- a/docs/devel/tcg-plugins.rst
+++ b/docs/devel/tcg-plugins.rst
@@ -3,6 +3,8 @@
Copyright (c) 2019, Linaro Limited
Written by Emilio Cota and Alex Bennée
+.. _tcgplugin-ref:
+
================
QEMU TCG Plugins
================
diff --git a/docs/devel/tracing.rst b/docs/devel/tracing.rst
index ba83954899..6b0f46cd54 100644
--- a/docs/devel/tracing.rst
+++ b/docs/devel/tracing.rst
@@ -414,6 +414,13 @@ disabled, this check will have no performance impact.
"tcg"
-----
+.. warning::
+ The ability to add new TCG trace points relies on a having a good
+ understanding of the TCG internals. In the meantime TCG plugins
+ have been introduced which solve many of the same problems with
+ more of a focus on analysing guest code. See :ref:`tcgplugin-ref`
+ for more details.
+
Guest code generated by TCG can be traced by defining an event with the "tcg"
event property. Internally, this property generates two events:
"<eventname>_trans" to trace the event at translation time, and
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
index 80cae86252..0c9d3c1e1e 100644
--- a/docs/system/deprecated.rst
+++ b/docs/system/deprecated.rst
@@ -312,6 +312,19 @@ The ``I7200`` guest CPU relies on the nanoMIPS ISA, which is deprecated
(the ISA has never been upstreamed to a compiler toolchain). Therefore
this CPU is also deprecated.
+TCG introspection features
+--------------------------
+
+TCG trace-events (since 6.1)
+''''''''''''''''''''''''''''
+
+The ability to add new TCG trace points has bit rotted and as the
+feature can be replicated with TCG plugins it will be deprecated. If
+any user is currently using this feature and needs help with
+converting to using TCG plugins they should contact the qemu-devel
+mailing list.
+
+
Related binaries
----------------
--
2.20.1
3
6
17 May '21
Recently, a new code was added to virGetConnectGeneric() that
saves the original error into a variable so that it's not lost in
virConnectClose() called under the 'error' label.
However, the error saving code uses virSaveLastError() +
virSetError() combo which leaks the memory allocated for the
error copy. Using virErrorPreserveLast() + virErrorRestore() does
the same job without the memleak.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/driver.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/driver.c b/src/driver.c
index 227bb56e48..329d493a50 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -138,7 +138,7 @@ static virConnectPtr
virGetConnectGeneric(virThreadLocal *threadPtr, const char *name)
{
virConnectPtr conn;
- virErrorPtr saved;
+ virErrorPtr orig_err;
if (virConnectCacheInitialize() < 0)
return NULL;
@@ -178,9 +178,9 @@ virGetConnectGeneric(virThreadLocal *threadPtr, const char *name)
return conn;
error:
- saved = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
virConnectClose(conn);
- virSetError(saved);
+ virErrorRestore(&orig_err);
return NULL;
}
--
2.26.3
2
1
17 May '21
QEMU already committed some significant changes since the tree opened.
The most notable which has fallout in libvirt is the dropping of the
'sheepdog' driver. This series adapts to that and then adds the
qemu capabilities data for this cycle based on the most recent qemu
upstream commit.
Patch 4 is heavily truncated. To fetch the full version please:
git fetch https://gitlab.com/pipo.sk/libvirt.git qemu-caps-6.1
Peter Krempa (4):
testQemuInfoSetArgs: Strip default machine alias only for 'latest'
test cases
qemublocktest: Drop 'network-sheepdog-qcow2' image creation test case
qemuxml2argvtest: Limit 'disk-network-sheepdog' testcase to qemu-6.0.0
tests: qemucapabilities: Add test-data for the qemu-6.1 cycle
.../domaincapsdata/qemu_6.1.0-q35.x86_64.xml | 208 +
.../domaincapsdata/qemu_6.1.0-tcg.x86_64.xml | 211 +
tests/domaincapsdata/qemu_6.1.0.x86_64.xml | 208 +
tests/qemublocktest.c | 1 -
.../imagecreate/network-sheepdog-qcow2.json | 20 -
.../imagecreate/network-sheepdog-qcow2.xml | 12 -
.../caps_6.1.0.x86_64.replies | 32734 ++++++++++++++++
.../caps_6.1.0.x86_64.xml | 3339 ++
.../cpu-tsc-high-frequency.x86_64-latest.args | 2 +-
...> disk-network-sheepdog.x86_64-6.0.0.args} | 2 +-
.../hugepages-memaccess3.x86_64-latest.args | 2 +-
tests/qemuxml2argvtest.c | 2 +-
tests/testutilsqemu.c | 6 +-
13 files changed, 36707 insertions(+), 40 deletions(-)
create mode 100644 tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml
create mode 100644 tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml
create mode 100644 tests/domaincapsdata/qemu_6.1.0.x86_64.xml
delete mode 100644 tests/qemublocktestdata/imagecreate/network-sheepdog-qcow2.json
delete mode 100644 tests/qemublocktestdata/imagecreate/network-sheepdog-qcow2.xml
create mode 100644 tests/qemucapabilitiesdata/caps_6.1.0.x86_64.replies
create mode 100644 tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
rename tests/qemuxml2argvdata/{disk-network-sheepdog.x86_64-latest.args => disk-network-sheepdog.x86_64-6.0.0.args} (95%)
--
2.30.2
3
6
---
src/storage/storage_backend_sheepdog.c | 99 +++++++++++++-------------
1 file changed, 48 insertions(+), 51 deletions(-)
diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c
index 6490dfae52..6b000ff9b8 100644
--- a/src/storage/storage_backend_sheepdog.c
+++ b/src/storage/storage_backend_sheepdog.c
@@ -35,11 +35,54 @@
#define VIR_FROM_THIS VIR_FROM_STORAGE
-static int virStorageBackendSheepdogRefreshVol(virStoragePoolObj *pool,
- virStorageVolDef *vol);
+static void
+virStorageBackendSheepdogAddHostArg(virCommand *cmd,
+ virStoragePoolObj *pool)
+{
+ virStoragePoolDef *def = virStoragePoolObjGetDef(pool);
+ const char *address = "localhost";
+ int port = 7000;
+ if (def->source.nhost > 0) {
+ if (def->source.hosts[0].name != NULL)
+ address = def->source.hosts[0].name;
+ if (def->source.hosts[0].port)
+ port = def->source.hosts[0].port;
+ }
+ virCommandAddArg(cmd, "-a");
+ virCommandAddArgFormat(cmd, "%s", address);
+ virCommandAddArg(cmd, "-p");
+ virCommandAddArgFormat(cmd, "%d", port);
+}
+
+
+static int
+virStorageBackendSheepdogRefreshVol(virStoragePoolObj *pool,
+ virStorageVolDef *vol)
+{
+ char *output = NULL;
+ virStoragePoolDef *def = virStoragePoolObjGetDef(pool);
+ g_autoptr(virCommand) cmd = NULL;
+
+ cmd = virCommandNewArgList(SHEEPDOGCLI, "vdi", "list", vol->name, "-r", NULL);
+ virStorageBackendSheepdogAddHostArg(cmd, pool);
+ virCommandSetOutputBuffer(cmd, &output);
+ if (virCommandRun(cmd, NULL) < 0)
+ return -1;
+
+ if (virStorageBackendSheepdogParseVdiList(vol, output) < 0)
+ return -1;
+
+ vol->type = VIR_STORAGE_VOL_NETWORK;
+
+ VIR_FREE(vol->key);
+ vol->key = g_strdup_printf("%s/%s", def->source.name, vol->name);
+
+ VIR_FREE(vol->target.path);
+ vol->target.path = g_strdup(vol->name);
+
+ return 0;
+}
-void virStorageBackendSheepdogAddHostArg(virCommand *cmd,
- virStoragePoolObj *pool);
int
virStorageBackendSheepdogParseNodeInfo(virStoragePoolDef *pool,
@@ -88,24 +131,6 @@ virStorageBackendSheepdogParseNodeInfo(virStoragePoolDef *pool,
return -1;
}
-void
-virStorageBackendSheepdogAddHostArg(virCommand *cmd,
- virStoragePoolObj *pool)
-{
- virStoragePoolDef *def = virStoragePoolObjGetDef(pool);
- const char *address = "localhost";
- int port = 7000;
- if (def->source.nhost > 0) {
- if (def->source.hosts[0].name != NULL)
- address = def->source.hosts[0].name;
- if (def->source.hosts[0].port)
- port = def->source.hosts[0].port;
- }
- virCommandAddArg(cmd, "-a");
- virCommandAddArgFormat(cmd, "%s", address);
- virCommandAddArg(cmd, "-p");
- virCommandAddArgFormat(cmd, "%d", port);
-}
static int
virStorageBackendSheepdogAddVolume(virStoragePoolObj *pool, const char *diskInfo)
@@ -134,6 +159,7 @@ virStorageBackendSheepdogAddVolume(virStoragePoolObj *pool, const char *diskInfo
return 0;
}
+
static int
virStorageBackendSheepdogRefreshAllVol(virStoragePoolObj *pool)
{
@@ -310,34 +336,6 @@ virStorageBackendSheepdogParseVdiList(virStorageVolDef *vol,
return -1;
}
-static int
-virStorageBackendSheepdogRefreshVol(virStoragePoolObj *pool,
- virStorageVolDef *vol)
-{
- char *output = NULL;
- virStoragePoolDef *def = virStoragePoolObjGetDef(pool);
- g_autoptr(virCommand) cmd = NULL;
-
- cmd = virCommandNewArgList(SHEEPDOGCLI, "vdi", "list", vol->name, "-r", NULL);
- virStorageBackendSheepdogAddHostArg(cmd, pool);
- virCommandSetOutputBuffer(cmd, &output);
- if (virCommandRun(cmd, NULL) < 0)
- return -1;
-
- if (virStorageBackendSheepdogParseVdiList(vol, output) < 0)
- return -1;
-
- vol->type = VIR_STORAGE_VOL_NETWORK;
-
- VIR_FREE(vol->key);
- vol->key = g_strdup_printf("%s/%s", def->source.name, vol->name);
-
- VIR_FREE(vol->target.path);
- vol->target.path = g_strdup(vol->name);
-
- return 0;
-}
-
static int
virStorageBackendSheepdogResizeVol(virStoragePoolObj *pool,
@@ -356,7 +354,6 @@ virStorageBackendSheepdogResizeVol(virStoragePoolObj *pool,
}
-
virStorageBackend virStorageBackendSheepdog = {
.type = VIR_STORAGE_POOL_SHEEPDOG,
--
2.20.1
2
1
17 May '21
See 3/3 for rationale.
Michal PrÃvoznÃk (3):
testutils: Drop libtool binary name handling
tests: Return EXIT_FAILURE/EXIT_SUCCESS instead of -1/0
testutils: Document and enforce @func callback retvals for
virTestMain()
tests/fchosttest.c | 2 +-
tests/qemusecuritytest.c | 2 +-
tests/scsihosttest.c | 2 +-
tests/seclabeltest.c | 2 +-
tests/storagepoolcapstest.c | 2 +-
tests/testutils.c | 20 +++++++++++++++-----
tests/testutils.h | 4 ++++
tests/virbitmaptest.c | 2 +-
tests/vircaps2xmltest.c | 2 +-
tests/vircapstest.c | 2 +-
tests/virconftest.c | 2 +-
tests/virendiantest.c | 2 +-
tests/virlogtest.c | 2 +-
tests/virresctrltest.c | 2 +-
tests/virscsitest.c | 2 +-
15 files changed, 32 insertions(+), 18 deletions(-)
--
2.26.3
2
5
[libvirt PATCH v3 00/10] make internal only secrets work with split daemons
by Daniel P. Berrangé 15 May '21
by Daniel P. Berrangé 15 May '21
15 May '21
If you define a secret with private="yes", then libvirt won't let any
client query the secret value after it is set. Only other libvirt
drivers inside the daemon can query it by passing a special internal
only flag to the virSecretGetValue API. The remote driver/daemon
refuses to let this internal flag go over the wire preventing normal
clients from using it
This doesn't work with the split daemons because the virSecretGetValue
API done by virqemud / virtstoraged has to go over the wire to reach
the virsecretd.
We need to come up with an alternative way to "prove" that the caller
of virSecretGetValue is a libvirt daemon, as opposed to a general
libvirt client.
Note with if only traditional POSIX DAC permissions are in effect
then we could consider it pointless trying to restrict access to
clients running the same user/group as the libvirt daemon. We ought
to take into account that the client might be confined by SELinux
though, so the "private secret" concept isn't entirely pointless.
Thus doing a simple uid of client == uid of daemon check is a bit
too weak. The UID check might also not fly if the modular daemons
are run inside containers with user namespaces, as the container
for virtsecretd and virtqemud might have different user mappings
in theory.
This series adds a concept of a "token" which is known only to the
libvirt daemons. The first daemon to use it writes a random hex
string to /var/run/libvirt/common/system.token. Other daemons can
read and compare this. Unless a MAC system is present this is still
largely security theatre, but that's not really worse than the
historical behaviour.
When an API call is made the virIdentity by default reflects the
identity of the UNIX process that initiated it.
When connecting to virtproxyd, the client apps' identity is forwarded
to the next virtNNNNd daemon.
When libvirt drivers, however, initiate an API call we never set any
identity. With monolithic libvirtd, they'd inherit the current client
identity automagically since it was all in the same thread local. With
modular daemons the othe driver would see the identity of the other
libvirt daemon which is bad as this gives elevated privileges in the
ACL check.
Thus we fix the code which drivers use to open a connection to other
daemons, such that it applies the current caller's identity. It does
this using an "elevated" identity though, which means, we have added
in the system token. Thus the virtsecretd daemon getting the call
virSecretGetValue sees the virIdentity reflecting the client
application which originally called the virDomainCreate() API, but
with the system token set. Thus virsecretd can see that the
virSecretGetValue was invoked by another daemon, not a libvirt
client app.
Changed in v3...
Properly mock the new APIs in test suite
Changed in v2...
We can't set the elevated identity only when opening the virConnect
for the secret driver. This works for modular daemons, as the identity
is passed to the virsecretd at time of opening and thus applies to
the later virSecretGetValue call on that connection.
For monolithic daemon, the identity present at virConnectOpen is
irrelevant. The virSecretGetValue call will just directly query
the current thread's identity.
IOW, to work in both deployment scenarios we need to have the
elevated identity set across both virConnectOpen and virSecretGetValue
Daniel P. Berrangé (10):
util: add virRandomToken API
util: introduce concept of a system token into identities
util: generate a persistent system token
util: set system token for system identity
util: add API for copying identity objects
util: helper to temporary elevate privileges of the current identity
src: add API to determine if current identity is a system identity
src: set identity when opening secondary drivers
src: elevate current identity privilege when fetching secret
secret: rework handling of private secrets
src/driver-secret.h | 9 +-
src/driver.c | 27 +++
src/libvirt-secret.c | 2 +-
src/libvirt_private.syms | 8 +
src/libxl/libxl_conf.c | 5 +
src/qemu/qemu_domain.c | 11 +-
src/qemu/qemu_tpm.c | 5 +
src/remote/remote_driver.c | 8 +-
src/secret/secret_driver.c | 34 ++-
src/storage/storage_backend_iscsi.c | 5 +
src/storage/storage_backend_iscsi_direct.c | 5 +
src/storage/storage_backend_rbd.c | 5 +
src/storage/storage_util.c | 5 +
src/util/viridentity.c | 244 ++++++++++++++++++++-
src/util/viridentity.h | 11 +
src/util/viridentitypriv.h | 30 +++
src/util/virrandom.c | 18 ++
src/util/virrandom.h | 1 +
src/util/virsecret.c | 3 +-
tests/qemuxml2argvmock.c | 9 +
tests/qemuxml2argvtest.c | 9 +-
tests/viridentitytest.c | 11 +-
22 files changed, 435 insertions(+), 30 deletions(-)
create mode 100644 src/util/viridentitypriv.h
--
2.31.1
3
12
Historically PowerPC 64 was always supported with qemu-kvm in RHEL.
In future RHEL-9 it is being discontinued and this was addressed
in
commit 03cc3c9064322ac4028a2213105cd230fe28c013
Author: Jiri Denemark <jdenemar(a)redhat.com>
Date: Wed Apr 21 14:55:03 2021 +0200
spec: Do not build qemu driver for Power on RHEL-9
when the specfile was cleaned up to remove RHEL-7 support:
commit 0f601d2f868f2017cdd16e0a7ca90a59e7d5e120
Author: Andrea Bolognani <abologna(a)redhat.com>
Date: Wed May 5 19:30:46 2021 +0200
spec: Bump min_fedora and min_rhel
it also removed the logic that applied to RHEL-8 wrt arch list
and lost PowerPC 64 support on 8. This reverts that part of the
change but with the condition reversed to prioritize the future
state.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
libvirt.spec.in | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index f421828d16..8ac324be0a 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -8,7 +8,11 @@
%define arches_qemu_kvm %{ix86} x86_64 %{power64} %{arm} aarch64 s390x
%if 0%{?rhel}
- %define arches_qemu_kvm x86_64 aarch64 s390x
+ %if 0%{?rhel} > 8
+ %define arches_qemu_kvm x86_64 aarch64 s390x
+ %else
+ %define arches_qemu_kvm x86_64 %{power64} aarch64 s390x
+ %endif
%endif
%define arches_64bit x86_64 %{power64} aarch64 s390x riscv64
--
2.31.1
3
2
Support for glusterfs with KVM is being dropped in RHEL-9 in the
virtualization stack.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
libvirt.spec.in | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 8ac324be0a..c52f607bd1 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -65,10 +65,15 @@
%endif
%define with_storage_gluster 0%{!?_without_storage_gluster:1}
-%ifnarch %{arches_qemu_kvm}
- # gluster is only built where qemu driver is enabled on RHEL
- %if 0%{?rhel}
+%if 0%{?rhel}
+ # Glusterfs dropped in RHEL-9, and before that only
+ # enabled on arches where KVM exists
+ %if 0%{?rhel} > 8
%define with_storage_gluster 0
+ %else
+ %ifnarch %{arches_qemu_kvm}
+ %define with_storage_gluster 0
+ %endif
%endif
%endif
--
2.31.1
3
2
[libvirt PATCH v2 0/6] Refactor more XML parsing boilerplate code, part X
by Tim Wiederhake 14 May '21
by Tim Wiederhake 14 May '21
14 May '21
For background, see
https://listman.redhat.com/archives/libvir-list/2021-April/msg00668.html
Changes since V1:
* Split up VIR_FREE'd and reused ´g_autofree xmlNodePtr *´ variables.
Tim Wiederhake (6):
virNodeDeviceDefParseXML: Use g_auto*
virDomainNumatuneNodeParseXML: Use virXMLProp*
virDomainNumatuneNodeParseXML: Use g_autofree
virDomainNumaDefNodeDistanceParseXML: Use virXMLProp*
virDomainNumaDefParseXML: Use virXMLProp*
virDomainNumaDefParseXML: Use g_autofree
src/conf/node_device_conf.c | 44 ++-
src/conf/numa_conf.c | 305 ++++++------------
.../hugepages-memaccess-invalid.err | 2 +-
3 files changed, 110 insertions(+), 241 deletions(-)
--
2.26.3
2
7
[libvirt PATCH 00/10] Refactor more XML parsing boilerplate code, part X
by Tim Wiederhake 13 May '21
by Tim Wiederhake 13 May '21
13 May '21
For background, see
https://listman.redhat.com/archives/libvir-list/2021-April/msg00668.html
Tim Wiederhake (10):
virNodeDeviceDefParseXML: Use g_auto*
virDomainNumatuneNodeParseXML: Use virXMLProp*
virDomainNumatuneNodeParseXML: Use g_autofree
virDomainNumaDefNodeDistanceParseXML: Use virXMLProp*
virDomainNumaDefParseXML: Use virXMLProp*
virDomainNumaDefParseXML: Use g_autofree
virStorageAdapterParseXMLFCHost: Use virXMLProp*
virStoragePoolDefParseSource: Use virXMLProp*
virStoragePoolDefParseSource: Use VIR_XPATH_NODE_AUTORESTORE
virStoragePoolDefParseXML: Use virXMLProp*
src/conf/node_device_conf.c | 34 +--
src/conf/numa_conf.c | 285 +++++-------------
src/conf/storage_adapter_conf.c | 17 +-
src/conf/storage_conf.c | 83 ++---
.../hugepages-memaccess-invalid.err | 2 +-
5 files changed, 125 insertions(+), 296 deletions(-)
--
2.26.3
3
20
13 May '21
Hi Guy,
Does anyone clear how to hot plugin a new vhost-user-blk-pci device to a running VM?
Before staring vm , I pass the disk through QEMU command line like below.
<qemu:commandline>
<qemu:arg value='-object'/>
<qemu:arg value='memory-backend-file,id=mem0,size=4G,mem-path=/dev/hugepages,share=on'/>
<qemu:arg value='-numa'/>
<qemu:arg value='node,memdev=mem0'/>
<qemu:arg value='-chardev'/>
<qemu:arg value='socket,id=spdk_vhost_blk721ea46a-b306-11eb-a280-525400a98761,path=/var/tmp/vhost.721ea46a-b306-11eb-a280-525400a98761,reconnect=1'/>
<qemu:arg value='-device'/>
<qemu:arg value='vhost-user-blk-pci,chardev=spdk_vhost_blk721ea46a-b306-11eb-a280-525400a98761,bootindex=1,num-queues=4'/>
<qemu:arg value='-chardev'/>
<qemu:arg value='socket,id=spdk_vhost_blk2f699c58-d222-4629-9fdc-400c3aadc55e,path=/var/tmp/vhost.2f699c58-d222-4629-9fdc-400c3aadc55e,reconnect=1'/>
<qemu:arg value='-device'/>
<qemu:arg value='vhost-user-blk-pci,chardev=spdk_vhost_blk2f699c58-d222-4629-9fdc-400c3aadc55e,num-queues=4'/>
</qemu:commandline>
But I don’t know how to live add a vhost-user-blk-pci device on running VM even with calling attachDevice API now.
OS: redhat 7.4 Libvirt version: 3.4
Your help will be appreciated.
Thanks!
1
0
13 May '21
The libvirt-daemon package now provides the 'libvirt-admin' virtual
name, but the Provides stanza doesn't declare version information,
which breaks things depending on that package using a versioned
dependency. Fix this by setting the version-release of libvirt to
that name to mimic the previous state.
Fixes: 2244ac168d42c3fa424bae6d33ecdbb8726da7c2
Signed-off-by: Neal Gompa <ngompa13(a)gmail.com>
---
libvirt.spec.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 9dea6c6787..d7a90c42f5 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -415,7 +415,7 @@ Requires: gettext
# Ensure smooth upgrades
Obsoletes: libvirt-admin < 7.3.0
-Provides: libvirt-admin
+Provides: libvirt-admin = %{version}-%{release}
Obsoletes: libvirt-bash-completion < 7.3.0
%description daemon
--
2.31.1
2
1
Re: After blockcopy with pivot, a dirty-bitmap is added, but not been removed automatically.
by Peter Krempa 13 May '21
by Peter Krempa 13 May '21
13 May '21
On Mon, May 10, 2021 at 13:34:41 +0800, ChangLimin wrote:
> Hi Peter,
>
> Since https://libvirt.org/git/?p=libvirt.git;a=commitdiff;h=7bfff40fdfe5410c446c1…,
> after blockcopy with pivot, a dirty-bitmap is added, but not been removed automatically.
> Is that something wrong?
Yeah, it's a bug and it should be removed. I'll have a look.
2
2
Implements QEMU support for NVMe device emulation, which was added in
qemu 1.6.0:
https://git.qemu.org/?p=qemu.git;a=commit;h=f3c507adcd7
It can be used by adding elements in XML like this:
<devices>
...
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/nvme.img'/>
<target dev='nvmea' bus='nvme'/>
<serial>QEMU-WMAP9A966149</serial>
</disk>
...
</devices>
Signed-off-by: Zhiyong Ye <yezhiyong(a)bytedance.com>
Signed-off-by: zhenwei pi <pizhenwei(a)bytedance.com>
---
docs/formatdomain.rst | 11 ++++++--
docs/schemas/domaincommon.rng | 3 ++-
src/bhyve/bhyve_command.c | 1 +
src/bhyve/bhyve_domain.c | 1 +
src/conf/domain_conf.c | 5 ++++
src/conf/domain_conf.h | 1 +
src/conf/domain_validate.c | 4 ++-
src/hyperv/hyperv_driver.c | 2 ++
src/qemu/qemu_alias.c | 1 +
src/qemu/qemu_command.c | 8 ++++++
src/qemu/qemu_domain_address.c | 11 +++++---
src/qemu/qemu_hotplug.c | 2 ++
src/qemu/qemu_validate.c | 13 ++++++++++
src/util/virutil.c | 3 ++-
src/vbox/vbox_common.c | 1 +
src/vz/vz_sdk.c | 2 ++
src/vz/vz_utils.c | 1 +
tests/qemuxml2argvdata/disk-nvme-device.args | 28 +++++++++++++++++++++
tests/qemuxml2argvdata/disk-nvme-device.xml | 30 ++++++++++++++++++++++
tests/qemuxml2argvtest.c | 1 +
tests/qemuxml2xmloutdata/disk-nvme-device.xml | 36 +++++++++++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
22 files changed, 157 insertions(+), 9 deletions(-)
create mode 100644 tests/qemuxml2argvdata/disk-nvme-device.args
create mode 100644 tests/qemuxml2argvdata/disk-nvme-device.xml
create mode 100644 tests/qemuxml2xmloutdata/disk-nvme-device.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index fa5c14febc..d7e5299664 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -2479,6 +2479,12 @@ paravirtualized driver is specified via the ``disk`` element.
</source>
<target dev='vdf' bus='virtio'/>
</disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/var/lib/libvirt/images/nvme.img'/>
+ <target dev='nvmea' bus='nvme'/>
+ <serial>QEMU-WMAP9A966149</serial>
+ </disk>
</devices>
...
@@ -2880,8 +2886,9 @@ paravirtualized driver is specified via the ``disk`` element.
name in the guest OS. Treat it as a device ordering hint. The optional
``bus`` attribute specifies the type of disk device to emulate; possible
values are driver specific, with typical values being "ide", "scsi",
- "virtio", "xen", "usb", "sata", or "sd" :since:`"sd" since 1.1.2` . If
- omitted, the bus type is inferred from the style of the device name (e.g. a
+ "virtio", "xen", "usb", "sata", "sd" :since:`"sd" since 1.1.2`,
+ or "nvme" :since:`"nvme" since 7.3.0 (QEMU only)`. If omitted,
+ the bus type is inferred from the style of the device name (e.g. a
device named 'sda' will typically be exported using a SCSI bus). The optional
attribute ``tray`` indicates the tray status of the removable disks (i.e.
CDROM or Floppy disk), the value can be either "open" or "closed", defaults
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index a2e5c50c1d..47c60d7247 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2202,7 +2202,7 @@
<define name="diskTarget">
<data type="string">
- <param name="pattern">(ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]+</param>
+ <param name="pattern">(ioemu:)?(fd|hd|sd|vd|xvd|ubd|nvme)[a-zA-Z0-9_]+</param>
</data>
</define>
<define name="target">
@@ -2222,6 +2222,7 @@
<value>uml</value> <!-- NOT USED ANYMORE -->
<value>sata</value>
<value>sd</value>
+ <value>nvme</value>
</choice>
</attribute>
</optional>
diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index f8e0ce5123..d601f15eae 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -320,6 +320,7 @@ bhyveBuildDiskArgStr(const virDomainDef *def,
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
index 33e74e2e25..3972b57ba9 100644
--- a/src/bhyve/bhyve_domain.c
+++ b/src/bhyve/bhyve_domain.c
@@ -142,6 +142,7 @@ bhyveDomainDiskDefAssignAddress(struct _bhyveConn *driver,
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
break;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7044701fac..1c89309f29 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -350,6 +350,7 @@ VIR_ENUM_IMPL(virDomainDiskBus,
"uml",
"sata",
"sd",
+ "nvme",
);
VIR_ENUM_IMPL(virDomainDiskCache,
@@ -5356,6 +5357,8 @@ virDomainDiskDefPostParse(virDomainDiskDef *disk,
disk->bus = VIR_DOMAIN_DISK_BUS_XEN;
else if (STRPREFIX(disk->dst, "ubd"))
disk->bus = VIR_DOMAIN_DISK_BUS_UML;
+ else if (STRPREFIX(disk->dst, "nvme"))
+ disk->bus = VIR_DOMAIN_DISK_BUS_NVME;
}
}
@@ -7723,6 +7726,7 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt,
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
/* Other disk bus's aren't controller based */
@@ -28737,6 +28741,7 @@ virDiskNameToBusDeviceIndex(virDomainDiskDef *disk,
case VIR_DOMAIN_DISK_BUS_NONE:
case VIR_DOMAIN_DISK_BUS_SATA:
case VIR_DOMAIN_DISK_BUS_UML:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
*busIdx = 0;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 2d5462bb55..b54284ee49 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -381,6 +381,7 @@ typedef enum {
VIR_DOMAIN_DISK_BUS_UML,
VIR_DOMAIN_DISK_BUS_SATA,
VIR_DOMAIN_DISK_BUS_SD,
+ VIR_DOMAIN_DISK_BUS_NVME,
VIR_DOMAIN_DISK_BUS_LAST
} virDomainDiskBus;
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index 686b9e8d16..0e79698381 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -227,6 +227,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus,
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_NONE:
case VIR_DOMAIN_DISK_BUS_LAST:
return true;
@@ -721,7 +722,8 @@ virDomainDiskDefValidate(const virDomainDef *def,
!STRPREFIX(disk->dst, "sd") &&
!STRPREFIX(disk->dst, "vd") &&
!STRPREFIX(disk->dst, "xvd") &&
- !STRPREFIX(disk->dst, "ubd")) {
+ !STRPREFIX(disk->dst, "ubd") &&
+ !STRPREFIX(disk->dst, "nvme")) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Invalid harddisk device name: %s"), disk->dst);
return -1;
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index ff20d5548b..f6fb0a610b 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -970,6 +970,7 @@ hypervDomainAttachStorage(virDomainPtr domain, virDomainDef *def, const char *ho
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SATA:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported controller type"));
@@ -3125,6 +3126,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SATA:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid disk bus in definition"));
diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
index ed47fa335a..b4fd8f9ae6 100644
--- a/src/qemu/qemu_alias.c
+++ b/src/qemu/qemu_alias.c
@@ -254,6 +254,7 @@ qemuAssignDeviceDiskAlias(virDomainDef *def,
case VIR_DOMAIN_DISK_BUS_XEN:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_NONE:
case VIR_DOMAIN_DISK_BUS_LAST:
break;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index d6c5308ef0..14d6bfcd89 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1607,6 +1607,7 @@ qemuCheckIOThreads(const virDomainDef *def,
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SATA:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_NONE:
case VIR_DOMAIN_DISK_BUS_LAST:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -1847,6 +1848,13 @@ qemuBuildDiskDeviceStr(const virDomainDef *def,
virBufferAsprintf(&opt, "floppy,unit=%d", disk->info.addr.drive.unit);
break;
+ case VIR_DOMAIN_DISK_BUS_NVME:
+ virBufferAddLit(&opt, "nvme");
+
+ if (qemuBuildDeviceAddressStr(&opt, def, &disk->info) < 0)
+ return NULL;
+ break;
+
case VIR_DOMAIN_DISK_BUS_XEN:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index a11e40d9b2..7249328b80 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -778,7 +778,6 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
case VIR_DOMAIN_DEVICE_DISK:
switch ((virDomainDiskBus) dev->data.disk->bus) {
case VIR_DOMAIN_DISK_BUS_VIRTIO:
- /* only virtio disks use PCI */
switch ((virDomainDiskModel) dev->data.disk->model) {
case VIR_DOMAIN_DISK_MODEL_VIRTIO_TRANSITIONAL:
/* Transitional devices only work in conventional PCI slots */
@@ -792,6 +791,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
}
return 0;
+ case VIR_DOMAIN_DISK_BUS_NVME:
+ return pciFlags;
+
case VIR_DOMAIN_DISK_BUS_IDE:
case VIR_DOMAIN_DISK_BUS_FDC:
case VIR_DOMAIN_DISK_BUS_SCSI:
@@ -2235,10 +2237,11 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def,
}
}
- /* Disks (VirtIO only for now) */
+ /* Disks (VirtIO and NVMe-device only for now) */
for (i = 0; i < def->ndisks; i++) {
- /* Only VirtIO disks use PCI addrs */
- if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO)
+ /* Only VirtIO adn NVMe-device disks use PCI addrs */
+ if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO &&
+ def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_NVME)
continue;
/* don't touch s390 devices */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index a64cddb9e7..862f30572d 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1092,6 +1092,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver,
/* Note that SD card hotplug support should be added only once
* they support '-device' (don't require -drive only).
* See also: qemuDiskBusIsSD */
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_NONE:
case VIR_DOMAIN_DISK_BUS_LAST:
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
@@ -5312,6 +5313,7 @@ qemuDomainDetachPrepDisk(virDomainObj *vm,
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SATA:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("This type of disk cannot be hot unplugged"));
return -1;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 141203f979..73ce7cc617 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -2721,6 +2721,19 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk,
break;
+ case VIR_DOMAIN_DISK_BUS_NVME:
+ if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("unexpected address type for nvme disk"));
+ return -1;
+ }
+ if (!disk->serial) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("serial property must be specified for nvme disk"));
+ return -1;
+ }
+ break;
+
case VIR_DOMAIN_DISK_BUS_XEN:
case VIR_DOMAIN_DISK_BUS_SD:
case VIR_DOMAIN_DISK_BUS_NONE:
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 3f49a469e5..a586b94c9a 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -369,7 +369,8 @@ int virDiskNameParse(const char *name, int *disk, int *partition)
const char *ptr = NULL;
char *rem;
int idx = 0;
- static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd"};
+ static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd",
+ "xvd", "ubd", "nvme"};
size_t i;
size_t n_digits;
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 1ca521321c..11f057236c 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -1154,6 +1154,7 @@ vboxAttachDrives(virDomainDef *def, struct _vboxDriver *data, IMachine *machine)
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_NONE:
case VIR_DOMAIN_DISK_BUS_LAST:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index e09950812d..0a804aa284 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3469,6 +3469,7 @@ static int prlsdkConfigureDisk(struct _vzDriver *driver,
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -4354,6 +4355,7 @@ prlsdkGetBlockStats(PRL_HANDLE sdkstats,
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index 8fed875281..f7e4d174cf 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -244,6 +244,7 @@ vzCheckDiskAddressDriveUnsupportedParams(virDomainDiskDef *disk)
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SD:
+ case VIR_DOMAIN_DISK_BUS_NVME:
case VIR_DOMAIN_DISK_BUS_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
diff --git a/tests/qemuxml2argvdata/disk-nvme-device.args b/tests/qemuxml2argvdata/disk-nvme-device.args
new file mode 100644
index 0000000000..594e1dea31
--- /dev/null
+++ b/tests/qemuxml2argvdata/disk-nvme-device.args
@@ -0,0 +1,28 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-i386 \
+-name QEMUGuest1 \
+-S \
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
+-m 214 \
+-realtime mlock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-usb \
+-drive file=/tmp/data.img,format=raw,if=none,id=drive-nvme-disk0 \
+-device nvme,bus=pci.0,addr=0x2,drive=drive-nvme-disk0,id=nvme-disk0,bootindex=1,serial=QEMU-WMAP9A966149
diff --git a/tests/qemuxml2argvdata/disk-nvme-device.xml b/tests/qemuxml2argvdata/disk-nvme-device.xml
new file mode 100644
index 0000000000..18d9632f20
--- /dev/null
+++ b/tests/qemuxml2argvdata/disk-nvme-device.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-i386</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/data.img'/>
+ <target dev='nvmea' bus='nvme'/>
+ <serial>QEMU-WMAP9A966149</serial>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index a9dafe226e..681158c73b 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1493,6 +1493,7 @@ mymain(void)
DO_TEST_CAPS_ARCH_VER("disk-arm-virtio-sd", "aarch64", "4.0.0");
DO_TEST_CAPS_ARCH_LATEST("disk-arm-virtio-sd", "aarch64");
+ DO_TEST("disk-nvme-device", NONE);
DO_TEST("graphics-egl-headless",
QEMU_CAPS_DEVICE_CIRRUS_VGA);
DO_TEST_CAPS_LATEST("graphics-egl-headless");
diff --git a/tests/qemuxml2xmloutdata/disk-nvme-device.xml b/tests/qemuxml2xmloutdata/disk-nvme-device.xml
new file mode 100644
index 0000000000..e016164d28
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/disk-nvme-device.xml
@@ -0,0 +1,36 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-i386</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/tmp/data.img'/>
+ <target dev='nvmea' bus='nvme'/>
+ <serial>QEMU-WMAP9A966149</serial>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </disk>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 7af6f90aee..f36819cd73 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -336,6 +336,7 @@ mymain(void)
DO_TEST("disk-mirror-old", NONE);
DO_TEST("disk-mirror", NONE);
DO_TEST("disk-active-commit", NONE);
+ DO_TEST("disk-nvme-device", NONE);
DO_TEST("graphics-listen-network",
QEMU_CAPS_DEVICE_CIRRUS_VGA,
QEMU_CAPS_VNC);
--
2.11.0
2
1
Cloud-Hypervisor is a KVM virtualization using hypervisor. It
functions similarly to qemu and the libvirt Cloud-Hypervisor driver
uses a very similar structure to the libvirt driver.
The biggest difference from the libvirt perspective is that the
"monitor" socket is seperated into two sockets one that commands are
issued to and one that events are notified from. The current
implementation only uses the command socket (running over a REST API
with json encoded data) with future changes to add support for the
event socket (to better handle shutdowns from inside the VM).
This patch adds support for the following initial VM actions using the
Cloud-Hypervsior API:
* vm.create
* vm.delete
* vm.boot
* vm.shutdown
* vm.reboot
* vm.pause
* vm.resume
To use the Cloud-Hypervisor driver, the v0.14.0 release of
Cloud-Hypervisor is required to be installed.
Some additional notes:
* The curl handle is persistent but not useful to detect ch process
shutdown/crash (a future patch will address this shortcoming)
* On a 64-bit host Cloud-Hypervisor needs to support PVH and so can
emulate 32-bit mode but it isn't fully tested (a 64-bit kernel and
32-bit userspace is fine, a 32-bit kernel is unsupported)
* The pause ch implements pauses execution of the guest cpus (and
disk/network i/o threads) which seems to align with
https://wiki.libvirt.org/page/VM_lifecycle#Pausing_a_guest_domain
The original RFC is
https://listman.redhat.com/archives/libvir-list/2020-August/msg01040.html
Changes since the RFC:
* Updated to use g_autofree where applicable
* Fixed meson.build to properly detect and disable the driver if
either Curl or YAJL are missing
* Fixed filenames in comments to match actual filenames
* Switched to use VIR_DOMAIN_VIRT_KVM and removed VIR_DOMAIN_VIRT_CH
* Added default emulator path to the virDomainDef when unspecified
* Updated driver to run as non-root, launching cloud-hypervisor as
non-root
* Updated to build a virtchd daemon
* Enabled non-root session usage.
* Switched to use of g_free instead of VIR_FREE
* Stopped checking for container based virt shutdown methods.
* Stopped checking for container based virt reboot methods.
* Fixed URI schemes to only list ch for the ch://session driver URI
* Updated name of chDriverState to be cloud-hypervisor
* Removed debug code for tracing curl calls
* Consolidated kernel, initrd and cmdline methods
* Added checks on diskdef->src->type prior to working with the
other diskdef->src members
* Added error reporting when failing to build the config from the
user's xml
* Fixed empty Expect Header for create vm
* Switched to use virReportEnumRangeError on unsupported netType
* Removed unused chStrToInt function
* Converted use of virObject to GObject
* Switched to using the virDomainObjPtr's domstatus element to refer
to the guest PID instead of privateData element
* Stopped setting persistent in chDomainCreateXML
* Added cleanup for removing the guest from driver->domains list on
failure
* Simplified min version check
* Added test for guest domain support based on cloud-hypervisor
binary availability
* Updated spec file to disable ch driver by default
* Added error reporting for unsupported device types
* Updated cloud-hypervisor to not need to poll for socket readiness
* Added drvch.rst for a user overview of the driver
* Added explanation of the architecture of cloud-hypervisor and
approach taken to manage with libvirt
Signed-off-by: William Douglas <william.douglas(a)intel.com>
---
docs/drivers.html.in | 1 +
docs/drvch.rst | 55 ++
docs/meson.build | 1 +
include/libvirt/virterror.h | 1 +
libvirt.spec.in | 31 +
meson.build | 43 ++
meson_options.txt | 3 +
po/POTFILES.in | 5 +
src/ch/ch_conf.c | 256 ++++++++
src/ch/ch_conf.h | 85 +++
src/ch/ch_domain.c | 203 ++++++
src/ch/ch_domain.h | 65 ++
src/ch/ch_driver.c | 930 ++++++++++++++++++++++++++++
src/ch/ch_driver.h | 24 +
src/ch/ch_monitor.c | 837 +++++++++++++++++++++++++
src/ch/ch_monitor.h | 60 ++
src/ch/ch_process.c | 126 ++++
src/ch/ch_process.h | 31 +
src/ch/meson.build | 74 +++
src/ch/virtchd.service.in | 47 ++
src/ch/virtchd.sysconf | 3 +
src/meson.build | 1 +
src/remote/remote_daemon.c | 4 +
src/remote/remote_daemon_dispatch.c | 3 +-
src/util/virerror.c | 1 +
tools/virsh.c | 3 +
26 files changed, 2892 insertions(+), 1 deletion(-)
create mode 100644 docs/drvch.rst
create mode 100644 src/ch/ch_conf.c
create mode 100644 src/ch/ch_conf.h
create mode 100644 src/ch/ch_domain.c
create mode 100644 src/ch/ch_domain.h
create mode 100644 src/ch/ch_driver.c
create mode 100644 src/ch/ch_driver.h
create mode 100644 src/ch/ch_monitor.c
create mode 100644 src/ch/ch_monitor.h
create mode 100644 src/ch/ch_process.c
create mode 100644 src/ch/ch_process.h
create mode 100644 src/ch/meson.build
create mode 100644 src/ch/virtchd.service.in
create mode 100644 src/ch/virtchd.sysconf
diff --git a/docs/drivers.html.in b/docs/drivers.html.in
index 34f98f60b6..824604998e 100644
--- a/docs/drivers.html.in
+++ b/docs/drivers.html.in
@@ -37,6 +37,7 @@
<li><strong><a href="drvhyperv.html">Microsoft Hyper-V</a></strong></li>
<li><strong><a href="drvvirtuozzo.html">Virtuozzo</a></strong></li>
<li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
+ <li><strong><a href="drvch.html">Cloud Hypervisor</a></strong></li>
</ul>
</body>
diff --git a/docs/drvch.rst b/docs/drvch.rst
new file mode 100644
index 0000000000..bb13599e6f
--- /dev/null
+++ b/docs/drvch.rst
@@ -0,0 +1,55 @@
+=======================
+Cloud Hypervisor driver
+=======================
+
+.. contents::
+
+Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) that
+runs on top of KVM. The project focuses on exclusively running modern,
+cloud workloads, on top of a limited set of hardware architectures and
+platforms. Cloud workloads refers to those that are usually run by
+customers inside a cloud provider. For our purposes this means modern
+operating systems with most I/O handled by paravirtualised devices
+(i.e. virtio), no requirement for legacy devices, and 64-bit CPUs.
+
+The libvirt Cloud Hypervisor driver is intended to be run as a session
+driver without privileges. The cloud-hypervisor binary itself should be
+``setcap cap_net_admin+ep`` (in order to create tap interfaces).
+
+Expected connection URI would be
+
+``ch:///session``
+
+
+Example guest domain XML configurations
+=======================================
+
+The Cloud Hypervisor driver in libvirt is in its early stage under active
+development only supporting a limited number of Cloud Hypervisor features.
+
+Firmware is from
+`hypervisor-fw <https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases>`__
+
+**Note: Only virtio devices are supported**
+
+::
+
+ <domain type='kvm'>
+ <name>cloudhypervisor</name>
+ <uuid>4dea22b3-1d52-d8f3-2516-782e98ab3fa0</uuid>
+ <os>
+ <type>hvm</type>
+ <kernel>hypervisor-fw</kernel>
+ </os>
+ <memory unit='G'>2</memory>
+ <devices>
+ <disk type='file'>
+ <source file='disk.raw'/>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <interface type='ethernet'>
+ <model type='virtio'/>
+ </interface>
+ </devices>
+ <vcpu>2</vcpu>
+ </domain>
diff --git a/docs/meson.build b/docs/meson.build
index f550629d8e..bee0d80d53 100644
--- a/docs/meson.build
+++ b/docs/meson.build
@@ -111,6 +111,7 @@ docs_rst_files = [
'daemons',
'developer-tooling',
'drvqemu',
+ 'drvch',
'formatbackup',
'formatcheckpoint',
'formatdomain',
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
index 524a7bf9e8..57986931fd 100644
--- a/include/libvirt/virterror.h
+++ b/include/libvirt/virterror.h
@@ -136,6 +136,7 @@ typedef enum {
VIR_FROM_TPM = 70, /* Error from TPM */
VIR_FROM_BPF = 71, /* Error from BPF code */
+ VIR_FROM_CH = 72, /* Error from Cloud-Hypervisor driver */
# ifdef VIR_ENUM_SENTINELS
VIR_ERR_DOMAIN_LAST
diff --git a/libvirt.spec.in b/libvirt.spec.in
index da7af2824e..4eeb4dc1b4 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -244,6 +244,9 @@ Requires: libvirt-daemon-driver-lxc = %{version}-%{release}
%if %{with_qemu}
Requires: libvirt-daemon-driver-qemu = %{version}-%{release}
%endif
+%if %{with_ch}
+Requires: libvirt-daemon-driver-ch = %{version}-%{release}
+%endif
# We had UML driver, but we've removed it.
Obsoletes: libvirt-daemon-driver-uml <= 5.0.0
Obsoletes: libvirt-daemon-uml <= 5.0.0
@@ -761,6 +764,20 @@ QEMU
%endif
+%if %{with_ch}
+%package daemon-driver-ch
+Summary: Cloud-Hypervisor driver plugin for the libvirtd daemon
+Requires: libvirt-daemon = %{version}-%{release}
+Requires: libvirt-libs = %{version}-%{release}
+Requires: /usr/bin/cloud-hypervisor
+
+%description daemon-driver-ch
+The Cloud-Hypervisor driver plugin for the libvirtd daemon,
+providing an implementation of the hypervisor driver APIs
+using Cloud-Hypervisor
+%endif
+
+
%if %{with_lxc}
%package daemon-driver-lxc
Summary: LXC driver plugin for the libvirtd daemon
@@ -1003,6 +1020,12 @@ exit 1
%define arg_qemu -Ddriver_qemu=disabled
%endif
+%if %{with_ch}
+ %define arg_ch -Ddriver_ch=enabled
+%else
+ %define arg_ch -Ddriver_ch=disabled
+%endif
+
%if %{with_openvz}
%define arg_openvz -Ddriver_openvz=enabled
%else
@@ -1146,6 +1169,7 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec)
%meson \
-Drunstatedir=%{_rundir} \
%{?arg_qemu} \
+ %{?arg_ch} \
%{?arg_openvz} \
%{?arg_lxc} \
%{?arg_vbox} \
@@ -1771,6 +1795,13 @@ exit 0
%{_mandir}/man8/virtqemud.8*
%endif
+%if %{with_ch}
+%files daemon-driver-ch
+%dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/ch/
+%ghost %dir %{_rundir}/libvirt/ch/
+%{_libdir}/%{name}/connection-driver/libvirt_driver_ch.so
+%endif
+
%if %{with_lxc}
%files daemon-driver-lxc
%config(noreplace) %{_sysconfdir}/sysconfig/virtlxcd
diff --git a/meson.build b/meson.build
index 951da67896..8c33efb25c 100644
--- a/meson.build
+++ b/meson.build
@@ -1517,6 +1517,48 @@ elif get_option('driver_lxc').enabled()
error('linux and remote_driver are required for LXC')
endif
+if not get_option('driver_ch').disabled() and host_machine.system() == 'linux'
+ use_ch = true
+
+ if not conf.has('WITH_LIBVIRTD')
+ use_ch = false
+ if get_option('driver_ch').enabled()
+ error('libvirtd is required to build Cloud-Hypervisor driver')
+ endif
+ endif
+
+ if not yajl_dep.found()
+ use_ch = false
+ if get_option('driver_ch').enabled()
+ error('YAJL 2 is required to build Cloud-Hypervisor driver')
+ endif
+ endif
+
+ if not curl_dep.found()
+ use_ch = false
+ if get_option('driver_ch').enabled()
+ error('curl is required to build Cloud-Hypervisor driver')
+ endif
+ endif
+
+ if use_ch
+ conf.set('WITH_CH', 1)
+
+ default_ch_user = 'root'
+ default_ch_group = 'root'
+ ch_user = get_option('ch_user')
+ if ch_user == ''
+ ch_user = default_ch_user
+ endif
+ ch_group = get_option('ch_group')
+ if ch_group == ''
+ ch_group = default_ch_group
+ endif
+ conf.set_quoted('CH_USER', ch_user)
+ conf.set_quoted('CH_GROUP', ch_group)
+ endif
+endif
+
# there's no use compiling the network driver without the libvirt
# daemon, nor compiling it for macOS, where it breaks the compile
if not get_option('driver_network').disabled() and conf.has('WITH_LIBVIRTD') and host_machine.system() != 'darwin'
@@ -2170,6 +2212,7 @@ driver_summary = {
'VBox': conf.has('WITH_VBOX'),
'libxl': conf.has('WITH_LIBXL'),
'LXC': conf.has('WITH_LXC'),
+ 'Cloud-Hypervisor': conf.has('WITH_CH'),
'ESX': conf.has('WITH_ESX'),
'Hyper-V': conf.has('WITH_HYPERV'),
'vz': conf.has('WITH_VZ'),
diff --git a/meson_options.txt b/meson_options.txt
index 2606648b64..cd0b4b33be 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -53,6 +53,9 @@ option('driver_interface', type: 'feature', value: 'auto', description: 'host in
option('driver_libvirtd', type: 'feature', value: 'auto', description: 'libvirtd driver')
option('driver_libxl', type: 'feature', value: 'auto', description: 'libxenlight driver')
option('driver_lxc', type: 'feature', value: 'auto', description: 'Linux Container driver')
+option('driver_ch', type: 'feature', value: 'auto', description: 'Cloud-Hypervisor driver')
+option('ch_user', type: 'string', value: '', description: 'username to run Cloud-Hypervisor system instance as')
+option('ch_group', type: 'string', value: '', description: 'groupname to run Cloud-Hypervisor system instance as')
option('driver_network', type: 'feature', value: 'auto', description: 'virtual network driver')
option('driver_openvz', type: 'feature', value: 'auto', description: 'OpenVZ driver')
option('driver_qemu', type: 'feature', value: 'auto', description: 'QEMU/KVM driver')
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 413783ee35..c200d7452a 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -18,6 +18,11 @@
@SRCDIR@src/bhyve/bhyve_monitor.c
@SRCDIR@src/bhyve/bhyve_parse_command.c
@SRCDIR@src/bhyve/bhyve_process.c
+@SRCDIR@src/ch/ch_conf.c
+@SRCDIR@src/ch/ch_domain.c
+@SRCDIR@src/ch/ch_driver.c
+@SRCDIR@src/ch/ch_monitor.c
+@SRCDIR@src/ch/ch_process.c
@SRCDIR@src/conf/backup_conf.c
@SRCDIR@src/conf/capabilities.c
@SRCDIR@src/conf/checkpoint_conf.c
diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c
new file mode 100644
index 0000000000..3fd9258c52
--- /dev/null
+++ b/src/ch/ch_conf.c
@@ -0,0 +1,256 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_conf.c: functions for Cloud-Hypervisor configuration
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "configmake.h"
+#include "viralloc.h"
+#include "vircommand.h"
+#include "virlog.h"
+#include "virobject.h"
+#include "virstring.h"
+#include "virutil.h"
+
+#include "ch_conf.h"
+#include "ch_domain.h"
+
+#define VIR_FROM_THIS VIR_FROM_CH
+
+VIR_LOG_INIT("ch.ch_conf");
+
+static virClass *virCHDriverConfigClass;
+static void virCHDriverConfigDispose(void *obj);
+
+static int virCHConfigOnceInit(void)
+{
+ if (!VIR_CLASS_NEW(virCHDriverConfig, virClassForObject()))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virCHConfig);
+
+
+/* Functions */
+virCaps *virCHDriverCapsInit(void)
+{
+ virCaps *caps;
+ virCapsGuest *guest;
+ g_autofree char *ch_cmd = NULL;
+
+ if ((caps = virCapabilitiesNew(virArchFromHost(),
+ false, false)) == NULL)
+ goto cleanup;
+
+ if (!(caps->host.numa = virCapabilitiesHostNUMANewHost()))
+ goto cleanup;
+
+ if (virCapabilitiesInitCaches(caps) < 0)
+ goto cleanup;
+
+ if ((guest = virCapabilitiesAddGuest(caps,
+ VIR_DOMAIN_OSTYPE_HVM,
+ caps->host.arch,
+ NULL,
+ NULL,
+ 0,
+ NULL)) == NULL)
+ goto cleanup;
+
+ if (virCapabilitiesAddGuestDomain(guest,
+ VIR_DOMAIN_VIRT_KVM,
+ NULL,
+ NULL,
+ 0,
+ NULL) == NULL)
+ goto cleanup;
+
+ ch_cmd = g_find_program_in_path(CH_CMD);
+ if (!ch_cmd)
+ goto cleanup;
+
+ return caps;
+
+ cleanup:
+ virObjectUnref(caps);
+ return NULL;
+}
+
+/**
+ * virCHDriverGetCapabilities:
+ *
+ * Get a reference to the virCaps instance for the
+ * driver. If @refresh is true, the capabilities will be
+ * rebuilt first
+ *
+ * The caller must release the reference with virObjetUnref
+ *
+ * Returns: a reference to a virCaps instance or NULL
+ */
+virCaps *virCHDriverGetCapabilities(virCHDriver *driver,
+ bool refresh)
+{
+ virCaps *ret;
+ if (refresh) {
+ virCaps *caps = NULL;
+ if ((caps = virCHDriverCapsInit()) == NULL)
+ return NULL;
+
+ chDriverLock(driver);
+ virObjectUnref(driver->caps);
+ driver->caps = caps;
+ } else {
+ chDriverLock(driver);
+ }
+
+ ret = virObjectRef(driver->caps);
+ chDriverUnlock(driver);
+ return ret;
+}
+
+virDomainXMLOption *
+chDomainXMLConfInit(virCHDriver *driver)
+{
+ virCHDriverDomainDefParserConfig.priv = driver;
+ return virDomainXMLOptionNew(&virCHDriverDomainDefParserConfig,
+ &virCHDriverPrivateDataCallbacks,
+ NULL, NULL, NULL);
+}
+
+virCHDriverConfig *
+virCHDriverConfigNew(bool privileged)
+{
+ virCHDriverConfig *cfg;
+
+ if (virCHConfigInitialize() < 0)
+ return NULL;
+
+ if (!(cfg = virObjectNew(virCHDriverConfigClass)))
+ return NULL;
+
+ cfg->uri = g_strdup(privileged ? "ch:///system" : "ch:///session");
+ if (privileged) {
+ if (virGetUserID(CH_USER, &cfg->user) < 0)
+ return NULL;
+ if (virGetGroupID(CH_GROUP, &cfg->group) < 0)
+ return NULL;
+ } else {
+ cfg->user = (uid_t)-1;
+ cfg->group = (gid_t)-1;
+ }
+
+ if (privileged) {
+ cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR);
+ cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR);
+
+ } else {
+ g_autofree char *rundir = NULL;
+ g_autofree char *cachedir = NULL;
+
+ cachedir = virGetUserCacheDirectory();
+
+ cfg->logDir = g_strdup_printf("%s/ch/log", cachedir);
+
+ rundir = virGetUserRuntimeDirectory();
+ cfg->stateDir = g_strdup_printf("%s/ch/run", rundir);
+ }
+
+ return cfg;
+}
+
+virCHDriverConfig *virCHDriverGetConfig(virCHDriver *driver)
+{
+ virCHDriverConfig *cfg;
+ chDriverLock(driver);
+ cfg = virObjectRef(driver->config);
+ chDriverUnlock(driver);
+ return cfg;
+}
+
+static void
+virCHDriverConfigDispose(void *obj)
+{
+ virCHDriverConfig *cfg = obj;
+
+ g_free(cfg->stateDir);
+ g_free(cfg->logDir);
+}
+
+#define MIN_VERSION ((0 * 1000000) + (13 * 1000) + (0))
+
+static int
+chExtractVersionInfo(int *retversion)
+{
+ int ret = -1;
+ unsigned long version;
+ char *help = NULL;
+ char *tmp = NULL;
+ g_autofree char *ch_cmd = g_find_program_in_path(CH_CMD);
+ virCommand *cmd = virCommandNewArgList(ch_cmd, "--version", NULL);
+
+ if (retversion)
+ *retversion = 0;
+
+ virCommandAddEnvString(cmd, "LC_ALL=C");
+ virCommandSetOutputBuffer(cmd, &help);
+
+ if (virCommandRun(cmd, NULL) < 0)
+ goto cleanup;
+
+ tmp = help;
+
+ /* expected format: cloud-hypervisor v<major>.<minor>.<micro> */
+ if ((tmp = STRSKIP(tmp, "cloud-hypervisor v")) == NULL)
+ goto cleanup;
+
+ if (virParseVersionString(tmp, &version, false) < 0)
+ goto cleanup;
+
+ if (version < MIN_VERSION) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cloud-Hypervisor version is too old (v0.13.0 is the minimum supported version)"));
+ goto cleanup;
+ }
+
+ if (retversion)
+ *retversion = version;
+
+ ret = 0;
+
+ cleanup:
+ virCommandFree(cmd);
+
+ return ret;
+}
+
+int chExtractVersion(virCHDriver *driver)
+{
+ if (driver->version > 0)
+ return 0;
+
+ if (chExtractVersionInfo(&driver->version) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Could not extract Cloud-Hypervisor version"));
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h
new file mode 100644
index 0000000000..d856825377
--- /dev/null
+++ b/src/ch/ch_conf.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_conf.h: header file for Cloud-Hypervisor configuration
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "virdomainobjlist.h"
+#include "virthread.h"
+
+#define CH_DRIVER_NAME "CH"
+#define CH_CMD "cloud-hypervisor"
+
+typedef struct _virCHDriver virCHDriver;
+
+typedef struct _virCHDriverConfig virCHDriverConfig;
+
+struct _virCHDriverConfig {
+ GObject parent;
+
+ char *stateDir;
+ char *logDir;
+ char *uri;
+
+ uid_t user;
+ gid_t group;
+};
+
+struct _virCHDriver
+{
+ virMutex lock;
+
+ /* Require lock to get a reference on the object,
+ * lockless access thereafter */
+ virCaps *caps;
+
+ /* Immutable pointer, Immutable object */
+ virDomainXMLOption *xmlopt;
+
+ /* Immutable pointer, self-locking APIs */
+ virDomainObjList *domains;
+
+ /* Cloud-Hypervisor version */
+ int version;
+
+ /* Require lock to get reference on 'config',
+ * then lockless thereafter */
+ virCHDriverConfig *config;
+
+ /* pid file FD, ensures two copies of the driver can't use the same root */
+ int lockFD;
+};
+
+virCaps *virCHDriverCapsInit(void);
+virCaps *virCHDriverGetCapabilities(virCHDriver *driver,
+ bool refresh);
+virDomainXMLOption *chDomainXMLConfInit(virCHDriver *driver);
+virCHDriverConfig *virCHDriverConfigNew(bool privileged);
+virCHDriverConfig *virCHDriverGetConfig(virCHDriver *driver);
+int chExtractVersion(virCHDriver *driver);
+
+static inline void chDriverLock(virCHDriver *driver)
+{
+ virMutexLock(&driver->lock);
+}
+
+static inline void chDriverUnlock(virCHDriver *driver)
+{
+ virMutexUnlock(&driver->lock);
+}
diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c
new file mode 100644
index 0000000000..9d0b091699
--- /dev/null
+++ b/src/ch/ch_domain.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_domain.c: Domain manager functions for Cloud-Hypervisor driver
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "ch_domain.h"
+#include "viralloc.h"
+#include "virlog.h"
+#include "virtime.h"
+
+#define VIR_FROM_THIS VIR_FROM_CH
+
+VIR_ENUM_IMPL(virCHDomainJob,
+ CH_JOB_LAST,
+ "none",
+ "query",
+ "destroy",
+ "modify",
+);
+
+VIR_LOG_INIT("ch.ch_domain");
+
+static int
+virCHDomainObjInitJob(virCHDomainObjPrivate *priv)
+{
+ memset(&priv->job, 0, sizeof(priv->job));
+
+ if (virCondInit(&priv->job.cond) < 0)
+ return -1;
+
+ return 0;
+}
+
+static void
+virCHDomainObjResetJob(virCHDomainObjPrivate *priv)
+{
+ struct virCHDomainJobObj *job = &priv->job;
+
+ job->active = CH_JOB_NONE;
+ job->owner = 0;
+}
+
+static void
+virCHDomainObjFreeJob(virCHDomainObjPrivate *priv)
+{
+ ignore_value(virCondDestroy(&priv->job.cond));
+}
+
+/*
+ * obj must be locked before calling, virCHDriver must NOT be locked
+ *
+ * This must be called by anything that will change the VM state
+ * in any way
+ *
+ * Upon successful return, the object will have its ref count increased.
+ * Successful calls must be followed by EndJob eventually.
+ */
+int
+virCHDomainObjBeginJob(virDomainObj *obj, enum virCHDomainJob job)
+{
+ virCHDomainObjPrivate *priv = obj->privateData;
+ unsigned long long now;
+ unsigned long long then;
+
+ if (virTimeMillisNow(&now) < 0)
+ return -1;
+ then = now + CH_JOB_WAIT_TIME;
+
+ while (priv->job.active) {
+ VIR_DEBUG("Wait normal job condition for starting job: %s",
+ virCHDomainJobTypeToString(job));
+ if (virCondWaitUntil(&priv->job.cond, &obj->parent.lock, then) < 0)
+ goto error;
+ }
+
+ virCHDomainObjResetJob(priv);
+
+ VIR_DEBUG("Starting job: %s", virCHDomainJobTypeToString(job));
+ priv->job.active = job;
+ priv->job.owner = virThreadSelfID();
+
+ return 0;
+
+ error:
+ VIR_WARN("Cannot start job (%s) for domain %s;"
+ " current job is (%s) owned by (%d)",
+ virCHDomainJobTypeToString(job),
+ obj->def->name,
+ virCHDomainJobTypeToString(priv->job.active),
+ priv->job.owner);
+
+ if (errno == ETIMEDOUT)
+ virReportError(VIR_ERR_OPERATION_TIMEOUT,
+ "%s", _("cannot acquire state change lock"));
+ else
+ virReportSystemError(errno,
+ "%s", _("cannot acquire job mutex"));
+ return -1;
+}
+
+/*
+ * obj must be locked and have a reference before calling
+ *
+ * To be called after completing the work associated with the
+ * earlier virCHDomainBeginJob() call
+ */
+void
+virCHDomainObjEndJob(virDomainObj *obj)
+{
+ virCHDomainObjPrivate *priv = obj->privateData;
+ enum virCHDomainJob job = priv->job.active;
+
+ VIR_DEBUG("Stopping job: %s",
+ virCHDomainJobTypeToString(job));
+
+ virCHDomainObjResetJob(priv);
+ virCondSignal(&priv->job.cond);
+}
+
+static void *
+virCHDomainObjPrivateAlloc(void *opaque G_GNUC_UNUSED)
+{
+ virCHDomainObjPrivate *priv;
+
+ priv = g_new0(virCHDomainObjPrivate, 1);
+
+ if (virCHDomainObjInitJob(priv) < 0) {
+ g_free(priv);
+ return NULL;
+ }
+
+ return priv;
+}
+
+static void
+virCHDomainObjPrivateFree(void *data)
+{
+ virCHDomainObjPrivate *priv = data;
+
+ virCHDomainObjFreeJob(priv);
+ g_free(priv);
+}
+
+virDomainXMLPrivateDataCallbacks virCHDriverPrivateDataCallbacks = {
+ .alloc = virCHDomainObjPrivateAlloc,
+ .free = virCHDomainObjPrivateFree,
+};
+
+static int
+virCHDomainDefPostParseBasic(virDomainDef *def,
+ void *opaque G_GNUC_UNUSED)
+{
+ /* check for emulator and create a default one if needed */
+ if (!def->emulator) {
+ if (!(def->emulator = g_find_program_in_path(CH_CMD))) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("No emulator found for cloud-hypervisor"));
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static int
+virCHDomainDefPostParse(virDomainDef *def,
+ unsigned int parseFlags G_GNUC_UNUSED,
+ void *opaque,
+ void *parseOpaque G_GNUC_UNUSED)
+{
+ virCHDriver *driver = opaque;
+ g_autoptr(virCaps) caps = virCHDriverGetCapabilities(driver, false);
+ if (!caps)
+ return -1;
+ if (!virCapabilitiesDomainSupported(caps, def->os.type,
+ def->os.arch,
+ def->virtType))
+ return -1;
+
+ return 0;
+}
+
+virDomainDefParserConfig virCHDriverDomainDefParserConfig = {
+ .domainPostParseBasicCallback = virCHDomainDefPostParseBasic,
+ .domainPostParseCallback = virCHDomainDefPostParse,
+};
diff --git a/src/ch/ch_domain.h b/src/ch/ch_domain.h
new file mode 100644
index 0000000000..b4e0d4c212
--- /dev/null
+++ b/src/ch/ch_domain.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_domain.h: header file for domain manager's Cloud-Hypervisor driver functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "ch_conf.h"
+#include "ch_monitor.h"
+
+/* Give up waiting for mutex after 30 seconds */
+#define CH_JOB_WAIT_TIME (1000ull * 30)
+
+/* Only 1 job is allowed at any time
+ * A job includes *all* ch.so api, even those just querying
+ * information, not merely actions */
+
+enum virCHDomainJob {
+ CH_JOB_NONE = 0, /* Always set to 0 for easy if (jobActive) conditions */
+ CH_JOB_QUERY, /* Doesn't change any state */
+ CH_JOB_DESTROY, /* Destroys the domain (cannot be masked out) */
+ CH_JOB_MODIFY, /* May change state */
+ CH_JOB_LAST
+};
+VIR_ENUM_DECL(virCHDomainJob);
+
+
+struct virCHDomainJobObj {
+ virCond cond; /* Use to coordinate jobs */
+ enum virCHDomainJob active; /* Currently running job */
+ int owner; /* Thread which set current job */
+};
+
+
+typedef struct _virCHDomainObjPrivate virCHDomainObjPrivate;
+struct _virCHDomainObjPrivate {
+ struct virCHDomainJobObj job;
+
+ virCHMonitor *monitor;
+};
+
+extern virDomainXMLPrivateDataCallbacks virCHDriverPrivateDataCallbacks;
+extern virDomainDefParserConfig virCHDriverDomainDefParserConfig;
+
+int
+virCHDomainObjBeginJob(virDomainObj *obj, enum virCHDomainJob job)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+void
+virCHDomainObjEndJob(virDomainObj *obj);
diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
new file mode 100644
index 0000000000..11f5a3d01b
--- /dev/null
+++ b/src/ch/ch_driver.c
@@ -0,0 +1,930 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_driver.c: Core Cloud-Hypervisor driver functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "ch_conf.h"
+#include "ch_domain.h"
+#include "ch_driver.h"
+#include "ch_monitor.h"
+#include "ch_process.h"
+#include "datatypes.h"
+#include "driver.h"
+#include "viraccessapicheck.h"
+#include "viralloc.h"
+#include "virbuffer.h"
+#include "vircommand.h"
+#include "virerror.h"
+#include "virfile.h"
+#include "virlog.h"
+#include "virnetdevtap.h"
+#include "virobject.h"
+#include "virstring.h"
+#include "virtypedparam.h"
+#include "viruri.h"
+#include "virutil.h"
+#include "viruuid.h"
+
+#define VIR_FROM_THIS VIR_FROM_CH
+
+VIR_LOG_INIT("ch.ch_driver");
+
+static int chStateInitialize(bool privileged,
+ const char *root,
+ virStateInhibitCallback callback,
+ void *opaque);
+static int chStateCleanup(void);
+virCHDriver *ch_driver = NULL;
+
+static virDomainObj *
+chDomObjFromDomain(virDomain *domain)
+{
+ virDomainObj *vm;
+ virCHDriver *driver = domain->conn->privateData;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ vm = virDomainObjListFindByUUID(driver->domains, domain->uuid);
+ if (!vm) {
+ virUUIDFormat(domain->uuid, uuidstr);
+ virReportError(VIR_ERR_NO_DOMAIN,
+ _("no domain with matching uuid '%s' (%s)"),
+ uuidstr, domain->name);
+ return NULL;
+ }
+
+ return vm;
+}
+
+/* Functions */
+static int
+chConnectURIProbe(char **uri)
+{
+ if (ch_driver == NULL)
+ return 0;
+
+ *uri = g_strdup("ch:///system");
+ return 1;
+}
+
+static virDrvOpenStatus chConnectOpen(virConnectPtr conn,
+ virConnectAuthPtr auth G_GNUC_UNUSED,
+ virConf *conf G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
+
+ /* URI was good, but driver isn't active */
+ if (ch_driver == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Cloud-Hypervisor state driver is not active"));
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ if (virConnectOpenEnsureACL(conn) < 0)
+ return VIR_DRV_OPEN_ERROR;
+
+ conn->privateData = ch_driver;
+
+ return VIR_DRV_OPEN_SUCCESS;
+}
+
+static int chConnectClose(virConnectPtr conn)
+{
+ conn->privateData = NULL;
+ return 0;
+}
+
+static const char *chConnectGetType(virConnectPtr conn)
+{
+ if (virConnectGetTypeEnsureACL(conn) < 0)
+ return NULL;
+
+ return "CH";
+}
+
+static int chConnectGetVersion(virConnectPtr conn,
+ unsigned long *version)
+{
+ virCHDriver *driver = conn->privateData;
+
+ if (virConnectGetVersionEnsureACL(conn) < 0)
+ return -1;
+
+ chDriverLock(driver);
+ *version = driver->version;
+ chDriverUnlock(driver);
+ return 0;
+}
+
+static char *chConnectGetHostname(virConnectPtr conn)
+{
+ if (virConnectGetHostnameEnsureACL(conn) < 0)
+ return NULL;
+
+ return virGetHostname();
+}
+
+static int chConnectNumOfDomains(virConnectPtr conn)
+{
+ virCHDriver *driver = conn->privateData;
+
+ if (virConnectNumOfDomainsEnsureACL(conn) < 0)
+ return -1;
+
+ return virDomainObjListNumOfDomains(driver->domains, true,
+ virConnectNumOfDomainsCheckACL, conn);
+}
+
+static int chConnectListDomains(virConnectPtr conn, int *ids, int nids)
+{
+ virCHDriver *driver = conn->privateData;
+
+ if (virConnectListDomainsEnsureACL(conn) < 0)
+ return -1;
+
+ return virDomainObjListGetActiveIDs(driver->domains, ids, nids,
+ virConnectListDomainsCheckACL, conn);
+}
+
+static int
+chConnectListAllDomains(virConnectPtr conn,
+ virDomainPtr **domains,
+ unsigned int flags)
+{
+ virCHDriver *driver = conn->privateData;
+
+ virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);
+
+ if (virConnectListAllDomainsEnsureACL(conn) < 0)
+ return -1;
+
+ return virDomainObjListExport(driver->domains, conn, domains,
+ virConnectListAllDomainsCheckACL, flags);
+}
+
+static int chNodeGetInfo(virConnectPtr conn,
+ virNodeInfoPtr nodeinfo)
+{
+ if (virNodeGetInfoEnsureACL(conn) < 0)
+ return -1;
+
+ return virCapabilitiesGetNodeInfo(nodeinfo);
+}
+
+static char *chConnectGetCapabilities(virConnectPtr conn)
+{
+ virCHDriver *driver = conn->privateData;
+ virCaps *caps;
+ char *xml;
+
+ if (virConnectGetCapabilitiesEnsureACL(conn) < 0)
+ return NULL;
+
+ if (!(caps = virCHDriverGetCapabilities(driver, true)))
+ return NULL;
+
+ xml = virCapabilitiesFormatXML(caps);
+
+ virObjectUnref(caps);
+ return xml;
+}
+
+/**
+ * chDomainCreateXML:
+ * @conn: pointer to connection
+ * @xml: XML definition of domain
+ * @flags: bitwise-OR of supported virDomainCreateFlags
+ *
+ * Creates a domain based on xml and starts it
+ *
+ * Returns a new domain object or NULL in case of failure.
+ */
+static virDomainPtr
+chDomainCreateXML(virConnectPtr conn,
+ const char *xml,
+ unsigned int flags)
+{
+ virCHDriver *driver = conn->privateData;
+ virDomainDef *vmdef = NULL;
+ virDomainObj *vm = NULL;
+ virDomainPtr dom = NULL;
+ unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
+
+ virCheckFlags(VIR_DOMAIN_START_VALIDATE, NULL);
+
+ if (flags & VIR_DOMAIN_START_VALIDATE)
+ parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA;
+
+
+ if ((vmdef = virDomainDefParseString(xml, driver->xmlopt,
+ NULL, parse_flags)) == NULL)
+ goto cleanup;
+
+ if (virDomainCreateXMLEnsureACL(conn, vmdef) < 0)
+ goto cleanup;
+
+ if (!(vm = virDomainObjListAdd(driver->domains,
+ vmdef,
+ driver->xmlopt,
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
+ goto cleanup;
+
+ vmdef = NULL;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virCHProcessStart(driver, vm, VIR_DOMAIN_RUNNING_BOOTED) < 0)
+ goto cleanup;
+
+ dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id);
+
+ virCHDomainObjEndJob(vm);
+
+ cleanup:
+ if (!dom) {
+ virDomainObjListRemove(driver->domains, vm);
+ }
+ virDomainDefFree(vmdef);
+ virDomainObjEndAPI(&vm);
+ chDriverUnlock(driver);
+ return dom;
+}
+
+static int
+chDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
+{
+ virCHDriver *driver = dom->conn->privateData;
+ virDomainObj *vm;
+ int ret = -1;
+
+ virCheckFlags(0, -1);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainCreateWithFlagsEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ ret = virCHProcessStart(driver, vm, VIR_DOMAIN_RUNNING_BOOTED);
+
+ virCHDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainCreate(virDomainPtr dom)
+{
+ return chDomainCreateWithFlags(dom, 0);
+}
+
+static virDomainPtr
+chDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
+{
+ virCHDriver *driver = conn->privateData;
+ virDomainDef *vmdef = NULL;
+ virDomainObj *vm = NULL;
+ virDomainPtr dom = NULL;
+ unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
+
+ virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
+
+ if (flags & VIR_DOMAIN_START_VALIDATE)
+ parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA;
+
+ if ((vmdef = virDomainDefParseString(xml, driver->xmlopt,
+ NULL, parse_flags)) == NULL)
+ goto cleanup;
+
+ if (virXMLCheckIllegalChars("name", vmdef->name, "\n") < 0)
+ goto cleanup;
+
+ if (virDomainDefineXMLFlagsEnsureACL(conn, vmdef) < 0)
+ goto cleanup;
+
+ if (!(vm = virDomainObjListAdd(driver->domains, vmdef,
+ driver->xmlopt,
+ 0, NULL)))
+ goto cleanup;
+
+ vmdef = NULL;
+ vm->persistent = 1;
+
+ dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id);
+
+ cleanup:
+ virDomainDefFree(vmdef);
+ virDomainObjEndAPI(&vm);
+ return dom;
+}
+
+static virDomainPtr
+chDomainDefineXML(virConnectPtr conn, const char *xml)
+{
+ return chDomainDefineXMLFlags(conn, xml, 0);
+}
+
+static int
+chDomainUndefineFlags(virDomainPtr dom,
+ unsigned int flags)
+{
+ virCHDriver *driver = dom->conn->privateData;
+ virDomainObj *vm;
+ int ret = -1;
+
+ virCheckFlags(0, -1);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainUndefineFlagsEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ if (!vm->persistent) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ "%s", _("Cannot undefine transient domain"));
+ goto cleanup;
+ }
+
+ if (virDomainObjIsActive(vm)) {
+ vm->persistent = 0;
+ } else {
+ virDomainObjListRemove(driver->domains, vm);
+ }
+
+ ret = 0;
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainUndefine(virDomainPtr dom)
+{
+ return chDomainUndefineFlags(dom, 0);
+}
+
+static int chDomainIsActive(virDomainPtr dom)
+{
+ virCHDriver *driver = dom->conn->privateData;
+ virDomainObj *vm;
+ int ret = -1;
+
+ chDriverLock(driver);
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainIsActiveEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ ret = virDomainObjIsActive(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ chDriverUnlock(driver);
+ return ret;
+}
+
+static int
+chDomainShutdownFlags(virDomainPtr dom,
+ unsigned int flags)
+{
+ virCHDomainObjPrivate *priv;
+ virDomainObj *vm;
+ virDomainState state;
+ int ret = -1;
+
+ virCheckFlags(VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN, -1);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ priv = vm->privateData;
+
+ if (virDomainShutdownFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
+ goto cleanup;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virDomainObjCheckActive(vm) < 0)
+ goto endjob;
+
+ state = virDomainObjGetState(vm, NULL);
+ if (state != VIR_DOMAIN_RUNNING && state != VIR_DOMAIN_PAUSED) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("only can shutdown running/paused domain"));
+ goto endjob;
+ } else {
+ if (virCHMonitorShutdownVM(priv->monitor) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to shutdown guest VM"));
+ goto endjob;
+ }
+ }
+
+ virDomainObjSetState(vm, VIR_DOMAIN_SHUTDOWN, VIR_DOMAIN_SHUTDOWN_USER);
+
+ ret = 0;
+
+ endjob:
+ virCHDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainShutdown(virDomainPtr dom)
+{
+ return chDomainShutdownFlags(dom, 0);
+}
+
+
+static int
+chDomainReboot(virDomainPtr dom, unsigned int flags)
+{
+ virCHDomainObjPrivate *priv;
+ virDomainObj *vm;
+ virDomainState state;
+ int ret = -1;
+
+ virCheckFlags(VIR_DOMAIN_REBOOT_ACPI_POWER_BTN, -1);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ priv = vm->privateData;
+
+ if (virDomainRebootEnsureACL(dom->conn, vm->def, flags) < 0)
+ goto cleanup;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virDomainObjCheckActive(vm) < 0)
+ goto endjob;
+
+ state = virDomainObjGetState(vm, NULL);
+ if (state != VIR_DOMAIN_RUNNING && state != VIR_DOMAIN_PAUSED) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("only can reboot running/paused domain"));
+ goto endjob;
+ } else {
+ if (virCHMonitorRebootVM(priv->monitor) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to reboot domain"));
+ goto endjob;
+ }
+ }
+
+ if (state == VIR_DOMAIN_RUNNING)
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
+ else
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_UNPAUSED);
+
+ ret = 0;
+
+ endjob:
+ virCHDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainSuspend(virDomainPtr dom)
+{
+ virCHDomainObjPrivate *priv;
+ virDomainObj *vm;
+ int ret = -1;
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ priv = vm->privateData;
+
+ if (virDomainSuspendEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virDomainObjCheckActive(vm) < 0)
+ goto endjob;
+
+ if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_RUNNING) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("only can suspend running domain"));
+ goto endjob;
+ } else {
+ if (virCHMonitorSuspendVM(priv->monitor) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to suspend domain"));
+ goto endjob;
+ }
+ }
+
+ virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER);
+
+ ret = 0;
+
+ endjob:
+ virCHDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainResume(virDomainPtr dom)
+{
+ virCHDomainObjPrivate *priv;
+ virDomainObj *vm;
+ int ret = -1;
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ priv = vm->privateData;
+
+ if (virDomainResumeEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virDomainObjCheckActive(vm) < 0)
+ goto endjob;
+
+ if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("only can resume paused domain"));
+ goto endjob;
+ } else {
+ if (virCHMonitorResumeVM(priv->monitor) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to resume domain"));
+ goto endjob;
+ }
+ }
+
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_UNPAUSED);
+
+ ret = 0;
+
+ endjob:
+ virCHDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+/**
+ * chDomainDestroyFlags:
+ * @dom: pointer to domain to destroy
+ * @flags: extra flags; not used yet.
+ *
+ * Sends SIGKILL to Cloud-Hypervisor process to terminate it
+ *
+ * Returns 0 on success or -1 in case of error
+ */
+static int
+chDomainDestroyFlags(virDomainPtr dom, unsigned int flags)
+{
+ virCHDriver *driver = dom->conn->privateData;
+ virDomainObj *vm;
+ int ret = -1;
+
+ virCheckFlags(0, -1);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainDestroyFlagsEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ if (virCHDomainObjBeginJob(vm, CH_JOB_DESTROY) < 0)
+ goto cleanup;
+
+ if (virDomainObjCheckActive(vm) < 0)
+ goto endjob;
+
+ ret = virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED);
+
+ endjob:
+ virCHDomainObjEndJob(vm);
+ if (!vm->persistent)
+ virDomainObjListRemove(driver->domains, vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainDestroy(virDomainPtr dom)
+{
+ return chDomainDestroyFlags(dom, 0);
+}
+
+static virDomainPtr chDomainLookupByID(virConnectPtr conn,
+ int id)
+{
+ virCHDriver *driver = conn->privateData;
+ virDomainObj *vm;
+ virDomainPtr dom = NULL;
+
+ chDriverLock(driver);
+ vm = virDomainObjListFindByID(driver->domains, id);
+ chDriverUnlock(driver);
+
+ if (!vm) {
+ virReportError(VIR_ERR_NO_DOMAIN,
+ _("no domain with matching id '%d'"), id);
+ goto cleanup;
+ }
+
+ if (virDomainLookupByIDEnsureACL(conn, vm->def) < 0)
+ goto cleanup;
+
+ dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return dom;
+}
+
+static virDomainPtr chDomainLookupByName(virConnectPtr conn,
+ const char *name)
+{
+ virCHDriver *driver = conn->privateData;
+ virDomainObj *vm;
+ virDomainPtr dom = NULL;
+
+ chDriverLock(driver);
+ vm = virDomainObjListFindByName(driver->domains, name);
+ chDriverUnlock(driver);
+
+ if (!vm) {
+ virReportError(VIR_ERR_NO_DOMAIN,
+ _("no domain with matching name '%s'"), name);
+ goto cleanup;
+ }
+
+ if (virDomainLookupByNameEnsureACL(conn, vm->def) < 0)
+ goto cleanup;
+
+ dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return dom;
+}
+
+static virDomainPtr chDomainLookupByUUID(virConnectPtr conn,
+ const unsigned char *uuid)
+{
+ virCHDriver *driver = conn->privateData;
+ virDomainObj *vm;
+ virDomainPtr dom = NULL;
+
+ chDriverLock(driver);
+ vm = virDomainObjListFindByUUID(driver->domains, uuid);
+ chDriverUnlock(driver);
+
+ if (!vm) {
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ virUUIDFormat(uuid, uuidstr);
+ virReportError(VIR_ERR_NO_DOMAIN,
+ _("no domain with matching uuid '%s'"), uuidstr);
+ goto cleanup;
+ }
+
+ if (virDomainLookupByUUIDEnsureACL(conn, vm->def) < 0)
+ goto cleanup;
+
+ dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return dom;
+}
+
+static int
+chDomainGetState(virDomainPtr dom,
+ int *state,
+ int *reason,
+ unsigned int flags)
+{
+ virDomainObj *vm;
+ int ret = -1;
+
+ virCheckFlags(0, -1);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainGetStateEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ *state = virDomainObjGetState(vm, reason);
+ ret = 0;
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static char *chDomainGetXMLDesc(virDomainPtr dom,
+ unsigned int flags)
+{
+ virCHDriver *driver = dom->conn->privateData;
+ virDomainObj *vm;
+ char *ret = NULL;
+
+ virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS, NULL);
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainGetXMLDescEnsureACL(dom->conn, vm->def, flags) < 0)
+ goto cleanup;
+
+ ret = virDomainDefFormat(vm->def, driver->xmlopt,
+ virDomainDefFormatConvertXMLFlags(flags));
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int chDomainGetInfo(virDomainPtr dom,
+ virDomainInfoPtr info)
+{
+ virDomainObj *vm;
+ int ret = -1;
+
+ if (!(vm = chDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainGetInfoEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ info->state = virDomainObjGetState(vm, NULL);
+
+ info->cpuTime = 0;
+
+ info->maxMem = virDomainDefGetMemoryTotal(vm->def);
+ info->memory = vm->def->mem.cur_balloon;
+ info->nrVirtCpu = virDomainDefGetVcpus(vm->def);
+
+ ret = 0;
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int chStateCleanup(void)
+{
+ if (ch_driver == NULL)
+ return -1;
+
+ virObjectUnref(ch_driver->domains);
+ virObjectUnref(ch_driver->xmlopt);
+ virObjectUnref(ch_driver->caps);
+ virObjectUnref(ch_driver->config);
+ virMutexDestroy(&ch_driver->lock);
+ g_free(ch_driver);
+
+ return 0;
+}
+
+static int chStateInitialize(bool privileged,
+ const char *root,
+ virStateInhibitCallback callback G_GNUC_UNUSED,
+ void *opaque G_GNUC_UNUSED)
+{
+ if (root != NULL) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("Driver does not support embedded mode"));
+ return -1;
+ }
+
+ ch_driver = g_new0(virCHDriver, 1);
+
+ if (virMutexInit(&ch_driver->lock) < 0) {
+ g_free(ch_driver);
+ return VIR_DRV_STATE_INIT_ERROR;
+ }
+
+ if (!(ch_driver->domains = virDomainObjListNew()))
+ goto cleanup;
+
+ if (!(ch_driver->caps = virCHDriverCapsInit()))
+ goto cleanup;
+
+ if (!(ch_driver->xmlopt = chDomainXMLConfInit(ch_driver)))
+ goto cleanup;
+
+ if (!(ch_driver->config = virCHDriverConfigNew(privileged)))
+ goto cleanup;
+
+ if (chExtractVersion(ch_driver) < 0)
+ goto cleanup;
+
+ return VIR_DRV_STATE_INIT_COMPLETE;
+
+ cleanup:
+ chStateCleanup();
+ return VIR_DRV_STATE_INIT_ERROR;
+}
+
+/* Function Tables */
+static virHypervisorDriver chHypervisorDriver = {
+ .name = "CH",
+ .connectURIProbe = chConnectURIProbe,
+ .connectOpen = chConnectOpen, /* 6.7.0 */
+ .connectClose = chConnectClose, /* 6.7.0 */
+ .connectGetType = chConnectGetType, /* 6.7.0 */
+ .connectGetVersion = chConnectGetVersion, /* 6.7.0 */
+ .connectGetHostname = chConnectGetHostname, /* 6.7.0 */
+ .connectNumOfDomains = chConnectNumOfDomains, /* 6.7.0 */
+ .connectListAllDomains = chConnectListAllDomains, /* 6.7.0 */
+ .connectListDomains = chConnectListDomains, /* 6.7.0 */
+ .connectGetCapabilities = chConnectGetCapabilities, /* 6.7.0 */
+ .domainCreateXML = chDomainCreateXML, /* 6.7.0 */
+ .domainCreate = chDomainCreate, /* 6.7.0 */
+ .domainCreateWithFlags = chDomainCreateWithFlags, /* 6.7.0 */
+ .domainShutdown = chDomainShutdown, /* 6.7.0 */
+ .domainShutdownFlags = chDomainShutdownFlags, /* 6.7.0 */
+ .domainReboot = chDomainReboot, /* 6.7.0 */
+ .domainSuspend = chDomainSuspend, /* 6.7.0 */
+ .domainResume = chDomainResume, /* 6.7.0 */
+ .domainDestroy = chDomainDestroy, /* 6.7.0 */
+ .domainDestroyFlags = chDomainDestroyFlags, /* 6.7.0 */
+ .domainDefineXML = chDomainDefineXML, /* 6.7.0 */
+ .domainDefineXMLFlags = chDomainDefineXMLFlags, /* 6.7.0 */
+ .domainUndefine = chDomainUndefine, /* 6.7.0 */
+ .domainUndefineFlags = chDomainUndefineFlags, /* 6.7.0 */
+ .domainLookupByID = chDomainLookupByID, /* 6.7.0 */
+ .domainLookupByUUID = chDomainLookupByUUID, /* 6.7.0 */
+ .domainLookupByName = chDomainLookupByName, /* 6.7.0 */
+ .domainGetState = chDomainGetState, /* 6.7.0 */
+ .domainGetXMLDesc = chDomainGetXMLDesc, /* 6.7.0 */
+ .domainGetInfo = chDomainGetInfo, /* 6.7.0 */
+ .domainIsActive = chDomainIsActive, /* 6.7.0 */
+ .nodeGetInfo = chNodeGetInfo, /* 6.7.0 */
+};
+
+static virConnectDriver chConnectDriver = {
+ .localOnly = true,
+ .uriSchemes = (const char *[]){"ch", "Cloud-Hypervisor", NULL},
+ .hypervisorDriver = &chHypervisorDriver,
+};
+
+static virStateDriver chStateDriver = {
+ .name = "cloud-hypervisor",
+ .stateInitialize = chStateInitialize,
+ .stateCleanup = chStateCleanup,
+};
+
+int chRegister(void)
+{
+ if (virRegisterConnectDriver(&chConnectDriver, false) < 0)
+ return -1;
+ if (virRegisterStateDriver(&chStateDriver) < 0)
+ return -1;
+ return 0;
+}
diff --git a/src/ch/ch_driver.h b/src/ch/ch_driver.h
new file mode 100644
index 0000000000..933be3953b
--- /dev/null
+++ b/src/ch/ch_driver.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_driver.h: header file for Cloud-Hypervisor driver functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+/* Function declarations */
+int chRegister(void);
diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
new file mode 100644
index 0000000000..2968c2aae7
--- /dev/null
+++ b/src/ch/ch_monitor.c
@@ -0,0 +1,837 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_monitor.c: Manage Cloud-Hypervisor interactions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <curl/curl.h>
+
+#include "ch_conf.h"
+#include "ch_monitor.h"
+#include "viralloc.h"
+#include "vircommand.h"
+#include "virerror.h"
+#include "virfile.h"
+#include "virjson.h"
+#include "virlog.h"
+#include "virstring.h"
+#include "virtime.h"
+
+#define VIR_FROM_THIS VIR_FROM_CH
+
+VIR_LOG_INIT("ch.ch_monitor");
+
+static virClass *virCHMonitorClass;
+static void virCHMonitorDispose(void *obj);
+
+static int virCHMonitorOnceInit(void)
+{
+ if (!VIR_CLASS_NEW(virCHMonitor, virClassForObjectLockable()))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virCHMonitor);
+
+int virCHMonitorShutdownVMM(virCHMonitor *mon);
+int virCHMonitorPutNoContent(virCHMonitor *mon, const char *endpoint);
+int virCHMonitorGet(virCHMonitor *mon, const char *endpoint);
+
+static int
+virCHMonitorBuildCPUJson(virJSONValue *content, virDomainDef *vmdef)
+{
+ virJSONValue *cpus;
+ unsigned int maxvcpus = 0;
+ unsigned int nvcpus = 0;
+ virDomainVcpuDef *vcpu;
+ size_t i;
+
+ /* count maximum allowed number vcpus and enabled vcpus when boot.*/
+ maxvcpus = virDomainDefGetVcpusMax(vmdef);
+ for (i = 0; i < maxvcpus; i++) {
+ vcpu = virDomainDefGetVcpu(vmdef, i);
+ if (vcpu->online)
+ nvcpus++;
+ }
+
+ if (maxvcpus != 0 || nvcpus != 0) {
+ cpus = virJSONValueNewObject();
+ if (virJSONValueObjectAppendNumberInt(cpus, "boot_vcpus", nvcpus) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppendNumberInt(cpus, "max_vcpus", vmdef->maxvcpus) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppend(content, "cpus", &cpus) < 0)
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(cpus);
+ return -1;
+}
+
+static int
+virCHMonitorBuildKernelRelatedJson(virJSONValue *content, virDomainDef *vmdef)
+{
+ virJSONValue *kernel = virJSONValueNewObject();
+ virJSONValue *cmdline = virJSONValueNewObject();
+ virJSONValue *initramfs = virJSONValueNewObject();
+
+ if (vmdef->os.kernel == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Kernel image path in this domain is not defined"));
+ goto cleanup;
+ } else {
+ kernel = virJSONValueNewObject();
+ if (virJSONValueObjectAppendString(kernel, "path", vmdef->os.kernel) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppend(content, "kernel", &kernel) < 0)
+ goto cleanup;
+ }
+
+ if (vmdef->os.cmdline) {
+ if (virJSONValueObjectAppendString(cmdline, "args", vmdef->os.cmdline) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppend(content, "cmdline", &cmdline) < 0)
+ goto cleanup;
+ }
+
+ if (vmdef->os.initrd != NULL) {
+ initramfs = virJSONValueNewObject();
+ if (virJSONValueObjectAppendString(initramfs, "path", vmdef->os.initrd) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppend(content, "initramfs", &initramfs) < 0)
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(kernel);
+ virJSONValueFree(cmdline);
+ virJSONValueFree(initramfs);
+
+ return -1;
+}
+
+static int
+virCHMonitorBuildMemoryJson(virJSONValue *content, virDomainDef *vmdef)
+{
+ virJSONValue *memory;
+ unsigned long long total_memory = virDomainDefGetMemoryInitial(vmdef) * 1024;
+
+ if (total_memory != 0) {
+ memory = virJSONValueNewObject();
+ if (virJSONValueObjectAppendNumberUlong(memory, "size", total_memory) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppend(content, "memory", &memory) < 0)
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(memory);
+ return -1;
+}
+
+static int
+virCHMonitorBuildDiskJson(virJSONValue *disks, virDomainDiskDef *diskdef)
+{
+ virJSONValue *disk = virJSONValueNewObject();
+
+ if (!diskdef->src)
+ goto cleanup;
+
+ switch (diskdef->src->type) {
+ case VIR_STORAGE_TYPE_FILE:
+ if (!diskdef->src->path) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("Missing disk file path in domain"));
+ goto cleanup;
+ }
+ if (diskdef->bus != VIR_DOMAIN_DISK_BUS_VIRTIO) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Only virtio bus types are supported for '%s'"), diskdef->src->path);
+ goto cleanup;
+ }
+ if (virJSONValueObjectAppendString(disk, "path", diskdef->src->path) < 0)
+ goto cleanup;
+ if (diskdef->src->readonly) {
+ if (virJSONValueObjectAppendBoolean(disk, "readonly", true) < 0)
+ goto cleanup;
+ }
+ if (virJSONValueArrayAppend(disks, &disk) < 0)
+ goto cleanup;
+
+ break;
+ case VIR_STORAGE_TYPE_NONE:
+ case VIR_STORAGE_TYPE_BLOCK:
+ case VIR_STORAGE_TYPE_DIR:
+ case VIR_STORAGE_TYPE_NETWORK:
+ case VIR_STORAGE_TYPE_VOLUME:
+ case VIR_STORAGE_TYPE_NVME:
+ case VIR_STORAGE_TYPE_VHOST_USER:
+ default:
+ virReportEnumRangeError(virStorageType, diskdef->src->type);
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(disk);
+ return -1;
+}
+
+static int
+virCHMonitorBuildDisksJson(virJSONValue *content, virDomainDef *vmdef)
+{
+ virJSONValue *disks;
+ size_t i;
+
+ if (vmdef->ndisks > 0) {
+ disks = virJSONValueNewArray();
+
+ for (i = 0; i < vmdef->ndisks; i++) {
+ if (virCHMonitorBuildDiskJson(disks, vmdef->disks[i]) < 0)
+ goto cleanup;
+ }
+ if (virJSONValueObjectAppend(content, "disks", &disks) < 0)
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(disks);
+ return -1;
+}
+
+static int
+virCHMonitorBuildNetJson(virJSONValue *nets, virDomainNetDef *netdef)
+{
+ virDomainNetType netType = virDomainNetGetActualType(netdef);
+ char macaddr[VIR_MAC_STRING_BUFLEN];
+ virJSONValue *net;
+
+ // check net type at first
+ net = virJSONValueNewObject();
+
+ switch (netType) {
+ case VIR_DOMAIN_NET_TYPE_ETHERNET:
+ if (netdef->guestIP.nips == 1) {
+ const virNetDevIPAddr *ip = netdef->guestIP.ips[0];
+ g_autofree char *addr = NULL;
+ virSocketAddr netmask;
+ g_autofree char *netmaskStr = NULL;
+ if (!(addr = virSocketAddrFormat(&ip->address)))
+ goto cleanup;
+ if (virJSONValueObjectAppendString(net, "ip", addr) < 0)
+ goto cleanup;
+
+ if (virSocketAddrPrefixToNetmask(ip->prefix, &netmask, AF_INET) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to translate net prefix %d to netmask"),
+ ip->prefix);
+ goto cleanup;
+ }
+ if (!(netmaskStr = virSocketAddrFormat(&netmask)))
+ goto cleanup;
+ if (virJSONValueObjectAppendString(net, "mask", netmaskStr) < 0)
+ goto cleanup;
+ } else if (netdef->guestIP.nips > 1) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("ethernet type supports a single guest ip"));
+ }
+ break;
+ case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+ if ((virDomainChrType)netdef->data.vhostuser->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("vhost_user type support UNIX socket in this CH"));
+ goto cleanup;
+ } else {
+ if (virJSONValueObjectAppendString(net, "vhost_socket", netdef->data.vhostuser->data.nix.path) < 0)
+ goto cleanup;
+ if (virJSONValueObjectAppendBoolean(net, "vhost_user", true) < 0)
+ goto cleanup;
+ }
+ break;
+ case VIR_DOMAIN_NET_TYPE_BRIDGE:
+ case VIR_DOMAIN_NET_TYPE_NETWORK:
+ case VIR_DOMAIN_NET_TYPE_DIRECT:
+ case VIR_DOMAIN_NET_TYPE_USER:
+ case VIR_DOMAIN_NET_TYPE_SERVER:
+ case VIR_DOMAIN_NET_TYPE_CLIENT:
+ case VIR_DOMAIN_NET_TYPE_MCAST:
+ case VIR_DOMAIN_NET_TYPE_INTERNAL:
+ case VIR_DOMAIN_NET_TYPE_HOSTDEV:
+ case VIR_DOMAIN_NET_TYPE_UDP:
+ case VIR_DOMAIN_NET_TYPE_VDPA:
+ case VIR_DOMAIN_NET_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainNetType, netType);
+ goto cleanup;
+ }
+
+ if (netdef->ifname != NULL) {
+ if (virJSONValueObjectAppendString(net, "tap", netdef->ifname) < 0)
+ goto cleanup;
+ }
+ if (virJSONValueObjectAppendString(net, "mac", virMacAddrFormat(&netdef->mac, macaddr)) < 0)
+ goto cleanup;
+
+
+ if (netdef->virtio != NULL) {
+ if (netdef->virtio->iommu == VIR_TRISTATE_SWITCH_ON) {
+ if (virJSONValueObjectAppendBoolean(net, "iommu", true) < 0)
+ goto cleanup;
+ }
+ }
+ if (netdef->driver.virtio.queues) {
+ if (virJSONValueObjectAppendNumberInt(net, "num_queues", netdef->driver.virtio.queues) < 0)
+ goto cleanup;
+ }
+
+ if (netdef->driver.virtio.rx_queue_size || netdef->driver.virtio.tx_queue_size) {
+ if (netdef->driver.virtio.rx_queue_size != netdef->driver.virtio.tx_queue_size) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("virtio rx_queue_size option %d is not same with tx_queue_size %d"),
+ netdef->driver.virtio.rx_queue_size,
+ netdef->driver.virtio.tx_queue_size);
+ goto cleanup;
+ }
+ if (virJSONValueObjectAppendNumberInt(net, "queue_size", netdef->driver.virtio.rx_queue_size) < 0)
+ goto cleanup;
+ }
+
+ if (virJSONValueArrayAppend(nets, &net) < 0)
+ goto cleanup;
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(net);
+ return -1;
+}
+
+static int
+virCHMonitorBuildNetsJson(virJSONValue *content, virDomainDef *vmdef)
+{
+ virJSONValue *nets;
+ size_t i;
+
+ if (vmdef->nnets > 0) {
+ nets = virJSONValueNewArray();
+
+ for (i = 0; i < vmdef->nnets; i++) {
+ if (virCHMonitorBuildNetJson(nets, vmdef->nets[i]) < 0)
+ goto cleanup;
+ }
+ if (virJSONValueObjectAppend(content, "net", &nets) < 0)
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ virJSONValueFree(nets);
+ return -1;
+}
+
+static int
+virCHMonitorDetectUnsupportedDevices(virDomainDef *vmdef)
+{
+ int ret = 0;
+
+ if (vmdef->ngraphics > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support graphics"));
+ ret = 1;
+ }
+ if (vmdef->ncontrollers > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support controllers"));
+ ret = 1;
+ }
+ if (vmdef->nfss > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support fss"));
+ ret = 1;
+ }
+ if (vmdef->ninputs > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support inputs"));
+ ret = 1;
+ }
+ if (vmdef->nsounds > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support sounds"));
+ ret = 1;
+ }
+ if (vmdef->naudios > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support audios"));
+ ret = 1;
+ }
+ if (vmdef->nvideos > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support videos"));
+ ret = 1;
+ }
+ if (vmdef->nhostdevs > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support hostdevs"));
+ ret = 1;
+ }
+ if (vmdef->nredirdevs > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support redirdevs"));
+ ret = 1;
+ }
+ if (vmdef->nsmartcards > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support smartcards"));
+ ret = 1;
+ }
+ if (vmdef->nserials > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support serials"));
+ ret = 1;
+ }
+ if (vmdef->nparallels > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support parallels"));
+ ret = 1;
+ }
+ if (vmdef->nchannels > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support channels"));
+ ret = 1;
+ }
+ if (vmdef->nconsoles > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support consoles"));
+ ret = 1;
+ }
+ if (vmdef->nleases > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support leases"));
+ ret = 1;
+ }
+ if (vmdef->nhubs > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support hubs"));
+ ret = 1;
+ }
+ if (vmdef->nseclabels > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support seclabels"));
+ ret = 1;
+ }
+ if (vmdef->nrngs > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support rngs"));
+ ret = 1;
+ }
+ if (vmdef->nshmems > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support shmems"));
+ ret = 1;
+ }
+ if (vmdef->nmems > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support mems"));
+ ret = 1;
+ }
+ if (vmdef->npanics > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support panics"));
+ ret = 1;
+ }
+ if (vmdef->nsysinfo > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cloud-Hypervisor doesn't support sysinfo"));
+ ret = 1;
+ }
+
+ return ret;
+}
+
+static int
+virCHMonitorBuildVMJson(virDomainDef *vmdef, char **jsonstr)
+{
+ virJSONValue *content = virJSONValueNewObject();
+ int ret = -1;
+
+ if (vmdef == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("VM is not defined"));
+ goto cleanup;
+ }
+
+ if (virCHMonitorDetectUnsupportedDevices(vmdef))
+ goto cleanup;
+
+ if (virCHMonitorBuildCPUJson(content, vmdef) < 0)
+ goto cleanup;
+
+ if (virCHMonitorBuildMemoryJson(content, vmdef) < 0)
+ goto cleanup;
+
+ if (virCHMonitorBuildKernelRelatedJson(content, vmdef) < 0)
+ goto cleanup;
+
+ if (virCHMonitorBuildDisksJson(content, vmdef) < 0)
+ goto cleanup;
+
+ if (virCHMonitorBuildNetsJson(content, vmdef) < 0)
+ goto cleanup;
+
+ if (!(*jsonstr = virJSONValueToString(content, false)))
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ virJSONValueFree(content);
+ return ret;
+}
+
+static int
+chMonitorCreateSocket(const char *socket_path)
+{
+ struct sockaddr_un addr;
+ socklen_t addrlen = sizeof(addr);
+ int fd;
+
+ if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Unable to create UNIX socket"));
+ goto error;
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ if (virStrcpyStatic(addr.sun_path, socket_path) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("UNIX socket path '%s' too long"),
+ socket_path);
+ goto error;
+ }
+
+ if (unlink(socket_path) < 0 && errno != ENOENT) {
+ virReportSystemError(errno,
+ _("Unable to unlink %s"),
+ socket_path);
+ goto error;
+ }
+
+ if (bind(fd, (struct sockaddr *)&addr, addrlen) < 0) {
+ virReportSystemError(errno,
+ _("Unable to bind to UNIX socket path '%s'"),
+ socket_path);
+ goto error;
+ }
+
+ if (listen(fd, 1) < 0) {
+ virReportSystemError(errno,
+ _("Unable to listen to UNIX socket path '%s'"),
+ socket_path);
+ goto error;
+ }
+
+ /* We run cloud-hypervisor with umask 0002. Compensate for the umask
+ * libvirtd might be running under to get the same permission
+ * cloud-hypervisor would have. */
+ if (virFileUpdatePerm(socket_path, 0002, 0664) < 0)
+ goto error;
+
+ return fd;
+
+ error:
+ VIR_FORCE_CLOSE(fd);
+ return -1;
+}
+
+virCHMonitor *
+virCHMonitorNew(virDomainObj *vm, const char *socketdir)
+{
+ virCHMonitor *ret = NULL;
+ virCHMonitor *mon = NULL;
+ virCommand *cmd = NULL;
+ int socket_fd = 0;
+
+ if (virCHMonitorInitialize() < 0)
+ return NULL;
+
+ if (!(mon = virObjectLockableNew(virCHMonitorClass)))
+ return NULL;
+
+ if (!vm->def) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("VM is not defined"));
+ return NULL;
+ }
+
+ /* prepare to launch Cloud-Hypervisor socket */
+ mon->socketpath = g_strdup_printf("%s/%s-socket", socketdir, vm->def->name);
+ if (g_mkdir_with_parents(socketdir, 0777) < 0) {
+ virReportSystemError(errno,
+ _("Cannot create socket directory '%s'"),
+ socketdir);
+ goto cleanup;
+ }
+
+ cmd = virCommandNew(vm->def->emulator);
+ virCommandSetUmask(cmd, 0x002);
+ socket_fd = chMonitorCreateSocket(mon->socketpath);
+ if (socket_fd < 0) {
+ virReportSystemError(errno,
+ _("Cannot create socket '%s'"),
+ mon->socketpath);
+ goto cleanup;
+ }
+
+ virCommandAddArg(cmd, "--api-socket");
+ virCommandAddArgFormat(cmd, "fd=%d", socket_fd);
+ virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
+
+ /* launch Cloud-Hypervisor socket */
+ if (virCommandRunAsync(cmd, &mon->pid) < 0)
+ goto cleanup;
+
+ /* get a curl handle */
+ mon->handle = curl_easy_init();
+
+ /* now has its own reference */
+ virObjectRef(mon);
+ mon->vm = virObjectRef(vm);
+
+ ret = mon;
+
+ cleanup:
+ virCommandFree(cmd);
+ return ret;
+}
+
+static void virCHMonitorDispose(void *opaque)
+{
+ virCHMonitor *mon = opaque;
+
+ VIR_DEBUG("mon=%p", mon);
+ virObjectUnref(mon->vm);
+}
+
+void virCHMonitorClose(virCHMonitor *mon)
+{
+ if (!mon)
+ return;
+
+ if (mon->pid > 0) {
+ /* try cleaning up the Cloud-Hypervisor process */
+ virProcessAbort(mon->pid);
+ mon->pid = 0;
+ }
+
+ if (mon->handle)
+ curl_easy_cleanup(mon->handle);
+
+ if (mon->socketpath) {
+ if (virFileRemove(mon->socketpath, -1, -1) < 0) {
+ VIR_WARN("Unable to remove CH socket file '%s'",
+ mon->socketpath);
+ }
+ g_free(mon->socketpath);
+ }
+
+ virObjectUnref(mon);
+ if (mon->vm)
+ virObjectUnref(mon->vm);
+}
+
+static int
+virCHMonitorCurlPerform(CURL *handle)
+{
+ CURLcode errorCode;
+ long responseCode = 0;
+
+ errorCode = curl_easy_perform(handle);
+
+ if (errorCode != CURLE_OK) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("curl_easy_perform() returned an error: %s (%d)"),
+ curl_easy_strerror(errorCode), errorCode);
+ return -1;
+ }
+
+ errorCode = curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE,
+ &responseCode);
+
+ if (errorCode != CURLE_OK) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("curl_easy_getinfo(CURLINFO_RESPONSE_CODE) returned an "
+ "error: %s (%d)"), curl_easy_strerror(errorCode),
+ errorCode);
+ return -1;
+ }
+
+ if (responseCode < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("curl_easy_getinfo(CURLINFO_RESPONSE_CODE) returned a "
+ "negative response code"));
+ return -1;
+ }
+
+ return responseCode;
+}
+
+int
+virCHMonitorPutNoContent(virCHMonitor *mon, const char *endpoint)
+{
+ g_autofree char *url = NULL;
+ int responseCode = 0;
+ int ret = -1;
+
+ url = g_strdup_printf("%s/%s", URL_ROOT, endpoint);
+
+ virObjectLock(mon);
+
+ /* reset all options of a libcurl session handle at first */
+ curl_easy_reset(mon->handle);
+
+ curl_easy_setopt(mon->handle, CURLOPT_UNIX_SOCKET_PATH, mon->socketpath);
+ curl_easy_setopt(mon->handle, CURLOPT_URL, url);
+ curl_easy_setopt(mon->handle, CURLOPT_PUT, true);
+ curl_easy_setopt(mon->handle, CURLOPT_HTTPHEADER, NULL);
+
+ responseCode = virCHMonitorCurlPerform(mon->handle);
+
+ virObjectUnlock(mon);
+
+ if (responseCode == 200 || responseCode == 204)
+ ret = 0;
+
+ return ret;
+}
+
+int
+virCHMonitorGet(virCHMonitor *mon, const char *endpoint)
+{
+ g_autofree char *url = NULL;
+ int responseCode = 0;
+ int ret = -1;
+
+ url = g_strdup_printf("%s/%s", URL_ROOT, endpoint);
+
+ virObjectLock(mon);
+
+ /* reset all options of a libcurl session handle at first */
+ curl_easy_reset(mon->handle);
+
+ curl_easy_setopt(mon->handle, CURLOPT_UNIX_SOCKET_PATH, mon->socketpath);
+ curl_easy_setopt(mon->handle, CURLOPT_URL, url);
+
+ responseCode = virCHMonitorCurlPerform(mon->handle);
+
+ virObjectUnlock(mon);
+
+ if (responseCode == 200 || responseCode == 204)
+ ret = 0;
+
+ return ret;
+}
+
+int
+virCHMonitorShutdownVMM(virCHMonitor *mon)
+{
+ return virCHMonitorPutNoContent(mon, URL_VMM_SHUTDOWN);
+}
+
+int
+virCHMonitorCreateVM(virCHMonitor *mon)
+{
+ g_autofree char *url = NULL;
+ int responseCode = 0;
+ int ret = -1;
+ g_autofree char *payload = NULL;
+ struct curl_slist *headers = NULL;
+
+ url = g_strdup_printf("%s/%s", URL_ROOT, URL_VM_CREATE);
+ headers = curl_slist_append(headers, "Accept: application/json");
+ headers = curl_slist_append(headers, "Content-Type: application/json");
+
+ if (virCHMonitorBuildVMJson(mon->vm->def, &payload) != 0)
+ return -1;
+
+ virObjectLock(mon);
+
+ /* reset all options of a libcurl session handle at first */
+ curl_easy_reset(mon->handle);
+
+ curl_easy_setopt(mon->handle, CURLOPT_UNIX_SOCKET_PATH, mon->socketpath);
+ curl_easy_setopt(mon->handle, CURLOPT_URL, url);
+ curl_easy_setopt(mon->handle, CURLOPT_CUSTOMREQUEST, "PUT");
+ curl_easy_setopt(mon->handle, CURLOPT_HTTPHEADER, headers);
+ curl_easy_setopt(mon->handle, CURLOPT_POSTFIELDS, payload);
+
+ responseCode = virCHMonitorCurlPerform(mon->handle);
+
+ virObjectUnlock(mon);
+
+ if (responseCode == 200 || responseCode == 204)
+ ret = 0;
+
+ curl_slist_free_all(headers);
+ return ret;
+}
+
+int
+virCHMonitorBootVM(virCHMonitor *mon)
+{
+ return virCHMonitorPutNoContent(mon, URL_VM_BOOT);
+}
+
+int
+virCHMonitorShutdownVM(virCHMonitor *mon)
+{
+ return virCHMonitorPutNoContent(mon, URL_VM_SHUTDOWN);
+}
+
+int
+virCHMonitorRebootVM(virCHMonitor *mon)
+{
+ return virCHMonitorPutNoContent(mon, URL_VM_REBOOT);
+}
+
+int
+virCHMonitorSuspendVM(virCHMonitor *mon)
+{
+ return virCHMonitorPutNoContent(mon, URL_VM_Suspend);
+}
+
+int
+virCHMonitorResumeVM(virCHMonitor *mon)
+{
+ return virCHMonitorPutNoContent(mon, URL_VM_RESUME);
+}
diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h
new file mode 100644
index 0000000000..e717e11cbc
--- /dev/null
+++ b/src/ch/ch_monitor.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_monitor.h: header file for managing Cloud-Hypervisor interactions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <curl/curl.h>
+
+#include "virobject.h"
+#include "domain_conf.h"
+
+#define URL_ROOT "http://localhost/api/v1"
+#define URL_VMM_SHUTDOWN "vmm.shutdown"
+#define URL_VM_CREATE "vm.create"
+#define URL_VM_DELETE "vm.delete"
+#define URL_VM_BOOT "vm.boot"
+#define URL_VM_SHUTDOWN "vm.shutdown"
+#define URL_VM_REBOOT "vm.reboot"
+#define URL_VM_Suspend "vm.pause"
+#define URL_VM_RESUME "vm.resume"
+
+typedef struct _virCHMonitor virCHMonitor;
+
+struct _virCHMonitor {
+ virObjectLockable parent;
+
+ CURL *handle;
+
+ char *socketpath;
+
+ pid_t pid;
+
+ virDomainObj *vm;
+};
+
+virCHMonitor *virCHMonitorNew(virDomainObj *vm, const char *socketdir);
+void virCHMonitorClose(virCHMonitor *mon);
+
+int virCHMonitorCreateVM(virCHMonitor *mon);
+int virCHMonitorBootVM(virCHMonitor *mon);
+int virCHMonitorShutdownVM(virCHMonitor *mon);
+int virCHMonitorRebootVM(virCHMonitor *mon);
+int virCHMonitorSuspendVM(virCHMonitor *mon);
+int virCHMonitorResumeVM(virCHMonitor *mon);
diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c
new file mode 100644
index 0000000000..93b1f7f97e
--- /dev/null
+++ b/src/ch/ch_process.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_process.c: Process controller for Cloud-Hypervisor driver
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "ch_domain.h"
+#include "ch_monitor.h"
+#include "ch_process.h"
+#include "viralloc.h"
+#include "virerror.h"
+#include "virlog.h"
+
+#define VIR_FROM_THIS VIR_FROM_CH
+
+VIR_LOG_INIT("ch.ch_process");
+
+#define START_SOCKET_POSTFIX ": starting up socket\n"
+#define START_VM_POSTFIX ": starting up vm\n"
+
+
+
+static virCHMonitor *
+virCHProcessConnectMonitor(virCHDriver *driver,
+ virDomainObj *vm)
+{
+ virCHMonitor *monitor = NULL;
+ virCHDriverConfig *cfg = virCHDriverGetConfig(driver);
+
+ monitor = virCHMonitorNew(vm, cfg->stateDir);
+
+ virObjectUnref(cfg);
+ return monitor;
+}
+
+/**
+ * virCHProcessStart:
+ * @driver: pointer to driver structure
+ * @vm: pointer to virtual machine structure
+ * @reason: reason for switching vm to running state
+ *
+ * Starts Cloud-Hypervisor listen on a local socket
+ *
+ * Returns 0 on success or -1 in case of error
+ */
+int virCHProcessStart(virCHDriver *driver,
+ virDomainObj *vm,
+ virDomainRunningReason reason)
+{
+ int ret = -1;
+ virCHDomainObjPrivate *priv = vm->privateData;
+
+ if (!priv->monitor) {
+ /* And we can get the first monitor connection now too */
+ if (!(priv->monitor = virCHProcessConnectMonitor(driver, vm))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to create connection to CH socket"));
+ goto cleanup;
+ }
+
+ if (virCHMonitorCreateVM(priv->monitor) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to create guest VM"));
+ goto cleanup;
+ }
+ }
+
+ if (virCHMonitorBootVM(priv->monitor) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to boot guest VM"));
+ goto cleanup;
+ }
+
+ vm->pid = priv->monitor->pid;
+ vm->def->id = vm->pid;
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, reason);
+
+ return 0;
+
+ cleanup:
+ if (ret)
+ virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
+
+ return ret;
+}
+
+int virCHProcessStop(virCHDriver *driver G_GNUC_UNUSED,
+ virDomainObj *vm,
+ virDomainShutoffReason reason)
+{
+ virCHDomainObjPrivate *priv = vm->privateData;
+
+ VIR_DEBUG("Stopping VM name=%s pid=%d reason=%d",
+ vm->def->name, (int)vm->pid, (int)reason);
+
+ if (priv->monitor) {
+ virCHMonitorClose(priv->monitor);
+ priv->monitor = NULL;
+ }
+
+ vm->pid = -1;
+ vm->def->id = -1;
+
+ virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason);
+
+ return 0;
+}
diff --git a/src/ch/ch_process.h b/src/ch/ch_process.h
new file mode 100644
index 0000000000..abc4915979
--- /dev/null
+++ b/src/ch/ch_process.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright Intel Corp. 2020-2021
+ *
+ * ch_process.h: header file for Cloud-Hypervisor's process controller
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "ch_conf.h"
+#include "internal.h"
+
+int virCHProcessStart(virCHDriver *driver,
+ virDomainObj *vm,
+ virDomainRunningReason reason);
+int virCHProcessStop(virCHDriver *driver,
+ virDomainObj *vm,
+ virDomainShutoffReason reason);
diff --git a/src/ch/meson.build b/src/ch/meson.build
new file mode 100644
index 0000000000..e34974d56c
--- /dev/null
+++ b/src/ch/meson.build
@@ -0,0 +1,74 @@
+ch_driver_sources = [
+ 'ch_conf.c',
+ 'ch_conf.h',
+ 'ch_domain.c',
+ 'ch_domain.h',
+ 'ch_driver.c',
+ 'ch_driver.h',
+ 'ch_monitor.c',
+ 'ch_monitor.h',
+ 'ch_process.c',
+ 'ch_process.h',
+]
+
+driver_source_files += files(ch_driver_sources)
+
+stateful_driver_source_files += files(ch_driver_sources)
+
+if conf.has('WITH_CH')
+ ch_driver_impl = static_library(
+ 'virt_driver_ch_impl',
+ [
+ ch_driver_sources,
+ ],
+ dependencies: [
+ access_dep,
+ curl_dep,
+ log_dep,
+ src_dep,
+ ],
+ include_directories: [
+ conf_inc_dir,
+ ],
+ )
+
+ virt_modules += {
+ 'name': 'virt_driver_ch',
+ 'link_whole': [
+ ch_driver_impl,
+ ],
+ 'link_args': [
+ libvirt_no_undefined,
+ ],
+ }
+
+ virt_daemons += {
+ 'name': 'virtchd',
+ 'c_args': [
+ '-DDAEMON_NAME="virtchd"',
+ '-DMODULE_NAME="ch"',
+ ],
+ }
+
+ virt_daemon_confs += {
+ 'name': 'virtchd',
+ }
+
+ virt_daemon_units += {
+ 'service': 'virtchd',
+ 'service_in': files('virtchd.service.in'),
+ 'name': 'Libvirt ch',
+ 'sockprefix': 'virtchd',
+ 'sockets': [ 'main', 'ro', 'admin' ],
+ }
+
+ sysconf_files += {
+ 'name': 'virtchd',
+ 'file': files('virtchd.sysconf'),
+ }
+
+ virt_install_dirs += [
+ localstatedir / 'lib' / 'libvirt' / 'ch',
+ runstatedir / 'libvirt' / 'ch',
+ ]
+endif
diff --git a/src/ch/virtchd.service.in b/src/ch/virtchd.service.in
new file mode 100644
index 0000000000..cc1e85d1df
--- /dev/null
+++ b/src/ch/virtchd.service.in
@@ -0,0 +1,47 @@
+[Unit]
+Description=Virtualization Cloud-Hypervisor daemon
+Conflicts=libvirtd.service
+Requires=virtchd.socket
+Requires=virtchd-ro.socket
+Requires=virtchd-admin.socket
+Wants=systemd-machined.service
+Before=libvirt-guests.service
+After=network.target
+After=dbus.service
+After=apparmor.service
+After=local-fs.target
+After=remote-fs.target
+After=systemd-logind.service
+After=systemd-machined.service
+Documentation=man:libvirtd(8)
+Documentation=https://libvirt.org
+
+[Service]
+Type=notify
+EnvironmentFile=-@sysconfdir@/sysconfig/virtchd
+ExecStart=@sbindir@/virtchd $VIRTCHD_ARGS
+ExecReload=/bin/kill -HUP $MAINPID
+KillMode=process
+Restart=on-failure
+# At least 2 FD per guest (eg ch monitor + ch socket).
+# eg if we want to support 4096 guests, we'll typically need 8192 FDs
+# If changing this, also consider virtlogd.service & virtlockd.service
+# limits which are also related to number of guests
+LimitNOFILE=8192
+# The cgroups pids controller can limit the number of tasks started by
+# the daemon, which can limit the number of domains for some hypervisors.
+# A conservative default of 8 tasks per guest results in a TasksMax of
+# 32k to support 4096 guests.
+TasksMax=32768
+# With cgroups v2 there is no devices controller anymore, we have to use
+# eBPF to control access to devices. In order to do that we create a eBPF
+# hash MAP which locks memory. The default map size for 64 devices together
+# with program takes 12k per guest. After rounding up we will get 64M to
+# support 4096 guests.
+LimitMEMLOCK=64M
+
+[Install]
+WantedBy=multi-user.target
+Also=virtchd.socket
+Also=virtchd-ro.socket
+Also=virtchd-admin.socket
diff --git a/src/ch/virtchd.sysconf b/src/ch/virtchd.sysconf
new file mode 100644
index 0000000000..5ee44be5cf
--- /dev/null
+++ b/src/ch/virtchd.sysconf
@@ -0,0 +1,3 @@
+# Customizations for the virtchd.service systemd unit
+
+VIRTCHD_ARGS="--timeout 120"
diff --git a/src/meson.build b/src/meson.build
index c7ff9e978c..2bd88e6699 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -271,6 +271,7 @@ subdir('esx')
subdir('hyperv')
subdir('libxl')
subdir('lxc')
+subdir('ch')
subdir('openvz')
subdir('qemu')
subdir('test')
diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
index ec2661d0a8..7076fe3294 100644
--- a/src/remote/remote_daemon.c
+++ b/src/remote/remote_daemon.c
@@ -169,6 +169,10 @@ static int daemonInitialize(void)
if (virDriverLoadModule("qemu", "qemuRegister", false) < 0)
return -1;
# endif
+# ifdef WITH_CH
+ if (virDriverLoadModule("ch", "chRegister", false) < 0)
+ return -1;
+# endif
# ifdef WITH_LXC
if (virDriverLoadModule("lxc", "lxcRegister", false) < 0)
return -1;
diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
index 1b4f5256c3..e500b41564 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -2139,7 +2139,8 @@ remoteDispatchConnectOpen(virNetServer *server G_GNUC_UNUSED,
STREQ(type, "VBOX") ||
STREQ(type, "bhyve") ||
STREQ(type, "vz") ||
- STREQ(type, "Parallels")) {
+ STREQ(type, "Parallels") ||
+ STREQ(type, "CH")) {
VIR_DEBUG("Hypervisor driver found, setting URIs for secondary drivers");
if (getuid() == 0) {
priv->interfaceURI = "interface:///system";
diff --git a/src/util/virerror.c b/src/util/virerror.c
index 1746487f7d..d9e2c65dc8 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -145,6 +145,7 @@ VIR_ENUM_IMPL(virErrorDomain,
"TPM", /* 70 */
"BPF",
+ "Cloud-Hypervisor Driver",
);
diff --git a/tools/virsh.c b/tools/virsh.c
index 7d7109cfdf..70355a606b 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -506,6 +506,9 @@ virshShowVersion(vshControl *ctl G_GNUC_UNUSED)
#ifdef WITH_OPENVZ
vshPrint(ctl, " OpenVZ");
#endif
+#ifdef WITH_CH
+ vshPrint(ctl, " Cloud-Hypervisor");
+#endif
#ifdef WITH_VZ
vshPrint(ctl, " Virtuozzo");
#endif
--
2.31.1
3
4