render / rpms / libvirt

Forked from rpms/libvirt 5 months ago
Clone
Pablo Greco 40546a
From fddd43e717869d56e481c3fde2d5ee6b5513a1f5 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <fddd43e717869d56e481c3fde2d5ee6b5513a1f5@dist-git>
Pablo Greco 40546a
From: Yi Min Zhao <zyimin@linux.ibm.com>
Pablo Greco 40546a
Date: Mon, 8 Apr 2019 10:57:25 +0200
Pablo Greco 40546a
Subject: [PATCH] conf: Introduce parser, formatter for uid and fid
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
This patch introduces new XML parser/formatter functions. Uid is
Pablo Greco 40546a
16-bit and non-zero. Fid is 32-bit. They are the two attributes of zpci
Pablo Greco 40546a
which is introduced as PCI address element. Zpci element is parsed and
Pablo Greco 40546a
formatted along with PCI address. And add the related test cases.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com>
Pablo Greco 40546a
Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Pablo Greco 40546a
Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com>
Pablo Greco 40546a
Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
Pablo Greco 40546a
Pablo Greco 40546a
(cherry picked from commit b4833b2c2f7be8a68eb6495ed57ed61918e3ecd8)
Pablo Greco 40546a
Pablo Greco 40546a
https://bugzilla.redhat.com/show_bug.cgi?id=1508149
Pablo Greco 40546a
Pablo Greco 40546a
Conflicts:
Pablo Greco 40546a
Pablo Greco 40546a
  * src/conf/device_conf.c
Pablo Greco 40546a
    + context
Pablo Greco 40546a
      - missing edeef779585
Pablo Greco 40546a
Pablo Greco 40546a
  * tests/qemuxml2argvtest.c
Pablo Greco 40546a
    + context
Pablo Greco 40546a
      - missing a0ff9fbe5cad, 0bdb704383f7
Pablo Greco 40546a
Pablo Greco 40546a
Changed:
Pablo Greco 40546a
Pablo Greco 40546a
  * tests/qemuxml2argvdata/disk-virtio-s390-zpci.args
Pablo Greco 40546a
    tests/qemuxml2argvdata/hostdev-vfio-zpci.args
Pablo Greco 40546a
    + no -boot in output
Pablo Greco 40546a
      - missing caccbba64aa9
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Pablo Greco 40546a
Message-Id: <20190408085732.28684-9-abologna@redhat.com>
Pablo Greco 40546a
Reviewed-by: Laine Stump <laine@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 docs/schemas/basictypes.rng                   | 27 ++++++++++
Pablo Greco 40546a
 docs/schemas/domaincommon.rng                 |  1 +
Pablo Greco 40546a
 src/conf/device_conf.c                        | 53 +++++++++++++++++++
Pablo Greco 40546a
 src/conf/domain_addr.c                        |  3 ++
Pablo Greco 40546a
 src/conf/domain_conf.c                        | 12 ++++-
Pablo Greco 40546a
 src/libvirt_private.syms                      |  2 +
Pablo Greco 40546a
 src/util/virpci.c                             | 26 +++++++++
Pablo Greco 40546a
 src/util/virpci.h                             |  6 +++
Pablo Greco 40546a
 .../disk-virtio-s390-zpci.args                | 26 +++++++++
Pablo Greco 40546a
 .../disk-virtio-s390-zpci.xml                 | 19 +++++++
Pablo Greco 40546a
 tests/qemuxml2argvdata/hostdev-vfio-zpci.args | 24 +++++++++
Pablo Greco 40546a
 tests/qemuxml2argvdata/hostdev-vfio-zpci.xml  | 21 ++++++++
Pablo Greco 40546a
 tests/qemuxml2argvtest.c                      |  7 +++
Pablo Greco 40546a
 .../disk-virtio-s390-zpci.xml                 | 31 +++++++++++
Pablo Greco 40546a
 .../qemuxml2xmloutdata/hostdev-vfio-zpci.xml  | 32 +++++++++++
Pablo Greco 40546a
 tests/qemuxml2xmltest.c                       |  6 +++
Pablo Greco 40546a
 16 files changed, 295 insertions(+), 1 deletion(-)
Pablo Greco 40546a
 create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.args
Pablo Greco 40546a
 create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml
Pablo Greco 40546a
 create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.args
Pablo Greco 40546a
 create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.xml
Pablo Greco 40546a
 create mode 100644 tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml
Pablo Greco 40546a
 create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng
Pablo Greco 40546a
index b45a7fcdc8..97e14d7ca8 100644
Pablo Greco 40546a
--- a/docs/schemas/basictypes.rng
Pablo Greco 40546a
+++ b/docs/schemas/basictypes.rng
Pablo Greco 40546a
@@ -65,6 +65,17 @@
Pablo Greco 40546a
       </data>
Pablo Greco 40546a
     </choice>
Pablo Greco 40546a
   </define>
Pablo Greco 40546a
+  <define name="uint32">
Pablo Greco 40546a
+    <choice>
Pablo Greco 40546a
+      <data type="string">
Pablo Greco 40546a
+        <param name="pattern">(0x)?[0-9a-fA-F]{1,8}</param>
Pablo Greco 40546a
+      </data>
Pablo Greco 40546a
+      <data type="unsignedInt">
Pablo Greco 40546a
+        <param name="minInclusive">0</param>
Pablo Greco 40546a
+        <param name="maxInclusive">4294967295</param>
Pablo Greco 40546a
+      </data>
Pablo Greco 40546a
+    </choice>
Pablo Greco 40546a
+  </define>
Pablo Greco 40546a
 
Pablo Greco 40546a
   <define name="UUID">
Pablo Greco 40546a
     <choice>
Pablo Greco 40546a
@@ -111,6 +122,22 @@
Pablo Greco 40546a
       </attribute>
Pablo Greco 40546a
     </optional>
Pablo Greco 40546a
   </define>
Pablo Greco 40546a
+  <define name="zpciaddress">
Pablo Greco 40546a
+    <optional>
Pablo Greco 40546a
+      <element name="zpci">
Pablo Greco 40546a
+        <optional>
Pablo Greco 40546a
+          <attribute name="uid">
Pablo Greco 40546a
+            <ref name="uint16"/>
Pablo Greco 40546a
+          </attribute>
Pablo Greco 40546a
+        </optional>
Pablo Greco 40546a
+        <optional>
Pablo Greco 40546a
+          <attribute name="fid">
Pablo Greco 40546a
+            <ref name="uint32"/>
Pablo Greco 40546a
+          </attribute>
Pablo Greco 40546a
+        </optional>
Pablo Greco 40546a
+      </element>
Pablo Greco 40546a
+    </optional>
Pablo Greco 40546a
+  </define>
Pablo Greco 40546a
 
Pablo Greco 40546a
   
Pablo Greco 40546a
   
Pablo Greco 40546a
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
Pablo Greco 40546a
index 70a7767d9c..2b6d4dced6 100644
Pablo Greco 40546a
--- a/docs/schemas/domaincommon.rng
Pablo Greco 40546a
+++ b/docs/schemas/domaincommon.rng
Pablo Greco 40546a
@@ -5186,6 +5186,7 @@
Pablo Greco 40546a
             <value>pci</value>
Pablo Greco 40546a
           </attribute>
Pablo Greco 40546a
           <ref name="pciaddress"/>
Pablo Greco 40546a
+          <ref name="zpciaddress"/>
Pablo Greco 40546a
         </group>
Pablo Greco 40546a
         <group>
Pablo Greco 40546a
           <attribute name="type">
Pablo Greco 40546a
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
Pablo Greco 40546a
index d69f94fadf..cadac32603 100644
Pablo Greco 40546a
--- a/src/conf/device_conf.c
Pablo Greco 40546a
+++ b/src/conf/device_conf.c
Pablo Greco 40546a
@@ -32,6 +32,45 @@
Pablo Greco 40546a
 
Pablo Greco 40546a
 #define VIR_FROM_THIS VIR_FROM_DEVICE
Pablo Greco 40546a
 
Pablo Greco 40546a
+static int
Pablo Greco 40546a
+virZPCIDeviceAddressParseXML(xmlNodePtr node,
Pablo Greco 40546a
+                             virPCIDeviceAddressPtr addr)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    virZPCIDeviceAddress def = { 0 };
Pablo Greco 40546a
+    char *uid;
Pablo Greco 40546a
+    char *fid;
Pablo Greco 40546a
+    int ret = -1;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    uid = virXMLPropString(node, "uid");
Pablo Greco 40546a
+    fid = virXMLPropString(node, "fid");
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (uid &&
Pablo Greco 40546a
+        virStrToLong_uip(uid, NULL, 0, &def.uid) < 0) {
Pablo Greco 40546a
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
Pablo Greco 40546a
+                       _("Cannot parse <address> 'uid' attribute"));
Pablo Greco 40546a
+        goto cleanup;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (fid &&
Pablo Greco 40546a
+        virStrToLong_uip(fid, NULL, 0, &def.fid) < 0) {
Pablo Greco 40546a
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
Pablo Greco 40546a
+                       _("Cannot parse <address> 'fid' attribute"));
Pablo Greco 40546a
+        goto cleanup;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (!virZPCIDeviceAddressIsEmpty(&def) &&
Pablo Greco 40546a
+        !virZPCIDeviceAddressIsValid(&def))
Pablo Greco 40546a
+        goto cleanup;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    addr->zpci = def;
Pablo Greco 40546a
+    ret = 0;
Pablo Greco 40546a
+
Pablo Greco 40546a
+ cleanup:
Pablo Greco 40546a
+    VIR_FREE(uid);
Pablo Greco 40546a
+    VIR_FREE(fid);
Pablo Greco 40546a
+    return ret;
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
 int
Pablo Greco 40546a
 virDomainDeviceInfoCopy(virDomainDeviceInfoPtr dst,
Pablo Greco 40546a
                         virDomainDeviceInfoPtr src)
Pablo Greco 40546a
@@ -196,6 +235,8 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
Pablo Greco 40546a
                             virPCIDeviceAddressPtr addr)
Pablo Greco 40546a
 {
Pablo Greco 40546a
     char *domain, *slot, *bus, *function, *multi;
Pablo Greco 40546a
+    xmlNodePtr cur;
Pablo Greco 40546a
+    xmlNodePtr zpci = NULL;
Pablo Greco 40546a
     int ret = -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
     memset(addr, 0, sizeof(*addr));
Pablo Greco 40546a
@@ -245,6 +286,18 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
Pablo Greco 40546a
     if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr, true))
Pablo Greco 40546a
         goto cleanup;
Pablo Greco 40546a
 
Pablo Greco 40546a
+    cur = node->children;
Pablo Greco 40546a
+    while (cur) {
Pablo Greco 40546a
+        if (cur->type == XML_ELEMENT_NODE &&
Pablo Greco 40546a
+            virXMLNodeNameEqual(cur, "zpci")) {
Pablo Greco 40546a
+            zpci = cur;
Pablo Greco 40546a
+        }
Pablo Greco 40546a
+        cur = cur->next;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (zpci && virZPCIDeviceAddressParseXML(zpci, addr) < 0)
Pablo Greco 40546a
+        goto cleanup;
Pablo Greco 40546a
+
Pablo Greco 40546a
     ret = 0;
Pablo Greco 40546a
 
Pablo Greco 40546a
  cleanup:
Pablo Greco 40546a
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
Pablo Greco 40546a
index 3e33549c3d..9e0a0fdf95 100644
Pablo Greco 40546a
--- a/src/conf/domain_addr.c
Pablo Greco 40546a
+++ b/src/conf/domain_addr.c
Pablo Greco 40546a
@@ -1054,6 +1054,9 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
Pablo Greco 40546a
                                                dev->isolationGroup, false) < 0)
Pablo Greco 40546a
         return -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
+    addr.extFlags = dev->addr.pci.extFlags;
Pablo Greco 40546a
+    addr.zpci = dev->addr.pci.zpci;
Pablo Greco 40546a
+
Pablo Greco 40546a
     if (!addrs->dryRun) {
Pablo Greco 40546a
         dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
Pablo Greco 40546a
         dev->addr.pci = addr;
Pablo Greco 40546a
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
Pablo Greco 40546a
index bcb0558bc3..29ebf0a930 100644
Pablo Greco 40546a
--- a/src/conf/domain_conf.c
Pablo Greco 40546a
+++ b/src/conf/domain_conf.c
Pablo Greco 40546a
@@ -6448,6 +6448,7 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
Pablo Greco 40546a
                           unsigned int flags)
Pablo Greco 40546a
 {
Pablo Greco 40546a
     virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
Pablo Greco 40546a
+    virBuffer childBuf = VIR_BUFFER_INITIALIZER;
Pablo Greco 40546a
 
Pablo Greco 40546a
     if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) && info->bootIndex) {
Pablo Greco 40546a
         virBufferAsprintf(buf, "<boot order='%u'", info->bootIndex);
Pablo Greco 40546a
@@ -6510,6 +6511,14 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
Pablo Greco 40546a
             virBufferAsprintf(&attrBuf, " multifunction='%s'",
Pablo Greco 40546a
                               virTristateSwitchTypeToString(info->addr.pci.multi));
Pablo Greco 40546a
         }
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci)) {
Pablo Greco 40546a
+            virBufferSetChildIndent(&childBuf, buf);
Pablo Greco 40546a
+            virBufferAsprintf(&childBuf,
Pablo Greco 40546a
+                              "<zpci uid='0x%.4x' fid='0x%.8x'/>\n",
Pablo Greco 40546a
+                              info->addr.pci.zpci.uid,
Pablo Greco 40546a
+                              info->addr.pci.zpci.fid);
Pablo Greco 40546a
+        }
Pablo Greco 40546a
         break;
Pablo Greco 40546a
 
Pablo Greco 40546a
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
Pablo Greco 40546a
@@ -6577,9 +6586,10 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
Pablo Greco 40546a
         break;
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
-    virXMLFormatElement(buf, "address", &attrBuf, NULL);
Pablo Greco 40546a
+    virXMLFormatElement(buf, "address", &attrBuf, &childBuf);
Pablo Greco 40546a
 
Pablo Greco 40546a
     virBufferFreeAndReset(&attrBuf);
Pablo Greco 40546a
+    virBufferFreeAndReset(&childBuf);
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
 static int
Pablo Greco 40546a
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
Pablo Greco 40546a
index df27ac4b3a..b2a2a1f265 100644
Pablo Greco 40546a
--- a/src/libvirt_private.syms
Pablo Greco 40546a
+++ b/src/libvirt_private.syms
Pablo Greco 40546a
@@ -2569,6 +2569,8 @@ virPCIHeaderTypeToString;
Pablo Greco 40546a
 virPCIIsVirtualFunction;
Pablo Greco 40546a
 virPCIStubDriverTypeFromString;
Pablo Greco 40546a
 virPCIStubDriverTypeToString;
Pablo Greco 40546a
+virZPCIDeviceAddressIsEmpty;
Pablo Greco 40546a
+virZPCIDeviceAddressIsValid;
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
 # util/virperf.h
Pablo Greco 40546a
diff --git a/src/util/virpci.c b/src/util/virpci.c
Pablo Greco 40546a
index 8d02366664..3a1e49a7a7 100644
Pablo Greco 40546a
--- a/src/util/virpci.c
Pablo Greco 40546a
+++ b/src/util/virpci.c
Pablo Greco 40546a
@@ -2597,6 +2597,32 @@ virPCIDeviceAddressParse(char *address,
Pablo Greco 40546a
 
Pablo Greco 40546a
 #ifdef __linux__
Pablo Greco 40546a
 
Pablo Greco 40546a
+bool
Pablo Greco 40546a
+virZPCIDeviceAddressIsValid(virZPCIDeviceAddressPtr zpci)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    /* We don't need to check fid because fid covers
Pablo Greco 40546a
+     * all range of uint32 type.
Pablo Greco 40546a
+     */
Pablo Greco 40546a
+    if (zpci->uid > VIR_DOMAIN_DEVICE_ZPCI_MAX_UID ||
Pablo Greco 40546a
+        zpci->uid == 0) {
Pablo Greco 40546a
+        virReportError(VIR_ERR_XML_ERROR,
Pablo Greco 40546a
+                       _("Invalid PCI address uid='0x%.4x', "
Pablo Greco 40546a
+                         "must be > 0x0000 and <= 0x%.4x"),
Pablo Greco 40546a
+                       zpci->uid,
Pablo Greco 40546a
+                       VIR_DOMAIN_DEVICE_ZPCI_MAX_UID);
Pablo Greco 40546a
+        return false;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    return true;
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+bool
Pablo Greco 40546a
+virZPCIDeviceAddressIsEmpty(const virZPCIDeviceAddress *addr)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    return !(addr->uid || addr->fid);
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
 /*
Pablo Greco 40546a
  * returns true if equal
Pablo Greco 40546a
  */
Pablo Greco 40546a
diff --git a/src/util/virpci.h b/src/util/virpci.h
Pablo Greco 40546a
index b366d7d9c3..1ed9e2381e 100644
Pablo Greco 40546a
--- a/src/util/virpci.h
Pablo Greco 40546a
+++ b/src/util/virpci.h
Pablo Greco 40546a
@@ -36,6 +36,9 @@ typedef virPCIDeviceAddress *virPCIDeviceAddressPtr;
Pablo Greco 40546a
 typedef struct _virPCIDeviceList virPCIDeviceList;
Pablo Greco 40546a
 typedef virPCIDeviceList *virPCIDeviceListPtr;
Pablo Greco 40546a
 
Pablo Greco 40546a
+# define VIR_DOMAIN_DEVICE_ZPCI_MAX_UID UINT16_MAX
Pablo Greco 40546a
+# define VIR_DOMAIN_DEVICE_ZPCI_MAX_FID UINT32_MAX
Pablo Greco 40546a
+
Pablo Greco 40546a
 typedef struct _virZPCIDeviceAddress virZPCIDeviceAddress;
Pablo Greco 40546a
 typedef virZPCIDeviceAddress *virZPCIDeviceAddressPtr;
Pablo Greco 40546a
 struct _virZPCIDeviceAddress {
Pablo Greco 40546a
@@ -235,6 +238,9 @@ int virPCIGetAddrString(unsigned int domain,
Pablo Greco 40546a
 
Pablo Greco 40546a
 int virPCIDeviceAddressParse(char *address, virPCIDeviceAddressPtr bdf);
Pablo Greco 40546a
 
Pablo Greco 40546a
+bool virZPCIDeviceAddressIsValid(virZPCIDeviceAddressPtr zpci);
Pablo Greco 40546a
+bool virZPCIDeviceAddressIsEmpty(const virZPCIDeviceAddress *addr);
Pablo Greco 40546a
+
Pablo Greco 40546a
 int virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
Pablo Greco 40546a
                                  int pfNetDevIdx,
Pablo Greco 40546a
                                  char **pfname,
Pablo Greco 40546a
diff --git a/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..20e63a15b5
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args
Pablo Greco 40546a
@@ -0,0 +1,26 @@
Pablo Greco 40546a
+LC_ALL=C \
Pablo Greco 40546a
+PATH=/bin \
Pablo Greco 40546a
+HOME=/home/test \
Pablo Greco 40546a
+USER=test \
Pablo Greco 40546a
+LOGNAME=test \
Pablo Greco 40546a
+QEMU_AUDIO_DRV=none \
Pablo Greco 40546a
+/usr/bin/qemu-system-s390x \
Pablo Greco 40546a
+-name QEMUGuest1 \
Pablo Greco 40546a
+-S \
Pablo Greco 40546a
+-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \
Pablo Greco 40546a
+-m 214 \
Pablo Greco 40546a
+-smp 1,sockets=1,cores=1,threads=1 \
Pablo Greco 40546a
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
Pablo Greco 40546a
+-display none \
Pablo Greco 40546a
+-no-user-config \
Pablo Greco 40546a
+-nodefaults \
Pablo Greco 40546a
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
Pablo Greco 40546a
+server,nowait \
Pablo Greco 40546a
+-mon chardev=charmonitor,id=monitor,mode=control \
Pablo Greco 40546a
+-rtc base=utc \
Pablo Greco 40546a
+-no-shutdown \
Pablo Greco 40546a
+-boot c \
Pablo Greco 40546a
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-virtio-disk0 \
Pablo Greco 40546a
+-device virtio-blk-pci,bus=pci.0,addr=0x8,drive=drive-virtio-disk0,\
Pablo Greco 40546a
+id=virtio-disk0 \
Pablo Greco 40546a
+-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0000
Pablo Greco 40546a
diff --git a/tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..8bf4a23670
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml
Pablo Greco 40546a
@@ -0,0 +1,19 @@
Pablo Greco 40546a
+<domain type='qemu'>
Pablo Greco 40546a
+  <name>QEMUGuest1</name>
Pablo Greco 40546a
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
Pablo Greco 40546a
+  <memory>219136</memory>
Pablo Greco 40546a
+  <vcpu>1</vcpu>
Pablo Greco 40546a
+  <os>
Pablo Greco 40546a
+    <type arch='s390x' machine='s390-ccw-virtio'>hvm</type>
Pablo Greco 40546a
+  </os>
Pablo Greco 40546a
+  <devices>
Pablo Greco 40546a
+    <emulator>/usr/bin/qemu-system-s390x</emulator>
Pablo Greco 40546a
+    <disk type='block' device='disk'>
Pablo Greco 40546a
+      <source dev='/dev/HostVG/QEMUGuest1'/>
Pablo Greco 40546a
+      <target dev='hda' bus='virtio'/>
Pablo Greco 40546a
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'>
Pablo Greco 40546a
+        <zpci uid='0x0019' fid='0x0000001f'/>
Pablo Greco 40546a
+      </address>
Pablo Greco 40546a
+    </disk>
Pablo Greco 40546a
+  </devices>
Pablo Greco 40546a
+</domain>
Pablo Greco 40546a
diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci.args b/tests/qemuxml2argvdata/hostdev-vfio-zpci.args
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..622c504da0
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci.args
Pablo Greco 40546a
@@ -0,0 +1,24 @@
Pablo Greco 40546a
+LC_ALL=C \
Pablo Greco 40546a
+PATH=/bin \
Pablo Greco 40546a
+HOME=/home/test \
Pablo Greco 40546a
+USER=test \
Pablo Greco 40546a
+LOGNAME=test \
Pablo Greco 40546a
+QEMU_AUDIO_DRV=none \
Pablo Greco 40546a
+/usr/bin/qemu-system-s390x \
Pablo Greco 40546a
+-name QEMUGuest1 \
Pablo Greco 40546a
+-S \
Pablo Greco 40546a
+-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \
Pablo Greco 40546a
+-m 214 \
Pablo Greco 40546a
+-smp 1,sockets=1,cores=1,threads=1 \
Pablo Greco 40546a
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
Pablo Greco 40546a
+-display none \
Pablo Greco 40546a
+-no-user-config \
Pablo Greco 40546a
+-nodefaults \
Pablo Greco 40546a
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
Pablo Greco 40546a
+server,nowait \
Pablo Greco 40546a
+-mon chardev=charmonitor,id=monitor,mode=control \
Pablo Greco 40546a
+-rtc base=utc \
Pablo Greco 40546a
+-no-shutdown \
Pablo Greco 40546a
+-boot c \
Pablo Greco 40546a
+-device vfio-pci,host=00:00.0,id=hostdev0,bus=pci.0,addr=0x8 \
Pablo Greco 40546a
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x1
Pablo Greco 40546a
diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci.xml b/tests/qemuxml2argvdata/hostdev-vfio-zpci.xml
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..002b99c52d
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci.xml
Pablo Greco 40546a
@@ -0,0 +1,21 @@
Pablo Greco 40546a
+<domain type='qemu'>
Pablo Greco 40546a
+  <name>QEMUGuest1</name>
Pablo Greco 40546a
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
Pablo Greco 40546a
+  <memory>219100</memory>
Pablo Greco 40546a
+  <os>
Pablo Greco 40546a
+    <type arch='s390x' machine='s390-ccw-virtio'>hvm</type>
Pablo Greco 40546a
+  </os>
Pablo Greco 40546a
+  <devices>
Pablo Greco 40546a
+    <emulator>/usr/bin/qemu-system-s390x</emulator>
Pablo Greco 40546a
+    <controller type='pci' index='0' model='pci-root'/>
Pablo Greco 40546a
+    <hostdev mode='subsystem' type='pci' managed='no'>
Pablo Greco 40546a
+      <driver name='vfio'/>
Pablo Greco 40546a
+      <source>
Pablo Greco 40546a
+        <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/>
Pablo Greco 40546a
+      </source>
Pablo Greco 40546a
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'>
Pablo Greco 40546a
+        <zpci uid='0x0019' fid='0x0000001f'/>
Pablo Greco 40546a
+      </address>
Pablo Greco 40546a
+    </hostdev>
Pablo Greco 40546a
+  </devices>
Pablo Greco 40546a
+</domain>
Pablo Greco 40546a
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
Pablo Greco 40546a
index 7f25cccf9d..2eb2505971 100644
Pablo Greco 40546a
--- a/tests/qemuxml2argvtest.c
Pablo Greco 40546a
+++ b/tests/qemuxml2argvtest.c
Pablo Greco 40546a
@@ -1038,6 +1038,10 @@ mymain(void)
Pablo Greco 40546a
             QEMU_CAPS_CCW, QEMU_CAPS_VIRTIO_S390);
Pablo Greco 40546a
     DO_TEST("disk-virtio-scsi-ccw", QEMU_CAPS_VIRTIO_SCSI,
Pablo Greco 40546a
             QEMU_CAPS_CCW, QEMU_CAPS_VIRTIO_S390);
Pablo Greco 40546a
+    DO_TEST("disk-virtio-s390-zpci",
Pablo Greco 40546a
+            QEMU_CAPS_DEVICE_ZPCI,
Pablo Greco 40546a
+            QEMU_CAPS_CCW,
Pablo Greco 40546a
+            QEMU_CAPS_VIRTIO_S390);
Pablo Greco 40546a
     DO_TEST("disk-order",
Pablo Greco 40546a
             QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_VIRTIO_BLK_SCSI);
Pablo Greco 40546a
     DO_TEST("disk-virtio-drive-queues",
Pablo Greco 40546a
@@ -1628,6 +1632,9 @@ mymain(void)
Pablo Greco 40546a
     DO_TEST_PARSE_ERROR("hostdev-mdev-display-missing-graphics",
Pablo Greco 40546a
             QEMU_CAPS_DEVICE_VFIO_PCI,
Pablo Greco 40546a
             QEMU_CAPS_VFIO_PCI_DISPLAY);
Pablo Greco 40546a
+    DO_TEST("hostdev-vfio-zpci",
Pablo Greco 40546a
+            QEMU_CAPS_DEVICE_VFIO_PCI,
Pablo Greco 40546a
+            QEMU_CAPS_DEVICE_ZPCI);
Pablo Greco 40546a
     DO_TEST("pci-rom", NONE);
Pablo Greco 40546a
     DO_TEST("pci-rom-disabled", NONE);
Pablo Greco 40546a
     DO_TEST("pci-rom-disabled-invalid", NONE);
Pablo Greco 40546a
diff --git a/tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml b/tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..37684c82b1
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml
Pablo Greco 40546a
@@ -0,0 +1,31 @@
Pablo Greco 40546a
+<domain type='qemu'>
Pablo Greco 40546a
+  <name>QEMUGuest1</name>
Pablo Greco 40546a
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
Pablo Greco 40546a
+  <memory unit='KiB'>219136</memory>
Pablo Greco 40546a
+  <currentMemory unit='KiB'>219136</currentMemory>
Pablo Greco 40546a
+  <vcpu placement='static'>1</vcpu>
Pablo Greco 40546a
+  <os>
Pablo Greco 40546a
+    <type arch='s390x' machine='s390-ccw-virtio'>hvm</type>
Pablo Greco 40546a
+    <boot dev='hd'/>
Pablo Greco 40546a
+  </os>
Pablo Greco 40546a
+  <clock offset='utc'/>
Pablo Greco 40546a
+  <on_poweroff>destroy</on_poweroff>
Pablo Greco 40546a
+  <on_reboot>restart</on_reboot>
Pablo Greco 40546a
+  <on_crash>destroy</on_crash>
Pablo Greco 40546a
+  <devices>
Pablo Greco 40546a
+    <emulator>/usr/bin/qemu-system-s390x</emulator>
Pablo Greco 40546a
+    <disk type='block' device='disk'>
Pablo Greco 40546a
+      <driver name='qemu' type='raw'/>
Pablo Greco 40546a
+      <source dev='/dev/HostVG/QEMUGuest1'/>
Pablo Greco 40546a
+      <target dev='hda' bus='virtio'/>
Pablo Greco 40546a
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'>
Pablo Greco 40546a
+        <zpci uid='0x0019' fid='0x0000001f'/>
Pablo Greco 40546a
+      </address>
Pablo Greco 40546a
+    </disk>
Pablo Greco 40546a
+    <controller type='pci' index='0' model='pci-root'/>
Pablo Greco 40546a
+    <memballoon model='virtio'>
Pablo Greco 40546a
+      <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/>
Pablo Greco 40546a
+    </memballoon>
Pablo Greco 40546a
+    <panic model='s390'/>
Pablo Greco 40546a
+  </devices>
Pablo Greco 40546a
+</domain>
Pablo Greco 40546a
diff --git a/tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..fc8c38ab66
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml
Pablo Greco 40546a
@@ -0,0 +1,32 @@
Pablo Greco 40546a
+<domain type='qemu'>
Pablo Greco 40546a
+  <name>QEMUGuest1</name>
Pablo Greco 40546a
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
Pablo Greco 40546a
+  <memory unit='KiB'>219100</memory>
Pablo Greco 40546a
+  <currentMemory unit='KiB'>219100</currentMemory>
Pablo Greco 40546a
+  <vcpu placement='static'>1</vcpu>
Pablo Greco 40546a
+  <os>
Pablo Greco 40546a
+    <type arch='s390x' machine='s390-ccw-virtio'>hvm</type>
Pablo Greco 40546a
+    <boot dev='hd'/>
Pablo Greco 40546a
+  </os>
Pablo Greco 40546a
+  <clock offset='utc'/>
Pablo Greco 40546a
+  <on_poweroff>destroy</on_poweroff>
Pablo Greco 40546a
+  <on_reboot>restart</on_reboot>
Pablo Greco 40546a
+  <on_crash>destroy</on_crash>
Pablo Greco 40546a
+  <devices>
Pablo Greco 40546a
+    <emulator>/usr/bin/qemu-system-s390x</emulator>
Pablo Greco 40546a
+    <controller type='pci' index='0' model='pci-root'/>
Pablo Greco 40546a
+    <hostdev mode='subsystem' type='pci' managed='no'>
Pablo Greco 40546a
+      <driver name='vfio'/>
Pablo Greco 40546a
+      <source>
Pablo Greco 40546a
+        <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/>
Pablo Greco 40546a
+      </source>
Pablo Greco 40546a
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'>
Pablo Greco 40546a
+        <zpci uid='0x0019' fid='0x0000001f'/>
Pablo Greco 40546a
+      </address>
Pablo Greco 40546a
+    </hostdev>
Pablo Greco 40546a
+    <memballoon model='virtio'>
Pablo Greco 40546a
+      <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/>
Pablo Greco 40546a
+    </memballoon>
Pablo Greco 40546a
+    <panic model='s390'/>
Pablo Greco 40546a
+  </devices>
Pablo Greco 40546a
+</domain>
Pablo Greco 40546a
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
Pablo Greco 40546a
index 2a2bf01ffa..a787f4f4a3 100644
Pablo Greco 40546a
--- a/tests/qemuxml2xmltest.c
Pablo Greco 40546a
+++ b/tests/qemuxml2xmltest.c
Pablo Greco 40546a
@@ -400,6 +400,9 @@ mymain(void)
Pablo Greco 40546a
             QEMU_CAPS_VIRTIO_SCSI);
Pablo Greco 40546a
     DO_TEST("disk-virtio-scsi-ioeventfd",
Pablo Greco 40546a
             QEMU_CAPS_VIRTIO_SCSI);
Pablo Greco 40546a
+    DO_TEST("disk-virtio-s390-zpci",
Pablo Greco 40546a
+            QEMU_CAPS_DEVICE_ZPCI,
Pablo Greco 40546a
+            QEMU_CAPS_CCW);
Pablo Greco 40546a
     DO_TEST("disk-scsi-megasas",
Pablo Greco 40546a
             QEMU_CAPS_SCSI_MEGASAS);
Pablo Greco 40546a
     DO_TEST("disk-scsi-mptsas1068",
Pablo Greco 40546a
@@ -482,6 +485,9 @@ mymain(void)
Pablo Greco 40546a
     DO_TEST("hostdev-usb-address", NONE);
Pablo Greco 40546a
     DO_TEST("hostdev-pci-address", NONE);
Pablo Greco 40546a
     DO_TEST("hostdev-vfio", NONE);
Pablo Greco 40546a
+    DO_TEST("hostdev-vfio-zpci",
Pablo Greco 40546a
+            QEMU_CAPS_DEVICE_ZPCI,
Pablo Greco 40546a
+            QEMU_CAPS_CCW);
Pablo Greco 40546a
     DO_TEST("hostdev-mdev-precreated", NONE);
Pablo Greco 40546a
     DO_TEST("hostdev-mdev-display", QEMU_CAPS_VFIO_PCI_DISPLAY);
Pablo Greco 40546a
     DO_TEST("pci-rom", NONE);
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a