From c1c5344a14e146ed23c9d39bd82b7c2c4490e6e5 Mon Sep 17 00:00:00 2001
From: CentOS Sources
Date: Apr 10 2018 06:09:38 +0000
Subject: import libvirt-3.9.0-14.el7
---
diff --git a/.gitignore b/.gitignore
index 1d9289f..b62ce7d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/libvirt-3.2.0.tar.xz
+SOURCES/libvirt-3.9.0.tar.xz
diff --git a/.libvirt.metadata b/.libvirt.metadata
index e2e8aba..0db550c 100644
--- a/.libvirt.metadata
+++ b/.libvirt.metadata
@@ -1 +1 @@
-47d4b443fdf1e268589529018c436bbc4b413a7c SOURCES/libvirt-3.2.0.tar.xz
+7aae5bfdbc859234833464a7faaa2a1cc0c2775e SOURCES/libvirt-3.9.0.tar.xz
diff --git a/SOURCES/libvirt-Add-VIR_DOMAIN_JOB_OPERATION-typed-parameter.patch b/SOURCES/libvirt-Add-VIR_DOMAIN_JOB_OPERATION-typed-parameter.patch
deleted file mode 100644
index adafe29..0000000
--- a/SOURCES/libvirt-Add-VIR_DOMAIN_JOB_OPERATION-typed-parameter.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From 16dad808f19120275bc57e952968840417e0d091 Mon Sep 17 00:00:00 2001
-Message-Id: <16dad808f19120275bc57e952968840417e0d091@dist-git>
-From: Jiri Denemark
-Date: Wed, 26 Apr 2017 11:59:59 +0200
-Subject: [PATCH] Add VIR_DOMAIN_JOB_OPERATION typed parameter
-
-The parameter is reported by virDomainGetJobStats API and
-VIR_DOMAIN_EVENT_ID_JOB_COMPLETED event and it can be used to identify
-the operation (migration, snapshot, ...) to which the reported
-statistics belong.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441563
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit b1c79d785f9385eb4ebd5e71d1d44e67f744f4d9)
-Signed-off-by: Jiri Denemark
----
- include/libvirt/libvirt-domain.h | 25 +++++++++++++++++++++++++
- tools/virsh-domain.c | 29 +++++++++++++++++++++++++++++
- 2 files changed, 54 insertions(+)
-
-diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
-index 501996bc8..c9e96a6c9 100644
---- a/include/libvirt/libvirt-domain.h
-+++ b/include/libvirt/libvirt-domain.h
-@@ -3117,6 +3117,31 @@ int virDomainGetJobStats(virDomainPtr domain,
- unsigned int flags);
- int virDomainAbortJob(virDomainPtr dom);
-
-+typedef enum {
-+ VIR_DOMAIN_JOB_OPERATION_UNKNOWN = 0,
-+ VIR_DOMAIN_JOB_OPERATION_START = 1,
-+ VIR_DOMAIN_JOB_OPERATION_SAVE = 2,
-+ VIR_DOMAIN_JOB_OPERATION_RESTORE = 3,
-+ VIR_DOMAIN_JOB_OPERATION_MIGRATION_IN = 4,
-+ VIR_DOMAIN_JOB_OPERATION_MIGRATION_OUT = 5,
-+ VIR_DOMAIN_JOB_OPERATION_SNAPSHOT = 6,
-+ VIR_DOMAIN_JOB_OPERATION_SNAPSHOT_REVERT = 7,
-+ VIR_DOMAIN_JOB_OPERATION_DUMP = 8,
-+
-+# ifdef VIR_ENUM_SENTINELS
-+ VIR_DOMAIN_JOB_OPERATION_LAST
-+# endif
-+} virDomainJobOperation;
-+
-+/**
-+ * VIR_DOMAIN_JOB_OPERATION:
-+ *
-+ * virDomainGetJobStats field: the operation which started the job as
-+ * VIR_TYPED_PARAM_INT. The values correspond to the items in
-+ * virDomainJobOperation enum.
-+ */
-+# define VIR_DOMAIN_JOB_OPERATION "operation"
-+
- /**
- * VIR_DOMAIN_JOB_TIME_ELAPSED:
- *
-diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
-index 4b6c13ce4..bc0ded686 100644
---- a/tools/virsh-domain.c
-+++ b/tools/virsh-domain.c
-@@ -5754,6 +5754,26 @@ virshDomainJobToString(int type)
- return str ? _(str) : _("unknown");
- }
-
-+VIR_ENUM_DECL(virshDomainJobOperation);
-+VIR_ENUM_IMPL(virshDomainJobOperation,
-+ VIR_DOMAIN_JOB_OPERATION_LAST,
-+ N_("Unknown"),
-+ N_("Start"),
-+ N_("Save"),
-+ N_("Restore"),
-+ N_("Incoming migration"),
-+ N_("Outgoing migration"),
-+ N_("Snapshot"),
-+ N_("Snapshot revert"),
-+ N_("Dump"))
-+
-+static const char *
-+virshDomainJobOperationToString(int op)
-+{
-+ const char *str = virshDomainJobOperationTypeToString(op);
-+ return str ? _(str) : _("unknown");
-+}
-+
- static bool
- cmdDomjobinfo(vshControl *ctl, const vshCmd *cmd)
- {
-@@ -5767,6 +5787,7 @@ cmdDomjobinfo(vshControl *ctl, const vshCmd *cmd)
- unsigned long long value;
- unsigned int flags = 0;
- int ivalue;
-+ int op;
- int rc;
-
- if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
-@@ -5836,6 +5857,14 @@ cmdDomjobinfo(vshControl *ctl, const vshCmd *cmd)
- goto cleanup;
- }
-
-+ op = VIR_DOMAIN_JOB_OPERATION_UNKNOWN;
-+ if ((rc = virTypedParamsGetInt(params, nparams,
-+ VIR_DOMAIN_JOB_OPERATION, &op)) < 0)
-+ goto save_error;
-+
-+ vshPrint(ctl, "%-17s %-12s\n", _("Operation:"),
-+ virshDomainJobOperationToString(op));
-+
- vshPrint(ctl, "%-17s %-12llu ms\n", _("Time elapsed:"), info.timeElapsed);
- if ((rc = virTypedParamsGetULLong(params, nparams,
- VIR_DOMAIN_JOB_TIME_ELAPSED_NET,
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Add-capabilities-for-qemu-2.9.0-ppc64.patch b/SOURCES/libvirt-Add-capabilities-for-qemu-2.9.0-ppc64.patch
deleted file mode 100644
index 41ce69d..0000000
--- a/SOURCES/libvirt-Add-capabilities-for-qemu-2.9.0-ppc64.patch
+++ /dev/null
@@ -1,20299 +0,0 @@
-From 7aaf4f3e62156b4b86388de24c426056bfa8499a Mon Sep 17 00:00:00 2001
-Message-Id: <7aaf4f3e62156b4b86388de24c426056bfa8499a@dist-git>
-From: Shivaprasad G Bhat
-Date: Thu, 3 Aug 2017 10:11:46 +0200
-Subject: [PATCH] Add capabilities for qemu-2.9.0 ppc64
-
-Signed-off-by: Shivaprasad G Bhat
-Reviewed-by: Andrea Bolognani
-(cherry picked from commit eb56cc6f8865960687fe73b29beb8314479176a6)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1474327
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- .../caps_2.9.0.ppc64le.replies | 19188 +++++++++++++++++++
- tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml | 1062 +
- tests/qemucapabilitiestest.c | 1 +
- 3 files changed, 20251 insertions(+)
- create mode 100644 tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.replies
- create mode 100644 tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml
-
-diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.replies b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.replies
-new file mode 100644
-index 0000000000..0c85f9ed45
---- /dev/null
-+++ b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.replies
-@@ -0,0 +1,19188 @@
-+{
-+ "QMP": {
-+ "version": {
-+ "qemu": {
-+ "micro": 0,
-+ "minor": 9,
-+ "major": 2
-+ },
-+ "package": " (v2.9.0)"
-+ },
-+ "capabilities": [
-+ ]
-+ }
-+}
-+
-+{
-+ "return": {
-+ },
-+ "id": "libvirt-1"
-+}
-+
-+{
-+ "return": {
-+ "qemu": {
-+ "micro": 0,
-+ "minor": 9,
-+ "major": 2
-+ },
-+ "package": " (v2.9.0)"
-+ },
-+ "id": "libvirt-2"
-+}
-+
-+{
-+ "return": {
-+ "arch": "ppc64"
-+ },
-+ "id": "libvirt-3"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "netdev_add"
-+ },
-+ {
-+ "name": "device_add"
-+ },
-+ {
-+ "name": "query-qmp-schema"
-+ },
-+ {
-+ "name": "xen-set-replication"
-+ },
-+ {
-+ "name": "xen-set-global-dirty-log"
-+ },
-+ {
-+ "name": "xen-save-devices-state"
-+ },
-+ {
-+ "name": "xen-load-devices-state"
-+ },
-+ {
-+ "name": "xen-colo-do-checkpoint"
-+ },
-+ {
-+ "name": "x-colo-lost-heartbeat"
-+ },
-+ {
-+ "name": "x-blockdev-remove-medium"
-+ },
-+ {
-+ "name": "x-blockdev-insert-medium"
-+ },
-+ {
-+ "name": "x-blockdev-change"
-+ },
-+ {
-+ "name": "transaction"
-+ },
-+ {
-+ "name": "trace-event-set-state"
-+ },
-+ {
-+ "name": "trace-event-get-state"
-+ },
-+ {
-+ "name": "system_wakeup"
-+ },
-+ {
-+ "name": "system_reset"
-+ },
-+ {
-+ "name": "system_powerdown"
-+ },
-+ {
-+ "name": "stop"
-+ },
-+ {
-+ "name": "set_password"
-+ },
-+ {
-+ "name": "set_link"
-+ },
-+ {
-+ "name": "send-key"
-+ },
-+ {
-+ "name": "screendump"
-+ },
-+ {
-+ "name": "ringbuf-write"
-+ },
-+ {
-+ "name": "ringbuf-read"
-+ },
-+ {
-+ "name": "remove-fd"
-+ },
-+ {
-+ "name": "quit"
-+ },
-+ {
-+ "name": "query-xen-replication-status"
-+ },
-+ {
-+ "name": "query-vnc-servers"
-+ },
-+ {
-+ "name": "query-vnc"
-+ },
-+ {
-+ "name": "query-vm-generation-id"
-+ },
-+ {
-+ "name": "query-version"
-+ },
-+ {
-+ "name": "query-uuid"
-+ },
-+ {
-+ "name": "query-tpm-types"
-+ },
-+ {
-+ "name": "query-tpm-models"
-+ },
-+ {
-+ "name": "query-tpm"
-+ },
-+ {
-+ "name": "query-target"
-+ },
-+ {
-+ "name": "query-status"
-+ },
-+ {
-+ "name": "query-rx-filter"
-+ },
-+ {
-+ "name": "query-rocker-ports"
-+ },
-+ {
-+ "name": "query-rocker-of-dpa-groups"
-+ },
-+ {
-+ "name": "query-rocker-of-dpa-flows"
-+ },
-+ {
-+ "name": "query-rocker"
-+ },
-+ {
-+ "name": "query-pci"
-+ },
-+ {
-+ "name": "query-named-block-nodes"
-+ },
-+ {
-+ "name": "query-name"
-+ },
-+ {
-+ "name": "query-migrate-parameters"
-+ },
-+ {
-+ "name": "query-migrate-capabilities"
-+ },
-+ {
-+ "name": "query-migrate-cache-size"
-+ },
-+ {
-+ "name": "query-migrate"
-+ },
-+ {
-+ "name": "query-mice"
-+ },
-+ {
-+ "name": "query-memory-devices"
-+ },
-+ {
-+ "name": "query-memdev"
-+ },
-+ {
-+ "name": "query-machines"
-+ },
-+ {
-+ "name": "query-kvm"
-+ },
-+ {
-+ "name": "query-iothreads"
-+ },
-+ {
-+ "name": "query-hotpluggable-cpus"
-+ },
-+ {
-+ "name": "query-fdsets"
-+ },
-+ {
-+ "name": "query-events"
-+ },
-+ {
-+ "name": "query-dump-guest-memory-capability"
-+ },
-+ {
-+ "name": "query-dump"
-+ },
-+ {
-+ "name": "query-cpus"
-+ },
-+ {
-+ "name": "query-cpu-definitions"
-+ },
-+ {
-+ "name": "query-commands"
-+ },
-+ {
-+ "name": "query-command-line-options"
-+ },
-+ {
-+ "name": "query-chardev-backends"
-+ },
-+ {
-+ "name": "query-chardev"
-+ },
-+ {
-+ "name": "query-blockstats"
-+ },
-+ {
-+ "name": "query-block-jobs"
-+ },
-+ {
-+ "name": "query-block"
-+ },
-+ {
-+ "name": "query-balloon"
-+ },
-+ {
-+ "name": "query-acpi-ospm-status"
-+ },
-+ {
-+ "name": "qom-set"
-+ },
-+ {
-+ "name": "qom-list-types"
-+ },
-+ {
-+ "name": "qom-list"
-+ },
-+ {
-+ "name": "qom-get"
-+ },
-+ {
-+ "name": "qmp_capabilities"
-+ },
-+ {
-+ "name": "pmemsave"
-+ },
-+ {
-+ "name": "object-del"
-+ },
-+ {
-+ "name": "object-add"
-+ },
-+ {
-+ "name": "netdev_del"
-+ },
-+ {
-+ "name": "nbd-server-stop"
-+ },
-+ {
-+ "name": "nbd-server-start"
-+ },
-+ {
-+ "name": "nbd-server-add"
-+ },
-+ {
-+ "name": "migrate_set_speed"
-+ },
-+ {
-+ "name": "migrate_set_downtime"
-+ },
-+ {
-+ "name": "migrate_cancel"
-+ },
-+ {
-+ "name": "migrate-start-postcopy"
-+ },
-+ {
-+ "name": "migrate-set-parameters"
-+ },
-+ {
-+ "name": "migrate-set-capabilities"
-+ },
-+ {
-+ "name": "migrate-set-cache-size"
-+ },
-+ {
-+ "name": "migrate-incoming"
-+ },
-+ {
-+ "name": "migrate"
-+ },
-+ {
-+ "name": "memsave"
-+ },
-+ {
-+ "name": "input-send-event"
-+ },
-+ {
-+ "name": "inject-nmi"
-+ },
-+ {
-+ "name": "human-monitor-command"
-+ },
-+ {
-+ "name": "getfd"
-+ },
-+ {
-+ "name": "expire_password"
-+ },
-+ {
-+ "name": "eject"
-+ },
-+ {
-+ "name": "dump-guest-memory"
-+ },
-+ {
-+ "name": "drive-mirror"
-+ },
-+ {
-+ "name": "drive-backup"
-+ },
-+ {
-+ "name": "device_del"
-+ },
-+ {
-+ "name": "device-list-properties"
-+ },
-+ {
-+ "name": "cpu-add"
-+ },
-+ {
-+ "name": "cpu"
-+ },
-+ {
-+ "name": "cont"
-+ },
-+ {
-+ "name": "closefd"
-+ },
-+ {
-+ "name": "client_migrate_info"
-+ },
-+ {
-+ "name": "chardev-remove"
-+ },
-+ {
-+ "name": "chardev-add"
-+ },
-+ {
-+ "name": "change-vnc-password"
-+ },
-+ {
-+ "name": "change-backing-file"
-+ },
-+ {
-+ "name": "change"
-+ },
-+ {
-+ "name": "blockdev-snapshot-sync"
-+ },
-+ {
-+ "name": "blockdev-snapshot-internal-sync"
-+ },
-+ {
-+ "name": "blockdev-snapshot-delete-internal-sync"
-+ },
-+ {
-+ "name": "blockdev-snapshot"
-+ },
-+ {
-+ "name": "blockdev-open-tray"
-+ },
-+ {
-+ "name": "blockdev-mirror"
-+ },
-+ {
-+ "name": "blockdev-del"
-+ },
-+ {
-+ "name": "blockdev-close-tray"
-+ },
-+ {
-+ "name": "blockdev-change-medium"
-+ },
-+ {
-+ "name": "blockdev-backup"
-+ },
-+ {
-+ "name": "blockdev-add"
-+ },
-+ {
-+ "name": "block_set_io_throttle"
-+ },
-+ {
-+ "name": "block_resize"
-+ },
-+ {
-+ "name": "block_passwd"
-+ },
-+ {
-+ "name": "block-stream"
-+ },
-+ {
-+ "name": "block-set-write-threshold"
-+ },
-+ {
-+ "name": "block-job-set-speed"
-+ },
-+ {
-+ "name": "block-job-resume"
-+ },
-+ {
-+ "name": "block-job-pause"
-+ },
-+ {
-+ "name": "block-job-complete"
-+ },
-+ {
-+ "name": "block-job-cancel"
-+ },
-+ {
-+ "name": "block-dirty-bitmap-remove"
-+ },
-+ {
-+ "name": "block-dirty-bitmap-clear"
-+ },
-+ {
-+ "name": "block-dirty-bitmap-add"
-+ },
-+ {
-+ "name": "block-commit"
-+ },
-+ {
-+ "name": "balloon"
-+ },
-+ {
-+ "name": "add_client"
-+ },
-+ {
-+ "name": "add-fd"
-+ }
-+ ],
-+ "id": "libvirt-4"
-+}
-+
-+{
-+ "return": {
-+ "fd": 17,
-+ "fdset-id": 0
-+ },
-+ "id": "libvirt-5"
-+}
-+
-+{
-+ "id": "libvirt-6",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'bogus' not found"
-+ }
-+}
-+
-+{
-+ "return": {
-+ "enabled": true,
-+ "present": true
-+ },
-+ "id": "libvirt-7"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "WATCHDOG"
-+ },
-+ {
-+ "name": "WAKEUP"
-+ },
-+ {
-+ "name": "VSERPORT_CHANGE"
-+ },
-+ {
-+ "name": "VNC_INITIALIZED"
-+ },
-+ {
-+ "name": "VNC_DISCONNECTED"
-+ },
-+ {
-+ "name": "VNC_CONNECTED"
-+ },
-+ {
-+ "name": "SUSPEND_DISK"
-+ },
-+ {
-+ "name": "SUSPEND"
-+ },
-+ {
-+ "name": "STOP"
-+ },
-+ {
-+ "name": "SPICE_MIGRATE_COMPLETED"
-+ },
-+ {
-+ "name": "SPICE_INITIALIZED"
-+ },
-+ {
-+ "name": "SPICE_DISCONNECTED"
-+ },
-+ {
-+ "name": "SPICE_CONNECTED"
-+ },
-+ {
-+ "name": "SHUTDOWN"
-+ },
-+ {
-+ "name": "RTC_CHANGE"
-+ },
-+ {
-+ "name": "RESUME"
-+ },
-+ {
-+ "name": "RESET"
-+ },
-+ {
-+ "name": "QUORUM_REPORT_BAD"
-+ },
-+ {
-+ "name": "QUORUM_FAILURE"
-+ },
-+ {
-+ "name": "POWERDOWN"
-+ },
-+ {
-+ "name": "NIC_RX_FILTER_CHANGED"
-+ },
-+ {
-+ "name": "MIGRATION_PASS"
-+ },
-+ {
-+ "name": "MIGRATION"
-+ },
-+ {
-+ "name": "MEM_UNPLUG_ERROR"
-+ },
-+ {
-+ "name": "GUEST_PANICKED"
-+ },
-+ {
-+ "name": "DUMP_COMPLETED"
-+ },
-+ {
-+ "name": "DEVICE_TRAY_MOVED"
-+ },
-+ {
-+ "name": "DEVICE_DELETED"
-+ },
-+ {
-+ "name": "BLOCK_WRITE_THRESHOLD"
-+ },
-+ {
-+ "name": "BLOCK_JOB_READY"
-+ },
-+ {
-+ "name": "BLOCK_JOB_ERROR"
-+ },
-+ {
-+ "name": "BLOCK_JOB_COMPLETED"
-+ },
-+ {
-+ "name": "BLOCK_JOB_CANCELLED"
-+ },
-+ {
-+ "name": "BLOCK_IO_ERROR"
-+ },
-+ {
-+ "name": "BLOCK_IMAGE_CORRUPTED"
-+ },
-+ {
-+ "name": "BALLOON_CHANGE"
-+ },
-+ {
-+ "name": "ACPI_DEVICE_OST"
-+ }
-+ ],
-+ "id": "libvirt-8"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "vhost-vsock-pci"
-+ },
-+ {
-+ "name": "scsi-generic"
-+ },
-+ {
-+ "name": "qio-channel-tls"
-+ },
-+ {
-+ "name": "virtio-mmio"
-+ },
-+ {
-+ "name": "scsi-hd"
-+ },
-+ {
-+ "name": "MPC8541E_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "isa-m48t59"
-+ },
-+ {
-+ "name": "405GPb-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8544E_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "usb-bot"
-+ },
-+ {
-+ "name": "chardev-null"
-+ },
-+ {
-+ "name": "750_v3.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "dec-21154"
-+ },
-+ {
-+ "name": "chardev-parallel"
-+ },
-+ {
-+ "name": "qemu-xhci"
-+ },
-+ {
-+ "name": "spapr-pci-vfio-host-bridge"
-+ },
-+ {
-+ "name": "e300c2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "lsi53c895a"
-+ },
-+ {
-+ "name": "MPC8568-powerpc64-cpu"
-+ },
-+ {
-+ "name": "401-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8379-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-keyboard-pci"
-+ },
-+ {
-+ "name": "40p-machine"
-+ },
-+ {
-+ "name": "750cxe_v3.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8349EA-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cxr-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cl_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "G2HiP4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "STB04-powerpc64-cpu"
-+ },
-+ {
-+ "name": "usb-audio"
-+ },
-+ {
-+ "name": "ide-hd"
-+ },
-+ {
-+ "name": "virtio-net-device"
-+ },
-+ {
-+ "name": "601_v0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "powernv-chip-POWER9"
-+ },
-+ {
-+ "name": "powernv-chip-POWER8"
-+ },
-+ {
-+ "name": "chardev-pty"
-+ },
-+ {
-+ "name": "ppc4xx-pcihost"
-+ },
-+ {
-+ "name": "spapr-vio-bus"
-+ },
-+ {
-+ "name": "ppc4xx-host-bridge"
-+ },
-+ {
-+ "name": "750fx_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "macio-newworld"
-+ },
-+ {
-+ "name": "MPC8377E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "970fx_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "440EPa-powerpc64-cpu"
-+ },
-+ {
-+ "name": "SUNW,fdtwo"
-+ },
-+ {
-+ "name": "isa-pcspk"
-+ },
-+ {
-+ "name": "dec-21154-p2p-bridge"
-+ },
-+ {
-+ "name": "603e_v4.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7445_v3.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "970MP_v1.1-spapr-cpu-core"
-+ },
-+ {
-+ "name": "G2leGP3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "spapr-vscsi"
-+ },
-+ {
-+ "name": "loader"
-+ },
-+ {
-+ "name": "xlnx.xps-ethernetlite"
-+ },
-+ {
-+ "name": "7410_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "filter-rewriter"
-+ },
-+ {
-+ "name": "platform-bus-device"
-+ },
-+ {
-+ "name": "403GA-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-serial-pci"
-+ },
-+ {
-+ "name": "MPC5200_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cxe_v2.4b-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ics"
-+ },
-+ {
-+ "name": "MPC8610-powerpc64-cpu"
-+ },
-+ {
-+ "name": "icp"
-+ },
-+ {
-+ "name": "virtio-crypto-device"
-+ },
-+ {
-+ "name": "MPC8548E_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.5-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7447_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "970fx_v3.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7457_v1.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "usb-bt-dongle"
-+ },
-+ {
-+ "name": "virtio-input-host-pci"
-+ },
-+ {
-+ "name": "xlnx.xps-intc"
-+ },
-+ {
-+ "name": "MPC8343EA-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e1000"
-+ },
-+ {
-+ "name": "mpc8xxx_gpio"
-+ },
-+ {
-+ "name": "401F2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-mux"
-+ },
-+ {
-+ "name": "pseries-2.1-machine"
-+ },
-+ {
-+ "name": "ich9-usb-uhci6"
-+ },
-+ {
-+ "name": "ich9-usb-uhci5"
-+ },
-+ {
-+ "name": "usb-mtp"
-+ },
-+ {
-+ "name": "ich9-usb-uhci3"
-+ },
-+ {
-+ "name": "cmd646-ide"
-+ },
-+ {
-+ "name": "ich9-usb-uhci4"
-+ },
-+ {
-+ "name": "sysbus-ahci"
-+ },
-+ {
-+ "name": "e500v2_v22-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ich9-usb-uhci2"
-+ },
-+ {
-+ "name": "ich9-usb-uhci1"
-+ },
-+ {
-+ "name": "MPC8533E_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7447A_v1.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "tpci200"
-+ },
-+ {
-+ "name": "memory-backend-file"
-+ },
-+ {
-+ "name": "604r-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-socket"
-+ },
-+ {
-+ "name": "sysbus-m48t59"
-+ },
-+ {
-+ "name": "603e7v2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "970mp_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "uni-north-internal-pci-pcihost"
-+ },
-+ {
-+ "name": "rtl8139"
-+ },
-+ {
-+ "name": "pci-bridge"
-+ },
-+ {
-+ "name": "chardev-hci"
-+ },
-+ {
-+ "name": "MPC8347EAT-powerpc64-cpu"
-+ },
-+ {
-+ "name": "megasas"
-+ },
-+ {
-+ "name": "405GPc-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7455_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7400_v2.8-powerpc64-cpu"
-+ },
-+ {
-+ "name": "u3-agp"
-+ },
-+ {
-+ "name": "container"
-+ },
-+ {
-+ "name": "7450_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "scsi-block"
-+ },
-+ {
-+ "name": "7451_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "unimplemented-device"
-+ },
-+ {
-+ "name": "603e_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "eTSEC"
-+ },
-+ {
-+ "name": "scsi-cd"
-+ },
-+ {
-+ "name": "uni-north-agp"
-+ },
-+ {
-+ "name": "440EPX-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER8_v2.0-spapr-cpu-core"
-+ },
-+ {
-+ "name": "MPC5200B_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "usb-uas"
-+ },
-+ {
-+ "name": "accel"
-+ },
-+ {
-+ "name": "740p-powerpc64-cpu"
-+ },
-+ {
-+ "name": "floppy-bus"
-+ },
-+ {
-+ "name": "virtio-vga"
-+ },
-+ {
-+ "name": "440-Xilinx-powerpc64-cpu"
-+ },
-+ {
-+ "name": "vhost-scsi-pci"
-+ },
-+ {
-+ "name": "spapr-rng"
-+ },
-+ {
-+ "name": "xlnx.xps-timer"
-+ },
-+ {
-+ "name": "isa-serial"
-+ },
-+ {
-+ "name": "virtio-serial-device"
-+ },
-+ {
-+ "name": "970_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "tls-creds-anon"
-+ },
-+ {
-+ "name": "sdhci-pci"
-+ },
-+ {
-+ "name": "POWER7_v2.3-spapr-cpu-core"
-+ },
-+ {
-+ "name": "chardev-gdb"
-+ },
-+ {
-+ "name": "pc-testdev"
-+ },
-+ {
-+ "name": "icskvm"
-+ },
-+ {
-+ "name": "escc"
-+ },
-+ {
-+ "name": "fw_cfg_mem"
-+ },
-+ {
-+ "name": "603e_v3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pseries-2.3-machine"
-+ },
-+ {
-+ "name": "MPC8347T-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7445_v3.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "taihu-machine"
-+ },
-+ {
-+ "name": "icp-kvm"
-+ },
-+ {
-+ "name": "MPC8555_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "G2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-balloon-pci"
-+ },
-+ {
-+ "name": "ide-cd"
-+ },
-+ {
-+ "name": "usb-ccid"
-+ },
-+ {
-+ "name": "750p-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pseries-2.2-machine"
-+ },
-+ {
-+ "name": "powernv-cpu-core-POWER8NVL"
-+ },
-+ {
-+ "name": "403GCX-powerpc64-cpu"
-+ },
-+ {
-+ "name": "sb16"
-+ },
-+ {
-+ "name": "iothread"
-+ },
-+ {
-+ "name": "750gl-powerpc64-cpu"
-+ },
-+ {
-+ "name": "filter-redirector"
-+ },
-+ {
-+ "name": "7410_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8347EP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC5200_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7450_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER7_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "vhost-vsock-device"
-+ },
-+ {
-+ "name": "MPC8545E_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "cs4231a"
-+ },
-+ {
-+ "name": "virtio-input-host-device"
-+ },
-+ {
-+ "name": "970MP_v1.0-spapr-cpu-core"
-+ },
-+ {
-+ "name": "403GB-powerpc64-cpu"
-+ },
-+ {
-+ "name": "G2le-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82559er"
-+ },
-+ {
-+ "name": "MPC8548E_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.6-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v2.8-powerpc64-cpu"
-+ },
-+ {
-+ "name": "604e_v2.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ivshmem-doorbell"
-+ },
-+ {
-+ "name": "750cxe_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cx_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-udp"
-+ },
-+ {
-+ "name": "MPC8343-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-rng-device"
-+ },
-+ {
-+ "name": "G2leLS-powerpc64-cpu"
-+ },
-+ {
-+ "name": "isa-parallel"
-+ },
-+ {
-+ "name": "MPC8548E_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "adlib"
-+ },
-+ {
-+ "name": "602-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pci-bridge-seat"
-+ },
-+ {
-+ "name": "hda-micro"
-+ },
-+ {
-+ "name": "fw_cfg_io"
-+ },
-+ {
-+ "name": "dc390"
-+ },
-+ {
-+ "name": "POWER5+_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "740_v3.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7441_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qemu,register"
-+ },
-+ {
-+ "name": "IDE"
-+ },
-+ {
-+ "name": "MPC8533_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e300c3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8641D-powerpc64-cpu"
-+ },
-+ {
-+ "name": "401E2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8347EAP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "spapr-pci-host-bridge"
-+ },
-+ {
-+ "name": "memory-backend-ram"
-+ },
-+ {
-+ "name": "am53c974"
-+ },
-+ {
-+ "name": "pseries-2.5-machine"
-+ },
-+ {
-+ "name": "750cx_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER7+_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-blk-device"
-+ },
-+ {
-+ "name": "qio-channel-file"
-+ },
-+ {
-+ "name": "745_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "601_v1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8544_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "740_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qio-channel-websock"
-+ },
-+ {
-+ "name": "pseries-2.4-machine"
-+ },
-+ {
-+ "name": "mc146818rtc"
-+ },
-+ {
-+ "name": "spapr-nvram"
-+ },
-+ {
-+ "name": "POWER9_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-msmouse"
-+ },
-+ {
-+ "name": "uni-north-pci"
-+ },
-+ {
-+ "name": "chardev-pipe"
-+ },
-+ {
-+ "name": "cryptodev-backend-builtin"
-+ },
-+ {
-+ "name": "750fx_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "hda-output"
-+ },
-+ {
-+ "name": "603e_v1.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC603-powerpc64-cpu"
-+ },
-+ {
-+ "name": "sysbus-m48t08"
-+ },
-+ {
-+ "name": "raven"
-+ },
-+ {
-+ "name": "440EPb-powerpc64-cpu"
-+ },
-+ {
-+ "name": "VGA"
-+ },
-+ {
-+ "name": "i8257"
-+ },
-+ {
-+ "name": "sysbus-m48t02"
-+ },
-+ {
-+ "name": "pc87312"
-+ },
-+ {
-+ "name": "mptsas1068"
-+ },
-+ {
-+ "name": "edu"
-+ },
-+ {
-+ "name": "MPC8347P-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-mouse-pci"
-+ },
-+ {
-+ "name": "740_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7455_v3.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "vfio-pci-igd-lpc-bridge"
-+ },
-+ {
-+ "name": "spapr-vlan"
-+ },
-+ {
-+ "name": "603e_v4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "HDA"
-+ },
-+ {
-+ "name": "7447_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "603e_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pseries-2.8-machine"
-+ },
-+ {
-+ "name": "MPC8543E_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "floppy"
-+ },
-+ {
-+ "name": "macio-oldworld"
-+ },
-+ {
-+ "name": "qemu:memory-region"
-+ },
-+ {
-+ "name": "adb-keyboard"
-+ },
-+ {
-+ "name": "G2LS-powerpc64-cpu"
-+ },
-+ {
-+ "name": "sysbus-ohci"
-+ },
-+ {
-+ "name": "7445_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pseries-2.7-machine"
-+ },
-+ {
-+ "name": "755_v2.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7450_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e600-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qio-channel-command"
-+ },
-+ {
-+ "name": "chardev-ringbuf"
-+ },
-+ {
-+ "name": "usb-serial"
-+ },
-+ {
-+ "name": "x2vp20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qtest-accel"
-+ },
-+ {
-+ "name": "pseries-2.6-machine"
-+ },
-+ {
-+ "name": "750l_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750fl-powerpc64-cpu"
-+ },
-+ {
-+ "name": "vt82c686b-usb-uhci"
-+ },
-+ {
-+ "name": "405D2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-blk-pci"
-+ },
-+ {
-+ "name": "virtio-gpu-device"
-+ },
-+ {
-+ "name": "MPC8560_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750gx_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "System"
-+ },
-+ {
-+ "name": "lsi53c810"
-+ },
-+ {
-+ "name": "uni-north-agp-pcihost"
-+ },
-+ {
-+ "name": "IOP480-powerpc64-cpu"
-+ },
-+ {
-+ "name": "603e7t-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8548E_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "405GPd-powerpc64-cpu"
-+ },
-+ {
-+ "name": "603-powerpc64-cpu"
-+ },
-+ {
-+ "name": "G2GP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7400_v2.9-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cxe_v3.1b-powerpc64-cpu"
-+ },
-+ {
-+ "name": "G2leGP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7450_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-file"
-+ },
-+ {
-+ "name": "7448_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "mac99-machine"
-+ },
-+ {
-+ "name": "e300c4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750l_v3.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC5200B_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "PCIE"
-+ },
-+ {
-+ "name": "qio-dns-resolver"
-+ },
-+ {
-+ "name": "750cx_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "cuda"
-+ },
-+ {
-+ "name": "604e_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8572E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-serial-bus"
-+ },
-+ {
-+ "name": "vhost-scsi"
-+ },
-+ {
-+ "name": "secondary-vga"
-+ },
-+ {
-+ "name": "401D2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8544_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500-ccsr"
-+ },
-+ {
-+ "name": "601_v2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "405EP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ccid-bus"
-+ },
-+ {
-+ "name": "pci-ohci"
-+ },
-+ {
-+ "name": "cfi.pflash02"
-+ },
-+ {
-+ "name": "cfi.pflash01"
-+ },
-+ {
-+ "name": "pseries-2.9-machine"
-+ },
-+ {
-+ "name": "usb-hub"
-+ },
-+ {
-+ "name": "750fx_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "405LP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8541_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8555_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "input-linux"
-+ },
-+ {
-+ "name": "x2vp4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7410_v1.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7400_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "740_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC5200_v12-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7448_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "xlnx.xps-uartlite"
-+ },
-+ {
-+ "name": "e5500-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pci-serial"
-+ },
-+ {
-+ "name": "403GC-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.7-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8543_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i8042"
-+ },
-+ {
-+ "name": "750cxe_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8543E_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82559c"
-+ },
-+ {
-+ "name": "i82559b"
-+ },
-+ {
-+ "name": "i82559a"
-+ },
-+ {
-+ "name": "SCSI"
-+ },
-+ {
-+ "name": "MPC8543E_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "rocker"
-+ },
-+ {
-+ "name": "pcnet"
-+ },
-+ {
-+ "name": "rng-egd"
-+ },
-+ {
-+ "name": "405CRa-powerpc64-cpu"
-+ },
-+ {
-+ "name": "spapr-tce-table"
-+ },
-+ {
-+ "name": "7400_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-testdev"
-+ },
-+ {
-+ "name": "MPC8349-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e200z5-powerpc64-cpu"
-+ },
-+ {
-+ "name": "740_v3.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "filter-dump"
-+ },
-+ {
-+ "name": "MPC8533_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82558b"
-+ },
-+ {
-+ "name": "G2H4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82558a"
-+ },
-+ {
-+ "name": "MPC8560_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "smbus-eeprom"
-+ },
-+ {
-+ "name": "host-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82801"
-+ },
-+ {
-+ "name": "tls-creds-x509"
-+ },
-+ {
-+ "name": "virtio-net-pci"
-+ },
-+ {
-+ "name": "virtio-keyboard-device"
-+ },
-+ {
-+ "name": "i82562"
-+ },
-+ {
-+ "name": "usb-net"
-+ },
-+ {
-+ "name": "MPC8560_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER7+_v2.1-spapr-cpu-core"
-+ },
-+ {
-+ "name": "603e_v1.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8568E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82557c"
-+ },
-+ {
-+ "name": "i82557b"
-+ },
-+ {
-+ "name": "i82557a"
-+ },
-+ {
-+ "name": "chardev-memory"
-+ },
-+ {
-+ "name": "isa-i8259"
-+ },
-+ {
-+ "name": "virtio-gpu-pci"
-+ },
-+ {
-+ "name": "nec-usb-xhci"
-+ },
-+ {
-+ "name": "pc-dimm"
-+ },
-+ {
-+ "name": "host-spapr-cpu-core"
-+ },
-+ {
-+ "name": "usb-mouse"
-+ },
-+ {
-+ "name": "sdhci-bus"
-+ },
-+ {
-+ "name": "i82551"
-+ },
-+ {
-+ "name": "i82550"
-+ },
-+ {
-+ "name": "405EZ-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7455_v3.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "sd-bus"
-+ },
-+ {
-+ "name": "apple-desktop-bus"
-+ },
-+ {
-+ "name": "e500v2_v30-powerpc64-cpu"
-+ },
-+ {
-+ "name": "macio-ide"
-+ },
-+ {
-+ "name": "401C2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8541_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-crypto-pci"
-+ },
-+ {
-+ "name": "755_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "filter-mirror"
-+ },
-+ {
-+ "name": "ich9-usb-ehci1"
-+ },
-+ {
-+ "name": "ich9-usb-ehci2"
-+ },
-+ {
-+ "name": "isa-ide"
-+ },
-+ {
-+ "name": "vfio-pci"
-+ },
-+ {
-+ "name": "prep-machine"
-+ },
-+ {
-+ "name": "irq"
-+ },
-+ {
-+ "name": "405GPR-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER8E_v2.1-spapr-cpu-core"
-+ },
-+ {
-+ "name": "750l_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7410_v1.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v2.5-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8572-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7450_v1.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7457_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qio-channel-socket"
-+ },
-+ {
-+ "name": "ich9-ahci"
-+ },
-+ {
-+ "name": "7457A_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER8NVL_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8347AT-powerpc64-cpu"
-+ },
-+ {
-+ "name": "chardev-stdio"
-+ },
-+ {
-+ "name": "piix3-usb-uhci"
-+ },
-+ {
-+ "name": "virtserialport"
-+ },
-+ {
-+ "name": "MPC8543E_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pvscsi"
-+ },
-+ {
-+ "name": "MPC8548_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cxe_v2.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82378"
-+ },
-+ {
-+ "name": "7447A_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "powernv-chip-POWER8NVL"
-+ },
-+ {
-+ "name": "750gx_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "gus"
-+ },
-+ {
-+ "name": "e500_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i82374"
-+ },
-+ {
-+ "name": "pnv-lpc"
-+ },
-+ {
-+ "name": "7445_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8543_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8540_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "604-powerpc64-cpu"
-+ },
-+ {
-+ "name": "405CRb-powerpc64-cpu"
-+ },
-+ {
-+ "name": "g3beige-machine"
-+ },
-+ {
-+ "name": "7400_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "IndustryPack"
-+ },
-+ {
-+ "name": "powernv-chip-POWER8E"
-+ },
-+ {
-+ "name": "7441_v2.3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7448_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8377-powerpc64-cpu"
-+ },
-+ {
-+ "name": "401A1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "603e7-powerpc64-cpu"
-+ },
-+ {
-+ "name": "cryptodev-backend"
-+ },
-+ {
-+ "name": "adb-mouse"
-+ },
-+ {
-+ "name": "Npe405L-powerpc64-cpu"
-+ },
-+ {
-+ "name": "or-irq"
-+ },
-+ {
-+ "name": "750cx_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8343E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "powernv-cpu-core-POWER9"
-+ },
-+ {
-+ "name": "powernv-cpu-core-POWER8"
-+ },
-+ {
-+ "name": "7451_v2.10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-rng-pci"
-+ },
-+ {
-+ "name": "chardev-vc"
-+ },
-+ {
-+ "name": "usb-ehci"
-+ },
-+ {
-+ "name": "bamboo-machine"
-+ },
-+ {
-+ "name": "filter-replay"
-+ },
-+ {
-+ "name": "G2leGP1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "603e_v1.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "970mp_v1.1-spapr-cpu-core"
-+ },
-+ {
-+ "name": "dec-21154-sysbus"
-+ },
-+ {
-+ "name": "virtio-9p-pci"
-+ },
-+ {
-+ "name": "spapr-vty"
-+ },
-+ {
-+ "name": "e1000-82545em"
-+ },
-+ {
-+ "name": "chardev-wctablet"
-+ },
-+ {
-+ "name": "7441_v2.10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8567E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER5+_v2.1-spapr-cpu-core"
-+ },
-+ {
-+ "name": "7400_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e1000-82544gc"
-+ },
-+ {
-+ "name": "740_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7448_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7455_v3.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER8NVL_v1.0-spapr-cpu-core"
-+ },
-+ {
-+ "name": "prep-systemio"
-+ },
-+ {
-+ "name": "MPC8547E_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.8-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500-spin"
-+ },
-+ {
-+ "name": "MPC8543_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8349E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "filter-buffer"
-+ },
-+ {
-+ "name": "mpc8544ds-machine"
-+ },
-+ {
-+ "name": "pci-serial-4x"
-+ },
-+ {
-+ "name": "401B2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ich9-intel-hda"
-+ },
-+ {
-+ "name": "virtio-9p-device"
-+ },
-+ {
-+ "name": "MPC8347AP-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ivshmem"
-+ },
-+ {
-+ "name": "e500v2_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8379E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-scsi-pci"
-+ },
-+ {
-+ "name": "e200z6-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7457A_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8555E_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qemu-console"
-+ },
-+ {
-+ "name": "ppce500-machine"
-+ },
-+ {
-+ "name": "virtio-pci-bus"
-+ },
-+ {
-+ "name": "750l_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ISA"
-+ },
-+ {
-+ "name": "MPC8541E_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ipoctal232"
-+ },
-+ {
-+ "name": "mpc8544-guts"
-+ },
-+ {
-+ "name": "uni-north-pci-pcihost"
-+ },
-+ {
-+ "name": "MPC8548_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pci-testdev"
-+ },
-+ {
-+ "name": "405GPa-powerpc64-cpu"
-+ },
-+ {
-+ "name": "piix4-usb-uhci"
-+ },
-+ {
-+ "name": "7400_v2.6-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-tablet-device"
-+ },
-+ {
-+ "name": "Npe405H2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750_v3.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "powernv-machine"
-+ },
-+ {
-+ "name": "ES1370"
-+ },
-+ {
-+ "name": "603e7v-powerpc64-cpu"
-+ },
-+ {
-+ "name": "openpic"
-+ },
-+ {
-+ "name": "Npe405H-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8548_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8545_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8567-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cxe_v3.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "G2HiP3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8378-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8343A-powerpc64-cpu"
-+ },
-+ {
-+ "name": "STB03-powerpc64-cpu"
-+ },
-+ {
-+ "name": "tcg-accel"
-+ },
-+ {
-+ "name": "750_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtconsole"
-+ },
-+ {
-+ "name": "MPC8540_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750l_v3.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "pci-serial-2x"
-+ },
-+ {
-+ "name": "ne2k_isa"
-+ },
-+ {
-+ "name": "isa-fdc"
-+ },
-+ {
-+ "name": "chardev-serial"
-+ },
-+ {
-+ "name": "colo-compare"
-+ },
-+ {
-+ "name": "745_v2.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-mmio-bus"
-+ },
-+ {
-+ "name": "virtio-tablet-pci"
-+ },
-+ {
-+ "name": "e1000e"
-+ },
-+ {
-+ "name": "usb-bus"
-+ },
-+ {
-+ "name": "7445_v3.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "rs6000-mc"
-+ },
-+ {
-+ "name": "usb-storage"
-+ },
-+ {
-+ "name": "PCI"
-+ },
-+ {
-+ "name": "kvm-openpic"
-+ },
-+ {
-+ "name": "esp"
-+ },
-+ {
-+ "name": "scsi-disk"
-+ },
-+ {
-+ "name": "virtex-ml507-machine"
-+ },
-+ {
-+ "name": "usb-kbd"
-+ },
-+ {
-+ "name": "750_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500-host-bridge"
-+ },
-+ {
-+ "name": "7410_v1.4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "Npe4GS3-powerpc64-cpu"
-+ },
-+ {
-+ "name": "ne2k_pci"
-+ },
-+ {
-+ "name": "isabus-bridge"
-+ },
-+ {
-+ "name": "970mp_v1.0-spapr-cpu-core"
-+ },
-+ {
-+ "name": "ivshmem-plain"
-+ },
-+ {
-+ "name": "755_v2.6-powerpc64-cpu"
-+ },
-+ {
-+ "name": "604e_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "qio-channel-buffer"
-+ },
-+ {
-+ "name": "970fx_v3.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7457_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "u3-agp-pcihost"
-+ },
-+ {
-+ "name": "spapr-vio-bridge"
-+ },
-+ {
-+ "name": "secret"
-+ },
-+ {
-+ "name": "hda-duplex"
-+ },
-+ {
-+ "name": "raven-pcihost"
-+ },
-+ {
-+ "name": "spapr-dr-connector"
-+ },
-+ {
-+ "name": "allwinner-ahci"
-+ },
-+ {
-+ "name": "nvme"
-+ },
-+ {
-+ "name": "sysbus-fdc"
-+ },
-+ {
-+ "name": "405D4-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8544E_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-balloon-device"
-+ },
-+ {
-+ "name": "MPC8641-powerpc64-cpu"
-+ },
-+ {
-+ "name": "none-machine"
-+ },
-+ {
-+ "name": "750fx_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750gx_v1.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "megasas-gen2"
-+ },
-+ {
-+ "name": "AC97"
-+ },
-+ {
-+ "name": "usb-tablet"
-+ },
-+ {
-+ "name": "970fx_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e300c1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500v2_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8540_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7400_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8543_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8533E_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7447A_v1.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "405CRc-powerpc64-cpu"
-+ },
-+ {
-+ "name": "740e-powerpc64-cpu"
-+ },
-+ {
-+ "name": "usb-braille"
-+ },
-+ {
-+ "name": "440-Xilinx-w-dfpu-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8555E_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "970mp_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "603e7v1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500mc-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500v2_v10-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8378E-powerpc64-cpu"
-+ },
-+ {
-+ "name": "intel-hda"
-+ },
-+ {
-+ "name": "kvm-accel"
-+ },
-+ {
-+ "name": "7400_v2.7-powerpc64-cpu"
-+ },
-+ {
-+ "name": "virtio-scsi-device"
-+ },
-+ {
-+ "name": "603p-powerpc64-cpu"
-+ },
-+ {
-+ "name": "grackle"
-+ },
-+ {
-+ "name": "970_v2.2-spapr-cpu-core"
-+ },
-+ {
-+ "name": "Cobra-powerpc64-cpu"
-+ },
-+ {
-+ "name": "POWER8E_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750fx_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "usb-wacom-tablet"
-+ },
-+ {
-+ "name": "970fx_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8548_v11-powerpc64-cpu"
-+ },
-+ {
-+ "name": "MPC8545_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i2c-bus"
-+ },
-+ {
-+ "name": "virtio-mouse-device"
-+ },
-+ {
-+ "name": "750e-powerpc64-cpu"
-+ },
-+ {
-+ "name": "isa-pit"
-+ },
-+ {
-+ "name": "macio-nvram"
-+ },
-+ {
-+ "name": "POWER9_v1.0-spapr-cpu-core"
-+ },
-+ {
-+ "name": "powernv-cpu-core-POWER8E"
-+ },
-+ {
-+ "name": "grackle-pcihost"
-+ },
-+ {
-+ "name": "ide-drive"
-+ },
-+ {
-+ "name": "ref405ep-machine"
-+ },
-+ {
-+ "name": "MPC8349A-powerpc64-cpu"
-+ },
-+ {
-+ "name": "401G2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "generic-sdhci"
-+ },
-+ {
-+ "name": "POWER8_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "i6300esb"
-+ },
-+ {
-+ "name": "STB25-powerpc64-cpu"
-+ },
-+ {
-+ "name": "sd-card"
-+ },
-+ {
-+ "name": "MPC8547E_v21-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7455_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "745_v2.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v2.2-powerpc64-cpu"
-+ },
-+ {
-+ "name": "vmxnet3"
-+ },
-+ {
-+ "name": "750_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "e500-pcihost"
-+ },
-+ {
-+ "name": "MPC8545E_v20-powerpc64-cpu"
-+ },
-+ {
-+ "name": "uni-north-internal-pci"
-+ },
-+ {
-+ "name": "spapr-rtc"
-+ },
-+ {
-+ "name": "MPC8347ET-powerpc64-cpu"
-+ },
-+ {
-+ "name": "755_v2.7-powerpc64-cpu"
-+ },
-+ {
-+ "name": "750cxe_v2.1-powerpc64-cpu"
-+ },
-+ {
-+ "name": "rng-random"
-+ },
-+ {
-+ "name": "750cl_v1.0-powerpc64-cpu"
-+ },
-+ {
-+ "name": "7457A_v1.2-powerpc64-cpu"
-+ }
-+ ],
-+ "id": "libvirt-9"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "secs",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "request-merging",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "min_io_size",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "serial",
-+ "type": "str"
-+ },
-+ {
-+ "name": "heads",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "ioeventfd",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "scsi",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "cyls",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-disable-pcie",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "logical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iothread",
-+ "type": "link"
-+ },
-+ {
-+ "name": "disable-modern",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "drive",
-+ "description": "Node name or ID of a block device to use as a backend",
-+ "type": "str"
-+ },
-+ {
-+ "name": "disable-legacy",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnkctl-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "werror",
-+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
-+ "type": "BlockdevOnError"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "discard_granularity",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "rerror",
-+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
-+ "type": "BlockdevOnError"
-+ },
-+ {
-+ "name": "page-per-vq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-deverr-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-pm-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "share-rw",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "physical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "config-wce",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "class",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "migrate-extra",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "modern-pio-notify",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "vectors",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-backend",
-+ "type": "child"
-+ },
-+ {
-+ "name": "x-ignore-backend-features",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "write-cache",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "num-queues",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "opt_io_size",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "ats",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-pci-bus-master-bug-migration",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ }
-+ ],
-+ "id": "libvirt-10"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "ctrl_mac_addr",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "status",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-pm-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest_csum",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ctrl_rx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ctrl_vq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "disable-modern",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "mrg_rxbuf",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host_tso6",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-txtimer",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "host_tso4",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "ctrl_rx_extra",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "gso",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "page-per-vq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-disable-pcie",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-ignore-backend-features",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "vlan",
-+ "description": "Integer VLAN id to connect to",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "x-txburst",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnkctl-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host_mtu",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "ctrl_vlan",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-backend",
-+ "type": "child"
-+ },
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "vectors",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "guest_announce",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host_ecn",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "ats",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host_ufo",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest_tso4",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest_tso6",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ctrl_guest_offloads",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "csum",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "modern-pio-notify",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ioeventfd",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "mq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest_ecn",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest_ufo",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-pci-bus-master-bug-migration",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "mac",
-+ "description": "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
-+ "type": "str"
-+ },
-+ {
-+ "name": "disable-legacy",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "tx",
-+ "type": "str"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-deverr-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "netdev",
-+ "description": "ID of a netdev to use as a backend",
-+ "type": "str"
-+ },
-+ {
-+ "name": "migrate-extra",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rx_queue_size",
-+ "type": "uint16"
-+ }
-+ ],
-+ "id": "libvirt-11"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ioeventfd",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-disable-pcie",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "cmd_per_lun",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "disable-modern",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "num_queues",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "disable-legacy",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnkctl-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "hotplug",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "page-per-vq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-deverr-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-pm-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "max_sectors",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "param_change",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iothread",
-+ "type": "link"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "migrate-extra",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "modern-pio-notify",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "vectors",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-backend",
-+ "type": "child"
-+ },
-+ {
-+ "name": "x-ignore-backend-features",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ats",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-pci-bus-master-bug-migration",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ }
-+ ],
-+ "id": "libvirt-12"
-+}
-+
-+{
-+ "id": "libvirt-13",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'virtio-blk-ccw' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-14",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'virtio-net-ccw' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-15",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'virtio-scsi-ccw' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-16",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'virtio-blk-s390' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-17",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'virtio-net-s390' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-18",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'pci-assign' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-19",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'kvm-pci-assign' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "x-pci-sub-device-id",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-no-kvm-msi",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-igd-opregion",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-vga",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pci-vendor-id",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "x-req",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-igd-gms",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ },
-+ {
-+ "name": "x-no-kvm-intx",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pci-device-id",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "host",
-+ "description": "Address (bus/device/function) of the host device, example: 04:10.0",
-+ "type": "str"
-+ },
-+ {
-+ "name": "x-no-kvm-msix",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-intx-mmap-timeout-ms",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "x-pci-sub-vendor-id",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "sysfsdev",
-+ "type": "str"
-+ },
-+ {
-+ "name": "x-no-mmap",
-+ "type": "bool"
-+ }
-+ ],
-+ "id": "libvirt-20"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "serial",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port_index",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "dpofua",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "logical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "discard_granularity",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "lun",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "max_unmap_size",
-+ "type": "uint64"
-+ },
-+ {
-+ "name": "drive",
-+ "description": "Node name or ID of a block device to use as a backend",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port_wwn",
-+ "type": "uint64"
-+ },
-+ {
-+ "name": "write-cache",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "share-rw",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "opt_io_size",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "min_io_size",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "product",
-+ "type": "str"
-+ },
-+ {
-+ "name": "scsi-id",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "channel",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "vendor",
-+ "type": "str"
-+ },
-+ {
-+ "name": "wwn",
-+ "type": "uint64"
-+ },
-+ {
-+ "name": "werror",
-+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
-+ "type": "BlockdevOnError"
-+ },
-+ {
-+ "name": "removable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rerror",
-+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
-+ "type": "BlockdevOnError"
-+ },
-+ {
-+ "name": "ver",
-+ "type": "str"
-+ },
-+ {
-+ "name": "physical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "max_io_size",
-+ "type": "uint64"
-+ }
-+ ],
-+ "id": "libvirt-21"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "serial",
-+ "type": "str"
-+ },
-+ {
-+ "name": "logical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "discard_granularity",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "drive",
-+ "description": "Node name or ID of a block device to use as a backend",
-+ "type": "str"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "write-cache",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "share-rw",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "opt_io_size",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "min_io_size",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "unit",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "wwn",
-+ "type": "uint64"
-+ },
-+ {
-+ "name": "werror",
-+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
-+ "type": "BlockdevOnError"
-+ },
-+ {
-+ "name": "model",
-+ "type": "str"
-+ },
-+ {
-+ "name": "rerror",
-+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
-+ "type": "BlockdevOnError"
-+ },
-+ {
-+ "name": "ver",
-+ "type": "str"
-+ },
-+ {
-+ "name": "physical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ }
-+ ],
-+ "id": "libvirt-22"
-+}
-+
-+{
-+ "id": "libvirt-23",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'PIIX4_PM' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-24",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'usb-redir' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-25",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'usb-host' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "drive",
-+ "description": "Node name or ID of a block device to use as a backend",
-+ "type": "str"
-+ },
-+ {
-+ "name": "lun",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "channel",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "scsi-id",
-+ "type": "uint32"
-+ }
-+ ],
-+ "id": "libvirt-26"
-+}
-+
-+{
-+ "id": "libvirt-27",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'i440FX-pcihost' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-28",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'q35-pcihost' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "serial",
-+ "type": "str"
-+ },
-+ {
-+ "name": "msos-desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "logical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "discard_granularity",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "drive",
-+ "description": "Node name or ID of a block device to use as a backend",
-+ "type": "str"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "write-cache",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "share-rw",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "opt_io_size",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "min_io_size",
-+ "type": "uint16"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ },
-+ {
-+ "name": "attached",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "full-path",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "removable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "physical_block_size",
-+ "description": "A power of two between 512 and 32768",
-+ "type": "uint16"
-+ }
-+ ],
-+ "id": "libvirt-29"
-+}
-+
-+{
-+ "id": "libvirt-30",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'kvm-pit' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "mmio",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "qemu-extended-regs",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "big-endian-framebuffer",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ },
-+ {
-+ "name": "vgamem_mb",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ }
-+ ],
-+ "id": "libvirt-31"
-+}
-+
-+{
-+ "id": "libvirt-32",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'vmware-svga' not found"
-+ }
-+}
-+
-+{
-+ "id": "libvirt-33",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'qxl' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ioeventfd",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-disable-pcie",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "disable-modern",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "disable-legacy",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnkctl-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "page-per-vq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-deverr-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-pm-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "max_outputs",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "migrate-extra",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "modern-pio-notify",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "vectors",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-backend",
-+ "type": "child"
-+ },
-+ {
-+ "name": "max_hostmem",
-+ "type": "size"
-+ },
-+ {
-+ "name": "x-ignore-backend-features",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ats",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-pci-bus-master-bug-migration",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ }
-+ ],
-+ "id": "libvirt-34"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "max_outputs",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "max_hostmem",
-+ "type": "size"
-+ }
-+ ],
-+ "id": "libvirt-35"
-+}
-+
-+{
-+ "id": "libvirt-36",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'ICH9-LPC' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "guest-stats-polling-interval",
-+ "type": "int"
-+ },
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-disable-pcie",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "disable-modern",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "disable-legacy",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnkctl-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest-stats",
-+ "type": "guest statistics"
-+ },
-+ {
-+ "name": "deflate-on-oom",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "page-per-vq",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-deverr-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-pm-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "class",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "migrate-extra",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "modern-pio-notify",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-backend",
-+ "type": "child"
-+ },
-+ {
-+ "name": "x-ignore-backend-features",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ats",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "virtio-pci-bus-master-bug-migration",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ }
-+ ],
-+ "id": "libvirt-37"
-+}
-+
-+{
-+ "id": "libvirt-38",
-+ "error": {
-+ "class": "DeviceNotFound",
-+ "desc": "Device 'virtio-balloon-ccw' not found"
-+ }
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "notify_on_empty",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "any_layout",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "indirect_desc",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "guest-stats",
-+ "type": "guest statistics"
-+ },
-+ {
-+ "name": "guest-stats-polling-interval",
-+ "type": "int"
-+ },
-+ {
-+ "name": "event_idx",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iommu_platform",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "deflate-on-oom",
-+ "description": "on/off",
-+ "type": "bool"
-+ }
-+ ],
-+ "id": "libvirt-39"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "rombar",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "intrs",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "x-pcie-lnksta-dllla",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "msix",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "multifunction",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "msi",
-+ "description": "on/off/auto",
-+ "type": "OnOffAuto"
-+ },
-+ {
-+ "name": "superspeed-ports-first",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "streams",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "romfile",
-+ "type": "str"
-+ },
-+ {
-+ "name": "force-pcie-endcap",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "command_serr_enable",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x-pcie-extcap-init",
-+ "description": "on/off",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "addr",
-+ "description": "Slot and optional function number, example: 06.0 or 06",
-+ "type": "int32"
-+ },
-+ {
-+ "name": "p3",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "p2",
-+ "type": "uint32"
-+ },
-+ {
-+ "name": "slots",
-+ "type": "uint32"
-+ }
-+ ],
-+ "id": "libvirt-40"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "ref405ep",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "none",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "virtex-ml507",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "powernv",
-+ "cpu-max": 2048
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "ppce500",
-+ "cpu-max": 32
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "mpc8544ds",
-+ "cpu-max": 15
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "bamboo",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "g3beige",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "prep",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": true,
-+ "name": "pseries-2.9",
-+ "is-default": true,
-+ "cpu-max": 1024,
-+ "alias": "pseries"
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "mac99",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "pseries-2.6",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": true,
-+ "name": "pseries-2.7",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": true,
-+ "name": "pseries-2.8",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "pseries-2.4",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "pseries-2.5",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "pseries-2.2",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "taihu",
-+ "cpu-max": 1
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "pseries-2.3",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "pseries-2.1",
-+ "cpu-max": 1024
-+ },
-+ {
-+ "hotpluggable-cpus": false,
-+ "name": "40p",
-+ "cpu-max": 1
-+ }
-+ ],
-+ "id": "libvirt-41"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "default",
-+ "typename": "604-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "ppc",
-+ "typename": "604-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "ppc32",
-+ "typename": "604-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "ppc64",
-+ "typename": "970fx_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "970mp",
-+ "typename": "970mp_v1.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx",
-+ "typename": "970fx_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "970",
-+ "typename": "970_v2.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER9",
-+ "typename": "POWER9_v1.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8NVL",
-+ "typename": "POWER8NVL_v1.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8",
-+ "typename": "POWER8E_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8E",
-+ "typename": "POWER8E_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7+",
-+ "typename": "POWER7+_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7",
-+ "typename": "POWER7_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER5gs",
-+ "typename": "POWER5+_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER5+",
-+ "typename": "POWER5+_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Apollo7PM",
-+ "typename": "7457A_v1.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A",
-+ "typename": "7457A_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A",
-+ "typename": "7447A_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Apollo7",
-+ "typename": "7457_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7457",
-+ "typename": "7457_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7447",
-+ "typename": "7447_v1.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Apollo6",
-+ "typename": "7455_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7455",
-+ "typename": "7455_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7445",
-+ "typename": "7445_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7451",
-+ "typename": "7451_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7441",
-+ "typename": "7441_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Vger",
-+ "typename": "7450_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7450",
-+ "typename": "7450_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7448",
-+ "typename": "7448_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Nitro",
-+ "typename": "7410_v1.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7410",
-+ "typename": "7410_v1.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "G4",
-+ "typename": "7400_v2.9-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Max",
-+ "typename": "7400_v2.9-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7400",
-+ "typename": "7400_v2.9-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Goldfinger",
-+ "typename": "755_v2.8-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "755",
-+ "typename": "755_v2.8-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "745",
-+ "typename": "745_v2.8-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "LoneStar",
-+ "typename": "750l_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750l",
-+ "typename": "750l_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx",
-+ "typename": "750gx_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx",
-+ "typename": "750fx_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe",
-+ "typename": "750cxe_v3.1b-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx",
-+ "typename": "750cx_v2.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750cl",
-+ "typename": "750cl_v2.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Conan/Doyle",
-+ "typename": "750p-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "G3",
-+ "typename": "750_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Typhoon",
-+ "typename": "750_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750",
-+ "typename": "750_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Arthur",
-+ "typename": "740_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "740",
-+ "typename": "740_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Mach5",
-+ "typename": "604r-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Sirocco",
-+ "typename": "604e_v2.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "604e",
-+ "typename": "604e_v2.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Goldeneye",
-+ "typename": "603e7t-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "603r",
-+ "typename": "603e7t-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Vaillant",
-+ "typename": "603e7v-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Stretch",
-+ "typename": "603e_v4.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "603e",
-+ "typename": "603e_v4.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Vanilla",
-+ "typename": "603-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "601v",
-+ "typename": "601_v2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "601",
-+ "typename": "601_v2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560",
-+ "typename": "MPC8560_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555E",
-+ "typename": "MPC8555E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555",
-+ "typename": "MPC8555_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E",
-+ "typename": "MPC8548E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548",
-+ "typename": "MPC8548_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8547E",
-+ "typename": "MPC8547E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545E",
-+ "typename": "MPC8545E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545",
-+ "typename": "MPC8545_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544E",
-+ "typename": "MPC8544E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544",
-+ "typename": "MPC8544_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E",
-+ "typename": "MPC8543E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543",
-+ "typename": "MPC8543_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541E",
-+ "typename": "MPC8541E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541",
-+ "typename": "MPC8541_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540",
-+ "typename": "MPC8540_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533E",
-+ "typename": "MPC8533E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533",
-+ "typename": "MPC8533_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2",
-+ "typename": "e500v2_v22-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v1",
-+ "typename": "e500_v20-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e500",
-+ "typename": "e500v2_v22-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EA",
-+ "typename": "MPC8347EAT-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347E",
-+ "typename": "MPC8347ET-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347A",
-+ "typename": "MPC8347AT-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347",
-+ "typename": "MPC8347T-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e300",
-+ "typename": "e300c3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e200",
-+ "typename": "e200z6-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8280",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8275",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8272",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8271",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8270",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8266_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8266_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8266",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8265_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8265_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8265",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8264_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8264_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8264",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8260_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8260_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8260",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8255_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8255_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8255",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8250_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8250_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8250",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8248",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8247",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8245",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8241",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "PowerQUICC-II",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC82xx",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200B",
-+ "typename": "MPC5200B_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200",
-+ "typename": "MPC5200_v12-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC52xx",
-+ "typename": "MPC5200_v12-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8240",
-+ "typename": "603-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "440EP",
-+ "typename": "440EPb-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp50",
-+ "typename": "x2vp20-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp7",
-+ "typename": "x2vp4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPe",
-+ "typename": "405CRc-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405GP",
-+ "typename": "405GPd-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405CR",
-+ "typename": "405CRc-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405",
-+ "typename": "405D4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "403",
-+ "typename": "403GC-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cl_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347ET",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8547E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "STB25",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401G2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349A",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750e",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8E_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Cobra",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603p",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8378E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500mc",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7v1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970mp_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440-Xilinx-w-dfpu",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740e",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405CRc",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8641",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405D4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604e_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe4GS3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v3.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v3.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "STB03",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343A",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8378",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2HiP3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8567",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe405H",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7v",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe405H2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPa",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e200z6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8379E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347AP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401B2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.8",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8547E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v3.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8567E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7441_v2.10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leGP1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7451_v2.10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe405L",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401A1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8377",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7441_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405CRb",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347AT",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8NVL_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8572",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.5",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPR",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401C2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v30",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v3.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405EZ",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8568E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "host",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2H4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e200z5",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405CRa",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GC",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e5500",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200_v12",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405LP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405EP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "601_v2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401D2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8572E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604e_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200B_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leGP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v3.1b",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.9",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2GP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPd",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7t",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "IOP480",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405D2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fl",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e600",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2LS",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v3.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347P",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440EPb",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC603",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER9_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "601_v1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7+_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EAP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401E2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8641D",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7441_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER5+_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "602",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leLS",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604e_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.8",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2le",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GB",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gl",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GCX",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750p",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v3.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347T",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440-Xilinx",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740p",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200B_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440EPX",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7451_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.8",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPc",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EAT",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970mp_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7v2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604r",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v22",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401F2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343EA",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.5",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8610",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.4b",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GA",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leGP3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v3.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v4.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440EPa",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8377E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "601_v0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "STB04",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2HiP4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cl_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxr",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349EA",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8379",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8568",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPb",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541E_v11",
-+ "typename": "",
-+ "static": false
-+ }
-+ ],
-+ "id": "libvirt-42"
-+}
-+
-+{
-+ "return": [
-+ ],
-+ "id": "libvirt-43"
-+}
-+
-+{
-+ "return": [
-+ ],
-+ "id": "libvirt-44"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "parameters": [
-+ {
-+ "name": "timeout",
-+ "help": "Request timeout in seconds (default 0 = no timeout)",
-+ "type": "number"
-+ },
-+ {
-+ "name": "initiator-name",
-+ "help": "Initiator iqn name to use when connecting",
-+ "type": "string"
-+ },
-+ {
-+ "name": "header-digest",
-+ "help": "HeaderDigest setting. {CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
-+ "type": "string"
-+ },
-+ {
-+ "name": "password-secret",
-+ "help": "ID of the secret providing password for CHAP authentication to target",
-+ "type": "string"
-+ },
-+ {
-+ "name": "password",
-+ "help": "password for CHAP authentication to target",
-+ "type": "string"
-+ },
-+ {
-+ "name": "user",
-+ "help": "username for CHAP authentication to target",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "iscsi"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "non-adaptive",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "lossy",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "acl",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "x509verify",
-+ "type": "string"
-+ },
-+ {
-+ "name": "tls",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "sasl",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "key-delay-ms",
-+ "type": "number"
-+ },
-+ {
-+ "name": "lock-key-sync",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "reverse",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "password",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "ipv6",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "ipv4",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "to",
-+ "type": "number"
-+ },
-+ {
-+ "name": "connections",
-+ "type": "number"
-+ },
-+ {
-+ "name": "head",
-+ "type": "number"
-+ },
-+ {
-+ "name": "display",
-+ "type": "string"
-+ },
-+ {
-+ "name": "share",
-+ "type": "string"
-+ },
-+ {
-+ "name": "x509",
-+ "type": "string"
-+ },
-+ {
-+ "name": "tls-creds",
-+ "type": "string"
-+ },
-+ {
-+ "name": "websocket",
-+ "type": "string"
-+ },
-+ {
-+ "name": "vnc",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "vnc"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "sock_fd",
-+ "type": "number"
-+ },
-+ {
-+ "name": "socket",
-+ "type": "string"
-+ },
-+ {
-+ "name": "readonly",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "writeout",
-+ "type": "string"
-+ },
-+ {
-+ "name": "security_model",
-+ "type": "string"
-+ },
-+ {
-+ "name": "mount_tag",
-+ "type": "string"
-+ },
-+ {
-+ "name": "path",
-+ "type": "string"
-+ },
-+ {
-+ "name": "fsdriver",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "virtfs"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "throttling.iops-size",
-+ "help": "when limiting by iops max size of an I/O in bytes",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-write-max-length",
-+ "help": "length of the bps-write-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-read-max-length",
-+ "help": "length of the bps-read-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-total-max-length",
-+ "help": "length of the bps-total-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-write-max-length",
-+ "help": "length of the iops-write-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-read-max-length",
-+ "help": "length of the iops-read-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-total-max-length",
-+ "help": "length of the iops-total-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-write-max",
-+ "help": "total bytes write burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-read-max",
-+ "help": "total bytes read burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-total-max",
-+ "help": "total bytes burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-write-max",
-+ "help": "I/O operations write burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-read-max",
-+ "help": "I/O operations read burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-total-max",
-+ "help": "I/O operations burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-write",
-+ "help": "limit write bytes per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-read",
-+ "help": "limit read bytes per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-total",
-+ "help": "limit total bytes per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-write",
-+ "help": "limit write operations per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-read",
-+ "help": "limit read operations per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-total",
-+ "help": "limit total I/O operations per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "sock_fd",
-+ "type": "number"
-+ },
-+ {
-+ "name": "socket",
-+ "type": "string"
-+ },
-+ {
-+ "name": "readonly",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "writeout",
-+ "type": "string"
-+ },
-+ {
-+ "name": "security_model",
-+ "type": "string"
-+ },
-+ {
-+ "name": "path",
-+ "type": "string"
-+ },
-+ {
-+ "name": "fsdriver",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "fsdev"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "string",
-+ "help": "Sets content of the blob to be inserted from a string",
-+ "type": "string"
-+ },
-+ {
-+ "name": "file",
-+ "help": "Sets the name of the file from which\nthe fw_cfg blob will be loaded",
-+ "type": "string"
-+ },
-+ {
-+ "name": "name",
-+ "help": "Sets the fw_cfg name of the blob to be inserted",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "fw_cfg"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "arg",
-+ "type": "string"
-+ },
-+ {
-+ "name": "target",
-+ "type": "string"
-+ },
-+ {
-+ "name": "enable",
-+ "type": "boolean"
-+ }
-+ ],
-+ "option": "semihosting-config"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "rrsnapshot",
-+ "type": "string"
-+ },
-+ {
-+ "name": "rrfile",
-+ "type": "string"
-+ },
-+ {
-+ "name": "rr",
-+ "type": "string"
-+ },
-+ {
-+ "name": "sleep",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "align",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "shift",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "icount"
-+ },
-+ {
-+ "parameters": [
-+ ],
-+ "option": "numa"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "debug-threads",
-+ "help": "When enabled, name the individual threads; defaults off.\nNOTE: The thread names are for debugging and not a\nstable API.",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "process",
-+ "help": "Sets the name of the QEMU process, as shown in top etc",
-+ "type": "string"
-+ },
-+ {
-+ "name": "guest",
-+ "help": "Sets the name of the guest.\nThis name will be displayed in the SDL window caption.\nThe name will also be used for the VNC server",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "name"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "timestamp",
-+ "type": "boolean"
-+ }
-+ ],
-+ "option": "msg"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "mlock",
-+ "type": "boolean"
-+ }
-+ ],
-+ "option": "realtime"
-+ },
-+ {
-+ "parameters": [
-+ ],
-+ "option": "tpmdev"
-+ },
-+ {
-+ "parameters": [
-+ ],
-+ "option": "object"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "opaque",
-+ "help": "free-form string used to describe fd",
-+ "type": "string"
-+ },
-+ {
-+ "name": "set",
-+ "help": "ID of the fd set to add fd to",
-+ "type": "number"
-+ },
-+ {
-+ "name": "fd",
-+ "help": "file descriptor of which a duplicate is added to fd set",
-+ "type": "number"
-+ }
-+ ],
-+ "option": "add-fd"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "enable",
-+ "type": "boolean"
-+ }
-+ ],
-+ "option": "sandbox"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "strict",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "reboot-timeout",
-+ "type": "string"
-+ },
-+ {
-+ "name": "splash-time",
-+ "type": "string"
-+ },
-+ {
-+ "name": "splash",
-+ "type": "string"
-+ },
-+ {
-+ "name": "menu",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "once",
-+ "type": "string"
-+ },
-+ {
-+ "name": "order",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "boot-opts"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "maxcpus",
-+ "type": "number"
-+ },
-+ {
-+ "name": "threads",
-+ "type": "number"
-+ },
-+ {
-+ "name": "cores",
-+ "type": "number"
-+ },
-+ {
-+ "name": "sockets",
-+ "type": "number"
-+ },
-+ {
-+ "name": "cpus",
-+ "type": "number"
-+ }
-+ ],
-+ "option": "smp-opts"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "maxmem",
-+ "type": "size"
-+ },
-+ {
-+ "name": "slots",
-+ "type": "number"
-+ },
-+ {
-+ "name": "size",
-+ "type": "size"
-+ }
-+ ],
-+ "option": "memory"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "thread",
-+ "help": "Enable/disable multi-threaded TCG",
-+ "type": "string"
-+ },
-+ {
-+ "name": "accel",
-+ "help": "Select the type of accelerator",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "accel"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "dea-key-wrap",
-+ "help": "enable/disable DEA key wrapping using the CPACF wrapping key",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "aes-key-wrap",
-+ "help": "enable/disable AES key wrapping using the CPACF wrapping key",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "suppress-vmdesc",
-+ "help": "Set on to disable self-describing migration",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "iommu",
-+ "help": "Set on/off to enable/disable Intel IOMMU (VT-d)",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "firmware",
-+ "help": "firmware image",
-+ "type": "string"
-+ },
-+ {
-+ "name": "usb",
-+ "help": "Set on/off to enable/disable usb",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "mem-merge",
-+ "help": "enable/disable memory merge support",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "dump-guest-core",
-+ "help": "Include guest memory in a core dump",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "dt_compatible",
-+ "help": "Overrides the \"compatible\" property of the dt root node",
-+ "type": "string"
-+ },
-+ {
-+ "name": "phandle_start",
-+ "help": "The first phandle ID we may generate dynamically",
-+ "type": "number"
-+ },
-+ {
-+ "name": "dumpdtb",
-+ "help": "Dump current dtb to a file and quit",
-+ "type": "string"
-+ },
-+ {
-+ "name": "dtb",
-+ "help": "Linux kernel device tree file",
-+ "type": "string"
-+ },
-+ {
-+ "name": "append",
-+ "help": "Linux kernel command line",
-+ "type": "string"
-+ },
-+ {
-+ "name": "initrd",
-+ "help": "Linux initial ramdisk file",
-+ "type": "string"
-+ },
-+ {
-+ "name": "kernel",
-+ "help": "Linux kernel image file",
-+ "type": "string"
-+ },
-+ {
-+ "name": "kvm_shadow_mem",
-+ "help": "KVM shadow MMU size",
-+ "type": "size"
-+ },
-+ {
-+ "name": "kernel_irqchip",
-+ "help": "use KVM in-kernel irqchip",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "accel",
-+ "help": "accelerator list",
-+ "type": "string"
-+ },
-+ {
-+ "name": "type",
-+ "help": "emulated machine",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "machine"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "romfile",
-+ "type": "string"
-+ },
-+ {
-+ "name": "bootindex",
-+ "type": "number"
-+ }
-+ ],
-+ "option": "option-rom"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "file",
-+ "type": "string"
-+ },
-+ {
-+ "name": "events",
-+ "type": "string"
-+ },
-+ {
-+ "name": "enable",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "trace"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "pretty",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "default",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "chardev",
-+ "type": "string"
-+ },
-+ {
-+ "name": "mode",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "mon"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "value",
-+ "type": "string"
-+ },
-+ {
-+ "name": "property",
-+ "type": "string"
-+ },
-+ {
-+ "name": "driver",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "global"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "driftfix",
-+ "type": "string"
-+ },
-+ {
-+ "name": "clock",
-+ "type": "string"
-+ },
-+ {
-+ "name": "base",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "rtc"
-+ },
-+ {
-+ "parameters": [
-+ ],
-+ "option": "net"
-+ },
-+ {
-+ "parameters": [
-+ ],
-+ "option": "netdev"
-+ },
-+ {
-+ "parameters": [
-+ ],
-+ "option": "device"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "logappend",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "logfile",
-+ "type": "string"
-+ },
-+ {
-+ "name": "append",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "chardev",
-+ "type": "string"
-+ },
-+ {
-+ "name": "size",
-+ "type": "size"
-+ },
-+ {
-+ "name": "debug",
-+ "type": "number"
-+ },
-+ {
-+ "name": "name",
-+ "type": "string"
-+ },
-+ {
-+ "name": "signal",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "mux",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "rows",
-+ "type": "number"
-+ },
-+ {
-+ "name": "cols",
-+ "type": "number"
-+ },
-+ {
-+ "name": "height",
-+ "type": "number"
-+ },
-+ {
-+ "name": "width",
-+ "type": "number"
-+ },
-+ {
-+ "name": "tls-creds",
-+ "type": "string"
-+ },
-+ {
-+ "name": "telnet",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "reconnect",
-+ "type": "number"
-+ },
-+ {
-+ "name": "delay",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "server",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "wait",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "ipv6",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "ipv4",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "to",
-+ "type": "number"
-+ },
-+ {
-+ "name": "localport",
-+ "type": "string"
-+ },
-+ {
-+ "name": "localaddr",
-+ "type": "string"
-+ },
-+ {
-+ "name": "port",
-+ "type": "string"
-+ },
-+ {
-+ "name": "host",
-+ "type": "string"
-+ },
-+ {
-+ "name": "path",
-+ "type": "string"
-+ },
-+ {
-+ "name": "backend",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "chardev"
-+ },
-+ {
-+ "parameters": [
-+ {
-+ "name": "copy-on-read",
-+ "help": "copy read data from backing file into image file",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "werror",
-+ "help": "write error action",
-+ "type": "string"
-+ },
-+ {
-+ "name": "rerror",
-+ "help": "read error action",
-+ "type": "string"
-+ },
-+ {
-+ "name": "read-only",
-+ "help": "open drive file as read-only",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "file",
-+ "help": "file name",
-+ "type": "string"
-+ },
-+ {
-+ "name": "serial",
-+ "help": "disk serial number",
-+ "type": "string"
-+ },
-+ {
-+ "name": "addr",
-+ "help": "pci address (virtio only)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "boot",
-+ "help": "(deprecated, ignored)",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "trans",
-+ "help": "chs translation (auto, lba, none)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "secs",
-+ "help": "number of sectors (ide disk geometry)",
-+ "type": "number"
-+ },
-+ {
-+ "name": "heads",
-+ "help": "number of heads (ide disk geometry)",
-+ "type": "number"
-+ },
-+ {
-+ "name": "cyls",
-+ "help": "number of cylinders (ide disk geometry)",
-+ "type": "number"
-+ },
-+ {
-+ "name": "if",
-+ "help": "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "media",
-+ "help": "media type (disk, cdrom)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "index",
-+ "help": "index number",
-+ "type": "number"
-+ },
-+ {
-+ "name": "unit",
-+ "help": "unit number (i.e. lun for scsi)",
-+ "type": "number"
-+ },
-+ {
-+ "name": "bus",
-+ "help": "bus number",
-+ "type": "number"
-+ },
-+ {
-+ "name": "stats-account-failed",
-+ "help": "whether to account for failed I/O operations in the statistics",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "stats-account-invalid",
-+ "help": "whether to account for invalid I/O operations in the statistics",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "detect-zeroes",
-+ "help": "try to optimize zero writes (off, on, unmap)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "throttling.group",
-+ "help": "name of the block throttling group",
-+ "type": "string"
-+ },
-+ {
-+ "name": "throttling.iops-size",
-+ "help": "when limiting by iops max size of an I/O in bytes",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-write-max-length",
-+ "help": "length of the bps-write-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-read-max-length",
-+ "help": "length of the bps-read-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-total-max-length",
-+ "help": "length of the bps-total-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-write-max-length",
-+ "help": "length of the iops-write-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-read-max-length",
-+ "help": "length of the iops-read-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-total-max-length",
-+ "help": "length of the iops-total-max burst period, in seconds",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-write-max",
-+ "help": "total bytes write burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-read-max",
-+ "help": "total bytes read burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-total-max",
-+ "help": "total bytes burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-write-max",
-+ "help": "I/O operations write burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-read-max",
-+ "help": "I/O operations read burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-total-max",
-+ "help": "I/O operations burst",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-write",
-+ "help": "limit write bytes per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-read",
-+ "help": "limit read bytes per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.bps-total",
-+ "help": "limit total bytes per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-write",
-+ "help": "limit write operations per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-read",
-+ "help": "limit read operations per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "throttling.iops-total",
-+ "help": "limit total I/O operations per second",
-+ "type": "number"
-+ },
-+ {
-+ "name": "werror",
-+ "help": "write error action",
-+ "type": "string"
-+ },
-+ {
-+ "name": "format",
-+ "help": "disk format (raw, qcow2, ...)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "cache.writeback",
-+ "help": "Enable writeback mode",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "aio",
-+ "help": "host AIO implementation (threads, native)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "snapshot",
-+ "help": "enable/disable snapshot mode",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "discard",
-+ "help": "discard operation (ignore/off, unmap/on)",
-+ "type": "string"
-+ },
-+ {
-+ "name": "read-only",
-+ "help": "Node is opened in read-only mode",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "cache.no-flush",
-+ "help": "Ignore flush requests",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "cache.direct",
-+ "help": "Bypass software writeback cache on the host",
-+ "type": "boolean"
-+ },
-+ {
-+ "name": "driver",
-+ "help": "Block driver to use for the node",
-+ "type": "string"
-+ },
-+ {
-+ "name": "node-name",
-+ "help": "Node name of the block device node",
-+ "type": "string"
-+ }
-+ ],
-+ "option": "drive"
-+ }
-+ ],
-+ "id": "libvirt-45"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "state": false,
-+ "capability": "xbzrle"
-+ },
-+ {
-+ "state": false,
-+ "capability": "rdma-pin-all"
-+ },
-+ {
-+ "state": false,
-+ "capability": "auto-converge"
-+ },
-+ {
-+ "state": false,
-+ "capability": "zero-blocks"
-+ },
-+ {
-+ "state": false,
-+ "capability": "compress"
-+ },
-+ {
-+ "state": false,
-+ "capability": "events"
-+ },
-+ {
-+ "state": false,
-+ "capability": "postcopy-ram"
-+ },
-+ {
-+ "state": false,
-+ "capability": "x-colo"
-+ },
-+ {
-+ "state": false,
-+ "capability": "release-ram"
-+ }
-+ ],
-+ "id": "libvirt-46"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "ACPI_DEVICE_OST",
-+ "meta-type": "event",
-+ "arg-type": "0"
-+ },
-+ {
-+ "name": "BALLOON_CHANGE",
-+ "meta-type": "event",
-+ "arg-type": "1"
-+ },
-+ {
-+ "name": "BLOCK_IMAGE_CORRUPTED",
-+ "meta-type": "event",
-+ "arg-type": "2"
-+ },
-+ {
-+ "name": "BLOCK_IO_ERROR",
-+ "meta-type": "event",
-+ "arg-type": "3"
-+ },
-+ {
-+ "name": "BLOCK_JOB_CANCELLED",
-+ "meta-type": "event",
-+ "arg-type": "4"
-+ },
-+ {
-+ "name": "BLOCK_JOB_COMPLETED",
-+ "meta-type": "event",
-+ "arg-type": "5"
-+ },
-+ {
-+ "name": "BLOCK_JOB_ERROR",
-+ "meta-type": "event",
-+ "arg-type": "6"
-+ },
-+ {
-+ "name": "BLOCK_JOB_READY",
-+ "meta-type": "event",
-+ "arg-type": "7"
-+ },
-+ {
-+ "name": "BLOCK_WRITE_THRESHOLD",
-+ "meta-type": "event",
-+ "arg-type": "8"
-+ },
-+ {
-+ "name": "DEVICE_DELETED",
-+ "meta-type": "event",
-+ "arg-type": "9"
-+ },
-+ {
-+ "name": "DEVICE_TRAY_MOVED",
-+ "meta-type": "event",
-+ "arg-type": "10"
-+ },
-+ {
-+ "name": "DUMP_COMPLETED",
-+ "meta-type": "event",
-+ "arg-type": "11"
-+ },
-+ {
-+ "name": "GUEST_PANICKED",
-+ "meta-type": "event",
-+ "arg-type": "12"
-+ },
-+ {
-+ "name": "MEM_UNPLUG_ERROR",
-+ "meta-type": "event",
-+ "arg-type": "13"
-+ },
-+ {
-+ "name": "MIGRATION",
-+ "meta-type": "event",
-+ "arg-type": "14"
-+ },
-+ {
-+ "name": "MIGRATION_PASS",
-+ "meta-type": "event",
-+ "arg-type": "15"
-+ },
-+ {
-+ "name": "NIC_RX_FILTER_CHANGED",
-+ "meta-type": "event",
-+ "arg-type": "16"
-+ },
-+ {
-+ "name": "POWERDOWN",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "QUORUM_FAILURE",
-+ "meta-type": "event",
-+ "arg-type": "18"
-+ },
-+ {
-+ "name": "QUORUM_REPORT_BAD",
-+ "meta-type": "event",
-+ "arg-type": "19"
-+ },
-+ {
-+ "name": "RESET",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "RESUME",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "RTC_CHANGE",
-+ "meta-type": "event",
-+ "arg-type": "20"
-+ },
-+ {
-+ "name": "SHUTDOWN",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "SPICE_CONNECTED",
-+ "meta-type": "event",
-+ "arg-type": "21"
-+ },
-+ {
-+ "name": "SPICE_DISCONNECTED",
-+ "meta-type": "event",
-+ "arg-type": "22"
-+ },
-+ {
-+ "name": "SPICE_INITIALIZED",
-+ "meta-type": "event",
-+ "arg-type": "23"
-+ },
-+ {
-+ "name": "SPICE_MIGRATE_COMPLETED",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "STOP",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "SUSPEND",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "SUSPEND_DISK",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "VNC_CONNECTED",
-+ "meta-type": "event",
-+ "arg-type": "24"
-+ },
-+ {
-+ "name": "VNC_DISCONNECTED",
-+ "meta-type": "event",
-+ "arg-type": "25"
-+ },
-+ {
-+ "name": "VNC_INITIALIZED",
-+ "meta-type": "event",
-+ "arg-type": "26"
-+ },
-+ {
-+ "name": "VSERPORT_CHANGE",
-+ "meta-type": "event",
-+ "arg-type": "27"
-+ },
-+ {
-+ "name": "WAKEUP",
-+ "meta-type": "event",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "WATCHDOG",
-+ "meta-type": "event",
-+ "arg-type": "28"
-+ },
-+ {
-+ "name": "add-fd",
-+ "ret-type": "30",
-+ "meta-type": "command",
-+ "arg-type": "29"
-+ },
-+ {
-+ "name": "add_client",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "31"
-+ },
-+ {
-+ "name": "balloon",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "32"
-+ },
-+ {
-+ "name": "block-commit",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "33"
-+ },
-+ {
-+ "name": "block-dirty-bitmap-add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "34"
-+ },
-+ {
-+ "name": "block-dirty-bitmap-clear",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "35"
-+ },
-+ {
-+ "name": "block-dirty-bitmap-remove",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "35"
-+ },
-+ {
-+ "name": "block-job-cancel",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "36"
-+ },
-+ {
-+ "name": "block-job-complete",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "37"
-+ },
-+ {
-+ "name": "block-job-pause",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "38"
-+ },
-+ {
-+ "name": "block-job-resume",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "39"
-+ },
-+ {
-+ "name": "block-job-set-speed",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "40"
-+ },
-+ {
-+ "name": "block-set-write-threshold",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "41"
-+ },
-+ {
-+ "name": "block-stream",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "42"
-+ },
-+ {
-+ "name": "block_passwd",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "43"
-+ },
-+ {
-+ "name": "block_resize",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "44"
-+ },
-+ {
-+ "name": "block_set_io_throttle",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "45"
-+ },
-+ {
-+ "name": "blockdev-add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "46"
-+ },
-+ {
-+ "name": "blockdev-backup",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "47"
-+ },
-+ {
-+ "name": "blockdev-change-medium",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "48"
-+ },
-+ {
-+ "name": "blockdev-close-tray",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "49"
-+ },
-+ {
-+ "name": "blockdev-del",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "50"
-+ },
-+ {
-+ "name": "blockdev-mirror",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "51"
-+ },
-+ {
-+ "name": "blockdev-open-tray",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "52"
-+ },
-+ {
-+ "name": "blockdev-snapshot",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "53"
-+ },
-+ {
-+ "name": "blockdev-snapshot-delete-internal-sync",
-+ "ret-type": "55",
-+ "meta-type": "command",
-+ "arg-type": "54"
-+ },
-+ {
-+ "name": "blockdev-snapshot-internal-sync",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "56"
-+ },
-+ {
-+ "name": "blockdev-snapshot-sync",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "57"
-+ },
-+ {
-+ "name": "change",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "58"
-+ },
-+ {
-+ "name": "change-backing-file",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "59"
-+ },
-+ {
-+ "name": "change-vnc-password",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "60"
-+ },
-+ {
-+ "name": "chardev-add",
-+ "ret-type": "62",
-+ "meta-type": "command",
-+ "arg-type": "61"
-+ },
-+ {
-+ "name": "chardev-remove",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "63"
-+ },
-+ {
-+ "name": "client_migrate_info",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "64"
-+ },
-+ {
-+ "name": "closefd",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "65"
-+ },
-+ {
-+ "name": "cont",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "cpu",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "66"
-+ },
-+ {
-+ "name": "cpu-add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "67"
-+ },
-+ {
-+ "name": "device-list-properties",
-+ "ret-type": "[69]",
-+ "meta-type": "command",
-+ "arg-type": "68"
-+ },
-+ {
-+ "name": "device_add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "70"
-+ },
-+ {
-+ "name": "device_del",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "71"
-+ },
-+ {
-+ "name": "drive-backup",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "72"
-+ },
-+ {
-+ "name": "drive-mirror",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "73"
-+ },
-+ {
-+ "name": "dump-guest-memory",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "74"
-+ },
-+ {
-+ "name": "dump-skeys",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "75"
-+ },
-+ {
-+ "name": "eject",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "76"
-+ },
-+ {
-+ "name": "expire_password",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "77"
-+ },
-+ {
-+ "name": "getfd",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "78"
-+ },
-+ {
-+ "name": "human-monitor-command",
-+ "ret-type": "str",
-+ "meta-type": "command",
-+ "arg-type": "79"
-+ },
-+ {
-+ "name": "inject-nmi",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "input-send-event",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "80"
-+ },
-+ {
-+ "name": "memsave",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "81"
-+ },
-+ {
-+ "name": "migrate",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "82"
-+ },
-+ {
-+ "name": "migrate-incoming",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "83"
-+ },
-+ {
-+ "name": "migrate-set-cache-size",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "84"
-+ },
-+ {
-+ "name": "migrate-set-capabilities",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "85"
-+ },
-+ {
-+ "name": "migrate-set-parameters",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "86"
-+ },
-+ {
-+ "name": "migrate-start-postcopy",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "migrate_cancel",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "migrate_set_downtime",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "87"
-+ },
-+ {
-+ "name": "migrate_set_speed",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "88"
-+ },
-+ {
-+ "name": "nbd-server-add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "89"
-+ },
-+ {
-+ "name": "nbd-server-start",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "90"
-+ },
-+ {
-+ "name": "nbd-server-stop",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "netdev_add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "91"
-+ },
-+ {
-+ "name": "netdev_del",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "92"
-+ },
-+ {
-+ "name": "object-add",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "93"
-+ },
-+ {
-+ "name": "object-del",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "94"
-+ },
-+ {
-+ "name": "pmemsave",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "95"
-+ },
-+ {
-+ "name": "qmp_capabilities",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "qom-get",
-+ "ret-type": "any",
-+ "meta-type": "command",
-+ "arg-type": "96"
-+ },
-+ {
-+ "name": "qom-list",
-+ "ret-type": "[98]",
-+ "meta-type": "command",
-+ "arg-type": "97"
-+ },
-+ {
-+ "name": "qom-list-types",
-+ "ret-type": "[100]",
-+ "meta-type": "command",
-+ "arg-type": "99"
-+ },
-+ {
-+ "name": "qom-set",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "101"
-+ },
-+ {
-+ "name": "query-acpi-ospm-status",
-+ "ret-type": "[102]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-balloon",
-+ "ret-type": "103",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-block",
-+ "ret-type": "[104]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-block-jobs",
-+ "ret-type": "[105]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-blockstats",
-+ "ret-type": "[107]",
-+ "meta-type": "command",
-+ "arg-type": "106"
-+ },
-+ {
-+ "name": "query-chardev",
-+ "ret-type": "[108]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-chardev-backends",
-+ "ret-type": "[109]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-command-line-options",
-+ "ret-type": "[111]",
-+ "meta-type": "command",
-+ "arg-type": "110"
-+ },
-+ {
-+ "name": "query-commands",
-+ "ret-type": "[112]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-cpu-definitions",
-+ "ret-type": "[113]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-cpu-model-baseline",
-+ "ret-type": "115",
-+ "meta-type": "command",
-+ "arg-type": "114"
-+ },
-+ {
-+ "name": "query-cpu-model-comparison",
-+ "ret-type": "117",
-+ "meta-type": "command",
-+ "arg-type": "116"
-+ },
-+ {
-+ "name": "query-cpu-model-expansion",
-+ "ret-type": "119",
-+ "meta-type": "command",
-+ "arg-type": "118"
-+ },
-+ {
-+ "name": "query-cpus",
-+ "ret-type": "[120]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-dump",
-+ "ret-type": "121",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-dump-guest-memory-capability",
-+ "ret-type": "122",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-events",
-+ "ret-type": "[123]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-fdsets",
-+ "ret-type": "[124]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-gic-capabilities",
-+ "ret-type": "[125]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-hotpluggable-cpus",
-+ "ret-type": "[126]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-iothreads",
-+ "ret-type": "[127]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-kvm",
-+ "ret-type": "128",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-machines",
-+ "ret-type": "[129]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-memdev",
-+ "ret-type": "[130]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-memory-devices",
-+ "ret-type": "[131]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-mice",
-+ "ret-type": "[132]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-migrate",
-+ "ret-type": "133",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-migrate-cache-size",
-+ "ret-type": "int",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-migrate-capabilities",
-+ "ret-type": "[134]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-migrate-parameters",
-+ "ret-type": "86",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-name",
-+ "ret-type": "135",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-named-block-nodes",
-+ "ret-type": "[136]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-pci",
-+ "ret-type": "[137]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-qmp-schema",
-+ "ret-type": "[138]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-rocker",
-+ "ret-type": "140",
-+ "meta-type": "command",
-+ "arg-type": "139"
-+ },
-+ {
-+ "name": "query-rocker-of-dpa-flows",
-+ "ret-type": "[142]",
-+ "meta-type": "command",
-+ "arg-type": "141"
-+ },
-+ {
-+ "name": "query-rocker-of-dpa-groups",
-+ "ret-type": "[144]",
-+ "meta-type": "command",
-+ "arg-type": "143"
-+ },
-+ {
-+ "name": "query-rocker-ports",
-+ "ret-type": "[146]",
-+ "meta-type": "command",
-+ "arg-type": "145"
-+ },
-+ {
-+ "name": "query-rx-filter",
-+ "ret-type": "[148]",
-+ "meta-type": "command",
-+ "arg-type": "147"
-+ },
-+ {
-+ "name": "query-spice",
-+ "ret-type": "149",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-status",
-+ "ret-type": "150",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-target",
-+ "ret-type": "151",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-tpm",
-+ "ret-type": "[152]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-tpm-models",
-+ "ret-type": "[153]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-tpm-types",
-+ "ret-type": "[154]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-uuid",
-+ "ret-type": "155",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-version",
-+ "ret-type": "156",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-vm-generation-id",
-+ "ret-type": "157",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-vnc",
-+ "ret-type": "158",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-vnc-servers",
-+ "ret-type": "[159]",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "query-xen-replication-status",
-+ "ret-type": "160",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "quit",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "remove-fd",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "161"
-+ },
-+ {
-+ "name": "ringbuf-read",
-+ "ret-type": "str",
-+ "meta-type": "command",
-+ "arg-type": "162"
-+ },
-+ {
-+ "name": "ringbuf-write",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "163"
-+ },
-+ {
-+ "name": "rtc-reset-reinjection",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "screendump",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "164"
-+ },
-+ {
-+ "name": "send-key",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "165"
-+ },
-+ {
-+ "name": "set_link",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "166"
-+ },
-+ {
-+ "name": "set_password",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "167"
-+ },
-+ {
-+ "name": "stop",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "system_powerdown",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "system_reset",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "system_wakeup",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "trace-event-get-state",
-+ "ret-type": "[169]",
-+ "meta-type": "command",
-+ "arg-type": "168"
-+ },
-+ {
-+ "name": "trace-event-set-state",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "170"
-+ },
-+ {
-+ "name": "transaction",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "171"
-+ },
-+ {
-+ "name": "x-blockdev-change",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "172"
-+ },
-+ {
-+ "name": "x-blockdev-insert-medium",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "173"
-+ },
-+ {
-+ "name": "x-blockdev-remove-medium",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "174"
-+ },
-+ {
-+ "name": "x-colo-lost-heartbeat",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "xen-colo-do-checkpoint",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "17"
-+ },
-+ {
-+ "name": "xen-load-devices-state",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "175"
-+ },
-+ {
-+ "name": "xen-save-devices-state",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "176"
-+ },
-+ {
-+ "name": "xen-set-global-dirty-log",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "177"
-+ },
-+ {
-+ "name": "xen-set-replication",
-+ "ret-type": "17",
-+ "meta-type": "command",
-+ "arg-type": "178"
-+ },
-+ {
-+ "name": "0",
-+ "members": [
-+ {
-+ "name": "info",
-+ "type": "102"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "1",
-+ "members": [
-+ {
-+ "name": "actual",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "2",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "msg",
-+ "type": "str"
-+ },
-+ {
-+ "name": "offset",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "fatal",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "3",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "operation",
-+ "type": "179"
-+ },
-+ {
-+ "name": "action",
-+ "type": "180"
-+ },
-+ {
-+ "name": "nospace",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "reason",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "4",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "181"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "len",
-+ "type": "int"
-+ },
-+ {
-+ "name": "offset",
-+ "type": "int"
-+ },
-+ {
-+ "name": "speed",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "5",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "181"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "len",
-+ "type": "int"
-+ },
-+ {
-+ "name": "offset",
-+ "type": "int"
-+ },
-+ {
-+ "name": "speed",
-+ "type": "int"
-+ },
-+ {
-+ "name": "error",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "6",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "operation",
-+ "type": "179"
-+ },
-+ {
-+ "name": "action",
-+ "type": "180"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "7",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "181"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "len",
-+ "type": "int"
-+ },
-+ {
-+ "name": "offset",
-+ "type": "int"
-+ },
-+ {
-+ "name": "speed",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "8",
-+ "members": [
-+ {
-+ "name": "node-name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "amount-exceeded",
-+ "type": "int"
-+ },
-+ {
-+ "name": "write-threshold",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "9",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "path",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "10",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "tray-open",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "11",
-+ "members": [
-+ {
-+ "name": "result",
-+ "type": "121"
-+ },
-+ {
-+ "name": "error",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "12",
-+ "members": [
-+ {
-+ "name": "action",
-+ "type": "182"
-+ },
-+ {
-+ "name": "info",
-+ "default": null,
-+ "type": "183"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "13",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "msg",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "14",
-+ "members": [
-+ {
-+ "name": "status",
-+ "type": "184"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "15",
-+ "members": [
-+ {
-+ "name": "pass",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "16",
-+ "members": [
-+ {
-+ "name": "name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "path",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "17",
-+ "members": [
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "18",
-+ "members": [
-+ {
-+ "name": "reference",
-+ "type": "str"
-+ },
-+ {
-+ "name": "sector-num",
-+ "type": "int"
-+ },
-+ {
-+ "name": "sectors-count",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "19",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "185"
-+ },
-+ {
-+ "name": "error",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "sector-num",
-+ "type": "int"
-+ },
-+ {
-+ "name": "sectors-count",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "20",
-+ "members": [
-+ {
-+ "name": "offset",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "21",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "186"
-+ },
-+ {
-+ "name": "client",
-+ "type": "186"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "22",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "186"
-+ },
-+ {
-+ "name": "client",
-+ "type": "186"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "23",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "187"
-+ },
-+ {
-+ "name": "client",
-+ "type": "188"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "24",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "189"
-+ },
-+ {
-+ "name": "client",
-+ "type": "190"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "25",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "189"
-+ },
-+ {
-+ "name": "client",
-+ "type": "191"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "26",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "189"
-+ },
-+ {
-+ "name": "client",
-+ "type": "191"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "27",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "open",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "28",
-+ "members": [
-+ {
-+ "name": "action",
-+ "type": "192"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "29",
-+ "members": [
-+ {
-+ "name": "fdset-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "opaque",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "30",
-+ "members": [
-+ {
-+ "name": "fdset-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "fd",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "31",
-+ "members": [
-+ {
-+ "name": "protocol",
-+ "type": "str"
-+ },
-+ {
-+ "name": "fdname",
-+ "type": "str"
-+ },
-+ {
-+ "name": "skipauth",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "tls",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "32",
-+ "members": [
-+ {
-+ "name": "value",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "33",
-+ "members": [
-+ {
-+ "name": "job-id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "base",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "top",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "backing-file",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "speed",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "filter-node-name",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "34",
-+ "members": [
-+ {
-+ "name": "node",
-+ "type": "str"
-+ },
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "granularity",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "35",
-+ "members": [
-+ {
-+ "name": "node",
-+ "type": "str"
-+ },
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "36",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "force",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "37",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "38",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "39",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "40",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "speed",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "41",
-+ "members": [
-+ {
-+ "name": "node-name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "write-threshold",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "42",
-+ "members": [
-+ {
-+ "name": "job-id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "base",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "base-node",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "backing-file",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "speed",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "on-error",
-+ "default": null,
-+ "type": "193"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "43",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "password",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "44",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "45",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "bps",
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_rd",
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_wr",
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops",
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_rd",
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_wr",
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_rd_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_wr_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_rd_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_wr_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_rd_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_wr_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_rd_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_wr_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "group",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "46",
-+ "tag": "driver",
-+ "variants": [
-+ {
-+ "case": "blkdebug",
-+ "type": "198"
-+ },
-+ {
-+ "case": "blkverify",
-+ "type": "199"
-+ },
-+ {
-+ "case": "bochs",
-+ "type": "200"
-+ },
-+ {
-+ "case": "cloop",
-+ "type": "200"
-+ },
-+ {
-+ "case": "dmg",
-+ "type": "200"
-+ },
-+ {
-+ "case": "file",
-+ "type": "201"
-+ },
-+ {
-+ "case": "ftp",
-+ "type": "202"
-+ },
-+ {
-+ "case": "ftps",
-+ "type": "203"
-+ },
-+ {
-+ "case": "gluster",
-+ "type": "204"
-+ },
-+ {
-+ "case": "host_cdrom",
-+ "type": "201"
-+ },
-+ {
-+ "case": "host_device",
-+ "type": "201"
-+ },
-+ {
-+ "case": "http",
-+ "type": "205"
-+ },
-+ {
-+ "case": "https",
-+ "type": "206"
-+ },
-+ {
-+ "case": "iscsi",
-+ "type": "207"
-+ },
-+ {
-+ "case": "luks",
-+ "type": "208"
-+ },
-+ {
-+ "case": "nbd",
-+ "type": "209"
-+ },
-+ {
-+ "case": "nfs",
-+ "type": "210"
-+ },
-+ {
-+ "case": "null-aio",
-+ "type": "211"
-+ },
-+ {
-+ "case": "null-co",
-+ "type": "211"
-+ },
-+ {
-+ "case": "parallels",
-+ "type": "200"
-+ },
-+ {
-+ "case": "qcow2",
-+ "type": "212"
-+ },
-+ {
-+ "case": "qcow",
-+ "type": "213"
-+ },
-+ {
-+ "case": "qed",
-+ "type": "213"
-+ },
-+ {
-+ "case": "quorum",
-+ "type": "214"
-+ },
-+ {
-+ "case": "raw",
-+ "type": "215"
-+ },
-+ {
-+ "case": "rbd",
-+ "type": "216"
-+ },
-+ {
-+ "case": "replication",
-+ "type": "217"
-+ },
-+ {
-+ "case": "sheepdog",
-+ "type": "218"
-+ },
-+ {
-+ "case": "ssh",
-+ "type": "219"
-+ },
-+ {
-+ "case": "vdi",
-+ "type": "200"
-+ },
-+ {
-+ "case": "vhdx",
-+ "type": "200"
-+ },
-+ {
-+ "case": "vmdk",
-+ "type": "213"
-+ },
-+ {
-+ "case": "vpc",
-+ "type": "200"
-+ },
-+ {
-+ "case": "vvfat",
-+ "type": "220"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "driver",
-+ "type": "194"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "discard",
-+ "default": null,
-+ "type": "195"
-+ },
-+ {
-+ "name": "cache",
-+ "default": null,
-+ "type": "196"
-+ },
-+ {
-+ "name": "read-only",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "detect-zeroes",
-+ "default": null,
-+ "type": "197"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "47",
-+ "members": [
-+ {
-+ "name": "job-id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "target",
-+ "type": "str"
-+ },
-+ {
-+ "name": "sync",
-+ "type": "221"
-+ },
-+ {
-+ "name": "speed",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "compress",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "on-source-error",
-+ "default": null,
-+ "type": "193"
-+ },
-+ {
-+ "name": "on-target-error",
-+ "default": null,
-+ "type": "193"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "48",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "read-only-mode",
-+ "default": null,
-+ "type": "222"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "49",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "50",
-+ "members": [
-+ {
-+ "name": "node-name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "51",
-+ "members": [
-+ {
-+ "name": "job-id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "target",
-+ "type": "str"
-+ },
-+ {
-+ "name": "replaces",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "sync",
-+ "type": "221"
-+ },
-+ {
-+ "name": "speed",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "granularity",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "buf-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "on-source-error",
-+ "default": null,
-+ "type": "193"
-+ },
-+ {
-+ "name": "on-target-error",
-+ "default": null,
-+ "type": "193"
-+ },
-+ {
-+ "name": "filter-node-name",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "52",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "force",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "53",
-+ "members": [
-+ {
-+ "name": "node",
-+ "type": "str"
-+ },
-+ {
-+ "name": "overlay",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "54",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "name",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "55",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "vm-state-size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "date-sec",
-+ "type": "int"
-+ },
-+ {
-+ "name": "date-nsec",
-+ "type": "int"
-+ },
-+ {
-+ "name": "vm-clock-sec",
-+ "type": "int"
-+ },
-+ {
-+ "name": "vm-clock-nsec",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "56",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "57",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "snapshot-file",
-+ "type": "str"
-+ },
-+ {
-+ "name": "snapshot-node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "mode",
-+ "default": null,
-+ "type": "223"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "58",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "target",
-+ "type": "str"
-+ },
-+ {
-+ "name": "arg",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "59",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "image-node-name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "backing-file",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "60",
-+ "members": [
-+ {
-+ "name": "password",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "61",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "backend",
-+ "type": "224"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "62",
-+ "members": [
-+ {
-+ "name": "pty",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "63",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "64",
-+ "members": [
-+ {
-+ "name": "protocol",
-+ "type": "str"
-+ },
-+ {
-+ "name": "hostname",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tls-port",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "cert-subject",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "65",
-+ "members": [
-+ {
-+ "name": "fdname",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "66",
-+ "members": [
-+ {
-+ "name": "index",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "67",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "68",
-+ "members": [
-+ {
-+ "name": "typename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[69]",
-+ "element-type": "69",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "69",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "description",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "70",
-+ "members": [
-+ {
-+ "name": "driver",
-+ "type": "str"
-+ },
-+ {
-+ "name": "bus",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "71",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "72",
-+ "members": [
-+ {
-+ "name": "job-id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "target",
-+ "type": "str"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "sync",
-+ "type": "221"
-+ },
-+ {
-+ "name": "mode",
-+ "default": null,
-+ "type": "223"
-+ },
-+ {
-+ "name": "speed",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bitmap",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "compress",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "on-source-error",
-+ "default": null,
-+ "type": "193"
-+ },
-+ {
-+ "name": "on-target-error",
-+ "default": null,
-+ "type": "193"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "73",
-+ "members": [
-+ {
-+ "name": "job-id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "target",
-+ "type": "str"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "replaces",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "sync",
-+ "type": "221"
-+ },
-+ {
-+ "name": "mode",
-+ "default": null,
-+ "type": "223"
-+ },
-+ {
-+ "name": "speed",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "granularity",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "buf-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "on-source-error",
-+ "default": null,
-+ "type": "193"
-+ },
-+ {
-+ "name": "on-target-error",
-+ "default": null,
-+ "type": "193"
-+ },
-+ {
-+ "name": "unmap",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "74",
-+ "members": [
-+ {
-+ "name": "paging",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "protocol",
-+ "type": "str"
-+ },
-+ {
-+ "name": "detach",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "begin",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "225"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "75",
-+ "members": [
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "76",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "force",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "77",
-+ "members": [
-+ {
-+ "name": "protocol",
-+ "type": "str"
-+ },
-+ {
-+ "name": "time",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "78",
-+ "members": [
-+ {
-+ "name": "fdname",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "79",
-+ "members": [
-+ {
-+ "name": "command-line",
-+ "type": "str"
-+ },
-+ {
-+ "name": "cpu-index",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "str",
-+ "json-type": "string",
-+ "meta-type": "builtin"
-+ },
-+ {
-+ "name": "80",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "head",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "events",
-+ "type": "[226]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "81",
-+ "members": [
-+ {
-+ "name": "val",
-+ "type": "int"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ },
-+ {
-+ "name": "cpu-index",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "82",
-+ "members": [
-+ {
-+ "name": "uri",
-+ "type": "str"
-+ },
-+ {
-+ "name": "blk",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "inc",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "detach",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "83",
-+ "members": [
-+ {
-+ "name": "uri",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "84",
-+ "members": [
-+ {
-+ "name": "value",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "85",
-+ "members": [
-+ {
-+ "name": "capabilities",
-+ "type": "[134]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "86",
-+ "members": [
-+ {
-+ "name": "compress-level",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "compress-threads",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "decompress-threads",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "cpu-throttle-initial",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "cpu-throttle-increment",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tls-creds",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "tls-hostname",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "max-bandwidth",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "downtime-limit",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "x-checkpoint-delay",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "87",
-+ "members": [
-+ {
-+ "name": "value",
-+ "type": "number"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "88",
-+ "members": [
-+ {
-+ "name": "value",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "89",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "writable",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "90",
-+ "members": [
-+ {
-+ "name": "addr",
-+ "type": "227"
-+ },
-+ {
-+ "name": "tls-creds",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "91",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "92",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "93",
-+ "members": [
-+ {
-+ "name": "qom-type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "props",
-+ "default": null,
-+ "type": "any"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "94",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "95",
-+ "members": [
-+ {
-+ "name": "val",
-+ "type": "int"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "96",
-+ "members": [
-+ {
-+ "name": "path",
-+ "type": "str"
-+ },
-+ {
-+ "name": "property",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "any",
-+ "json-type": "value",
-+ "meta-type": "builtin"
-+ },
-+ {
-+ "name": "97",
-+ "members": [
-+ {
-+ "name": "path",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[98]",
-+ "element-type": "98",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "98",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "99",
-+ "members": [
-+ {
-+ "name": "implements",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "abstract",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[100]",
-+ "element-type": "100",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "100",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "101",
-+ "members": [
-+ {
-+ "name": "path",
-+ "type": "str"
-+ },
-+ {
-+ "name": "property",
-+ "type": "str"
-+ },
-+ {
-+ "name": "value",
-+ "type": "any"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[102]",
-+ "element-type": "102",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "102",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "slot",
-+ "type": "str"
-+ },
-+ {
-+ "name": "slot-type",
-+ "type": "228"
-+ },
-+ {
-+ "name": "source",
-+ "type": "int"
-+ },
-+ {
-+ "name": "status",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "103",
-+ "members": [
-+ {
-+ "name": "actual",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[104]",
-+ "element-type": "104",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "104",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "removable",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "locked",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "inserted",
-+ "default": null,
-+ "type": "136"
-+ },
-+ {
-+ "name": "tray_open",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "io-status",
-+ "default": null,
-+ "type": "229"
-+ },
-+ {
-+ "name": "dirty-bitmaps",
-+ "default": null,
-+ "type": "[230]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[105]",
-+ "element-type": "105",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "105",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "len",
-+ "type": "int"
-+ },
-+ {
-+ "name": "offset",
-+ "type": "int"
-+ },
-+ {
-+ "name": "busy",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "paused",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "speed",
-+ "type": "int"
-+ },
-+ {
-+ "name": "io-status",
-+ "type": "229"
-+ },
-+ {
-+ "name": "ready",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "106",
-+ "members": [
-+ {
-+ "name": "query-nodes",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[107]",
-+ "element-type": "107",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "107",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "stats",
-+ "type": "231"
-+ },
-+ {
-+ "name": "parent",
-+ "default": null,
-+ "type": "107"
-+ },
-+ {
-+ "name": "backing",
-+ "default": null,
-+ "type": "107"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[108]",
-+ "element-type": "108",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "108",
-+ "members": [
-+ {
-+ "name": "label",
-+ "type": "str"
-+ },
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ },
-+ {
-+ "name": "frontend-open",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[109]",
-+ "element-type": "109",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "109",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "110",
-+ "members": [
-+ {
-+ "name": "option",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[111]",
-+ "element-type": "111",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "111",
-+ "members": [
-+ {
-+ "name": "option",
-+ "type": "str"
-+ },
-+ {
-+ "name": "parameters",
-+ "type": "[232]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[112]",
-+ "element-type": "112",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "112",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[113]",
-+ "element-type": "113",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "113",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "migration-safe",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "static",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "unavailable-features",
-+ "default": null,
-+ "type": "[str]"
-+ },
-+ {
-+ "name": "typename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "114",
-+ "members": [
-+ {
-+ "name": "modela",
-+ "type": "233"
-+ },
-+ {
-+ "name": "modelb",
-+ "type": "233"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "115",
-+ "members": [
-+ {
-+ "name": "model",
-+ "type": "233"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "116",
-+ "members": [
-+ {
-+ "name": "modela",
-+ "type": "233"
-+ },
-+ {
-+ "name": "modelb",
-+ "type": "233"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "117",
-+ "members": [
-+ {
-+ "name": "result",
-+ "type": "234"
-+ },
-+ {
-+ "name": "responsible-properties",
-+ "type": "[str]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "118",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "235"
-+ },
-+ {
-+ "name": "model",
-+ "type": "233"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "119",
-+ "members": [
-+ {
-+ "name": "model",
-+ "type": "233"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[120]",
-+ "element-type": "120",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "120",
-+ "tag": "arch",
-+ "variants": [
-+ {
-+ "case": "x86",
-+ "type": "237"
-+ },
-+ {
-+ "case": "sparc",
-+ "type": "238"
-+ },
-+ {
-+ "case": "ppc",
-+ "type": "239"
-+ },
-+ {
-+ "case": "mips",
-+ "type": "240"
-+ },
-+ {
-+ "case": "tricore",
-+ "type": "241"
-+ },
-+ {
-+ "case": "other",
-+ "type": "242"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "CPU",
-+ "type": "int"
-+ },
-+ {
-+ "name": "current",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "halted",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "qom_path",
-+ "type": "str"
-+ },
-+ {
-+ "name": "thread_id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "arch",
-+ "type": "236"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "121",
-+ "members": [
-+ {
-+ "name": "status",
-+ "type": "243"
-+ },
-+ {
-+ "name": "completed",
-+ "type": "int"
-+ },
-+ {
-+ "name": "total",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "122",
-+ "members": [
-+ {
-+ "name": "formats",
-+ "type": "[225]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[123]",
-+ "element-type": "123",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "123",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[124]",
-+ "element-type": "124",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "124",
-+ "members": [
-+ {
-+ "name": "fdset-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "fds",
-+ "type": "[244]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[125]",
-+ "element-type": "125",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "125",
-+ "members": [
-+ {
-+ "name": "version",
-+ "type": "int"
-+ },
-+ {
-+ "name": "emulated",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "kernel",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[126]",
-+ "element-type": "126",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "126",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "vcpus-count",
-+ "type": "int"
-+ },
-+ {
-+ "name": "props",
-+ "type": "245"
-+ },
-+ {
-+ "name": "qom-path",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[127]",
-+ "element-type": "127",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "127",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "thread-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "poll-max-ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "poll-grow",
-+ "type": "int"
-+ },
-+ {
-+ "name": "poll-shrink",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "128",
-+ "members": [
-+ {
-+ "name": "enabled",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "present",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[129]",
-+ "element-type": "129",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "129",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "alias",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "is-default",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "cpu-max",
-+ "type": "int"
-+ },
-+ {
-+ "name": "hotpluggable-cpus",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[130]",
-+ "element-type": "130",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "130",
-+ "members": [
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "merge",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "dump",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "prealloc",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host-nodes",
-+ "type": "[int]"
-+ },
-+ {
-+ "name": "policy",
-+ "type": "246"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[131]",
-+ "element-type": "131",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "131",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "dimm",
-+ "type": "248"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "247"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[132]",
-+ "element-type": "132",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "132",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "index",
-+ "type": "int"
-+ },
-+ {
-+ "name": "current",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "absolute",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "133",
-+ "members": [
-+ {
-+ "name": "status",
-+ "default": null,
-+ "type": "184"
-+ },
-+ {
-+ "name": "ram",
-+ "default": null,
-+ "type": "249"
-+ },
-+ {
-+ "name": "disk",
-+ "default": null,
-+ "type": "249"
-+ },
-+ {
-+ "name": "xbzrle-cache",
-+ "default": null,
-+ "type": "250"
-+ },
-+ {
-+ "name": "total-time",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "expected-downtime",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "downtime",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "setup-time",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "cpu-throttle-percentage",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "error-desc",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "int",
-+ "json-type": "int",
-+ "meta-type": "builtin"
-+ },
-+ {
-+ "name": "[134]",
-+ "element-type": "134",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "134",
-+ "members": [
-+ {
-+ "name": "capability",
-+ "type": "251"
-+ },
-+ {
-+ "name": "state",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "135",
-+ "members": [
-+ {
-+ "name": "name",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[136]",
-+ "element-type": "136",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "136",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "ro",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "drv",
-+ "type": "str"
-+ },
-+ {
-+ "name": "backing_file",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "backing_file_depth",
-+ "type": "int"
-+ },
-+ {
-+ "name": "encrypted",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "encryption_key_missing",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "detect_zeroes",
-+ "type": "197"
-+ },
-+ {
-+ "name": "bps",
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_rd",
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_wr",
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops",
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_rd",
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_wr",
-+ "type": "int"
-+ },
-+ {
-+ "name": "image",
-+ "type": "252"
-+ },
-+ {
-+ "name": "bps_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_rd_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_wr_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_rd_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_wr_max",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_rd_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "bps_wr_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_rd_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_wr_max_length",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "iops_size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "group",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "cache",
-+ "type": "253"
-+ },
-+ {
-+ "name": "write_threshold",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[137]",
-+ "element-type": "137",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "137",
-+ "members": [
-+ {
-+ "name": "bus",
-+ "type": "int"
-+ },
-+ {
-+ "name": "devices",
-+ "type": "[254]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[138]",
-+ "element-type": "138",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "138",
-+ "tag": "meta-type",
-+ "variants": [
-+ {
-+ "case": "builtin",
-+ "type": "256"
-+ },
-+ {
-+ "case": "enum",
-+ "type": "257"
-+ },
-+ {
-+ "case": "array",
-+ "type": "258"
-+ },
-+ {
-+ "case": "object",
-+ "type": "259"
-+ },
-+ {
-+ "case": "alternate",
-+ "type": "260"
-+ },
-+ {
-+ "case": "command",
-+ "type": "261"
-+ },
-+ {
-+ "case": "event",
-+ "type": "262"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "meta-type",
-+ "type": "255"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "139",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "140",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "ports",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "141",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "tbl-id",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[142]",
-+ "element-type": "142",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "142",
-+ "members": [
-+ {
-+ "name": "cookie",
-+ "type": "int"
-+ },
-+ {
-+ "name": "hits",
-+ "type": "int"
-+ },
-+ {
-+ "name": "key",
-+ "type": "263"
-+ },
-+ {
-+ "name": "mask",
-+ "type": "264"
-+ },
-+ {
-+ "name": "action",
-+ "type": "265"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "143",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[144]",
-+ "element-type": "144",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "144",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "type",
-+ "type": "int"
-+ },
-+ {
-+ "name": "vlan-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "pport",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "index",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "out-pport",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "group-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "set-vlan-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "pop-vlan",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "group-ids",
-+ "default": null,
-+ "type": "[int]"
-+ },
-+ {
-+ "name": "set-eth-src",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "set-eth-dst",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "ttl-check",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "145",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[146]",
-+ "element-type": "146",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "146",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "enabled",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "link-up",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "speed",
-+ "type": "int"
-+ },
-+ {
-+ "name": "duplex",
-+ "type": "266"
-+ },
-+ {
-+ "name": "autoneg",
-+ "type": "267"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "147",
-+ "members": [
-+ {
-+ "name": "name",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[148]",
-+ "element-type": "148",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "148",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "promiscuous",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "multicast",
-+ "type": "268"
-+ },
-+ {
-+ "name": "unicast",
-+ "type": "268"
-+ },
-+ {
-+ "name": "vlan",
-+ "type": "268"
-+ },
-+ {
-+ "name": "broadcast-allowed",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "multicast-overflow",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "unicast-overflow",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "main-mac",
-+ "type": "str"
-+ },
-+ {
-+ "name": "vlan-table",
-+ "type": "[int]"
-+ },
-+ {
-+ "name": "unicast-table",
-+ "type": "[str]"
-+ },
-+ {
-+ "name": "multicast-table",
-+ "type": "[str]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "149",
-+ "members": [
-+ {
-+ "name": "enabled",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "migrated",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tls-port",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "auth",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "compiled-version",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "mouse-mode",
-+ "type": "269"
-+ },
-+ {
-+ "name": "channels",
-+ "default": null,
-+ "type": "[188]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "150",
-+ "members": [
-+ {
-+ "name": "running",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "singlestep",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "status",
-+ "type": "270"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "151",
-+ "members": [
-+ {
-+ "name": "arch",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[152]",
-+ "element-type": "152",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "152",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "model",
-+ "type": "153"
-+ },
-+ {
-+ "name": "options",
-+ "type": "271"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[153]",
-+ "element-type": "153",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "153",
-+ "meta-type": "enum",
-+ "values": [
-+ "tpm-tis"
-+ ]
-+ },
-+ {
-+ "name": "[154]",
-+ "element-type": "154",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "154",
-+ "meta-type": "enum",
-+ "values": [
-+ "passthrough"
-+ ]
-+ },
-+ {
-+ "name": "155",
-+ "members": [
-+ {
-+ "name": "UUID",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "156",
-+ "members": [
-+ {
-+ "name": "qemu",
-+ "type": "272"
-+ },
-+ {
-+ "name": "package",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "157",
-+ "members": [
-+ {
-+ "name": "guid",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "158",
-+ "members": [
-+ {
-+ "name": "enabled",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "host",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "default": null,
-+ "type": "273"
-+ },
-+ {
-+ "name": "service",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "auth",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "clients",
-+ "default": null,
-+ "type": "[191]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[159]",
-+ "element-type": "159",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "159",
-+ "members": [
-+ {
-+ "name": "id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "server",
-+ "type": "[274]"
-+ },
-+ {
-+ "name": "clients",
-+ "type": "[191]"
-+ },
-+ {
-+ "name": "auth",
-+ "type": "275"
-+ },
-+ {
-+ "name": "vencrypt",
-+ "default": null,
-+ "type": "276"
-+ },
-+ {
-+ "name": "display",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "160",
-+ "members": [
-+ {
-+ "name": "error",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "desc",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "161",
-+ "members": [
-+ {
-+ "name": "fdset-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "fd",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "162",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "277"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "163",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "str"
-+ },
-+ {
-+ "name": "data",
-+ "type": "str"
-+ },
-+ {
-+ "name": "format",
-+ "default": null,
-+ "type": "277"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "164",
-+ "members": [
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "165",
-+ "members": [
-+ {
-+ "name": "keys",
-+ "type": "[278]"
-+ },
-+ {
-+ "name": "hold-time",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "166",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "up",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "167",
-+ "members": [
-+ {
-+ "name": "protocol",
-+ "type": "str"
-+ },
-+ {
-+ "name": "password",
-+ "type": "str"
-+ },
-+ {
-+ "name": "connected",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "168",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "vcpu",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[169]",
-+ "element-type": "169",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "169",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "state",
-+ "type": "279"
-+ },
-+ {
-+ "name": "vcpu",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "170",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "enable",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ignore-unavailable",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "vcpu",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "171",
-+ "members": [
-+ {
-+ "name": "actions",
-+ "type": "[280]"
-+ },
-+ {
-+ "name": "properties",
-+ "default": null,
-+ "type": "281"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "172",
-+ "members": [
-+ {
-+ "name": "parent",
-+ "type": "str"
-+ },
-+ {
-+ "name": "child",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "173",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "node-name",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "174",
-+ "members": [
-+ {
-+ "name": "device",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "175",
-+ "members": [
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "176",
-+ "members": [
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "177",
-+ "members": [
-+ {
-+ "name": "enable",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "178",
-+ "members": [
-+ {
-+ "name": "enable",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "primary",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "failover",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "bool",
-+ "json-type": "boolean",
-+ "meta-type": "builtin"
-+ },
-+ {
-+ "name": "179",
-+ "meta-type": "enum",
-+ "values": [
-+ "read",
-+ "write"
-+ ]
-+ },
-+ {
-+ "name": "180",
-+ "meta-type": "enum",
-+ "values": [
-+ "ignore",
-+ "report",
-+ "stop"
-+ ]
-+ },
-+ {
-+ "name": "181",
-+ "meta-type": "enum",
-+ "values": [
-+ "commit",
-+ "stream",
-+ "mirror",
-+ "backup"
-+ ]
-+ },
-+ {
-+ "name": "182",
-+ "meta-type": "enum",
-+ "values": [
-+ "pause",
-+ "poweroff"
-+ ]
-+ },
-+ {
-+ "name": "183",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "hyper-v",
-+ "type": "283"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "282"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "184",
-+ "meta-type": "enum",
-+ "values": [
-+ "none",
-+ "setup",
-+ "cancelling",
-+ "cancelled",
-+ "active",
-+ "postcopy-active",
-+ "completed",
-+ "failed",
-+ "colo"
-+ ]
-+ },
-+ {
-+ "name": "185",
-+ "meta-type": "enum",
-+ "values": [
-+ "read",
-+ "write",
-+ "flush"
-+ ]
-+ },
-+ {
-+ "name": "186",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "187",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ },
-+ {
-+ "name": "auth",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "188",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ },
-+ {
-+ "name": "connection-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "channel-type",
-+ "type": "int"
-+ },
-+ {
-+ "name": "channel-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "tls",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "189",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "service",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ },
-+ {
-+ "name": "websocket",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "auth",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "190",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "service",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ },
-+ {
-+ "name": "websocket",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "191",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "service",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ },
-+ {
-+ "name": "websocket",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "x509_dname",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "sasl_username",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "192",
-+ "meta-type": "enum",
-+ "values": [
-+ "reset",
-+ "shutdown",
-+ "poweroff",
-+ "pause",
-+ "debug",
-+ "none",
-+ "inject-nmi"
-+ ]
-+ },
-+ {
-+ "name": "193",
-+ "meta-type": "enum",
-+ "values": [
-+ "report",
-+ "ignore",
-+ "enospc",
-+ "stop",
-+ "auto"
-+ ]
-+ },
-+ {
-+ "name": "194",
-+ "meta-type": "enum",
-+ "values": [
-+ "blkdebug",
-+ "blkverify",
-+ "bochs",
-+ "cloop",
-+ "dmg",
-+ "file",
-+ "ftp",
-+ "ftps",
-+ "gluster",
-+ "host_cdrom",
-+ "host_device",
-+ "http",
-+ "https",
-+ "iscsi",
-+ "luks",
-+ "nbd",
-+ "nfs",
-+ "null-aio",
-+ "null-co",
-+ "parallels",
-+ "qcow",
-+ "qcow2",
-+ "qed",
-+ "quorum",
-+ "raw",
-+ "rbd",
-+ "replication",
-+ "sheepdog",
-+ "ssh",
-+ "vdi",
-+ "vhdx",
-+ "vmdk",
-+ "vpc",
-+ "vvfat"
-+ ]
-+ },
-+ {
-+ "name": "195",
-+ "meta-type": "enum",
-+ "values": [
-+ "ignore",
-+ "unmap"
-+ ]
-+ },
-+ {
-+ "name": "196",
-+ "members": [
-+ {
-+ "name": "direct",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "no-flush",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "197",
-+ "meta-type": "enum",
-+ "values": [
-+ "off",
-+ "on",
-+ "unmap"
-+ ]
-+ },
-+ {
-+ "name": "198",
-+ "members": [
-+ {
-+ "name": "image",
-+ "type": "284"
-+ },
-+ {
-+ "name": "config",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "align",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "inject-error",
-+ "default": null,
-+ "type": "[285]"
-+ },
-+ {
-+ "name": "set-state",
-+ "default": null,
-+ "type": "[286]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "199",
-+ "members": [
-+ {
-+ "name": "test",
-+ "type": "284"
-+ },
-+ {
-+ "name": "raw",
-+ "type": "284"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "200",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "284"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "201",
-+ "members": [
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ },
-+ {
-+ "name": "aio",
-+ "default": null,
-+ "type": "287"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "202",
-+ "members": [
-+ {
-+ "name": "url",
-+ "type": "str"
-+ },
-+ {
-+ "name": "readahead",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "timeout",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-password-secret",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "203",
-+ "members": [
-+ {
-+ "name": "url",
-+ "type": "str"
-+ },
-+ {
-+ "name": "readahead",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "timeout",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "sslverify",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "204",
-+ "members": [
-+ {
-+ "name": "volume",
-+ "type": "str"
-+ },
-+ {
-+ "name": "path",
-+ "type": "str"
-+ },
-+ {
-+ "name": "server",
-+ "type": "[288]"
-+ },
-+ {
-+ "name": "debug",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "205",
-+ "members": [
-+ {
-+ "name": "url",
-+ "type": "str"
-+ },
-+ {
-+ "name": "readahead",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "timeout",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "cookie",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "206",
-+ "members": [
-+ {
-+ "name": "url",
-+ "type": "str"
-+ },
-+ {
-+ "name": "readahead",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "timeout",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-username",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "proxy-password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "cookie",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "sslverify",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "207",
-+ "members": [
-+ {
-+ "name": "transport",
-+ "type": "289"
-+ },
-+ {
-+ "name": "portal",
-+ "type": "str"
-+ },
-+ {
-+ "name": "target",
-+ "type": "str"
-+ },
-+ {
-+ "name": "lun",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "user",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "password-secret",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "initiator-name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "header-digest",
-+ "default": null,
-+ "type": "290"
-+ },
-+ {
-+ "name": "timeout",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "208",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "284"
-+ },
-+ {
-+ "name": "key-secret",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "209",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "288"
-+ },
-+ {
-+ "name": "export",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "tls-creds",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "210",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "291"
-+ },
-+ {
-+ "name": "path",
-+ "type": "str"
-+ },
-+ {
-+ "name": "user",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "group",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tcp-syn-count",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "readahead-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "page-cache-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "debug",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "211",
-+ "members": [
-+ {
-+ "name": "size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "latency-ns",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "212",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "284"
-+ },
-+ {
-+ "name": "backing",
-+ "default": null,
-+ "type": "284"
-+ },
-+ {
-+ "name": "lazy-refcounts",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "pass-discard-request",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "pass-discard-snapshot",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "pass-discard-other",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "overlap-check",
-+ "default": null,
-+ "type": "292"
-+ },
-+ {
-+ "name": "cache-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "l2-cache-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "refcount-cache-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "cache-clean-interval",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "213",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "284"
-+ },
-+ {
-+ "name": "backing",
-+ "default": null,
-+ "type": "284"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "214",
-+ "members": [
-+ {
-+ "name": "blkverify",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "children",
-+ "type": "[284]"
-+ },
-+ {
-+ "name": "vote-threshold",
-+ "type": "int"
-+ },
-+ {
-+ "name": "rewrite-corrupted",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "read-pattern",
-+ "default": null,
-+ "type": "293"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "215",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "284"
-+ },
-+ {
-+ "name": "offset",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "size",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "216",
-+ "members": [
-+ {
-+ "name": "pool",
-+ "type": "str"
-+ },
-+ {
-+ "name": "image",
-+ "type": "str"
-+ },
-+ {
-+ "name": "conf",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "snapshot",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "user",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "server",
-+ "default": null,
-+ "type": "[294]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "217",
-+ "members": [
-+ {
-+ "name": "file",
-+ "type": "284"
-+ },
-+ {
-+ "name": "mode",
-+ "type": "295"
-+ },
-+ {
-+ "name": "top-id",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "218",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "288"
-+ },
-+ {
-+ "name": "vdi",
-+ "type": "str"
-+ },
-+ {
-+ "name": "snap-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tag",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "219",
-+ "members": [
-+ {
-+ "name": "server",
-+ "type": "296"
-+ },
-+ {
-+ "name": "path",
-+ "type": "str"
-+ },
-+ {
-+ "name": "user",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "220",
-+ "members": [
-+ {
-+ "name": "dir",
-+ "type": "str"
-+ },
-+ {
-+ "name": "fat-type",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "floppy",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "label",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "rw",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "221",
-+ "meta-type": "enum",
-+ "values": [
-+ "top",
-+ "full",
-+ "none",
-+ "incremental"
-+ ]
-+ },
-+ {
-+ "name": "222",
-+ "meta-type": "enum",
-+ "values": [
-+ "retain",
-+ "read-only",
-+ "read-write"
-+ ]
-+ },
-+ {
-+ "name": "223",
-+ "meta-type": "enum",
-+ "values": [
-+ "existing",
-+ "absolute-paths"
-+ ]
-+ },
-+ {
-+ "name": "224",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "file",
-+ "type": "298"
-+ },
-+ {
-+ "case": "serial",
-+ "type": "299"
-+ },
-+ {
-+ "case": "parallel",
-+ "type": "299"
-+ },
-+ {
-+ "case": "pipe",
-+ "type": "299"
-+ },
-+ {
-+ "case": "socket",
-+ "type": "300"
-+ },
-+ {
-+ "case": "udp",
-+ "type": "301"
-+ },
-+ {
-+ "case": "pty",
-+ "type": "302"
-+ },
-+ {
-+ "case": "null",
-+ "type": "302"
-+ },
-+ {
-+ "case": "mux",
-+ "type": "303"
-+ },
-+ {
-+ "case": "msmouse",
-+ "type": "302"
-+ },
-+ {
-+ "case": "wctablet",
-+ "type": "302"
-+ },
-+ {
-+ "case": "braille",
-+ "type": "302"
-+ },
-+ {
-+ "case": "testdev",
-+ "type": "302"
-+ },
-+ {
-+ "case": "stdio",
-+ "type": "304"
-+ },
-+ {
-+ "case": "console",
-+ "type": "302"
-+ },
-+ {
-+ "case": "spicevmc",
-+ "type": "305"
-+ },
-+ {
-+ "case": "spiceport",
-+ "type": "306"
-+ },
-+ {
-+ "case": "vc",
-+ "type": "307"
-+ },
-+ {
-+ "case": "ringbuf",
-+ "type": "308"
-+ },
-+ {
-+ "case": "memory",
-+ "type": "308"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "297"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "225",
-+ "meta-type": "enum",
-+ "values": [
-+ "elf",
-+ "kdump-zlib",
-+ "kdump-lzo",
-+ "kdump-snappy"
-+ ]
-+ },
-+ {
-+ "name": "[226]",
-+ "element-type": "226",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "226",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "key",
-+ "type": "310"
-+ },
-+ {
-+ "case": "btn",
-+ "type": "311"
-+ },
-+ {
-+ "case": "rel",
-+ "type": "312"
-+ },
-+ {
-+ "case": "abs",
-+ "type": "312"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "309"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "number",
-+ "json-type": "number",
-+ "meta-type": "builtin"
-+ },
-+ {
-+ "name": "227",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "inet",
-+ "type": "314"
-+ },
-+ {
-+ "case": "unix",
-+ "type": "315"
-+ },
-+ {
-+ "case": "vsock",
-+ "type": "316"
-+ },
-+ {
-+ "case": "fd",
-+ "type": "317"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "313"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "228",
-+ "meta-type": "enum",
-+ "values": [
-+ "DIMM",
-+ "CPU"
-+ ]
-+ },
-+ {
-+ "name": "229",
-+ "meta-type": "enum",
-+ "values": [
-+ "ok",
-+ "failed",
-+ "nospace"
-+ ]
-+ },
-+ {
-+ "name": "[230]",
-+ "element-type": "230",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "230",
-+ "members": [
-+ {
-+ "name": "name",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "count",
-+ "type": "int"
-+ },
-+ {
-+ "name": "granularity",
-+ "type": "int"
-+ },
-+ {
-+ "name": "status",
-+ "type": "318"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "231",
-+ "members": [
-+ {
-+ "name": "rd_bytes",
-+ "type": "int"
-+ },
-+ {
-+ "name": "wr_bytes",
-+ "type": "int"
-+ },
-+ {
-+ "name": "rd_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "wr_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "flush_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "flush_total_time_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "wr_total_time_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "rd_total_time_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "wr_highest_offset",
-+ "type": "int"
-+ },
-+ {
-+ "name": "rd_merged",
-+ "type": "int"
-+ },
-+ {
-+ "name": "wr_merged",
-+ "type": "int"
-+ },
-+ {
-+ "name": "idle_time_ns",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "failed_rd_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "failed_wr_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "failed_flush_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "invalid_rd_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "invalid_wr_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "invalid_flush_operations",
-+ "type": "int"
-+ },
-+ {
-+ "name": "account_invalid",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "account_failed",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "timed_stats",
-+ "type": "[319]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[232]",
-+ "element-type": "232",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "232",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "type": "320"
-+ },
-+ {
-+ "name": "help",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "default",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[str]",
-+ "element-type": "str",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "233",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "props",
-+ "default": null,
-+ "type": "any"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "234",
-+ "meta-type": "enum",
-+ "values": [
-+ "incompatible",
-+ "identical",
-+ "superset",
-+ "subset"
-+ ]
-+ },
-+ {
-+ "name": "235",
-+ "meta-type": "enum",
-+ "values": [
-+ "static",
-+ "full"
-+ ]
-+ },
-+ {
-+ "name": "236",
-+ "meta-type": "enum",
-+ "values": [
-+ "x86",
-+ "sparc",
-+ "ppc",
-+ "mips",
-+ "tricore",
-+ "other"
-+ ]
-+ },
-+ {
-+ "name": "237",
-+ "members": [
-+ {
-+ "name": "pc",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "238",
-+ "members": [
-+ {
-+ "name": "pc",
-+ "type": "int"
-+ },
-+ {
-+ "name": "npc",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "239",
-+ "members": [
-+ {
-+ "name": "nip",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "240",
-+ "members": [
-+ {
-+ "name": "PC",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "241",
-+ "members": [
-+ {
-+ "name": "PC",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "242",
-+ "members": [
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "243",
-+ "meta-type": "enum",
-+ "values": [
-+ "none",
-+ "active",
-+ "completed",
-+ "failed"
-+ ]
-+ },
-+ {
-+ "name": "[225]",
-+ "element-type": "225",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "[244]",
-+ "element-type": "244",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "244",
-+ "members": [
-+ {
-+ "name": "fd",
-+ "type": "int"
-+ },
-+ {
-+ "name": "opaque",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "245",
-+ "members": [
-+ {
-+ "name": "node-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "socket-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "core-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "thread-id",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[int]",
-+ "element-type": "int",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "246",
-+ "meta-type": "enum",
-+ "values": [
-+ "default",
-+ "preferred",
-+ "bind",
-+ "interleave"
-+ ]
-+ },
-+ {
-+ "name": "247",
-+ "meta-type": "enum",
-+ "values": [
-+ "dimm"
-+ ]
-+ },
-+ {
-+ "name": "248",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "321"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "249",
-+ "members": [
-+ {
-+ "name": "transferred",
-+ "type": "int"
-+ },
-+ {
-+ "name": "remaining",
-+ "type": "int"
-+ },
-+ {
-+ "name": "total",
-+ "type": "int"
-+ },
-+ {
-+ "name": "duplicate",
-+ "type": "int"
-+ },
-+ {
-+ "name": "skipped",
-+ "type": "int"
-+ },
-+ {
-+ "name": "normal",
-+ "type": "int"
-+ },
-+ {
-+ "name": "normal-bytes",
-+ "type": "int"
-+ },
-+ {
-+ "name": "dirty-pages-rate",
-+ "type": "int"
-+ },
-+ {
-+ "name": "mbps",
-+ "type": "number"
-+ },
-+ {
-+ "name": "dirty-sync-count",
-+ "type": "int"
-+ },
-+ {
-+ "name": "postcopy-requests",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "250",
-+ "members": [
-+ {
-+ "name": "cache-size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "bytes",
-+ "type": "int"
-+ },
-+ {
-+ "name": "pages",
-+ "type": "int"
-+ },
-+ {
-+ "name": "cache-miss",
-+ "type": "int"
-+ },
-+ {
-+ "name": "cache-miss-rate",
-+ "type": "number"
-+ },
-+ {
-+ "name": "overflow",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "251",
-+ "meta-type": "enum",
-+ "values": [
-+ "xbzrle",
-+ "rdma-pin-all",
-+ "auto-converge",
-+ "zero-blocks",
-+ "compress",
-+ "events",
-+ "postcopy-ram",
-+ "x-colo",
-+ "release-ram"
-+ ]
-+ },
-+ {
-+ "name": "252",
-+ "members": [
-+ {
-+ "name": "filename",
-+ "type": "str"
-+ },
-+ {
-+ "name": "format",
-+ "type": "str"
-+ },
-+ {
-+ "name": "dirty-flag",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "actual-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "virtual-size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "cluster-size",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "encrypted",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "compressed",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "backing-filename",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "full-backing-filename",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "backing-filename-format",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "snapshots",
-+ "default": null,
-+ "type": "[55]"
-+ },
-+ {
-+ "name": "backing-image",
-+ "default": null,
-+ "type": "252"
-+ },
-+ {
-+ "name": "format-specific",
-+ "default": null,
-+ "type": "322"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "253",
-+ "members": [
-+ {
-+ "name": "writeback",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "direct",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "no-flush",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[254]",
-+ "element-type": "254",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "254",
-+ "members": [
-+ {
-+ "name": "bus",
-+ "type": "int"
-+ },
-+ {
-+ "name": "slot",
-+ "type": "int"
-+ },
-+ {
-+ "name": "function",
-+ "type": "int"
-+ },
-+ {
-+ "name": "class_info",
-+ "type": "323"
-+ },
-+ {
-+ "name": "id",
-+ "type": "324"
-+ },
-+ {
-+ "name": "irq",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "qdev_id",
-+ "type": "str"
-+ },
-+ {
-+ "name": "pci_bridge",
-+ "default": null,
-+ "type": "325"
-+ },
-+ {
-+ "name": "regions",
-+ "type": "[326]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "255",
-+ "meta-type": "enum",
-+ "values": [
-+ "builtin",
-+ "enum",
-+ "array",
-+ "object",
-+ "alternate",
-+ "command",
-+ "event"
-+ ]
-+ },
-+ {
-+ "name": "256",
-+ "members": [
-+ {
-+ "name": "json-type",
-+ "type": "327"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "257",
-+ "members": [
-+ {
-+ "name": "values",
-+ "type": "[str]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "258",
-+ "members": [
-+ {
-+ "name": "element-type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "259",
-+ "members": [
-+ {
-+ "name": "members",
-+ "type": "[328]"
-+ },
-+ {
-+ "name": "tag",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "variants",
-+ "default": null,
-+ "type": "[329]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "260",
-+ "members": [
-+ {
-+ "name": "members",
-+ "type": "[330]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "261",
-+ "members": [
-+ {
-+ "name": "arg-type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "ret-type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "262",
-+ "members": [
-+ {
-+ "name": "arg-type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "263",
-+ "members": [
-+ {
-+ "name": "priority",
-+ "type": "int"
-+ },
-+ {
-+ "name": "tbl-id",
-+ "type": "int"
-+ },
-+ {
-+ "name": "in-pport",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tunnel-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "vlan-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "eth-type",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "eth-src",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "eth-dst",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "ip-proto",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "ip-tos",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "ip-dst",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "264",
-+ "members": [
-+ {
-+ "name": "in-pport",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tunnel-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "vlan-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "eth-src",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "eth-dst",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "ip-proto",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "ip-tos",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "265",
-+ "members": [
-+ {
-+ "name": "goto-tbl",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "group-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "tunnel-lport",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "vlan-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "new-vlan-id",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "out-pport",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "266",
-+ "meta-type": "enum",
-+ "values": [
-+ "half",
-+ "full"
-+ ]
-+ },
-+ {
-+ "name": "267",
-+ "meta-type": "enum",
-+ "values": [
-+ "off",
-+ "on"
-+ ]
-+ },
-+ {
-+ "name": "268",
-+ "meta-type": "enum",
-+ "values": [
-+ "normal",
-+ "none",
-+ "all"
-+ ]
-+ },
-+ {
-+ "name": "269",
-+ "meta-type": "enum",
-+ "values": [
-+ "client",
-+ "server",
-+ "unknown"
-+ ]
-+ },
-+ {
-+ "name": "[188]",
-+ "element-type": "188",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "270",
-+ "meta-type": "enum",
-+ "values": [
-+ "debug",
-+ "inmigrate",
-+ "internal-error",
-+ "io-error",
-+ "paused",
-+ "postmigrate",
-+ "prelaunch",
-+ "finish-migrate",
-+ "restore-vm",
-+ "running",
-+ "save-vm",
-+ "shutdown",
-+ "suspended",
-+ "watchdog",
-+ "guest-panicked",
-+ "colo"
-+ ]
-+ },
-+ {
-+ "name": "271",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "passthrough",
-+ "type": "332"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "331"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "272",
-+ "members": [
-+ {
-+ "name": "major",
-+ "type": "int"
-+ },
-+ {
-+ "name": "minor",
-+ "type": "int"
-+ },
-+ {
-+ "name": "micro",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "273",
-+ "meta-type": "enum",
-+ "values": [
-+ "ipv4",
-+ "ipv6",
-+ "unix",
-+ "vsock",
-+ "unknown"
-+ ]
-+ },
-+ {
-+ "name": "[191]",
-+ "element-type": "191",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "[274]",
-+ "element-type": "274",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "274",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "service",
-+ "type": "str"
-+ },
-+ {
-+ "name": "family",
-+ "type": "273"
-+ },
-+ {
-+ "name": "websocket",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "auth",
-+ "type": "275"
-+ },
-+ {
-+ "name": "vencrypt",
-+ "default": null,
-+ "type": "276"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "275",
-+ "meta-type": "enum",
-+ "values": [
-+ "none",
-+ "vnc",
-+ "ra2",
-+ "ra2ne",
-+ "tight",
-+ "ultra",
-+ "tls",
-+ "vencrypt",
-+ "sasl"
-+ ]
-+ },
-+ {
-+ "name": "276",
-+ "meta-type": "enum",
-+ "values": [
-+ "plain",
-+ "tls-none",
-+ "x509-none",
-+ "tls-vnc",
-+ "x509-vnc",
-+ "tls-plain",
-+ "x509-plain",
-+ "tls-sasl",
-+ "x509-sasl"
-+ ]
-+ },
-+ {
-+ "name": "277",
-+ "meta-type": "enum",
-+ "values": [
-+ "utf8",
-+ "base64"
-+ ]
-+ },
-+ {
-+ "name": "[278]",
-+ "element-type": "278",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "278",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "number",
-+ "type": "334"
-+ },
-+ {
-+ "case": "qcode",
-+ "type": "335"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "333"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "279",
-+ "meta-type": "enum",
-+ "values": [
-+ "unavailable",
-+ "disabled",
-+ "enabled"
-+ ]
-+ },
-+ {
-+ "name": "[280]",
-+ "element-type": "280",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "280",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "abort",
-+ "type": "337"
-+ },
-+ {
-+ "case": "block-dirty-bitmap-add",
-+ "type": "338"
-+ },
-+ {
-+ "case": "block-dirty-bitmap-clear",
-+ "type": "339"
-+ },
-+ {
-+ "case": "blockdev-backup",
-+ "type": "340"
-+ },
-+ {
-+ "case": "blockdev-snapshot",
-+ "type": "341"
-+ },
-+ {
-+ "case": "blockdev-snapshot-internal-sync",
-+ "type": "342"
-+ },
-+ {
-+ "case": "blockdev-snapshot-sync",
-+ "type": "343"
-+ },
-+ {
-+ "case": "drive-backup",
-+ "type": "344"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "336"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "281",
-+ "members": [
-+ {
-+ "name": "completion-mode",
-+ "default": null,
-+ "type": "345"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "282",
-+ "meta-type": "enum",
-+ "values": [
-+ "hyper-v"
-+ ]
-+ },
-+ {
-+ "name": "283",
-+ "members": [
-+ {
-+ "name": "arg1",
-+ "type": "int"
-+ },
-+ {
-+ "name": "arg2",
-+ "type": "int"
-+ },
-+ {
-+ "name": "arg3",
-+ "type": "int"
-+ },
-+ {
-+ "name": "arg4",
-+ "type": "int"
-+ },
-+ {
-+ "name": "arg5",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "284",
-+ "members": [
-+ {
-+ "type": "46"
-+ },
-+ {
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "alternate"
-+ },
-+ {
-+ "name": "[285]",
-+ "element-type": "285",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "285",
-+ "members": [
-+ {
-+ "name": "event",
-+ "type": "346"
-+ },
-+ {
-+ "name": "state",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "errno",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "sector",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "once",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "immediately",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[286]",
-+ "element-type": "286",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "286",
-+ "members": [
-+ {
-+ "name": "event",
-+ "type": "346"
-+ },
-+ {
-+ "name": "state",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "new_state",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "287",
-+ "meta-type": "enum",
-+ "values": [
-+ "threads",
-+ "native"
-+ ]
-+ },
-+ {
-+ "name": "[288]",
-+ "element-type": "288",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "288",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "inet",
-+ "type": "296"
-+ },
-+ {
-+ "case": "unix",
-+ "type": "348"
-+ },
-+ {
-+ "case": "vsock",
-+ "type": "349"
-+ },
-+ {
-+ "case": "fd",
-+ "type": "350"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "347"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "289",
-+ "meta-type": "enum",
-+ "values": [
-+ "tcp",
-+ "iser"
-+ ]
-+ },
-+ {
-+ "name": "290",
-+ "meta-type": "enum",
-+ "values": [
-+ "crc32c",
-+ "none",
-+ "crc32c-none",
-+ "none-crc32c"
-+ ]
-+ },
-+ {
-+ "name": "291",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "351"
-+ },
-+ {
-+ "name": "host",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "292",
-+ "members": [
-+ {
-+ "type": "352"
-+ },
-+ {
-+ "type": "353"
-+ }
-+ ],
-+ "meta-type": "alternate"
-+ },
-+ {
-+ "name": "[284]",
-+ "element-type": "284",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "293",
-+ "meta-type": "enum",
-+ "values": [
-+ "quorum",
-+ "fifo"
-+ ]
-+ },
-+ {
-+ "name": "[294]",
-+ "element-type": "294",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "294",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "295",
-+ "meta-type": "enum",
-+ "values": [
-+ "primary",
-+ "secondary"
-+ ]
-+ },
-+ {
-+ "name": "296",
-+ "members": [
-+ {
-+ "name": "host",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ },
-+ {
-+ "name": "numeric",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "to",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "ipv4",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "ipv6",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "297",
-+ "meta-type": "enum",
-+ "values": [
-+ "file",
-+ "serial",
-+ "parallel",
-+ "pipe",
-+ "socket",
-+ "udp",
-+ "pty",
-+ "null",
-+ "mux",
-+ "msmouse",
-+ "wctablet",
-+ "braille",
-+ "testdev",
-+ "stdio",
-+ "console",
-+ "spicevmc",
-+ "spiceport",
-+ "vc",
-+ "ringbuf",
-+ "memory"
-+ ]
-+ },
-+ {
-+ "name": "298",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "354"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "299",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "355"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "300",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "356"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "301",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "357"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "302",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "358"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "303",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "359"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "304",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "360"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "305",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "361"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "306",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "362"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "307",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "363"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "308",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "364"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "309",
-+ "meta-type": "enum",
-+ "values": [
-+ "key",
-+ "btn",
-+ "rel",
-+ "abs"
-+ ]
-+ },
-+ {
-+ "name": "310",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "365"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "311",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "366"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "312",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "367"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "313",
-+ "meta-type": "enum",
-+ "values": [
-+ "inet",
-+ "unix",
-+ "vsock",
-+ "fd"
-+ ]
-+ },
-+ {
-+ "name": "314",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "296"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "315",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "348"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "316",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "349"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "317",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "350"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "318",
-+ "meta-type": "enum",
-+ "values": [
-+ "active",
-+ "disabled",
-+ "frozen"
-+ ]
-+ },
-+ {
-+ "name": "[319]",
-+ "element-type": "319",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "319",
-+ "members": [
-+ {
-+ "name": "interval_length",
-+ "type": "int"
-+ },
-+ {
-+ "name": "min_rd_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "max_rd_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "avg_rd_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "min_wr_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "max_wr_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "avg_wr_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "min_flush_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "max_flush_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "avg_flush_latency_ns",
-+ "type": "int"
-+ },
-+ {
-+ "name": "avg_rd_queue_depth",
-+ "type": "number"
-+ },
-+ {
-+ "name": "avg_wr_queue_depth",
-+ "type": "number"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "320",
-+ "meta-type": "enum",
-+ "values": [
-+ "string",
-+ "boolean",
-+ "number",
-+ "size"
-+ ]
-+ },
-+ {
-+ "name": "321",
-+ "members": [
-+ {
-+ "name": "id",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "addr",
-+ "type": "int"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "slot",
-+ "type": "int"
-+ },
-+ {
-+ "name": "node",
-+ "type": "int"
-+ },
-+ {
-+ "name": "memdev",
-+ "type": "str"
-+ },
-+ {
-+ "name": "hotplugged",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "hotpluggable",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[55]",
-+ "element-type": "55",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "322",
-+ "tag": "type",
-+ "variants": [
-+ {
-+ "case": "qcow2",
-+ "type": "369"
-+ },
-+ {
-+ "case": "vmdk",
-+ "type": "370"
-+ },
-+ {
-+ "case": "luks",
-+ "type": "371"
-+ }
-+ ],
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "368"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "323",
-+ "members": [
-+ {
-+ "name": "desc",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "class",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "324",
-+ "members": [
-+ {
-+ "name": "device",
-+ "type": "int"
-+ },
-+ {
-+ "name": "vendor",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "325",
-+ "members": [
-+ {
-+ "name": "bus",
-+ "type": "372"
-+ },
-+ {
-+ "name": "devices",
-+ "default": null,
-+ "type": "[254]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[326]",
-+ "element-type": "326",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "326",
-+ "members": [
-+ {
-+ "name": "bar",
-+ "type": "int"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "address",
-+ "type": "int"
-+ },
-+ {
-+ "name": "size",
-+ "type": "int"
-+ },
-+ {
-+ "name": "prefetch",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "mem_type_64",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "327",
-+ "meta-type": "enum",
-+ "values": [
-+ "string",
-+ "number",
-+ "int",
-+ "boolean",
-+ "null",
-+ "object",
-+ "array",
-+ "value"
-+ ]
-+ },
-+ {
-+ "name": "[328]",
-+ "element-type": "328",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "328",
-+ "members": [
-+ {
-+ "name": "name",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "default",
-+ "default": null,
-+ "type": "any"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[329]",
-+ "element-type": "329",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "329",
-+ "members": [
-+ {
-+ "name": "case",
-+ "type": "str"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[330]",
-+ "element-type": "330",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "330",
-+ "members": [
-+ {
-+ "name": "type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "331",
-+ "meta-type": "enum",
-+ "values": [
-+ "passthrough"
-+ ]
-+ },
-+ {
-+ "name": "332",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "373"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "333",
-+ "meta-type": "enum",
-+ "values": [
-+ "number",
-+ "qcode"
-+ ]
-+ },
-+ {
-+ "name": "334",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "335",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "374"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "336",
-+ "meta-type": "enum",
-+ "values": [
-+ "abort",
-+ "block-dirty-bitmap-add",
-+ "block-dirty-bitmap-clear",
-+ "blockdev-backup",
-+ "blockdev-snapshot",
-+ "blockdev-snapshot-internal-sync",
-+ "blockdev-snapshot-sync",
-+ "drive-backup"
-+ ]
-+ },
-+ {
-+ "name": "337",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "375"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "338",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "34"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "339",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "35"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "340",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "47"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "341",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "53"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "342",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "56"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "343",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "57"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "344",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "72"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "345",
-+ "meta-type": "enum",
-+ "values": [
-+ "individual",
-+ "grouped"
-+ ]
-+ },
-+ {
-+ "name": "346",
-+ "meta-type": "enum",
-+ "values": [
-+ "l1_update",
-+ "l1_grow_alloc_table",
-+ "l1_grow_write_table",
-+ "l1_grow_activate_table",
-+ "l2_load",
-+ "l2_update",
-+ "l2_update_compressed",
-+ "l2_alloc_cow_read",
-+ "l2_alloc_write",
-+ "read_aio",
-+ "read_backing_aio",
-+ "read_compressed",
-+ "write_aio",
-+ "write_compressed",
-+ "vmstate_load",
-+ "vmstate_save",
-+ "cow_read",
-+ "cow_write",
-+ "reftable_load",
-+ "reftable_grow",
-+ "reftable_update",
-+ "refblock_load",
-+ "refblock_update",
-+ "refblock_update_part",
-+ "refblock_alloc",
-+ "refblock_alloc_hookup",
-+ "refblock_alloc_write",
-+ "refblock_alloc_write_blocks",
-+ "refblock_alloc_write_table",
-+ "refblock_alloc_switch_table",
-+ "cluster_alloc",
-+ "cluster_alloc_bytes",
-+ "cluster_free",
-+ "flush_to_os",
-+ "flush_to_disk",
-+ "pwritev_rmw_head",
-+ "pwritev_rmw_after_head",
-+ "pwritev_rmw_tail",
-+ "pwritev_rmw_after_tail",
-+ "pwritev",
-+ "pwritev_zero",
-+ "pwritev_done",
-+ "empty_image_prepare"
-+ ]
-+ },
-+ {
-+ "name": "347",
-+ "meta-type": "enum",
-+ "values": [
-+ "inet",
-+ "unix",
-+ "vsock",
-+ "fd"
-+ ]
-+ },
-+ {
-+ "name": "348",
-+ "members": [
-+ {
-+ "name": "path",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "349",
-+ "members": [
-+ {
-+ "name": "cid",
-+ "type": "str"
-+ },
-+ {
-+ "name": "port",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "350",
-+ "members": [
-+ {
-+ "name": "str",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "351",
-+ "meta-type": "enum",
-+ "values": [
-+ "inet"
-+ ]
-+ },
-+ {
-+ "name": "352",
-+ "members": [
-+ {
-+ "name": "template",
-+ "default": null,
-+ "type": "353"
-+ },
-+ {
-+ "name": "main-header",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "active-l1",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "active-l2",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "refcount-table",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "refcount-block",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "snapshot-table",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "inactive-l1",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "inactive-l2",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "353",
-+ "meta-type": "enum",
-+ "values": [
-+ "none",
-+ "constant",
-+ "cached",
-+ "all"
-+ ]
-+ },
-+ {
-+ "name": "354",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "in",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "out",
-+ "type": "str"
-+ },
-+ {
-+ "name": "append",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "355",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "device",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "356",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "addr",
-+ "type": "227"
-+ },
-+ {
-+ "name": "tls-creds",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "server",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "wait",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "nodelay",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "telnet",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "reconnect",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "357",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "remote",
-+ "type": "227"
-+ },
-+ {
-+ "name": "local",
-+ "default": null,
-+ "type": "227"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "358",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "359",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "chardev",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "360",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "signal",
-+ "default": null,
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "361",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "type",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "362",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "fqdn",
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "363",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "width",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "height",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "cols",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "rows",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "364",
-+ "members": [
-+ {
-+ "name": "logfile",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "logappend",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "size",
-+ "default": null,
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "365",
-+ "members": [
-+ {
-+ "name": "key",
-+ "type": "278"
-+ },
-+ {
-+ "name": "down",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "366",
-+ "members": [
-+ {
-+ "name": "button",
-+ "type": "376"
-+ },
-+ {
-+ "name": "down",
-+ "type": "bool"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "367",
-+ "members": [
-+ {
-+ "name": "axis",
-+ "type": "377"
-+ },
-+ {
-+ "name": "value",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "368",
-+ "meta-type": "enum",
-+ "values": [
-+ "qcow2",
-+ "vmdk",
-+ "luks"
-+ ]
-+ },
-+ {
-+ "name": "369",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "378"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "370",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "379"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "371",
-+ "members": [
-+ {
-+ "name": "data",
-+ "type": "380"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "372",
-+ "members": [
-+ {
-+ "name": "number",
-+ "type": "int"
-+ },
-+ {
-+ "name": "secondary",
-+ "type": "int"
-+ },
-+ {
-+ "name": "subordinate",
-+ "type": "int"
-+ },
-+ {
-+ "name": "io_range",
-+ "type": "381"
-+ },
-+ {
-+ "name": "memory_range",
-+ "type": "381"
-+ },
-+ {
-+ "name": "prefetchable_range",
-+ "type": "381"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "373",
-+ "members": [
-+ {
-+ "name": "path",
-+ "default": null,
-+ "type": "str"
-+ },
-+ {
-+ "name": "cancel-path",
-+ "default": null,
-+ "type": "str"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "374",
-+ "meta-type": "enum",
-+ "values": [
-+ "unmapped",
-+ "shift",
-+ "shift_r",
-+ "alt",
-+ "alt_r",
-+ "altgr",
-+ "altgr_r",
-+ "ctrl",
-+ "ctrl_r",
-+ "menu",
-+ "esc",
-+ "1",
-+ "2",
-+ "3",
-+ "4",
-+ "5",
-+ "6",
-+ "7",
-+ "8",
-+ "9",
-+ "0",
-+ "minus",
-+ "equal",
-+ "backspace",
-+ "tab",
-+ "q",
-+ "w",
-+ "e",
-+ "r",
-+ "t",
-+ "y",
-+ "u",
-+ "i",
-+ "o",
-+ "p",
-+ "bracket_left",
-+ "bracket_right",
-+ "ret",
-+ "a",
-+ "s",
-+ "d",
-+ "f",
-+ "g",
-+ "h",
-+ "j",
-+ "k",
-+ "l",
-+ "semicolon",
-+ "apostrophe",
-+ "grave_accent",
-+ "backslash",
-+ "z",
-+ "x",
-+ "c",
-+ "v",
-+ "b",
-+ "n",
-+ "m",
-+ "comma",
-+ "dot",
-+ "slash",
-+ "asterisk",
-+ "spc",
-+ "caps_lock",
-+ "f1",
-+ "f2",
-+ "f3",
-+ "f4",
-+ "f5",
-+ "f6",
-+ "f7",
-+ "f8",
-+ "f9",
-+ "f10",
-+ "num_lock",
-+ "scroll_lock",
-+ "kp_divide",
-+ "kp_multiply",
-+ "kp_subtract",
-+ "kp_add",
-+ "kp_enter",
-+ "kp_decimal",
-+ "sysrq",
-+ "kp_0",
-+ "kp_1",
-+ "kp_2",
-+ "kp_3",
-+ "kp_4",
-+ "kp_5",
-+ "kp_6",
-+ "kp_7",
-+ "kp_8",
-+ "kp_9",
-+ "less",
-+ "f11",
-+ "f12",
-+ "print",
-+ "home",
-+ "pgup",
-+ "pgdn",
-+ "end",
-+ "left",
-+ "up",
-+ "down",
-+ "right",
-+ "insert",
-+ "delete",
-+ "stop",
-+ "again",
-+ "props",
-+ "undo",
-+ "front",
-+ "copy",
-+ "open",
-+ "paste",
-+ "find",
-+ "cut",
-+ "lf",
-+ "help",
-+ "meta_l",
-+ "meta_r",
-+ "compose",
-+ "pause",
-+ "ro",
-+ "hiragana",
-+ "henkan",
-+ "yen",
-+ "kp_comma",
-+ "kp_equals",
-+ "power"
-+ ]
-+ },
-+ {
-+ "name": "375",
-+ "members": [
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "376",
-+ "meta-type": "enum",
-+ "values": [
-+ "left",
-+ "middle",
-+ "right",
-+ "wheel-up",
-+ "wheel-down",
-+ "side",
-+ "extra"
-+ ]
-+ },
-+ {
-+ "name": "377",
-+ "meta-type": "enum",
-+ "values": [
-+ "x",
-+ "y"
-+ ]
-+ },
-+ {
-+ "name": "378",
-+ "members": [
-+ {
-+ "name": "compat",
-+ "type": "str"
-+ },
-+ {
-+ "name": "lazy-refcounts",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "corrupt",
-+ "default": null,
-+ "type": "bool"
-+ },
-+ {
-+ "name": "refcount-bits",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "379",
-+ "members": [
-+ {
-+ "name": "create-type",
-+ "type": "str"
-+ },
-+ {
-+ "name": "cid",
-+ "type": "int"
-+ },
-+ {
-+ "name": "parent-cid",
-+ "type": "int"
-+ },
-+ {
-+ "name": "extents",
-+ "type": "[252]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "380",
-+ "members": [
-+ {
-+ "name": "cipher-alg",
-+ "type": "382"
-+ },
-+ {
-+ "name": "cipher-mode",
-+ "type": "383"
-+ },
-+ {
-+ "name": "ivgen-alg",
-+ "type": "384"
-+ },
-+ {
-+ "name": "ivgen-hash-alg",
-+ "default": null,
-+ "type": "385"
-+ },
-+ {
-+ "name": "hash-alg",
-+ "type": "385"
-+ },
-+ {
-+ "name": "payload-offset",
-+ "type": "int"
-+ },
-+ {
-+ "name": "master-key-iters",
-+ "type": "int"
-+ },
-+ {
-+ "name": "uuid",
-+ "type": "str"
-+ },
-+ {
-+ "name": "slots",
-+ "type": "[386]"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "381",
-+ "members": [
-+ {
-+ "name": "base",
-+ "type": "int"
-+ },
-+ {
-+ "name": "limit",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ },
-+ {
-+ "name": "[252]",
-+ "element-type": "252",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "382",
-+ "meta-type": "enum",
-+ "values": [
-+ "aes-128",
-+ "aes-192",
-+ "aes-256",
-+ "des-rfb",
-+ "3des",
-+ "cast5-128",
-+ "serpent-128",
-+ "serpent-192",
-+ "serpent-256",
-+ "twofish-128",
-+ "twofish-192",
-+ "twofish-256"
-+ ]
-+ },
-+ {
-+ "name": "383",
-+ "meta-type": "enum",
-+ "values": [
-+ "ecb",
-+ "cbc",
-+ "xts",
-+ "ctr"
-+ ]
-+ },
-+ {
-+ "name": "384",
-+ "meta-type": "enum",
-+ "values": [
-+ "plain",
-+ "plain64",
-+ "essiv"
-+ ]
-+ },
-+ {
-+ "name": "385",
-+ "meta-type": "enum",
-+ "values": [
-+ "md5",
-+ "sha1",
-+ "sha224",
-+ "sha256",
-+ "sha384",
-+ "sha512",
-+ "ripemd160"
-+ ]
-+ },
-+ {
-+ "name": "[386]",
-+ "element-type": "386",
-+ "meta-type": "array"
-+ },
-+ {
-+ "name": "386",
-+ "members": [
-+ {
-+ "name": "active",
-+ "type": "bool"
-+ },
-+ {
-+ "name": "iters",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "stripes",
-+ "default": null,
-+ "type": "int"
-+ },
-+ {
-+ "name": "key-offset",
-+ "type": "int"
-+ }
-+ ],
-+ "meta-type": "object"
-+ }
-+ ],
-+ "id": "libvirt-47"
-+}
-+
-+{
-+ "return": {
-+ },
-+ "id": "libvirt-1"
-+}
-+
-+{
-+ "return": [
-+ {
-+ "name": "default",
-+ "typename": "604-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "ppc",
-+ "typename": "604-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "ppc32",
-+ "typename": "604-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "ppc64",
-+ "typename": "970fx_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "970mp",
-+ "typename": "970mp_v1.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx",
-+ "typename": "970fx_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "970",
-+ "typename": "970_v2.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER9",
-+ "typename": "POWER9_v1.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8NVL",
-+ "typename": "POWER8NVL_v1.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8",
-+ "typename": "POWER8_v2.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8E",
-+ "typename": "POWER8E_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7+",
-+ "typename": "POWER7+_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7",
-+ "typename": "POWER7_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER5gs",
-+ "typename": "POWER5+_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER5+",
-+ "typename": "POWER5+_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Apollo7PM",
-+ "typename": "7457A_v1.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A",
-+ "typename": "7457A_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A",
-+ "typename": "7447A_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Apollo7",
-+ "typename": "7457_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7457",
-+ "typename": "7457_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7447",
-+ "typename": "7447_v1.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Apollo6",
-+ "typename": "7455_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7455",
-+ "typename": "7455_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7445",
-+ "typename": "7445_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7451",
-+ "typename": "7451_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7441",
-+ "typename": "7441_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Vger",
-+ "typename": "7450_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7450",
-+ "typename": "7450_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7448",
-+ "typename": "7448_v2.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Nitro",
-+ "typename": "7410_v1.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7410",
-+ "typename": "7410_v1.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "G4",
-+ "typename": "7400_v2.9-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Max",
-+ "typename": "7400_v2.9-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7400",
-+ "typename": "7400_v2.9-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Goldfinger",
-+ "typename": "755_v2.8-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "755",
-+ "typename": "755_v2.8-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "745",
-+ "typename": "745_v2.8-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "LoneStar",
-+ "typename": "750l_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750l",
-+ "typename": "750l_v3.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx",
-+ "typename": "750gx_v1.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx",
-+ "typename": "750fx_v2.3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe",
-+ "typename": "750cxe_v3.1b-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx",
-+ "typename": "750cx_v2.2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750cl",
-+ "typename": "750cl_v2.0-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Conan/Doyle",
-+ "typename": "750p-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "G3",
-+ "typename": "750_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Typhoon",
-+ "typename": "750_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "750",
-+ "typename": "750_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Arthur",
-+ "typename": "740_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "740",
-+ "typename": "740_v3.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Mach5",
-+ "typename": "604r-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Sirocco",
-+ "typename": "604e_v2.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "604e",
-+ "typename": "604e_v2.4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Goldeneye",
-+ "typename": "603e7t-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "603r",
-+ "typename": "603e7t-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Vaillant",
-+ "typename": "603e7v-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Stretch",
-+ "typename": "603e_v4.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "603e",
-+ "typename": "603e_v4.1-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "Vanilla",
-+ "typename": "603-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "601v",
-+ "typename": "601_v2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "601",
-+ "typename": "601_v2-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560",
-+ "typename": "MPC8560_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555E",
-+ "typename": "MPC8555E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555",
-+ "typename": "MPC8555_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E",
-+ "typename": "MPC8548E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548",
-+ "typename": "MPC8548_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8547E",
-+ "typename": "MPC8547E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545E",
-+ "typename": "MPC8545E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545",
-+ "typename": "MPC8545_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544E",
-+ "typename": "MPC8544E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544",
-+ "typename": "MPC8544_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E",
-+ "typename": "MPC8543E_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543",
-+ "typename": "MPC8543_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541E",
-+ "typename": "MPC8541E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541",
-+ "typename": "MPC8541_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540",
-+ "typename": "MPC8540_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533E",
-+ "typename": "MPC8533E_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533",
-+ "typename": "MPC8533_v11-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2",
-+ "typename": "e500v2_v22-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v1",
-+ "typename": "e500_v20-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e500",
-+ "typename": "e500v2_v22-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EA",
-+ "typename": "MPC8347EAT-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347E",
-+ "typename": "MPC8347ET-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347A",
-+ "typename": "MPC8347AT-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347",
-+ "typename": "MPC8347T-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e300",
-+ "typename": "e300c3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "e200",
-+ "typename": "e200z6-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8280",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8275",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8272",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8271",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8270",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8266_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8266_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8266",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8265_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8265_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8265",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8264_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8264_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8264",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8260_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8260_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8260",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8255_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8255_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8255",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8250_HiP4",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8250_HiP3",
-+ "typename": "G2HiP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8250",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8248",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8247",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8245",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8241",
-+ "typename": "G2HiP4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "PowerQUICC-II",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC82xx",
-+ "typename": "G2leGP3-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200B",
-+ "typename": "MPC5200B_v21-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200",
-+ "typename": "MPC5200_v12-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC52xx",
-+ "typename": "MPC5200_v12-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8240",
-+ "typename": "603-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "440EP",
-+ "typename": "440EPb-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp50",
-+ "typename": "x2vp20-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp7",
-+ "typename": "x2vp4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPe",
-+ "typename": "405CRc-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405GP",
-+ "typename": "405GPd-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405CR",
-+ "typename": "405CRc-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "405",
-+ "typename": "405D4-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "403",
-+ "typename": "403GC-powerpc64-cpu",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cl_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347ET",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8547E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "STB25",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401G2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349A",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750e",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8E_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Cobra",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603p",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8378E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500mc",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7v1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970mp_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440-Xilinx-w-dfpu",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740e",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405CRc",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8641",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405D4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604e_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe4GS3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v3.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v3.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "STB03",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343A",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8378",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2HiP3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8567",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe405H",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7v",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe405H2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPa",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e200z6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8379E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347AP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401B2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.8",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8547E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v3.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8567E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7441_v2.10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leGP1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7451_v2.10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "Npe405L",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401A1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8377",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7441_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405CRb",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8540_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347AT",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER8NVL_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457A_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8572",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.5",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPR",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401C2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v30",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v3.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405EZ",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8568E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2H4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e200z5",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405CRa",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.7",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GC",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e5500",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200_v12",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405LP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405EP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "601_v2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401D2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8572E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604e_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200B_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7448_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leGP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v3.1b",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.9",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2GP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPd",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7t",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "IOP480",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8560_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405D2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fl",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750l_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "x2vp20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e600",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2LS",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8543E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v3.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347P",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440EPb",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC603",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER9_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "601_v1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7+_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EAP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401E2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8641D",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7441_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740_v3.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER5+_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "602",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leLS",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cx_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604e_v2.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.8",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.6",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2le",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GB",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8545E_v21",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "POWER7_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "755_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EP",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750gl",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GCX",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750p",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8555_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v3.4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347T",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970_v2.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440-Xilinx",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "740p",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200B_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440EPX",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7451_v2.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7450_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7400_v2.8",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7455_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPc",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8347EAT",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970mp_v1.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e7v2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "604r",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447A_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8533E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e500v2_v22",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401F2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8343EA",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7457_v1.2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7447_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v2.5",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8548E_v20",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8610",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v2.4b",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC5200_v10",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "403GA",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7410_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2leGP3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "7445_v3.3",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "603e_v4.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "440EPa",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "970fx_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8377E",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750fx_v2.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "601_v0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "STB04",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "745_v1.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "G2HiP4",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cl_v2.0",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxr",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8349EA",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750cxe_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8379",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "401",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8568",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "e300c2",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "750_v3.1",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8544E_v11",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "405GPb",
-+ "typename": "",
-+ "static": false
-+ },
-+ {
-+ "name": "MPC8541E_v11",
-+ "typename": "",
-+ "static": false
-+ }
-+ ],
-+ "id": "libvirt-2"
-+}
-diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml
-new file mode 100644
-index 0000000000..29721b04f0
---- /dev/null
-+++ b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml
-@@ -0,0 +1,1062 @@
-+
-+ 0
-+ 0
-+ 0
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ 2009000
-+ 0
-+ (v2.9.0)
-+ ppc64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c
-index 2918ff4695..5937fbbe57 100644
---- a/tests/qemucapabilitiestest.c
-+++ b/tests/qemucapabilitiestest.c
-@@ -173,6 +173,7 @@ mymain(void)
- DO_TEST("aarch64", "caps_2.6.0-gicv2");
- DO_TEST("aarch64", "caps_2.6.0-gicv3");
- DO_TEST("ppc64le", "caps_2.6.0");
-+ DO_TEST("ppc64le", "caps_2.9.0");
- DO_TEST("s390x", "caps_2.7.0");
- DO_TEST("s390x", "caps_2.8.0");
-
---
-2.13.3
-
diff --git a/SOURCES/libvirt-Add-support-for-CPU-cache-specification.patch b/SOURCES/libvirt-Add-support-for-CPU-cache-specification.patch
deleted file mode 100644
index 2906ff9..0000000
--- a/SOURCES/libvirt-Add-support-for-CPU-cache-specification.patch
+++ /dev/null
@@ -1,389 +0,0 @@
-From a5cb43154905e2708bf90988bd2aa5f2fca6b935 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Jiri Denemark
-Date: Mon, 24 Apr 2017 15:40:07 +0200
-Subject: [PATCH] Add support for CPU cache specification
-
-This patch introduces
-
-
-
-
-
-sub element of /domain/cpu. Currently only a single element is
-allowed.
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit a646a6016a7c62688988f7cfaa22e1340c2ce761)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1428952
-
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 35 ++++++++++++
- docs/schemas/cputypes.rng | 21 ++++++++
- docs/schemas/domaincommon.rng | 3 ++
- src/conf/cpu_conf.c | 62 ++++++++++++++++++++++
- src/conf/cpu_conf.h | 19 +++++++
- src/libvirt_private.syms | 2 +
- .../generic-cpu-cache-disable.xml | 20 +++++++
- .../generic-cpu-cache-emulate.xml | 20 +++++++
- .../generic-cpu-cache-passthrough.xml | 20 +++++++
- tests/genericxml2xmltest.c | 4 ++
- 10 files changed, 206 insertions(+)
- create mode 100644 tests/genericxml2xmlindata/generic-cpu-cache-disable.xml
- create mode 100644 tests/genericxml2xmlindata/generic-cpu-cache-emulate.xml
- create mode 100644 tests/genericxml2xmlindata/generic-cpu-cache-passthrough.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index aae5e9c07..aee1e1442 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -1198,6 +1198,7 @@
- <model fallback='allow'>core2duo</model>
- <vendor>Intel</vendor>
- <topology sockets='1' cores='2' threads='1'/>
-+ <cache level='3' mode='emulate'/>
- <feature policy='disable' name='lahf_lm'/>
- </cpu>
- ...
-@@ -1211,6 +1212,7 @@
-
-
- <cpu mode='host-passthrough'>
-+ <cache mode='passthrough'/>
- <feature policy='disable' name='lahf_lm'/>
- ...
-
-@@ -1431,6 +1433,39 @@
- Since 0.8.5 the policy
- attribute can be omitted and will default to require
.
-
-+
-+ cache
-+ Since 3.3.0 the cache
-+ element describes the virtual CPU cache. If the element is missing,
-+ the hypervisor will use a sensible default.
-+
-+
-+ level
-+ This optional attribute specifies which cache level is described
-+ by the element. Missing attribute means the element describes all
-+ CPU cache levels at once. Mixing cache
elements with
-+ the level
attribute set and those without the
-+ attribute is forbidden.
-+
-+ mode
-+
-+ The following values are supported:
-+
-+ emulate
-+ The hypervisor will provide a fake CPU cache data.
-+
-+ passthrough
-+ The real CPU cache data reported by the host CPU will be
-+ passed through to the virtual CPU.
-+
-+ disable
-+ The virtual CPU will report no CPU cache of the specified
-+ level (or no cache at all if the level
attribute
-+ is missing).
-+
-+
-+
-+
-
-
-
-diff --git a/docs/schemas/cputypes.rng b/docs/schemas/cputypes.rng
-index 8189114e3..3eef16abc 100644
---- a/docs/schemas/cputypes.rng
-+++ b/docs/schemas/cputypes.rng
-@@ -142,4 +142,25 @@
-
-
-
-+
-+
-+
-+
-+
-+ 1
-+ 2
-+ 3
-+
-+
-+
-+
-+
-+ emulate
-+ passthrough
-+ disable
-+
-+
-+
-+
-+
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index edc225fe5..d5c28ee3c 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -4545,6 +4545,9 @@
-
-
-
-+
-+
-+
-
-
-
-diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
-index 623b1699f..1b098c476 100644
---- a/src/conf/cpu_conf.c
-+++ b/src/conf/cpu_conf.c
-@@ -62,6 +62,12 @@ VIR_ENUM_IMPL(virCPUFeaturePolicy, VIR_CPU_FEATURE_LAST,
- "disable",
- "forbid")
-
-+VIR_ENUM_IMPL(virCPUCacheMode, VIR_CPU_CACHE_MODE_LAST,
-+ "emulate",
-+ "passthrough",
-+ "disable")
-+
-+
- void
- virCPUDefFreeFeatures(virCPUDefPtr def)
- {
-@@ -92,6 +98,7 @@ virCPUDefFree(virCPUDefPtr def)
- return;
-
- virCPUDefFreeModel(def);
-+ VIR_FREE(def->cache);
- VIR_FREE(def);
- }
-
-@@ -204,7 +211,18 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu)
- copy->threads = cpu->threads;
- copy->arch = cpu->arch;
-
-+ if (cpu->cache) {
-+ if (VIR_ALLOC(copy->cache) < 0)
-+ goto error;
-+
-+ *copy->cache = *cpu->cache;
-+ }
-+
- return copy;
-+
-+ error:
-+ virCPUDefFree(copy);
-+ return NULL;
- }
-
-
-@@ -489,6 +507,41 @@ virCPUDefParseXML(xmlNodePtr node,
- def->features[i].policy = policy;
- }
-
-+ if (virXPathInt("count(./cache)", ctxt, &n) < 0) {
-+ goto cleanup;
-+ } else if (n > 1) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("at most one CPU cache element may be specified"));
-+ goto cleanup;
-+ } else if (n == 1) {
-+ int level = -1;
-+ char *strmode;
-+ int mode;
-+
-+ if (virXPathBoolean("boolean(./cache[1]/@level)", ctxt) == 1 &&
-+ (virXPathInt("string(./cache[1]/@level)", ctxt, &level) < 0 ||
-+ level < 1 || level > 3)) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("invalid CPU cache level, must be in range [1,3]"));
-+ goto cleanup;
-+ }
-+
-+ if (!(strmode = virXPathString("string(./cache[1]/@mode)", ctxt)) ||
-+ (mode = virCPUCacheModeTypeFromString(strmode)) < 0) {
-+ VIR_FREE(strmode);
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("missing or invalid CPU cache mode"));
-+ goto cleanup;
-+ }
-+ VIR_FREE(strmode);
-+
-+ if (VIR_ALLOC(def->cache) < 0)
-+ goto cleanup;
-+
-+ def->cache->level = level;
-+ def->cache->mode = mode;
-+ }
-+
- cleanup:
- ctxt->node = oldnode;
- VIR_FREE(fallback);
-@@ -662,6 +715,15 @@ virCPUDefFormatBuf(virBufferPtr buf,
- virBufferAddLit(buf, "/>\n");
- }
-
-+ if (def->cache) {
-+ virBufferAddLit(buf, "cache->level != -1)
-+ virBufferAsprintf(buf, "level='%d' ", def->cache->level);
-+ virBufferAsprintf(buf, "mode='%s'",
-+ virCPUCacheModeTypeToString(def->cache->mode));
-+ virBufferAddLit(buf, "/>\n");
-+ }
-+
- for (i = 0; i < def->nfeatures; i++) {
- virCPUFeatureDefPtr feature = def->features + i;
-
-diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
-index 3e02deed4..09438b68b 100644
---- a/src/conf/cpu_conf.h
-+++ b/src/conf/cpu_conf.h
-@@ -103,6 +103,24 @@ struct _virCPUFeatureDef {
- };
-
-
-+typedef enum {
-+ VIR_CPU_CACHE_MODE_EMULATE,
-+ VIR_CPU_CACHE_MODE_PASSTHROUGH,
-+ VIR_CPU_CACHE_MODE_DISABLE,
-+
-+ VIR_CPU_CACHE_MODE_LAST
-+} virCPUCacheMode;
-+
-+VIR_ENUM_DECL(virCPUCacheMode);
-+
-+typedef struct _virCPUCacheDef virCPUCacheDef;
-+typedef virCPUCacheDef *virCPUCacheDefPtr;
-+struct _virCPUCacheDef {
-+ int level; /* -1 for unspecified */
-+ virCPUCacheMode mode;
-+};
-+
-+
- typedef struct _virCPUDef virCPUDef;
- typedef virCPUDef *virCPUDefPtr;
- struct _virCPUDef {
-@@ -121,6 +139,7 @@ struct _virCPUDef {
- size_t nfeatures;
- size_t nfeatures_max;
- virCPUFeatureDefPtr features;
-+ virCPUCacheDefPtr cache;
- };
-
-
-diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
-index b551cb86a..9a334311d 100644
---- a/src/libvirt_private.syms
-+++ b/src/libvirt_private.syms
-@@ -67,6 +67,8 @@ virCapabilitiesSetNetPrefix;
-
-
- # conf/cpu_conf.h
-+virCPUCacheModeTypeFromString;
-+virCPUCacheModeTypeToString;
- virCPUDefAddFeature;
- virCPUDefCopy;
- virCPUDefCopyModel;
-diff --git a/tests/genericxml2xmlindata/generic-cpu-cache-disable.xml b/tests/genericxml2xmlindata/generic-cpu-cache-disable.xml
-new file mode 100644
-index 000000000..25f65cc6e
---- /dev/null
-+++ b/tests/genericxml2xmlindata/generic-cpu-cache-disable.xml
-@@ -0,0 +1,20 @@
-+
-+ foo
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219136
-+ 219136
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+
-+
-diff --git a/tests/genericxml2xmlindata/generic-cpu-cache-emulate.xml b/tests/genericxml2xmlindata/generic-cpu-cache-emulate.xml
-new file mode 100644
-index 000000000..6ea57cbf6
---- /dev/null
-+++ b/tests/genericxml2xmlindata/generic-cpu-cache-emulate.xml
-@@ -0,0 +1,20 @@
-+
-+ foo
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219136
-+ 219136
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+
-+
-diff --git a/tests/genericxml2xmlindata/generic-cpu-cache-passthrough.xml b/tests/genericxml2xmlindata/generic-cpu-cache-passthrough.xml
-new file mode 100644
-index 000000000..8d4c186c9
---- /dev/null
-+++ b/tests/genericxml2xmlindata/generic-cpu-cache-passthrough.xml
-@@ -0,0 +1,20 @@
-+
-+ foo
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219136
-+ 219136
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+
-+
-diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
-index 488190270..ab1ebce9f 100644
---- a/tests/genericxml2xmltest.c
-+++ b/tests/genericxml2xmltest.c
-@@ -100,6 +100,10 @@ mymain(void)
-
- DO_TEST("vcpus-individual");
-
-+ DO_TEST("cpu-cache-emulate");
-+ DO_TEST("cpu-cache-passthrough");
-+ DO_TEST("cpu-cache-disable");
-+
- virObjectUnref(caps);
- virObjectUnref(xmlopt);
-
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-controllers.patch b/SOURCES/libvirt-Add-virtio-related-options-to-controllers.patch
deleted file mode 100644
index f494336..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-controllers.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From e0bb36c4d7c60336d2aba94013c2946e1594959b Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:03 +0200
-Subject: [PATCH] Add virtio-related options to controllers
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit c85217cf8a81879d065b9d13e876eec141f63f6f)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 6 ++++++
- docs/schemas/domaincommon.rng | 1 +
- src/conf/domain_conf.c | 10 ++++++++++
- src/conf/domain_conf.h | 1 +
- tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml | 2 ++
- 5 files changed, 20 insertions(+)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index bb7a85a1a1..2b26f090cd 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -3597,6 +3597,12 @@
- iothread
value. The iothread
value
- must be within the range 1 to the domain iothreads value.
-
-+ virtio options
-+
-+ For virtio controllers,
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-
-
- USB companion controllers have an optional
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index f838dc55fd..2108d23df7 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -2019,6 +2019,7 @@
-
-
-
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index a4b4f70855..2e5eeb1172 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -1873,6 +1873,7 @@ void virDomainControllerDefFree(virDomainControllerDefPtr def)
- return;
-
- virDomainDeviceInfoClear(&def->info);
-+ VIR_FREE(def->virtio);
-
- VIR_FREE(def);
- }
-@@ -9037,6 +9038,9 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- cur = cur->next;
- }
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- /* node is parsed differently from target attributes because
- * someone thought it should be a subelement instead...
- */
-@@ -19214,6 +19218,10 @@ virDomainControllerDefCheckABIStability(virDomainControllerDefPtr src,
- }
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -21504,6 +21512,8 @@ virDomainControllerDriverFormat(virBufferPtr buf,
- if (def->iothread)
- virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
-
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+
- if (virBufferUse(&driverBuf)) {
- virBufferAddLit(buf, "
-
-
-+
-
-
-
-
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-disks.patch b/SOURCES/libvirt-Add-virtio-related-options-to-disks.patch
deleted file mode 100644
index abd2ba2..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-disks.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-From 51a842ccdf1c02ec00ba96217658b0db31a6addb Mon Sep 17 00:00:00 2001
-Message-Id: <51a842ccdf1c02ec00ba96217658b0db31a6addb@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:02 +0200
-Subject: [PATCH] Add virtio-related options to disks
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 1bc2cb3b3205dca7174147ac970e2b82c8af69da)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 5 +++++
- docs/schemas/domaincommon.rng | 1 +
- src/conf/domain_conf.c | 15 +++++++++++++++
- src/conf/domain_conf.h | 1 +
- tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml | 2 +-
- 5 files changed, 23 insertions(+), 1 deletion(-)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 2556f383fc..bb7a85a1a1 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -3008,6 +3008,11 @@
- bus
and "pci" or "ccw" address
types.
- Since 1.2.8 (QEMU 2.1)
-
-+
-+ For virtio disks,
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-
-
- backenddomain
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index f571af6706..f838dc55fd 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -1716,6 +1716,7 @@
-
-
-
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 4768d02029..a4b4f70855 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -1745,6 +1745,7 @@ virDomainDiskDefFree(virDomainDiskDefPtr def)
- VIR_FREE(def->product);
- VIR_FREE(def->domain_name);
- VIR_FREE(def->blkdeviotune.group_name);
-+ VIR_FREE(def->virtio);
- virDomainDeviceInfoClear(&def->info);
- virObjectUnref(def->privateData);
-
-@@ -4440,6 +4441,10 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
- }
- }
-
-+ if (disk->bus != VIR_DOMAIN_DISK_BUS_VIRTIO &&
-+ virDomainCheckVirtioOptions(disk->virtio) < 0)
-+ return -1;
-+
- if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
- virDomainDiskDefAssignAddress(xmlopt, disk, def) < 0)
- return -1;
-@@ -8420,6 +8425,9 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
- }
- }
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- /* Disk volume types will have authentication information handled in
- * virStorageTranslateDiskSourcePool
- */
-@@ -19146,6 +19154,10 @@ virDomainDiskDefCheckABIStability(virDomainDiskDefPtr src,
- return false;
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -21307,6 +21319,9 @@ virDomainDiskDefFormat(virBufferPtr buf,
- virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
- if (def->detect_zeroes)
- virBufferAsprintf(&driverBuf, " detect_zeroes='%s'", detect_zeroes);
-+
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+
- if (virBufferUse(&driverBuf)) {
- virBufferAddLit(buf, " 0 specific thread # */
- int detect_zeroes; /* enum virDomainDiskDetectZeroes */
- char *domain_name; /* backend domain name */
-+ virDomainVirtioOptionsPtr virtio;
- };
-
-
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-index b16a9847fe..6dd82de648 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-@@ -15,7 +15,7 @@
-
- /usr/bin/qemu-system-x86_64
-
--
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-filesystems.patch b/SOURCES/libvirt-Add-virtio-related-options-to-filesystems.patch
deleted file mode 100644
index 2576cd7..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-filesystems.patch
+++ /dev/null
@@ -1,127 +0,0 @@
-From c828a666c154dece5bce0530c6a53d72d91ca3a1 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:04 +0200
-Subject: [PATCH] Add virtio-related options to filesystems
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit b10c22d9fa11e2a67eca04592688bd701700f77f)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 5 +++++
- docs/schemas/domaincommon.rng | 1 +
- src/conf/domain_conf.c | 10 ++++++++++
- src/conf/domain_conf.h | 1 +
- tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml | 3 ++-
- 5 files changed, 19 insertions(+), 1 deletion(-)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 2b26f090cd..8d3f916a19 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -3293,6 +3293,11 @@
- or "handle", but no formats. Virtuozzo driver supports
- a type of "ploop" with a format of "ploop".
-
-+
-+ For virtio-backed devices,
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 2108d23df7..5e526b6100 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -2202,6 +2202,7 @@
- immediate
-
-
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 2e5eeb1172..5c7ffc0419 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -1905,6 +1905,7 @@ void virDomainFSDefFree(virDomainFSDefPtr def)
- virStorageSourceFree(def->src);
- VIR_FREE(def->dst);
- virDomainDeviceInfoClear(&def->info);
-+ VIR_FREE(def->virtio);
-
- VIR_FREE(def);
- }
-@@ -9451,6 +9452,9 @@ virDomainFSDefParseXML(xmlNodePtr node,
- goto error;
- }
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- def->src->path = source;
- source = NULL;
- def->dst = target;
-@@ -19246,6 +19250,10 @@ virDomainFsDefCheckABIStability(virDomainFSDefPtr src,
- return false;
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -21713,6 +21721,8 @@ virDomainFSDefFormat(virBufferPtr buf,
-
- }
-
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+
- if (virBufferUse(&driverBuf)) {
- virBufferAddLit(buf, "
-
-
-+
-
-
-
-
-
--
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-input-devices.patch b/SOURCES/libvirt-Add-virtio-related-options-to-input-devices.patch
deleted file mode 100644
index 6e235e0..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-input-devices.patch
+++ /dev/null
@@ -1,153 +0,0 @@
-From 00aaab7312b72b5ef1785793f97849a69f425b83 Mon Sep 17 00:00:00 2001
-Message-Id: <00aaab7312b72b5ef1785793f97849a69f425b83@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:07 +0200
-Subject: [PATCH] Add virtio-related options to input devices
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit cc0933d3501229cdc8cf183a52a14c9b1c8de666)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 7 +++++++
- docs/schemas/domaincommon.rng | 5 +++++
- src/conf/domain_conf.c | 18 ++++++++++++++++++
- src/conf/domain_conf.h | 1 +
- tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml | 4 ++++
- 5 files changed, 35 insertions(+)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 6be015f866..dc8e7d2dc7 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -5712,6 +5712,13 @@ qemu-kvm -net nic,model=? /dev/null
- event device passed through to guests. (KVM only)
-
-
-+
-+ The subelement driver
can be used to tune the virtio
-+ options of the device:
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index ee49d6eb58..78023ff4af 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3936,6 +3936,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index a0de639e51..d8ca25da38 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -1400,6 +1400,7 @@ void virDomainInputDefFree(virDomainInputDefPtr def)
-
- virDomainDeviceInfoClear(&def->info);
- VIR_FREE(def->source.evdev);
-+ VIR_FREE(def->virtio);
- VIR_FREE(def);
- }
-
-@@ -11587,6 +11588,9 @@ virDomainInputDefParseXML(const virDomainDef *dom,
- goto error;
- }
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- cleanup:
- VIR_FREE(evdev);
- VIR_FREE(type);
-@@ -19328,6 +19332,10 @@ virDomainInputDefCheckABIStability(virDomainInputDefPtr src,
- return false;
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -23404,6 +23412,7 @@ virDomainInputDefFormat(virBufferPtr buf,
- const char *type = virDomainInputTypeToString(def->type);
- const char *bus = virDomainInputBusTypeToString(def->bus);
- virBuffer childbuf = VIR_BUFFER_INITIALIZER;
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- /* don't format keyboard into migratable XML for backward compatibility */
- if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE &&
-@@ -23427,6 +23436,15 @@ virDomainInputDefFormat(virBufferPtr buf,
- type, bus);
-
- virBufferAdjustIndent(&childbuf, virBufferGetIndent(buf, false) + 2);
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+ if (virBufferCheckError(&driverBuf) < 0)
-+ return -1;
-+
-+ if (virBufferUse(&driverBuf)) {
-+ virBufferAddLit(&childbuf, " \n");
-+ }
- virBufferEscapeString(&childbuf, " \n", def->source.evdev);
- if (virDomainDeviceInfoFormat(&childbuf, &def->info, flags) < 0)
- return -1;
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index b79fb50c79..4c33b0d15e 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -1282,6 +1282,7 @@ struct _virDomainInputDef {
- char *evdev;
- } source;
- virDomainDeviceInfo info;
-+ virDomainVirtioOptionsPtr virtio;
- };
-
- typedef enum {
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-index 85d1145263..773038a320 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-@@ -54,15 +54,19 @@
-
-
-
-+
-
-
-
-+
-
-
-
-+
-
-
-
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-interfaces.patch b/SOURCES/libvirt-Add-virtio-related-options-to-interfaces.patch
deleted file mode 100644
index fcede1c..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-interfaces.patch
+++ /dev/null
@@ -1,334 +0,0 @@
-From 7667b332ec942112270da554ded58658a78860b9 Mon Sep 17 00:00:00 2001
-Message-Id: <7667b332ec942112270da554ded58658a78860b9@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:00 +0200
-Subject: [PATCH] Add virtio-related options to interfaces
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-
-
-
-
-
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit fd518643402d8233ceffe4ef28279bcce53284f6)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 19 ++++
- docs/schemas/domaincommon.rng | 12 ++
- src/conf/domain_conf.c | 121 +++++++++++++++++++++
- src/conf/domain_conf.h | 10 ++
- .../qemuxml2argv-virtio-options.xml | 1 +
- 5 files changed, 163 insertions(+)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index e8a3367bac..23546daae9 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -3448,6 +3448,19 @@
-
-
-
-+
-+
-+
-+ QEMU's virtio devices have some attributes related to the virtio transport under
-+ the driver
element:
-+ The iommu
attribute enables the use of emulated IOMMU
-+ by the device. The attribute ats
controls the Address
-+ Translation Service support for PCIe devices. This is needed to make use
-+ of IOTLB support (see IOMMU device ).
-+ Possible values are on
or off
.
-+ Since 3.5.0
-+
-+
-
-
-
-@@ -5139,6 +5152,12 @@ qemu-kvm -net nic,model=? /dev/null
- In general you should leave this option alone, unless you
- are very certain you know what you are doing.
-
-+
virtio options
-+
-+ For virtio interfaces,
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-
-
- Offloading options for the host and guest can be configured using
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 1b66362f17..9e68bbc52d 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -2632,6 +2632,7 @@
-
-
-
-+
-
-
-
-@@ -4952,6 +4953,17 @@
-
-
-
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 4652e1c72b..bba50cf3fd 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -1112,6 +1112,46 @@ virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt)
- return &xmlopt->ns;
- }
-
-+static int
-+virDomainVirtioOptionsParseXML(xmlXPathContextPtr ctxt,
-+ virDomainVirtioOptionsPtr *virtio)
-+{
-+ char *str = NULL;
-+ int ret = -1;
-+ int val;
-+ virDomainVirtioOptionsPtr res;
-+
-+ if (VIR_ALLOC(*virtio) < 0)
-+ return -1;
-+
-+ res = *virtio;
-+
-+ if ((str = virXPathString("string(./driver/@iommu)", ctxt))) {
-+ if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("invalid iommu value"));
-+ goto cleanup;
-+ }
-+ res->iommu = val;
-+ }
-+ VIR_FREE(str);
-+
-+ if ((str = virXPathString("string(./driver/@ats)", ctxt))) {
-+ if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("invalid ats value"));
-+ goto cleanup;
-+ }
-+ res->ats = val;
-+ }
-+
-+ ret = 0;
-+
-+ cleanup:
-+ VIR_FREE(str);
-+ return ret;
-+}
-+
-
- virSaveCookieCallbacksPtr
- virDomainXMLOptionGetSaveCookie(virDomainXMLOptionPtr xmlopt)
-@@ -1953,6 +1993,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
- VIR_FREE(def->ifname);
- VIR_FREE(def->ifname_guest);
- VIR_FREE(def->ifname_guest_actual);
-+ VIR_FREE(def->virtio);
-
- virNetDevIPInfoClear(&def->guestIP);
- virNetDevIPInfoClear(&def->hostIP);
-@@ -4313,6 +4354,28 @@ virDomainHostdevDefPostParse(virDomainHostdevDefPtr dev,
-
-
- static int
-+virDomainCheckVirtioOptions(virDomainVirtioOptionsPtr virtio)
-+{
-+ if (!virtio)
-+ return 0;
-+
-+ if (virtio->iommu != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("iommu driver option is only supported "
-+ "for virtio devices"));
-+ return -1;
-+ }
-+ if (virtio->ats != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("ats driver option is only supported "
-+ "for virtio devices"));
-+ return -1;
-+ }
-+ return 0;
-+}
-+
-+
-+static int
- virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
- const virDomainDef *def,
- virCapsPtr caps ATTRIBUTE_UNUSED,
-@@ -4410,6 +4473,13 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
- }
- }
-
-+ if (dev->type == VIR_DOMAIN_DEVICE_NET) {
-+ virDomainNetDefPtr net = dev->data.net;
-+ if (STRNEQ_NULLABLE(net->model, "virtio") &&
-+ virDomainCheckVirtioOptions(net->virtio) < 0)
-+ return -1;
-+ }
-+
- return 0;
- }
-
-@@ -5208,6 +5278,24 @@ virDomainDefValidate(virDomainDefPtr def,
- }
-
-
-+static void
-+virDomainVirtioOptionsFormat(virBufferPtr buf,
-+ virDomainVirtioOptionsPtr virtio)
-+{
-+ if (!virtio)
-+ return;
-+
-+ if (virtio->iommu != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(buf, " iommu='%s'",
-+ virTristateSwitchTypeToString(virtio->iommu));
-+ }
-+ if (virtio->ats != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(buf, " ats='%s'",
-+ virTristateSwitchTypeToString(virtio->ats));
-+ }
-+}
-+
-+
- /* Generate a string representation of a device address
- * @info address Device address to stringify
- */
-@@ -10354,6 +10442,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
- goto error;
- }
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- cleanup:
- ctxt->node = oldnode;
- VIR_FREE(macaddr);
-@@ -18979,6 +19070,30 @@ virDomainDeviceInfoCheckABIStability(virDomainDeviceInfoPtr src,
-
-
- static bool
-+virDomainVirtioOptionsCheckABIStability(virDomainVirtioOptionsPtr src,
-+ virDomainVirtioOptionsPtr dst)
-+{
-+ if (src->iommu != dst->iommu) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target device iommu option '%s' does not "
-+ "match source '%s'"),
-+ virTristateSwitchTypeToString(dst->iommu),
-+ virTristateSwitchTypeToString(src->iommu));
-+ return false;
-+ }
-+ if (src->ats != dst->ats) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target device ats option '%s' does not "
-+ "match source '%s'"),
-+ virTristateSwitchTypeToString(dst->ats),
-+ virTristateSwitchTypeToString(src->ats));
-+ return false;
-+ }
-+ return true;
-+}
-+
-+
-+static bool
- virDomainDiskDefCheckABIStability(virDomainDiskDefPtr src,
- virDomainDiskDefPtr dst)
- {
-@@ -19137,6 +19252,10 @@ virDomainNetDefCheckABIStability(virDomainNetDefPtr src,
- return false;
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -22074,6 +22193,8 @@ virDomainVirtioNetDriverFormat(char **outstr,
- virBufferAsprintf(&buf, " rx_queue_size='%u'",
- def->driver.virtio.rx_queue_size);
-
-+ virDomainVirtioOptionsFormat(&buf, def->virtio);
-+
- if (virBufferCheckError(&buf) < 0)
- return -1;
-
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index e6c20a9e1e..603d35bd50 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -156,6 +156,9 @@ typedef virDomainTPMDef *virDomainTPMDefPtr;
- typedef struct _virDomainIOMMUDef virDomainIOMMUDef;
- typedef virDomainIOMMUDef *virDomainIOMMUDefPtr;
-
-+typedef struct _virDomainVirtioOptions virDomainVirtioOptions;
-+typedef virDomainVirtioOptions *virDomainVirtioOptionsPtr;
-+
- /* Flags for the 'type' field in virDomainDeviceDef */
- typedef enum {
- VIR_DOMAIN_DEVICE_NONE = 0,
-@@ -1040,6 +1043,7 @@ struct _virDomainNetDef {
- int linkstate;
- unsigned int mtu;
- virNetDevCoalescePtr coalesce;
-+ virDomainVirtioOptionsPtr virtio;
- };
-
- typedef enum {
-@@ -2215,6 +2219,12 @@ struct _virDomainIOMMUDef {
- virTristateSwitch eim;
- virTristateSwitch iotlb;
- };
-+
-+struct _virDomainVirtioOptions {
-+ virTristateSwitch iommu;
-+ virTristateSwitch ats;
-+};
-+
- /*
- * Guest VM main configuration
- *
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-index c88cf649b1..3357bc6d1b 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-@@ -47,6 +47,7 @@
-
-
-
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-rng-devices.patch b/SOURCES/libvirt-Add-virtio-related-options-to-rng-devices.patch
deleted file mode 100644
index a2777a9..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-rng-devices.patch
+++ /dev/null
@@ -1,146 +0,0 @@
-From b452148f1570656d9b42efbdbff396cf5cafa9c7 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:05 +0200
-Subject: [PATCH] Add virtio-related options to rng devices
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit f65db1be1200b656094180ecfdb63f8bd0158cab)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 11 +++++++++++
- docs/schemas/domaincommon.rng | 5 +++++
- src/conf/domain_conf.c | 19 +++++++++++++++++++
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argvdata/qemuxml2argv-virtio-options.xml | 1 +
- 5 files changed, 37 insertions(+)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 8d3f916a19..2e5c669c4a 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -7061,6 +7061,17 @@ qemu-kvm -net nic,model=? /dev/null
-
-
-
-+ driver
-+
-+ The subelement driver
can be used to tune the device:
-+
-+ virtio options
-+
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 5e526b6100..7e80275029 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -4912,6 +4912,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 5c7ffc0419..059c006b69 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -12922,6 +12922,9 @@ virDomainRNGDefParseXML(virDomainXMLOptionPtr xmlopt,
- if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
- goto error;
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- cleanup:
- VIR_FREE(model);
- VIR_FREE(backend);
-@@ -19637,6 +19640,10 @@ virDomainRNGDefCheckABIStability(virDomainRNGDefPtr src,
- return false;
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -23132,6 +23139,7 @@ virDomainRNGDefFormat(virBufferPtr buf,
- {
- const char *model = virDomainRNGModelTypeToString(def->model);
- const char *backend = virDomainRNGBackendTypeToString(def->backend);
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- virBufferAsprintf(buf, "\n", model);
- virBufferAdjustIndent(buf, 2);
-@@ -23160,6 +23168,16 @@ virDomainRNGDefFormat(virBufferPtr buf,
- break;
- }
-
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+ if (virBufferCheckError(&driverBuf) < 0)
-+ return -1;
-+
-+ if (virBufferUse(&driverBuf)) {
-+ virBufferAddLit(buf, " \n");
-+ }
-+
- if (virDomainDeviceInfoNeedsFormat(&def->info, flags)) {
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
- return -1;
-@@ -23188,6 +23206,7 @@ virDomainRNGDefFree(virDomainRNGDefPtr def)
- }
-
- virDomainDeviceInfoClear(&def->info);
-+ VIR_FREE(def->virtio);
- VIR_FREE(def);
- }
-
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index fdd852c29d..8cb9d5d0b1 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -2020,6 +2020,7 @@ struct _virDomainRNGDef {
- } source;
-
- virDomainDeviceInfo info;
-+ virDomainVirtioOptionsPtr virtio;
- };
-
- typedef enum {
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-index 33da214611..b7b95014cd 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-@@ -80,6 +80,7 @@
-
-
- /dev/random
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Add-virtio-related-options-to-video.patch b/SOURCES/libvirt-Add-virtio-related-options-to-video.patch
deleted file mode 100644
index 1f0f3e4..0000000
--- a/SOURCES/libvirt-Add-virtio-related-options-to-video.patch
+++ /dev/null
@@ -1,189 +0,0 @@
-From 6abf3f12df5173dc12af69827fbee98811f83959 Mon Sep 17 00:00:00 2001
-Message-Id: <6abf3f12df5173dc12af69827fbee98811f83959@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:06 +0200
-Subject: [PATCH] Add virtio-related options to video
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit f5384fb4029a59624e728a2e0d37e6a62efbdc52)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 12 ++++++++++
- docs/schemas/domaincommon.rng | 5 ++++
- src/conf/domain_conf.c | 27 ++++++++++++++++++++--
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argv-virtio-options.xml | 1 +
- 5 files changed, 44 insertions(+), 2 deletions(-)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 2e5c669c4a..6be015f866 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -6133,6 +6133,18 @@ qemu-kvm -net nic,model=? /dev/null
- The optional address
sub-element can be used to
- tie the video device to a particular PCI slot.
-
-+
-+ driver
-+
-+ The subelement driver
can be used to tune the device:
-+
-+ virtio options
-+
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 7e80275029..ee49d6eb58 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3165,6 +3165,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 059c006b69..a0de639e51 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -2339,6 +2339,7 @@ void virDomainVideoDefFree(virDomainVideoDefPtr def)
- virDomainDeviceInfoClear(&def->info);
-
- VIR_FREE(def->accel);
-+ VIR_FREE(def->virtio);
- VIR_FREE(def);
- }
-
-@@ -13499,11 +13500,13 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
-
- static virDomainVideoDefPtr
- virDomainVideoDefParseXML(xmlNodePtr node,
-+ xmlXPathContextPtr ctxt,
- const virDomainDef *dom,
- unsigned int flags)
- {
- virDomainVideoDefPtr def;
- xmlNodePtr cur;
-+ xmlNodePtr saved = ctxt->node;
- char *type = NULL;
- char *heads = NULL;
- char *vram = NULL;
-@@ -13512,6 +13515,8 @@ virDomainVideoDefParseXML(xmlNodePtr node,
- char *vgamem = NULL;
- char *primary = NULL;
-
-+ ctxt->node = node;
-+
- if (VIR_ALLOC(def) < 0)
- return NULL;
-
-@@ -13613,7 +13618,12 @@ virDomainVideoDefParseXML(xmlNodePtr node,
- if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
- goto error;
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- cleanup:
-+ ctxt->node = saved;
-+
- VIR_FREE(type);
- VIR_FREE(ram);
- VIR_FREE(vram);
-@@ -14412,7 +14422,7 @@ virDomainDeviceDefParse(const char *xmlStr,
- goto error;
- break;
- case VIR_DOMAIN_DEVICE_VIDEO:
-- if (!(dev->data.video = virDomainVideoDefParseXML(node, def, flags)))
-+ if (!(dev->data.video = virDomainVideoDefParseXML(node, ctxt, def, flags)))
- goto error;
- break;
- case VIR_DOMAIN_DEVICE_HOSTDEV:
-@@ -18347,7 +18357,7 @@ virDomainDefParseXML(xmlDocPtr xml,
- virDomainVideoDefPtr video;
- ssize_t insertAt = -1;
-
-- if (!(video = virDomainVideoDefParseXML(nodes[i], def, flags)))
-+ if (!(video = virDomainVideoDefParseXML(nodes[i], ctxt, def, flags)))
- goto error;
-
- if (video->primary) {
-@@ -19414,6 +19424,10 @@ virDomainVideoDefCheckABIStability(virDomainVideoDefPtr src,
- }
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -23332,6 +23346,7 @@ virDomainVideoDefFormat(virBufferPtr buf,
- unsigned int flags)
- {
- const char *model = virDomainVideoTypeToString(def->type);
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- if (!model) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
-@@ -23341,6 +23356,14 @@ virDomainVideoDefFormat(virBufferPtr buf,
-
- virBufferAddLit(buf, "\n");
- virBufferAdjustIndent(buf, 2);
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+ if (virBufferCheckError(&driverBuf) < 0)
-+ return -1;
-+ if (virBufferUse(&driverBuf)) {
-+ virBufferAddLit(buf, " \n");
-+ }
- virBufferAsprintf(buf, "ram)
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 8cb9d5d0b1..b79fb50c79 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -1376,6 +1376,7 @@ struct _virDomainVideoDef {
- bool primary;
- virDomainVideoAccelDefPtr accel;
- virDomainDeviceInfo info;
-+ virDomainVirtioOptionsPtr virtio;
- };
-
- /* graphics console modes */
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-index b7b95014cd..85d1145263 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-@@ -69,6 +69,7 @@
-
-
-
-+
-
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Adding-POWER9-cpu-model-to-cpu_map.xml.patch b/SOURCES/libvirt-Adding-POWER9-cpu-model-to-cpu_map.xml.patch
deleted file mode 100644
index 35cdb0e..0000000
--- a/SOURCES/libvirt-Adding-POWER9-cpu-model-to-cpu_map.xml.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From e3d953a8230f0cc4c8955f80c515cede99593d6b Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Kothapally Madhu Pavan
-Date: Wed, 17 May 2017 13:23:33 +0200
-Subject: [PATCH] Adding POWER9 cpu model to cpu_map.xml
-
-As POWER9 model is not available in cpu_map.xml virsh capabilities
-donot display the cpu model and vendor details. This patch
-provides those details
-
-(cherry picked from commit 9cdf3a1c06189b8d0cab9f8f62b5b626cf8a150c)
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1450189
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/cpu/cpu_map.xml | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
-index 7d5540a73..29b5b596f 100644
---- a/src/cpu/cpu_map.xml
-+++ b/src/cpu/cpu_map.xml
-@@ -1571,6 +1571,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
---
-2.13.0
-
diff --git a/SOURCES/libvirt-Define-ETHTOOL_-GS-COALESCE-when-building-on-older-kernels.patch b/SOURCES/libvirt-Define-ETHTOOL_-GS-COALESCE-when-building-on-older-kernels.patch
deleted file mode 100644
index 5c2ab6b..0000000
--- a/SOURCES/libvirt-Define-ETHTOOL_-GS-COALESCE-when-building-on-older-kernels.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From f15202cb5a7429a2618cd4ede95064d8874b64ff Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Martin Kletzander
-Date: Tue, 25 Apr 2017 13:41:21 +0200
-Subject: [PATCH] Define ETHTOOL_[GS]COALESCE when building on older kernels
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1414627
-
-RHEL-only (upstream will have this only when built on kernel that
-supports it).
-
-Signed-off-by: Martin Kletzander
-Signed-off-by: Jiri Denemark
----
- src/util/virnetdev.c | 19 ++++++++-----------
- 1 file changed, 8 insertions(+), 11 deletions(-)
-
-diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
-index f14286f62..eb97b705e 100644
---- a/src/util/virnetdev.c
-+++ b/src/util/virnetdev.c
-@@ -3082,7 +3082,14 @@ virNetDevGetEthtoolGFeatures(virBitmapPtr bitmap ATTRIBUTE_UNUSED,
- # endif
-
-
--# if HAVE_DECL_ETHTOOL_SCOALESCE && HAVE_DECL_ETHTOOL_GCOALESCE
-+/* Workaround for binary distributions building on old kernels */
-+# ifndef ETHTOOL_GCOALESCE
-+# define ETHTOOL_GCOALESCE 0x0000000e
-+# endif
-+# ifndef ETHTOOL_SCOALESCE
-+# define ETHTOOL_SCOALESCE 0x0000000f
-+# endif
-+
- /**
- * virNetDevSetCoalesce:
- * @ifname: interface name to modify
-@@ -3153,16 +3160,6 @@ int virNetDevSetCoalesce(const char *ifname,
- VIR_FORCE_CLOSE(fd);
- return ret;
- }
--# else
--int virNetDevSetCoalesce(const char *ifname,
-- virNetDevCoalescePtr coalesce ATTRIBUTE_UNUSED)
--{
-- virReportSystemError(ENOSYS,
-- _("Cannot set coalesce info on interface '%s'"),
-- ifname);
-- return -1;
--}
--# endif
-
-
- /**
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Do-not-release-unreserved-address-in-qemuDomainAttachRNGDevice.patch b/SOURCES/libvirt-Do-not-release-unreserved-address-in-qemuDomainAttachRNGDevice.patch
deleted file mode 100644
index 2f90144..0000000
--- a/SOURCES/libvirt-Do-not-release-unreserved-address-in-qemuDomainAttachRNGDevice.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 595b527d46c885352dce5fd9b2e226a1d17c1ef4 Mon Sep 17 00:00:00 2001
-Message-Id: <595b527d46c885352dce5fd9b2e226a1d17c1ef4@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Mon, 22 May 2017 10:50:56 +0200
-Subject: [PATCH] Do not release unreserved address in
- qemuDomainAttachRNGDevice
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Only set releaseaddr to true after the address has been
-reserved successfully.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1452581
-
-Reviewed-by: John Ferlan
-(cherry picked from commit f25f30aff548636d0c8782d3eaee049c77548dd5)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- src/qemu/qemu_hotplug.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
-index 6e5678f16..5c3660922 100644
---- a/src/qemu/qemu_hotplug.c
-+++ b/src/qemu/qemu_hotplug.c
-@@ -2090,7 +2090,6 @@ qemuDomainAttachRNGDevice(virConnectPtr conn,
- rng->source.file))
- goto cleanup;
- }
-- releaseaddr = true;
-
- if (rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
- rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
-@@ -2103,6 +2102,7 @@ qemuDomainAttachRNGDevice(virConnectPtr conn,
- !rng->info.addr.ccw.assigned) < 0)
- goto cleanup;
- }
-+ releaseaddr = true;
-
- if (qemuDomainNamespaceSetupRNG(driver, vm, rng) < 0)
- goto cleanup;
---
-2.13.0
-
diff --git a/SOURCES/libvirt-Don-t-leak-str-in-virDomainNetDefCoalesceParseXML.patch b/SOURCES/libvirt-Don-t-leak-str-in-virDomainNetDefCoalesceParseXML.patch
deleted file mode 100644
index 2f1d5d0..0000000
--- a/SOURCES/libvirt-Don-t-leak-str-in-virDomainNetDefCoalesceParseXML.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 8405ec82963c74f0505455fa2be35208dafbf907 Mon Sep 17 00:00:00 2001
-Message-Id: <8405ec82963c74f0505455fa2be35208dafbf907@dist-git>
-From: Martin Kletzander
-Date: Tue, 25 Apr 2017 13:41:19 +0200
-Subject: [PATCH] Don't leak str in virDomainNetDefCoalesceParseXML
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1414627
-
-Signed-off-by: Martin Kletzander
-(cherry picked from commit f08e26a19a5ba1cb434627554ee037e5a1b97e83)
-Signed-off-by: Martin Kletzander
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index f2801ec84..47022c329 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -6798,6 +6798,7 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node,
- ret->rx_max_coalesced_frames = tmp;
-
- cleanup:
-+ VIR_FREE(str);
- ctxt->node = save;
- return ret;
-
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Fix-padding-of-encrypted-data.patch b/SOURCES/libvirt-Fix-padding-of-encrypted-data.patch
deleted file mode 100644
index 024b62b..0000000
--- a/SOURCES/libvirt-Fix-padding-of-encrypted-data.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 603a58f73e71323294c0d840bbfef4b5d9676e32 Mon Sep 17 00:00:00 2001
-Message-Id: <603a58f73e71323294c0d840bbfef4b5d9676e32@dist-git>
-From: "Daniel P. Berrange"
-Date: Wed, 3 May 2017 08:52:13 +0200
-Subject: [PATCH] Fix padding of encrypted data
-
-If we are encoding a block of data that is 16 bytes in length,
-we cannot leave it as 16 bytes, we must pad it out to the next
-block boundary, 32 bytes. Without this padding, the decoder will
-incorrectly treat the last byte of plain text as the padding
-length, as it can't distinguish padded from non-padded data.
-
-The problem exhibited itself when using a 16 byte passphrase
-for a LUKS volume
-
- $ virsh secret-set-value 55806c7d-8e93-456f-829b-607d8c198367 \
- $(echo -n 1234567812345678 | base64)
- Secret value set
-
- $ virsh start demo
- error: Failed to start domain demo
- error: internal error: process exited while connecting to monitor: >>>>>>>>>>Len 16
- 2017-05-02T10:35:40.016390Z qemu-system-x86_64: -object \
- secret,id=virtio-disk1-luks-secret0,data=SEtNi5vDUeyseMKHwc1c1Q==,\
- keyid=masterKey0,iv=zm7apUB1A6dPcH53VW960Q==,format=base64: \
- Incorrect number of padding bytes (56) found on decrypted data
-
-Notice how the padding '56' corresponds to the ordinal value of
-the character '8'.
-
-Signed-off-by: Daniel P. Berrange
-(cherry picked from commit 71890992daf37ec78b00b4ce873369421dc99731)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1447297
-Signed-off-by: Jiri Denemark
----
- src/util/vircrypto.c | 10 ++++++++--
- 1 file changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/src/util/vircrypto.c b/src/util/vircrypto.c
-index 8748e1c4e..48b04fc8c 100644
---- a/src/util/vircrypto.c
-+++ b/src/util/vircrypto.c
-@@ -152,8 +152,14 @@ virCryptoEncryptDataAESgnutls(gnutls_cipher_algorithm_t gnutls_enc_alg,
- uint8_t *ciphertext;
- size_t ciphertextlen;
-
-- /* Allocate a padded buffer, copy in the data */
-- ciphertextlen = VIR_ROUND_UP(datalen, 16);
-+ /* Allocate a padded buffer, copy in the data.
-+ *
-+ * NB, we must *always* have at least 1 byte of
-+ * padding - we can't skip it on multiples of
-+ * 16, otherwise decoder can't distinguish padded
-+ * data from non-padded data. Hence datalen + 1
-+ */
-+ ciphertextlen = VIR_ROUND_UP(datalen + 1, 16);
- if (VIR_ALLOC_N(ciphertext, ciphertextlen) < 0)
- return -1;
- memcpy(ciphertext, data, datalen);
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Introduce-virDomainDeviceAliasIsUserAlias.patch b/SOURCES/libvirt-Introduce-virDomainDeviceAliasIsUserAlias.patch
new file mode 100644
index 0000000..e9cdd28
--- /dev/null
+++ b/SOURCES/libvirt-Introduce-virDomainDeviceAliasIsUserAlias.patch
@@ -0,0 +1,79 @@
+From c4df501b589eb7d4315c13bfe6ba653321135841 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: =?UTF-8?q?J=C3=A1n=20Tomko?=
+Date: Thu, 30 Nov 2017 17:45:57 +0100
+Subject: [PATCH] Introduce virDomainDeviceAliasIsUserAlias
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Allow parts of code outside domain_conf to decide whether the alias
+is user-specified or not.
+
+(cherry picked from commit 309cd46b400d80420615b19adfebf7158492ae3b)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1518148
+
+Signed-off-by: Ján Tomko
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 9 ++++++++-
+ src/conf/domain_conf.h | 2 ++
+ src/libvirt_private.syms | 1 +
+ 3 files changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 83392a42c0..bd6d851f21 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -6662,6 +6662,13 @@ virDomainDeviceAddressParseXML(xmlNodePtr address,
+ #define USER_ALIAS_CHARS \
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-"
+
++bool
++virDomainDeviceAliasIsUserAlias(const char *aliasStr)
++{
++ return STRPREFIX(aliasStr, USER_ALIAS_PREFIX);
++}
++
++
+ /* Parse the XML definition for a device address
+ * @param node XML nodeset to parse for device address definition
+ */
+@@ -6715,7 +6722,7 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
+
+ if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) ||
+ (xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_USER_ALIAS &&
+- STRPREFIX(aliasStr, USER_ALIAS_PREFIX) &&
++ virDomainDeviceAliasIsUserAlias(aliasStr) &&
+ strspn(aliasStr, USER_ALIAS_CHARS) == strlen(aliasStr)))
+ VIR_STEAL_PTR(info->alias, aliasStr);
+ }
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 0e97f0437e..479a791f29 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -2674,6 +2674,8 @@ int virDomainDeviceValidateAliasForHotplug(virDomainObjPtr vm,
+ virDomainDeviceDefPtr dev,
+ unsigned int flags);
+
++bool virDomainDeviceAliasIsUserAlias(const char *aliasStr);
++
+ int virDomainDefValidate(virDomainDefPtr def,
+ virCapsPtr caps,
+ unsigned int parseFlags,
+diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
+index 0449b0185f..19c1ecc408 100644
+--- a/src/libvirt_private.syms
++++ b/src/libvirt_private.syms
+@@ -292,6 +292,7 @@ virDomainDefVcpuOrderClear;
+ virDomainDeleteConfig;
+ virDomainDeviceAddressIsValid;
+ virDomainDeviceAddressTypeToString;
++virDomainDeviceAliasIsUserAlias;
+ virDomainDeviceDefCopy;
+ virDomainDeviceDefFree;
+ virDomainDeviceDefParse;
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-Introduce-virDomainInputDefGetPath.patch b/SOURCES/libvirt-Introduce-virDomainInputDefGetPath.patch
new file mode 100644
index 0000000..de76e4f
--- /dev/null
+++ b/SOURCES/libvirt-Introduce-virDomainInputDefGetPath.patch
@@ -0,0 +1,112 @@
+From 90aa784ed6ab93eae0a5e555c55bd65bc3240647 Mon Sep 17 00:00:00 2001
+Message-Id: <90aa784ed6ab93eae0a5e555c55bd65bc3240647@dist-git>
+From: =?UTF-8?q?J=C3=A1n=20Tomko?=
+Date: Mon, 27 Nov 2017 14:20:58 +0100
+Subject: [PATCH] Introduce virDomainInputDefGetPath
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Use it to denadify qemuDomainSetupInput.
+
+(cherry picked from commit cbf4242db7da3727f86934513c417acdec3d1a48)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1509866
+
+Signed-off-by: Ján Tomko
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 16 ++++++++++++++++
+ src/conf/domain_conf.h | 1 +
+ src/libvirt_private.syms | 1 +
+ src/qemu/qemu_domain.c | 21 ++++-----------------
+ 4 files changed, 22 insertions(+), 17 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 641a978f07..530fae9d9d 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -1397,6 +1397,22 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
+ VIR_FREE(def);
+ }
+
++const char *virDomainInputDefGetPath(virDomainInputDefPtr input)
++{
++ switch ((virDomainInputType) input->type) {
++ case VIR_DOMAIN_INPUT_TYPE_MOUSE:
++ case VIR_DOMAIN_INPUT_TYPE_TABLET:
++ case VIR_DOMAIN_INPUT_TYPE_KBD:
++ case VIR_DOMAIN_INPUT_TYPE_LAST:
++ return NULL;
++ break;
++
++ case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
++ return input->source.evdev;
++ }
++ return NULL;
++}
++
+ void virDomainInputDefFree(virDomainInputDefPtr def)
+ {
+ if (!def)
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index f967e603d1..09635763a1 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -2696,6 +2696,7 @@ int virDomainObjWaitUntil(virDomainObjPtr vm,
+ void virDomainPanicDefFree(virDomainPanicDefPtr panic);
+ void virDomainResourceDefFree(virDomainResourceDefPtr resource);
+ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def);
++const char *virDomainInputDefGetPath(virDomainInputDefPtr input);
+ void virDomainInputDefFree(virDomainInputDefPtr def);
+ virDomainDiskDefPtr virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt);
+ void virDomainDiskDefFree(virDomainDiskDefPtr def);
+diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
+index 8d1d4a896b..3e0bc8730c 100644
+--- a/src/libvirt_private.syms
++++ b/src/libvirt_private.syms
+@@ -393,6 +393,7 @@ virDomainHypervTypeToString;
+ virDomainInputBusTypeToString;
+ virDomainInputDefFind;
+ virDomainInputDefFree;
++virDomainInputDefGetPath;
+ virDomainIOMMUModelTypeFromString;
+ virDomainIOMMUModelTypeToString;
+ virDomainIOThreadIDAdd;
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index 2f987787cd..dbe9ed5e98 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -8977,25 +8977,12 @@ qemuDomainSetupInput(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED,
+ virDomainInputDefPtr input,
+ const struct qemuDomainCreateDeviceData *data)
+ {
+- int ret = -1;
++ const char *path = virDomainInputDefGetPath(input);
+
+- switch ((virDomainInputType) input->type) {
+- case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+- if (qemuDomainCreateDevice(input->source.evdev, data, false) < 0)
+- goto cleanup;
+- break;
++ if (path && qemuDomainCreateDevice(path, data, false) < 0)
++ return -1;
+
+- case VIR_DOMAIN_INPUT_TYPE_MOUSE:
+- case VIR_DOMAIN_INPUT_TYPE_TABLET:
+- case VIR_DOMAIN_INPUT_TYPE_KBD:
+- case VIR_DOMAIN_INPUT_TYPE_LAST:
+- /* nada */
+- break;
+- }
+-
+- ret = 0;
+- cleanup:
+- return ret;
++ return 0;
+ }
+
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch b/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch
index b72350b..c3f491d 100644
--- a/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch
+++ b/SOURCES/libvirt-RHEL-Add-rhel-machine-types-to-qemuDomainMachineNeedsFDC.patch
@@ -1,5 +1,5 @@
-From 43caa2e812f3329221b875bbef4f0dcd07f8da05 Mon Sep 17 00:00:00 2001
-Message-Id: <43caa2e812f3329221b875bbef4f0dcd07f8da05@dist-git>
+From 6c4cb735843674c4dc3638fd22e222105bfc33ef Mon Sep 17 00:00:00 2001
+Message-Id: <6c4cb735843674c4dc3638fd22e222105bfc33ef@dist-git>
From: =?UTF-8?q?J=C3=A1n=20Tomko?=
Date: Mon, 22 Feb 2016 12:51:51 +0100
Subject: [PATCH] RHEL: Add rhel machine types to qemuDomainMachineNeedsFDC
@@ -17,10 +17,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 3 insertions(+)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
-index 589eb1889..9f165c1da 100644
+index 13e77eedcd..81bfef946e 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
-@@ -5889,6 +5889,9 @@ qemuDomainMachineNeedsFDC(const virDomainDef *def)
+@@ -6833,6 +6833,9 @@ qemuDomainMachineNeedsFDC(const char *machine)
STRPREFIX(p, "2.2") ||
STRPREFIX(p, "2.3"))
return false;
@@ -31,5 +31,5 @@ index 589eb1889..9f165c1da 100644
}
return false;
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-Add-support-for-QMP-I-O-error-reason.patch b/SOURCES/libvirt-RHEL-Add-support-for-QMP-I-O-error-reason.patch
index 362558d..3651996 100644
--- a/SOURCES/libvirt-RHEL-Add-support-for-QMP-I-O-error-reason.patch
+++ b/SOURCES/libvirt-RHEL-Add-support-for-QMP-I-O-error-reason.patch
@@ -1,5 +1,5 @@
-From d2a647fd2d68114875222614d6b098a96c9d16c3 Mon Sep 17 00:00:00 2001
-Message-Id:
+From 039a4ec94aca6cb2226161de49e4b8a7c53f8321 Mon Sep 17 00:00:00 2001
+Message-Id: <039a4ec94aca6cb2226161de49e4b8a7c53f8321@dist-git>
From: Jiri Denemark
Date: Thu, 9 Oct 2014 10:38:39 +0200
Subject: [PATCH] RHEL: Add support for QMP I/O error reason
@@ -18,10 +18,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
-index 6fcf57cd1..405f79fec 100644
+index e0f942788d..a1fa37e1e9 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
-@@ -646,7 +646,7 @@ qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
+@@ -641,7 +641,7 @@ qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
{
const char *device;
const char *action;
@@ -30,7 +30,7 @@ index 6fcf57cd1..405f79fec 100644
bool nospc = false;
int actionID;
-@@ -662,8 +662,14 @@ qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
+@@ -657,8 +657,14 @@ qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
if ((device = virJSONValueObjectGetString(data, "device")) == NULL)
VIR_WARN("missing device in disk io error event");
@@ -48,5 +48,5 @@ index 6fcf57cd1..405f79fec 100644
if ((actionID = qemuMonitorIOErrorActionTypeFromString(action)) < 0) {
VIR_WARN("unknown disk io error action '%s'", action);
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-Define-ETHTOOL_-GS-COALESCE-when-building-on-older-kernels.patch b/SOURCES/libvirt-RHEL-Define-ETHTOOL_-GS-COALESCE-when-building-on-older-kernels.patch
new file mode 100644
index 0000000..8649f9f
--- /dev/null
+++ b/SOURCES/libvirt-RHEL-Define-ETHTOOL_-GS-COALESCE-when-building-on-older-kernels.patch
@@ -0,0 +1,62 @@
+From c6e5d4660e094d9377300d76873545ef73886e0a Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Martin Kletzander
+Date: Tue, 25 Apr 2017 13:41:21 +0200
+Subject: [PATCH] RHEL: Define ETHTOOL_[GS]COALESCE when building on older
+ kernels
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1414627
+
+RHEL-only (upstream will have this only when built on kernel that
+supports it).
+
+Signed-off-by: Martin Kletzander
+Signed-off-by: Jiri Denemark
+---
+ src/util/virnetdev.c | 23 ++++++++---------------
+ 1 file changed, 8 insertions(+), 15 deletions(-)
+
+diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
+index 41ef65d882..4a63fe9af9 100644
+--- a/src/util/virnetdev.c
++++ b/src/util/virnetdev.c
+@@ -3350,7 +3350,14 @@ virNetDevGetEthtoolGFeatures(virBitmapPtr bitmap ATTRIBUTE_UNUSED,
+ # endif
+
+
+-# if HAVE_DECL_ETHTOOL_SCOALESCE && HAVE_DECL_ETHTOOL_GCOALESCE
++/* Workaround for binary distributions building on old kernels */
++# ifndef ETHTOOL_GCOALESCE
++# define ETHTOOL_GCOALESCE 0x0000000e
++# endif
++# ifndef ETHTOOL_SCOALESCE
++# define ETHTOOL_SCOALESCE 0x0000000f
++# endif
++
+ /**
+ * virNetDevSetCoalesce:
+ * @ifname: interface name to modify
+@@ -3450,20 +3457,6 @@ int virNetDevSetCoalesce(const char *ifname,
+ VIR_FORCE_CLOSE(fd);
+ return ret;
+ }
+-# else
+-int virNetDevSetCoalesce(const char *ifname,
+- virNetDevCoalescePtr coalesce,
+- bool update)
+-{
+- if (!coalesce && !update)
+- return 0;
+-
+- virReportSystemError(ENOSYS,
+- _("Cannot set coalesce info on interface '%s'"),
+- ifname);
+- return -1;
+-}
+-# endif
+
+
+ /**
+--
+2.14.3
+
diff --git a/SOURCES/libvirt-RHEL-Fix-maxvcpus-output.patch b/SOURCES/libvirt-RHEL-Fix-maxvcpus-output.patch
index 6007b17..039c712 100644
--- a/SOURCES/libvirt-RHEL-Fix-maxvcpus-output.patch
+++ b/SOURCES/libvirt-RHEL-Fix-maxvcpus-output.patch
@@ -1,5 +1,5 @@
-From 6ce52a680d7799f1a861f98c50581a74b15d51a1 Mon Sep 17 00:00:00 2001
-Message-Id: <6ce52a680d7799f1a861f98c50581a74b15d51a1@dist-git>
+From e6b3f2c8091afc39840c44add90c0148db365811 Mon Sep 17 00:00:00 2001
+Message-Id:
From: =?UTF-8?q?J=C3=A1n=20Tomko?=
Date: Wed, 17 Sep 2014 19:00:58 +0200
Subject: [PATCH] RHEL: Fix maxvcpus output
@@ -19,10 +19,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 5 insertions(+)
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
-index 02b9fc8eb..20d3a004b 100644
+index c485a97211..bd58aa43df 100644
--- a/src/util/virhostcpu.c
+++ b/src/util/virhostcpu.c
-@@ -1166,6 +1166,11 @@ virHostCPUGetKVMMaxVCPUs(void)
+@@ -1178,6 +1178,11 @@ virHostCPUGetKVMMaxVCPUs(void)
return -1;
}
@@ -35,5 +35,5 @@ index 02b9fc8eb..20d3a004b 100644
/* at first try KVM_CAP_MAX_VCPUS to determine the maximum count */
if ((ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_MAX_VCPUS)) > 0)
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch b/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch
index 897b338..b4c1c99 100644
--- a/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch
+++ b/SOURCES/libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch
@@ -1,5 +1,5 @@
-From 26d33ed184f16a57b412360e4e75dbbcb9807c76 Mon Sep 17 00:00:00 2001
-Message-Id: <26d33ed184f16a57b412360e4e75dbbcb9807c76@dist-git>
+From 01e432517f0a44054a5317cea7f8a1171a3b10c7 Mon Sep 17 00:00:00 2001
+Message-Id: <01e432517f0a44054a5317cea7f8a1171a3b10c7@dist-git>
From: Jiri Denemark
Date: Fri, 27 Mar 2015 12:48:40 +0100
Subject: [PATCH] RHEL: Hack around changed Broadwell/Haswell CPUs
@@ -18,17 +18,20 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1199446
Signed-off-by: Jiri Denemark
---
- src/qemu/qemu_command.c | 21 +++++++++++++++++++++
- .../qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args | 2 +-
- .../qemuxml2argv-cpu-host-model-cmt.args | 3 ++-
- .../qemuxml2argv-cpu-tsc-frequency.args | 2 +-
- 4 files changed, 25 insertions(+), 3 deletions(-)
+ src/qemu/qemu_command.c | 29 ++++++++++++++++++++++
+ .../qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args | 2 +-
+ .../qemuxml2argv-cpu-host-model-cmt.args | 3 ++-
+ .../qemuxml2argv-cpu-tsc-frequency.args | 2 +-
+ .../qemuxml2argv-q35-acpi-nouefi.args | 2 +-
+ .../qemuxml2argv-q35-acpi-uefi.args | 2 +-
+ .../qemuxml2argv-q35-noacpi-nouefi.args | 2 +-
+ 7 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
-index 64d2d7105..1a2984e56 100644
+index b1cfafa790..365555ca87 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
-@@ -6768,6 +6768,8 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
+@@ -6857,6 +6857,8 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
size_t i;
virCapsPtr caps = NULL;
virCPUDefPtr cpu = def->cpu;
@@ -37,7 +40,7 @@ index 64d2d7105..1a2984e56 100644
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto cleanup;
-@@ -6822,6 +6824,11 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
+@@ -6911,6 +6913,11 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
virBufferAsprintf(buf, ",vendor=%s", cpu->vendor_id);
for (i = 0; i < cpu->nfeatures; i++) {
@@ -49,7 +52,7 @@ index 64d2d7105..1a2984e56 100644
switch ((virCPUFeaturePolicy) cpu->features[i].policy) {
case VIR_CPU_FEATURE_FORCE:
case VIR_CPU_FEATURE_REQUIRE:
-@@ -6845,6 +6852,20 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
+@@ -6934,6 +6941,28 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
}
}
@@ -61,17 +64,25 @@ index 64d2d7105..1a2984e56 100644
+ */
+ if (STREQ_NULLABLE(cpu->model, "Broadwell") ||
+ STREQ_NULLABLE(cpu->model, "Haswell")) {
-+ if (!rtm)
-+ virBufferAddLit(buf, ",+rtm");
-+ if (!hle)
-+ virBufferAddLit(buf, ",+hle");
++ if (!rtm) {
++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
++ virBufferAddLit(buf, ",rtm=on");
++ else
++ virBufferAddLit(buf, ",+rtm");
++ }
++ if (!hle) {
++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
++ virBufferAddLit(buf, ",hle=on");
++ else
++ virBufferAddLit(buf, ",+hle");
++ }
+ }
+
ret = 0;
cleanup:
virObjectUnref(caps);
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
-index ef0e68b14..2e74a6703 100644
+index 06c9eed5b9..553b91c83b 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
@@ -84,7 +95,7 @@ index ef0e68b14..2e74a6703 100644
-smp 6,sockets=6,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
-index 7ae4ac5ad..e02f996ee 100644
+index ef45d98300..28cdf92782 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
@@ -9,7 +9,8 @@ QEMU_AUDIO_DRV=none \
@@ -98,7 +109,7 @@ index 7ae4ac5ad..e02f996ee 100644
-smp 6,sockets=6,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
-index 50223fab2..cd9a3ef16 100644
+index 3e2da0f242..53193c6fe2 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
@@ -110,6 +121,45 @@ index 50223fab2..cd9a3ef16 100644
-m 214 \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args
+index 503045de6b..5e1d3b4eb0 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args
+@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
+ -name guest \
+ -S \
+ -M q35 \
+--cpu Haswell \
++-cpu Haswell,+rtm,+hle \
+ -m 1024 \
+ -smp 1,sockets=1,cores=1,threads=1 \
+ -uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args
+index fbbbcf9812..40214c69e8 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args
+@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
+ -name guest \
+ -S \
+ -M q35 \
+--cpu Haswell \
++-cpu Haswell,+rtm,+hle \
+ -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,\
+ readonly=on \
+ -drive file=/var/lib/libvirt/qemu/nvram/guest_VARS.fd,if=pflash,format=raw,\
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args
+index de2a7f30bc..1be5968e02 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args
+@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
+ -name guest \
+ -S \
+ -M q35 \
+--cpu Haswell \
++-cpu Haswell,+rtm,+hle \
+ -m 1024 \
+ -smp 1,sockets=1,cores=1,threads=1 \
+ -uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-Support-virtio-disk-hotplug-in-JSON-mode.patch b/SOURCES/libvirt-RHEL-Support-virtio-disk-hotplug-in-JSON-mode.patch
index 8347599..0357f85 100644
--- a/SOURCES/libvirt-RHEL-Support-virtio-disk-hotplug-in-JSON-mode.patch
+++ b/SOURCES/libvirt-RHEL-Support-virtio-disk-hotplug-in-JSON-mode.patch
@@ -1,5 +1,5 @@
-From 2d1d83a1d3eeb7cf98972c461842f333f900c1e2 Mon Sep 17 00:00:00 2001
-Message-Id: <2d1d83a1d3eeb7cf98972c461842f333f900c1e2@dist-git>
+From 618632843aeb3a587c2bbfdb7442217ae13b45fe Mon Sep 17 00:00:00 2001
+Message-Id: <618632843aeb3a587c2bbfdb7442217ae13b45fe@dist-git>
From: Jiri Denemark
Date: Tue, 5 Apr 2016 09:14:09 +0200
Subject: [PATCH] RHEL: Support virtio disk hotplug in JSON mode
@@ -53,14 +53,14 @@ Conflicts:
src/qemu/qemu_monitor.c | 12 +++--
src/qemu/qemu_monitor_json.c | 106 +++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 6 +++
- tests/qemuhotplugtest.c | 92 ++++++++++++++++++++++++++++++++++++-
- 4 files changed, 210 insertions(+), 6 deletions(-)
+ tests/qemuhotplugtest.c | 93 ++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 211 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
-index 8bc00bc1e..488d761fb 100644
+index 3cf23db874..12ad45d340 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
-@@ -3073,8 +3073,10 @@ qemuMonitorDriveDel(qemuMonitorPtr mon,
+@@ -3125,8 +3125,10 @@ qemuMonitorDriveDel(qemuMonitorPtr mon,
QEMU_CHECK_MONITOR(mon);
@@ -73,7 +73,7 @@ index 8bc00bc1e..488d761fb 100644
}
-@@ -3195,8 +3197,10 @@ qemuMonitorAddDrive(qemuMonitorPtr mon,
+@@ -3247,8 +3249,10 @@ qemuMonitorAddDrive(qemuMonitorPtr mon,
QEMU_CHECK_MONITOR(mon);
@@ -87,10 +87,10 @@ index 8bc00bc1e..488d761fb 100644
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
-index 2010657e3..6fcf57cd1 100644
+index 8a75e0ef7e..e0f942788d 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
-@@ -3807,6 +3807,112 @@ int qemuMonitorJSONDelObject(qemuMonitorPtr mon,
+@@ -3839,6 +3839,112 @@ int qemuMonitorJSONDelObject(qemuMonitorPtr mon,
}
@@ -204,10 +204,10 @@ index 2010657e3..6fcf57cd1 100644
const char *alias,
const char *passphrase)
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
-index fb697033c..696aaeffc 100644
+index 02a504ab85..f1e818aed2 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
-@@ -233,6 +233,12 @@ int qemuMonitorJSONAddObject(qemuMonitorPtr mon,
+@@ -234,6 +234,12 @@ int qemuMonitorJSONAddObject(qemuMonitorPtr mon,
int qemuMonitorJSONDelObject(qemuMonitorPtr mon,
const char *objalias);
@@ -221,10 +221,10 @@ index fb697033c..696aaeffc 100644
const char *alias,
const char *passphrase);
diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c
-index cdeb3f1bf..2e1afeea9 100644
+index bdde7e45f3..7691ad8f0f 100644
--- a/tests/qemuhotplugtest.c
+++ b/tests/qemuhotplugtest.c
-@@ -658,6 +658,14 @@ mymain(void)
+@@ -663,6 +663,14 @@ mymain(void)
" }" \
"}\r\n"
@@ -239,7 +239,7 @@ index cdeb3f1bf..2e1afeea9 100644
DO_TEST_UPDATE("graphics-spice", "graphics-spice-nochange", false, false, NULL);
DO_TEST_UPDATE("graphics-spice-timeout", "graphics-spice-timeout-nochange", false, false,
"set_password", QMP_OK, "expire_password", QMP_OK);
-@@ -678,67 +686,135 @@ mymain(void)
+@@ -683,67 +691,135 @@ mymain(void)
"chardev-remove", QMP_OK);
DO_TEST_ATTACH("base-live", "disk-virtio", false, true,
@@ -376,7 +376,7 @@ index cdeb3f1bf..2e1afeea9 100644
"human-monitor-command", HMP(""));
DO_TEST_ATTACH_EVENT("base-without-scsi-controller-live", "disk-scsi-2", false, true,
-@@ -747,14 +823,17 @@ mymain(void)
+@@ -752,14 +828,17 @@ mymain(void)
"device_add", QMP_OK,
"device_add", QMP_OK,
"device_add", QMP_OK,
@@ -395,7 +395,7 @@ index cdeb3f1bf..2e1afeea9 100644
"human-monitor-command", HMP(""));
DO_TEST_ATTACH("base-live", "qemu-agent", false, true,
-@@ -765,38 +844,47 @@ mymain(void)
+@@ -770,38 +849,47 @@ mymain(void)
"chardev-remove", QMP_OK);
DO_TEST_ATTACH("base-ccw-live", "ccw-virtio", false, true,
@@ -443,6 +443,14 @@ index cdeb3f1bf..2e1afeea9 100644
"human-monitor-command", HMP("OK\\r\\n"),
"device_add", QMP_OK);
+@@ -819,6 +907,7 @@ mymain(void)
+ "object-del", QMP_OK);
+ DO_TEST_ATTACH("base-live+disk-scsi-wwn",
+ "disk-scsi-duplicate-wwn", false, false,
++ "__com.redhat_drive_add", QMP_NOT_FOUND,
+ "human-monitor-command", HMP("OK\\r\\n"),
+ "device_add", QMP_OK);
+
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-cpu-Fix-EPYC-IBRS-CPU-model.patch b/SOURCES/libvirt-RHEL-cpu-Fix-EPYC-IBRS-CPU-model.patch
new file mode 100644
index 0000000..2e372c8
--- /dev/null
+++ b/SOURCES/libvirt-RHEL-cpu-Fix-EPYC-IBRS-CPU-model.patch
@@ -0,0 +1,34 @@
+From 111f9cb4bd22a68c50237e52190663c3f43a66ee Mon Sep 17 00:00:00 2001
+Message-Id: <111f9cb4bd22a68c50237e52190663c3f43a66ee@dist-git>
+From: Jiri Denemark
+Date: Fri, 5 Jan 2018 17:40:30 +0100
+Subject: [PATCH] RHEL: cpu: Fix EPYC-IBRS CPU model
+
+It is spelled as EPYC-IBPB in QEMU.
+
+RHEL-only, upstream patches were sent for review with this patch
+squashed in.
+
+CVE-2017-5715
+
+Signed-off-by: Jiri Denemark
+---
+ src/cpu/cpu_map.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
+index a7888ec134..4d786f1e0a 100644
+--- a/src/cpu/cpu_map.xml
++++ b/src/cpu/cpu_map.xml
+@@ -1754,7 +1754,7 @@
+
+
+
+-
++
+
+
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch b/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch
index 11db783..ef549ec 100644
--- a/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch
+++ b/SOURCES/libvirt-RHEL-qemu-Add-ability-to-set-sgio-values-for-hostdev.patch
@@ -1,5 +1,5 @@
-From 5ed5c2acfb240683c3b1d7ec2e63b3c2571d707f Mon Sep 17 00:00:00 2001
-Message-Id: <5ed5c2acfb240683c3b1d7ec2e63b3c2571d707f@dist-git>
+From c696e4c1071b6a386d8c8428836eeb146886b644 Mon Sep 17 00:00:00 2001
+Message-Id:
From: John Ferlan
Date: Thu, 9 Jul 2015 08:28:57 -0400
Subject: [PATCH] RHEL: qemu: Add ability to set sgio values for hostdev
@@ -18,10 +18,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
-index 3b33e37bb..9137a69f8 100644
+index ec61c9c526..f1c142efb6 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
-@@ -1458,6 +1458,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
+@@ -1570,6 +1570,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
virDomainDiskDefPtr disk = NULL;
virDomainHostdevDefPtr hostdev = NULL;
char *sysfs_path = NULL;
@@ -29,7 +29,7 @@ index 3b33e37bb..9137a69f8 100644
const char *path = NULL;
int val = -1;
int ret = -1;
-@@ -1479,14 +1480,10 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
+@@ -1591,14 +1592,10 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
if (!qemuIsSharedHostdev(hostdev))
return 0;
@@ -46,7 +46,7 @@ index 3b33e37bb..9137a69f8 100644
} else {
return 0;
}
-@@ -1495,7 +1492,11 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
+@@ -1607,7 +1604,11 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
goto cleanup;
/* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */
@@ -59,7 +59,7 @@ index 3b33e37bb..9137a69f8 100644
/* Do not do anything if unpriv_sgio is not supported by the kernel and the
* whitelist is enabled. But if requesting unfiltered access, always call
-@@ -1508,6 +1509,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
+@@ -1620,6 +1621,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
ret = 0;
cleanup:
@@ -68,5 +68,5 @@ index 3b33e37bb..9137a69f8 100644
return ret;
}
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch b/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch
index 6d23430..fe9f6da 100644
--- a/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch
+++ b/SOURCES/libvirt-RHEL-qemu-Add-check-for-unpriv-sgio-for-SCSI-generic-host-device.patch
@@ -1,5 +1,5 @@
-From d331ff38d1f088b7cbdaec27b57ebbb81b3ff3d0 Mon Sep 17 00:00:00 2001
-Message-Id:
+From aa370aac88baeea6a35558f3c22a9206cc667eb9 Mon Sep 17 00:00:00 2001
+Message-Id:
From: John Ferlan
Date: Thu, 9 Jul 2015 08:28:58 -0400
Subject: [PATCH] RHEL: qemu: Add check for unpriv sgio for SCSI generic host
@@ -22,10 +22,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 15 insertions(+)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
-index 9137a69f8..7324c9c41 100644
+index f1c142efb6..4e5b33b788 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
-@@ -1298,6 +1298,8 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver,
+@@ -1410,6 +1410,8 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver,
{
char *dev_path = NULL;
char *key = NULL;
@@ -34,7 +34,7 @@ index 9137a69f8..7324c9c41 100644
int ret = -1;
if (!qemuIsSharedHostdev(hostdev))
-@@ -1306,6 +1308,19 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver,
+@@ -1418,6 +1420,19 @@ qemuAddSharedHostdev(virQEMUDriverPtr driver,
if (!(dev_path = qemuGetHostdevPath(hostdev)))
goto cleanup;
@@ -55,5 +55,5 @@ index 9137a69f8..7324c9c41 100644
goto cleanup;
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-qemu-Support-vhost-user-multiqueue-with-QEMU-2.3.patch b/SOURCES/libvirt-RHEL-qemu-Support-vhost-user-multiqueue-with-QEMU-2.3.patch
index 3611f76..cf534ed 100644
--- a/SOURCES/libvirt-RHEL-qemu-Support-vhost-user-multiqueue-with-QEMU-2.3.patch
+++ b/SOURCES/libvirt-RHEL-qemu-Support-vhost-user-multiqueue-with-QEMU-2.3.patch
@@ -1,5 +1,5 @@
-From 8e998fbb777e15718145899a60cd3d65accf68c9 Mon Sep 17 00:00:00 2001
-Message-Id: <8e998fbb777e15718145899a60cd3d65accf68c9@dist-git>
+From 569531d2a63be9a2e4d3c234b22391e7fcd8e5cc Mon Sep 17 00:00:00 2001
+Message-Id: <569531d2a63be9a2e4d3c234b22391e7fcd8e5cc@dist-git>
From: Martin Kletzander
Date: Mon, 23 Nov 2015 12:46:36 +0100
Subject: [PATCH] RHEL: qemu: Support vhost-user-multiqueue with QEMU 2.3
@@ -16,10 +16,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
-index 629fc8a9b..83ebcd020 100644
+index 10ec0d4bb9..37a58b3640 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
-@@ -4548,8 +4548,11 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
+@@ -4761,8 +4761,11 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_AARCH64_OFF);
/* vhost-user supports multi-queue from v2.4.0 onwards,
@@ -34,5 +34,5 @@ index 629fc8a9b..83ebcd020 100644
/* smm option is supported from v2.4.0 */
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-qemu-support-relative-backing-for-RHEL-7.0.z-qemu.patch b/SOURCES/libvirt-RHEL-qemu-support-relative-backing-for-RHEL-7.0.z-qemu.patch
index b03fb90..418c241 100644
--- a/SOURCES/libvirt-RHEL-qemu-support-relative-backing-for-RHEL-7.0.z-qemu.patch
+++ b/SOURCES/libvirt-RHEL-qemu-support-relative-backing-for-RHEL-7.0.z-qemu.patch
@@ -1,5 +1,5 @@
-From e57574f1c3a506267da6676a0036bc35dbd923b3 Mon Sep 17 00:00:00 2001
-Message-Id:
+From 9c0e9d27d742f8150378cb228a64662d9c4984d4 Mon Sep 17 00:00:00 2001
+Message-Id: <9c0e9d27d742f8150378cb228a64662d9c4984d4@dist-git>
From: Eric Blake
Date: Tue, 7 Oct 2014 17:06:17 -0600
Subject: [PATCH] RHEL: qemu: support relative backing for RHEL 7.0.z qemu
@@ -25,10 +25,10 @@ Signed-off-by: Jiri Denemark
1 file changed, 1 insertion(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
-index b1245ad5d..629fc8a9b 100644
+index 7cb091056b..10ec0d4bb9 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
-@@ -1480,6 +1480,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
+@@ -1555,6 +1555,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
{ "add-fd", QEMU_CAPS_ADD_FD },
{ "nbd-server-start", QEMU_CAPS_NBD_SERVER },
{ "change-backing-file", QEMU_CAPS_CHANGE_BACKING_FILE },
@@ -37,5 +37,5 @@ index b1245ad5d..629fc8a9b 100644
{ "migrate-incoming", QEMU_CAPS_INCOMING_DEFER },
{ "query-hotpluggable-cpus", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS },
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-RHEL-screenshot-Implement-multiple-screen-support.patch b/SOURCES/libvirt-RHEL-screenshot-Implement-multiple-screen-support.patch
index 14cd198..dc3cb8d 100644
--- a/SOURCES/libvirt-RHEL-screenshot-Implement-multiple-screen-support.patch
+++ b/SOURCES/libvirt-RHEL-screenshot-Implement-multiple-screen-support.patch
@@ -1,5 +1,5 @@
-From 647ae3f777d7b2b20e6e0caa4603c0b162cca9ec Mon Sep 17 00:00:00 2001
-Message-Id: <647ae3f777d7b2b20e6e0caa4603c0b162cca9ec@dist-git>
+From e326d80a0b1ff2606e16e6fabea8a1914a5cd1d2 Mon Sep 17 00:00:00 2001
+Message-Id:
From: Michal Privoznik
Date: Fri, 26 Aug 2011 16:41:17 +0800
Subject: [PATCH] RHEL: screenshot: Implement multiple screen support
@@ -34,10 +34,10 @@ Conflicts:
5 files changed, 57 insertions(+), 10 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
-index 3cc4f4d66..3f3eca440 100644
+index 1dff53441b..82c60e6ef1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
-@@ -3791,6 +3791,8 @@ qemuDomainScreenshot(virDomainPtr dom,
+@@ -3999,6 +3999,8 @@ qemuDomainScreenshot(virDomainPtr dom,
char *ret = NULL;
bool unlink_tmp = false;
virQEMUDriverConfigPtr cfg = NULL;
@@ -46,7 +46,7 @@ index 3cc4f4d66..3f3eca440 100644
virCheckFlags(0, NULL);
-@@ -3812,12 +3814,15 @@ qemuDomainScreenshot(virDomainPtr dom,
+@@ -4020,12 +4022,15 @@ qemuDomainScreenshot(virDomainPtr dom,
goto endjob;
}
@@ -68,7 +68,7 @@ index 3cc4f4d66..3f3eca440 100644
goto endjob;
}
-@@ -3832,8 +3837,11 @@ qemuDomainScreenshot(virDomainPtr dom,
+@@ -4040,8 +4045,11 @@ qemuDomainScreenshot(virDomainPtr dom,
qemuSecuritySetSavedStateLabel(driver->securityManager, vm->def, tmp);
@@ -82,10 +82,10 @@ index 3cc4f4d66..3f3eca440 100644
goto endjob;
}
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
-index a4fa6eca6..8bc00bc1e 100644
+index dd9d64a207..3cf23db874 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
-@@ -3409,12 +3409,22 @@ qemuMonitorSendKey(qemuMonitorPtr mon,
+@@ -3461,12 +3461,22 @@ qemuMonitorSendKey(qemuMonitorPtr mon,
int
qemuMonitorScreendump(qemuMonitorPtr mon,
@@ -111,10 +111,10 @@ index a4fa6eca6..8bc00bc1e 100644
return qemuMonitorJSONScreendump(mon, file);
else
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
-index 91ab9057e..c1506b0fc 100644
+index bc8494faee..7e20e96116 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
-@@ -876,7 +876,8 @@ int qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
+@@ -888,7 +888,8 @@ int qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
int qemuMonitorInjectNMI(qemuMonitorPtr mon);
int qemuMonitorScreendump(qemuMonitorPtr mon,
@@ -125,10 +125,10 @@ index 91ab9057e..c1506b0fc 100644
int qemuMonitorSendKey(qemuMonitorPtr mon,
unsigned int holdtime,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
-index aeb777d37..2010657e3 100644
+index 05cc634d20..8a75e0ef7e 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
-@@ -4262,6 +4262,30 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
+@@ -4294,6 +4294,30 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
return ret;
}
@@ -160,10 +160,10 @@ index aeb777d37..2010657e3 100644
const char *file)
{
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
-index d090d5709..fb697033c 100644
+index 739a99293c..02a504ab85 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
-@@ -291,6 +291,10 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
+@@ -292,6 +292,10 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
unsigned int *keycodes,
unsigned int nkeycodes);
@@ -175,5 +175,5 @@ index d090d5709..fb697033c 100644
const char *file);
--
-2.12.2
+2.14.3
diff --git a/SOURCES/libvirt-Remove-pointless-check-for-ret-in-virDomainNetDefCoalesceParseXML.patch b/SOURCES/libvirt-Remove-pointless-check-for-ret-in-virDomainNetDefCoalesceParseXML.patch
deleted file mode 100644
index b45264f..0000000
--- a/SOURCES/libvirt-Remove-pointless-check-for-ret-in-virDomainNetDefCoalesceParseXML.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 25fbc5c619a4277086b0bce0e3a55dd4099d4ab2 Mon Sep 17 00:00:00 2001
-Message-Id: <25fbc5c619a4277086b0bce0e3a55dd4099d4ab2@dist-git>
-From: Martin Kletzander
-Date: Tue, 25 Apr 2017 13:41:20 +0200
-Subject: [PATCH] Remove pointless check for !ret in
- virDomainNetDefCoalesceParseXML
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1414627
-
-It was left there after removing a macro it was part of in first
-version or so. Now it will always be NULL.
-
-Signed-off-by: Martin Kletzander
-(cherry picked from commit b2763f189c5b306a685021b4fede9e2cee8528de)
-Signed-off-by: Martin Kletzander
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 47022c329..2d5d00cf2 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -6776,7 +6776,7 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node,
- if (!str)
- goto cleanup;
-
-- if (!ret && VIR_ALLOC(ret) < 0)
-+ if (VIR_ALLOC(ret) < 0)
- goto cleanup;
-
- if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Rename-virResctrlInfo-to-virResctrlInfoPerCache.patch b/SOURCES/libvirt-Rename-virResctrlInfo-to-virResctrlInfoPerCache.patch
new file mode 100644
index 0000000..bb00ca1
--- /dev/null
+++ b/SOURCES/libvirt-Rename-virResctrlInfo-to-virResctrlInfoPerCache.patch
@@ -0,0 +1,97 @@
+From f8604e5cb29526fa7374b1a6690ac3b285720c3f Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Martin Kletzander
+Date: Wed, 31 Jan 2018 16:32:24 +0100
+Subject: [PATCH] Rename virResctrlInfo to virResctrlInfoPerCache
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1289368
+
+Just to ease the review of following patches.
+
+Signed-off-by: Martin Kletzander
+(cherry picked from commit b2211a9e5492879be5f3c6ab9ed2d0dba849c964)
+Signed-off-by: Martin Kletzander
+---
+ src/conf/capabilities.c | 2 +-
+ src/conf/capabilities.h | 2 +-
+ src/util/virresctrl.c | 4 ++--
+ src/util/virresctrl.h | 8 ++++----
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
+index 798c9bdaea..e93eaed2f0 100644
+--- a/src/conf/capabilities.c
++++ b/src/conf/capabilities.c
+@@ -904,7 +904,7 @@ virCapabilitiesFormatCaches(virBufferPtr buf,
+ virBufferSetChildIndent(&controlBuf, buf);
+ for (j = 0; j < bank->ncontrols; j++) {
+ const char *min_unit;
+- virResctrlInfoPtr controls = bank->controls[j];
++ virResctrlInfoPerCachePtr controls = bank->controls[j];
+ unsigned long long gran_short_size = controls->granularity;
+ unsigned long long min_short_size = controls->min;
+
+diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
+index 5048fa819d..27b88cb5ed 100644
+--- a/src/conf/capabilities.h
++++ b/src/conf/capabilities.h
+@@ -148,7 +148,7 @@ struct _virCapsHostCacheBank {
+ virCacheType type; /* Data, Instruction or Unified */
+ virBitmapPtr cpus; /* All CPUs that share this bank */
+ size_t ncontrols;
+- virResctrlInfoPtr *controls;
++ virResctrlInfoPerCachePtr *controls;
+ };
+
+ typedef struct _virCapsHost virCapsHost;
+diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
+index 2a11825a52..050a08178e 100644
+--- a/src/util/virresctrl.c
++++ b/src/util/virresctrl.c
+@@ -59,7 +59,7 @@ int
+ virResctrlGetCacheInfo(unsigned int level,
+ unsigned long long size,
+ virCacheType scope,
+- virResctrlInfoPtr **controls,
++ virResctrlInfoPerCachePtr **controls,
+ size_t *ncontrols)
+ {
+ int ret = -1;
+@@ -69,7 +69,7 @@ virResctrlGetCacheInfo(unsigned int level,
+ char *type_upper = NULL;
+ unsigned int bits = 0;
+ unsigned int min_cbm_bits = 0;
+- virResctrlInfoPtr control;
++ virResctrlInfoPerCachePtr control;
+
+ if (VIR_ALLOC(control) < 0)
+ goto cleanup;
+diff --git a/src/util/virresctrl.h b/src/util/virresctrl.h
+index 848b13e98a..42e8527803 100644
+--- a/src/util/virresctrl.h
++++ b/src/util/virresctrl.h
+@@ -36,9 +36,9 @@ typedef enum {
+ VIR_ENUM_DECL(virCache);
+
+
+-typedef struct _virResctrlInfo virResctrlInfo;
+-typedef virResctrlInfo *virResctrlInfoPtr;
+-struct _virResctrlInfo {
++typedef struct _virResctrlInfoPerCache virResctrlInfoPerCache;
++typedef virResctrlInfoPerCache *virResctrlInfoPerCachePtr;
++struct _virResctrlInfoPerCache {
+ /* Smallest possible increase of the allocation size in bytes */
+ unsigned long long granularity;
+ /* Minimal allocatable size in bytes (if different from granularity) */
+@@ -54,7 +54,7 @@ int
+ virResctrlGetCacheInfo(unsigned int level,
+ unsigned long long size,
+ virCacheType scope,
+- virResctrlInfoPtr **controls,
++ virResctrlInfoPerCachePtr **controls,
+ size_t *ncontrols);
+
+ int
+--
+2.16.1
+
diff --git a/SOURCES/libvirt-Revert-qemu-monitor-do-not-report-error-on-shutdown.patch b/SOURCES/libvirt-Revert-qemu-monitor-do-not-report-error-on-shutdown.patch
new file mode 100644
index 0000000..5e23027
--- /dev/null
+++ b/SOURCES/libvirt-Revert-qemu-monitor-do-not-report-error-on-shutdown.patch
@@ -0,0 +1,69 @@
+From be2ee0f5055cff0fd449ce972935f1af8ebfee84 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Michal Privoznik
+Date: Fri, 19 Jan 2018 14:35:17 +0100
+Subject: [PATCH] Revert "qemu: monitor: do not report error on shutdown"
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1536461
+
+This reverts commit aeda1b8c56dc58b0a413acc61bbea938b40499e1.
+
+Problem is that we need mon->lastError to be set because it's
+used all over the place. Also, there's nothing wrong with
+reporting error if one occurred. I mean, if there's a thread
+executing an API and which currently is talking on monitor it
+definitely wants the error reported.
+
+Signed-off-by: Michal Privoznik
+(cherry picked from commit 72adaf2f10509c3682f2c65ffad4176e00e5a2fb)
+Signed-off-by: Michal Privoznik
+Signed-off-by: Jiri Denemark
+---
+ src/qemu/qemu_monitor.c | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
+index 12ad45d340..b6af209a83 100644
+--- a/src/qemu/qemu_monitor.c
++++ b/src/qemu/qemu_monitor.c
+@@ -69,7 +69,6 @@ struct _qemuMonitor {
+ * < 0: an error occurred during the registration of @fd */
+ int watch;
+ int hasSendFD;
+- int willhangup;
+
+ virDomainObjPtr vm;
+
+@@ -701,10 +700,8 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
+ if (events & VIR_EVENT_HANDLE_HANGUP) {
+ hangup = true;
+ if (!error) {
+- if (!mon->willhangup) {
+- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+- _("End of file from qemu monitor"));
+- }
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("End of file from qemu monitor"));
+ eof = true;
+ events &= ~VIR_EVENT_HANDLE_HANGUP;
+ }
+@@ -743,7 +740,7 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
+ if (mon->lastError.code != VIR_ERR_OK) {
+ /* Already have an error, so clear any new error */
+ virResetLastError();
+- } else if (!mon->willhangup) {
++ } else {
+ virErrorPtr err = virGetLastError();
+ if (!err)
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+@@ -1337,7 +1334,6 @@ qemuMonitorEmitShutdown(qemuMonitorPtr mon, virTristateBool guest)
+ {
+ int ret = -1;
+ VIR_DEBUG("mon=%p guest=%u", mon, guest);
+- mon->willhangup = 1;
+
+ QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm, guest);
+ return ret;
+--
+2.16.1
+
diff --git a/SOURCES/libvirt-Revert-qemu-propagate-bridge-MTU-into-qemu-host_mtu-option.patch b/SOURCES/libvirt-Revert-qemu-propagate-bridge-MTU-into-qemu-host_mtu-option.patch
deleted file mode 100644
index 644df32..0000000
--- a/SOURCES/libvirt-Revert-qemu-propagate-bridge-MTU-into-qemu-host_mtu-option.patch
+++ /dev/null
@@ -1,204 +0,0 @@
-From b36260c361f9d8a854c4d5e9c7309aed7cb99834 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Laine Stump
-Date: Tue, 23 May 2017 13:02:42 -0400
-Subject: [PATCH] Revert "qemu: propagate bridge MTU into qemu "host_mtu"
- option"
-
-This reverts commit 2841e675.
-
-It turns out that adding the host_mtu field to the PCI capabilities in
-the guest bumps the length of PCI capabilities beyond the 32 byte
-boundary, so the virtio-net device gets 64 bytes of ioport space
-instead of 32, which offsets the address of all the other following
-devices. Migration doesn't work very well when the location and length
-of PCI capabilities of devices is changed between source and
-destination.
-
-This means that we need to make sure that the absence/presence of
-host_mtu on the qemu commandline always matches between source and
-destination, which means that we need to make setting of host_mtu an
-opt-in thing (it can't happen automatically when the bridge being used
-has a non-default MTU, which is what commit 2841e675 implemented).
-
-I do want to re-implement this feature with an
-setting, but probably won't backport that to any stable branches, so
-I'm first reverting the original commit, and that revert can be pushed
-to the few releases that have been made since the original (3.1.0 -
-3.3.0)
-
-Resolves: https://bugzilla.redhat.com/1449346
-(cherry picked from commit 77780a29edace958a1f931d3281b962be4f5290e)
-
-Signed-off-by: Jiri Denemark
----
- src/qemu/qemu_command.c | 32 ++++++++++----------------------
- src/qemu/qemu_command.h | 3 +--
- src/qemu/qemu_hotplug.c | 5 ++---
- src/qemu/qemu_interface.c | 5 ++---
- src/qemu/qemu_interface.h | 3 +--
- 5 files changed, 16 insertions(+), 32 deletions(-)
-
-diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
-index 30feef1de..4d3a3d8ca 100644
---- a/src/qemu/qemu_command.c
-+++ b/src/qemu/qemu_command.c
-@@ -3633,8 +3633,7 @@ qemuBuildNicDevStr(virDomainDefPtr def,
- int vlan,
- unsigned int bootindex,
- size_t vhostfdSize,
-- virQEMUCapsPtr qemuCaps,
-- unsigned int mtu)
-+ virQEMUCapsPtr qemuCaps)
- {
- virBuffer buf = VIR_BUFFER_INITIALIZER;
- const char *nic = net->model;
-@@ -3758,23 +3757,13 @@ qemuBuildNicDevStr(virDomainDefPtr def,
- virBufferAsprintf(&buf, ",rx_queue_size=%u", net->driver.virtio.rx_queue_size);
- }
-
-- if (usingVirtio && mtu) {
-- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
--
-- virBufferAsprintf(&buf, ",host_mtu=%u", mtu);
--
-- } else {
-- /* log an error if mtu was requested specifically for this
-- * interface, otherwise, if it's just what was reported by
-- * the attached network, ignore it.
-- */
-- if (net->mtu) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-- _("setting MTU is not supported with "
-- "this QEMU binary"));
-- goto error;
-- }
-+ if (usingVirtio && net->mtu) {
-+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("setting MTU is not supported with this QEMU binary"));
-+ goto error;
- }
-+ virBufferAsprintf(&buf, ",host_mtu=%u", net->mtu);
- }
-
- if (vlan == -1)
-@@ -8275,7 +8264,7 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver,
- VIR_FREE(netdev);
-
- if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex,
-- queues, qemuCaps, net->mtu))) {
-+ queues, qemuCaps))) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("Error generating NIC -device string"));
- goto error;
-@@ -8321,7 +8310,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
- virDomainNetType actualType = virDomainNetGetActualType(net);
- virNetDevBandwidthPtr actualBandwidth;
- size_t i;
-- unsigned int mtu = net->mtu;
-
-
- if (!bootindex)
-@@ -8376,7 +8364,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
- memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
-
- if (qemuInterfaceBridgeConnect(def, driver, net,
-- tapfd, &tapfdSize, &mtu) < 0)
-+ tapfd, &tapfdSize) < 0)
- goto cleanup;
- break;
-
-@@ -8556,7 +8544,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
- }
- if (qemuDomainSupportsNicdev(def, net)) {
- if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex,
-- vhostfdSize, qemuCaps, mtu)))
-+ vhostfdSize, qemuCaps)))
- goto cleanup;
- virCommandAddArgList(cmd, "-device", nic, NULL);
- } else {
-diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
-index 7da92c8c9..09cb00ee9 100644
---- a/src/qemu/qemu_command.h
-+++ b/src/qemu/qemu_command.h
-@@ -101,8 +101,7 @@ char *qemuBuildNicDevStr(virDomainDefPtr def,
- int vlan,
- unsigned int bootindex,
- size_t vhostfdSize,
-- virQEMUCapsPtr qemuCaps,
-- unsigned int mtu);
-+ virQEMUCapsPtr qemuCaps);
-
- char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk);
-
-diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
-index 5c3660922..cdeb0617a 100644
---- a/src/qemu/qemu_hotplug.c
-+++ b/src/qemu/qemu_hotplug.c
-@@ -968,7 +968,6 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
- bool charDevPlugged = false;
- bool netdevPlugged = false;
- bool hostPlugged = false;
-- unsigned int mtu = net->mtu;
-
- /* preallocate new slot for device */
- if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
-@@ -1025,7 +1024,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
- goto cleanup;
- memset(vhostfd, -1, sizeof(*vhostfd) * vhostfdSize);
- if (qemuInterfaceBridgeConnect(vm->def, driver, net,
-- tapfd, &tapfdSize, &mtu) < 0)
-+ tapfd, &tapfdSize) < 0)
- goto cleanup;
- iface_connected = true;
- if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
-@@ -1239,7 +1238,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
- VIR_FORCE_CLOSE(vhostfd[i]);
-
- if (!(nicstr = qemuBuildNicDevStr(vm->def, net, vlan, 0,
-- queueSize, priv->qemuCaps, mtu)))
-+ queueSize, priv->qemuCaps)))
- goto try_remove;
-
- qemuDomainObjEnterMonitor(driver, vm);
-diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
-index c643b76ec..e11d69c3e 100644
---- a/src/qemu/qemu_interface.c
-+++ b/src/qemu/qemu_interface.c
-@@ -503,8 +503,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
- virQEMUDriverPtr driver,
- virDomainNetDefPtr net,
- int *tapfd,
-- size_t *tapfdSize,
-- unsigned int *mtu)
-+ size_t *tapfdSize)
- {
- const char *brname;
- int ret = -1;
-@@ -545,7 +544,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
- def->uuid, tunpath, tapfd, *tapfdSize,
- virDomainNetGetActualVirtPortProfile(net),
- virDomainNetGetActualVlan(net),
-- net->coalesce, net->mtu, mtu,
-+ net->coalesce, 0, NULL,
- tap_create_flags) < 0) {
- virDomainAuditNetDevice(def, net, tunpath, false);
- goto cleanup;
-diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h
-index ba74ac2cf..a7faa0b3d 100644
---- a/src/qemu/qemu_interface.h
-+++ b/src/qemu/qemu_interface.h
-@@ -51,8 +51,7 @@ int qemuInterfaceBridgeConnect(virDomainDefPtr def,
- virQEMUDriverPtr driver,
- virDomainNetDefPtr net,
- int *tapfd,
-- size_t *tapfdSize,
-- unsigned int *mtu)
-+ size_t *tapfdSize)
- ATTRIBUTE_NONNULL(2);
-
- int qemuInterfaceOpenVhostNet(virDomainDefPtr def,
---
-2.13.0
-
diff --git a/SOURCES/libvirt-Revert-virNetDevSupportBandwidth-Enable-QoS-for-vhostuser.patch b/SOURCES/libvirt-Revert-virNetDevSupportBandwidth-Enable-QoS-for-vhostuser.patch
new file mode 100644
index 0000000..c75d21b
--- /dev/null
+++ b/SOURCES/libvirt-Revert-virNetDevSupportBandwidth-Enable-QoS-for-vhostuser.patch
@@ -0,0 +1,39 @@
+From 9d000db886030a45b1d8d016dd884db6b61419de Mon Sep 17 00:00:00 2001
+Message-Id: <9d000db886030a45b1d8d016dd884db6b61419de@dist-git>
+From: Michal Privoznik
+Date: Mon, 13 Nov 2017 14:26:00 +0100
+Subject: [PATCH] Revert "virNetDevSupportBandwidth: Enable QoS for vhostuser"
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1497410
+
+This reverts commit bc8a99ef06417a2303ccab455f9f045e2a617916.
+
+The vhostuser is not a TAP. Therefore our QoS code is not able to
+set any bandwidth. I don't really understand what I was thinking.
+
+Signed-off-by: Michal Privoznik
+(cherry picked from commit 676768edeb28689c48f8fe9b6923003c1ed39584)
+Signed-off-by: Michal Privoznik
+Signed-off-by: Jiri Denemark
+---
+ src/conf/netdev_bandwidth_conf.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/conf/netdev_bandwidth_conf.h b/src/conf/netdev_bandwidth_conf.h
+index c378280654..30f988953c 100644
+--- a/src/conf/netdev_bandwidth_conf.h
++++ b/src/conf/netdev_bandwidth_conf.h
+@@ -46,9 +46,9 @@ static inline bool virNetDevSupportBandwidth(virDomainNetType type)
+ case VIR_DOMAIN_NET_TYPE_NETWORK:
+ case VIR_DOMAIN_NET_TYPE_DIRECT:
+ case VIR_DOMAIN_NET_TYPE_ETHERNET:
+- case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+ return true;
+ case VIR_DOMAIN_NET_TYPE_USER:
++ case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+ case VIR_DOMAIN_NET_TYPE_SERVER:
+ case VIR_DOMAIN_NET_TYPE_CLIENT:
+ case VIR_DOMAIN_NET_TYPE_MCAST:
+--
+2.15.0
+
diff --git a/SOURCES/libvirt-Set-coalesce-settings-for-domain-interfaces.patch b/SOURCES/libvirt-Set-coalesce-settings-for-domain-interfaces.patch
deleted file mode 100644
index 745263f..0000000
--- a/SOURCES/libvirt-Set-coalesce-settings-for-domain-interfaces.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From 7fadd91380ce1000f3aa5b6e5c4b928f883fbb33 Mon Sep 17 00:00:00 2001
-Message-Id: <7fadd91380ce1000f3aa5b6e5c4b928f883fbb33@dist-git>
-From: Martin Kletzander
-Date: Tue, 25 Apr 2017 13:41:17 +0200
-Subject: [PATCH] Set coalesce settings for domain interfaces
-
-This patch makes use of the virNetDevSetCoalesce() function to make
-appropriate settings effective for devices that support them.
-
-Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1414627
-
-Signed-off-by: Martin Kletzander
-(cherry picked from commit fcef44728dff9cb708d00d17f5e0b44aa513f27b)
-Signed-off-by: Martin Kletzander
-Signed-off-by: Jiri Denemark
----
- src/bhyve/bhyve_command.c | 2 +-
- src/network/bridge_driver.c | 2 +-
- src/qemu/qemu_interface.c | 2 +-
- src/uml/uml_conf.c | 2 +-
- src/util/virnetdevtap.c | 5 +++++
- src/util/virnetdevtap.h | 2 ++
- tests/bhyvexml2argvmock.c | 1 +
- 7 files changed, 12 insertions(+), 4 deletions(-)
-
-diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
-index e0528ed77..e9c072b9f 100644
---- a/src/bhyve/bhyve_command.c
-+++ b/src/bhyve/bhyve_command.c
-@@ -100,7 +100,7 @@ bhyveBuildNetArgStr(virConnectPtr conn,
- def->uuid, NULL, NULL, 0,
- virDomainNetGetActualVirtPortProfile(net),
- virDomainNetGetActualVlan(net),
-- 0, NULL,
-+ NULL, 0, NULL,
- VIR_NETDEV_TAP_CREATE_IFUP | VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
- goto cleanup;
- }
-diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
-index 41bce794a..b0026ab17 100644
---- a/src/network/bridge_driver.c
-+++ b/src/network/bridge_driver.c
-@@ -2315,7 +2315,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
- if (virNetDevTapCreateInBridgePort(network->def->bridge,
- &macTapIfName, &network->def->mac,
- NULL, NULL, &tapfd, 1, NULL, NULL,
-- network->def->mtu, NULL,
-+ NULL, network->def->mtu, NULL,
- VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE |
- VIR_NETDEV_TAP_CREATE_IFUP |
- VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
-diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
-index c5dca60f1..2057ac929 100644
---- a/src/qemu/qemu_interface.c
-+++ b/src/qemu/qemu_interface.c
-@@ -545,7 +545,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
- def->uuid, tunpath, tapfd, *tapfdSize,
- virDomainNetGetActualVirtPortProfile(net),
- virDomainNetGetActualVlan(net),
-- net->mtu, mtu,
-+ net->coalesce, net->mtu, mtu,
- tap_create_flags) < 0) {
- virDomainAuditNetDevice(def, net, tunpath, false);
- goto cleanup;
-diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
-index 871653c5a..bdef78324 100644
---- a/src/uml/uml_conf.c
-+++ b/src/uml/uml_conf.c
-@@ -125,7 +125,7 @@ umlConnectTapDevice(virDomainDefPtr vm,
- vm->uuid, net->backend.tap, &tapfd, 1,
- virDomainNetGetActualVirtPortProfile(net),
- virDomainNetGetActualVlan(net),
-- 0, NULL,
-+ NULL, 0, NULL,
- VIR_NETDEV_TAP_CREATE_IFUP |
- VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
- if (template_ifname)
-diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c
-index 93002b929..c8dacfe27 100644
---- a/src/util/virnetdevtap.c
-+++ b/src/util/virnetdevtap.c
-@@ -584,6 +584,7 @@ virNetDevTapAttachBridge(const char *tapname,
- * @tapfd: array of file descriptor return value for the new tap device
- * @tapfdSize: number of file descriptors in @tapfd
- * @virtPortProfile: bridge/port specific configuration
-+ * @coalesce: optional coalesce parameters
- * @mtu: requested MTU for port (or 0 for "default")
- * @actualMTU: MTU actually set for port (after accounting for bridge's MTU)
- * @flags: OR of virNetDevTapCreateFlags:
-@@ -616,6 +617,7 @@ int virNetDevTapCreateInBridgePort(const char *brname,
- size_t tapfdSize,
- virNetDevVPortProfilePtr virtPortProfile,
- virNetDevVlanPtr virtVlan,
-+ virNetDevCoalescePtr coalesce,
- unsigned int mtu,
- unsigned int *actualMTU,
- unsigned int flags)
-@@ -661,6 +663,9 @@ int virNetDevTapCreateInBridgePort(const char *brname,
- if (virNetDevSetOnline(*ifname, !!(flags & VIR_NETDEV_TAP_CREATE_IFUP)) < 0)
- goto error;
-
-+ if (virNetDevSetCoalesce(*ifname, coalesce) < 0)
-+ goto error;
-+
- return 0;
-
- error:
-diff --git a/src/util/virnetdevtap.h b/src/util/virnetdevtap.h
-index 6bb3b8891..bd5ec14d4 100644
---- a/src/util/virnetdevtap.h
-+++ b/src/util/virnetdevtap.h
-@@ -24,6 +24,7 @@
- # define __VIR_NETDEV_TAP_H__
-
- # include "internal.h"
-+# include "virnetdev.h"
- # include "virnetdevvportprofile.h"
- # include "virnetdevvlan.h"
-
-@@ -83,6 +84,7 @@ int virNetDevTapCreateInBridgePort(const char *brname,
- size_t tapfdSize,
- virNetDevVPortProfilePtr virtPortProfile,
- virNetDevVlanPtr virtVlan,
-+ virNetDevCoalescePtr coalesce,
- unsigned int mtu,
- unsigned int *actualMTU,
- unsigned int flags)
-diff --git a/tests/bhyvexml2argvmock.c b/tests/bhyvexml2argvmock.c
-index fd714694f..7afa0e34c 100644
---- a/tests/bhyvexml2argvmock.c
-+++ b/tests/bhyvexml2argvmock.c
-@@ -28,6 +28,7 @@ int virNetDevTapCreateInBridgePort(const char *brname ATTRIBUTE_UNUSED,
- size_t tapfdSize ATTRIBUTE_UNUSED,
- virNetDevVPortProfilePtr virtPortProfile ATTRIBUTE_UNUSED,
- virNetDevVlanPtr virtVlan ATTRIBUTE_UNUSED,
-+ virNetDevCoalescePtr coalesce ATTRIBUTE_UNUSED,
- unsigned int mtu ATTRIBUTE_UNUSED,
- unsigned int *actualMTU ATTRIBUTE_UNUSED,
- unsigned int fakeflags ATTRIBUTE_UNUSED)
---
-2.12.2
-
diff --git a/SOURCES/libvirt-Split-out-virDomainIOMMUDefFormat.patch b/SOURCES/libvirt-Split-out-virDomainIOMMUDefFormat.patch
deleted file mode 100644
index 5df4c85..0000000
--- a/SOURCES/libvirt-Split-out-virDomainIOMMUDefFormat.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 0823b17d4ddc02a0bfca9fece7ff5ae3fd106a91 Mon Sep 17 00:00:00 2001
-Message-Id: <0823b17d4ddc02a0bfca9fece7ff5ae3fd106a91@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Tue, 16 May 2017 10:44:49 +0200
-Subject: [PATCH] Split out virDomainIOMMUDefFormat
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Make adding subelements easier.
-
-(cherry picked from commit d34ac94351255721ae86eba561cd2ba1d620ab7b)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1427005
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index a918ecd59..4096b9caf 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -24068,6 +24068,15 @@ virDomainDefIothreadShouldFormat(virDomainDefPtr def)
- }
-
-
-+static void
-+virDomainIOMMUDefFormat(virBufferPtr buf,
-+ const virDomainIOMMUDef *iommu)
-+{
-+ virBufferAsprintf(buf, " \n",
-+ virDomainIOMMUModelTypeToString(iommu->model));
-+}
-+
-+
- /* This internal version appends to an existing buffer
- * (possibly with auto-indent), rather than flattening
- * to string.
-@@ -24814,10 +24823,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
- goto error;
- }
-
-- if (def->iommu) {
-- virBufferAsprintf(buf, " \n",
-- virDomainIOMMUModelTypeToString(def->iommu->model));
-- }
-+ if (def->iommu)
-+ virDomainIOMMUDefFormat(buf, def->iommu);
-
- virBufferAdjustIndent(buf, -2);
- virBufferAddLit(buf, "\n");
---
-2.13.0
-
diff --git a/SOURCES/libvirt-Use-a-separate-buffer-for-controller-driver.patch b/SOURCES/libvirt-Use-a-separate-buffer-for-controller-driver.patch
deleted file mode 100644
index 8c44da7..0000000
--- a/SOURCES/libvirt-Use-a-separate-buffer-for-controller-driver.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 4e32b3e8ab394aaf1f94b1166d7c5e38cec8ede4 Mon Sep 17 00:00:00 2001
-Message-Id: <4e32b3e8ab394aaf1f94b1166d7c5e38cec8ede4@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:53 +0200
-Subject: [PATCH] Use a separate buffer for
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Make adding new attributes easier.
-
-(cherry picked from commit 5e5fc766257b05979c37593434d28cc9eb7e0cf0)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 39 ++++++++++++++++++++-------------------
- 1 file changed, 20 insertions(+), 19 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index d5c5a7030b..242a79a7e7 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -21332,6 +21332,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
- const char *model = NULL;
- const char *modelName = NULL;
- bool pcihole64 = false, pciModel = false, pciTarget = false;
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- if (!type) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
-@@ -21436,26 +21437,26 @@ virDomainControllerDefFormat(virBufferPtr buf,
- }
- }
-
-- if (def->queues || def->cmd_per_lun ||
-- def->max_sectors || def->ioeventfd || def->iothread) {
-+ if (def->queues)
-+ virBufferAsprintf(&driverBuf, " queues='%u'", def->queues);
-+
-+ if (def->cmd_per_lun)
-+ virBufferAsprintf(&driverBuf, " cmd_per_lun='%u'", def->cmd_per_lun);
-+
-+ if (def->max_sectors)
-+ virBufferAsprintf(&driverBuf, " max_sectors='%u'", def->max_sectors);
-+
-+ if (def->ioeventfd) {
-+ virBufferAsprintf(&driverBuf, " ioeventfd='%s'",
-+ virTristateSwitchTypeToString(def->ioeventfd));
-+ }
-+
-+ if (def->iothread)
-+ virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
-+
-+ if (virBufferUse(&driverBuf)) {
- virBufferAddLit(buf, "queues)
-- virBufferAsprintf(buf, " queues='%u'", def->queues);
--
-- if (def->cmd_per_lun)
-- virBufferAsprintf(buf, " cmd_per_lun='%u'", def->cmd_per_lun);
--
-- if (def->max_sectors)
-- virBufferAsprintf(buf, " max_sectors='%u'", def->max_sectors);
--
-- if (def->ioeventfd) {
-- virBufferAsprintf(buf, " ioeventfd='%s'",
-- virTristateSwitchTypeToString(def->ioeventfd));
-- }
--
-- if (def->iothread)
-- virBufferAsprintf(buf, " iothread='%u'", def->iothread);
--
-+ virBufferAddBuffer(buf, &driverBuf);
- virBufferAddLit(buf, "/>\n");
- }
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Use-a-separate-buffer-for-disk-driver.patch b/SOURCES/libvirt-Use-a-separate-buffer-for-disk-driver.patch
deleted file mode 100644
index d623c15..0000000
--- a/SOURCES/libvirt-Use-a-separate-buffer-for-disk-driver.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-From 0f6008b1fa9b236f673163a123b71aeebb6b4454 Mon Sep 17 00:00:00 2001
-Message-Id: <0f6008b1fa9b236f673163a123b71aeebb6b4454@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:52 +0200
-Subject: [PATCH] Use a separate buffer for
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Eliminate the big condition at the start.
-Instead use a buffer and only format the element if the buffer
-is non-empty.
-
-(cherry picked from commit d89803d27c3088aff6f4d062a578fc9938a80e04)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 55 +++++++++++++++++++++++++-------------------------
- 1 file changed, 27 insertions(+), 28 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 4228cad610..d5c5a7030b 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -21088,6 +21088,7 @@ virDomainDiskDefFormat(virBufferPtr buf,
- const char *sgio = virDomainDeviceSGIOTypeToString(def->sgio);
- const char *discard = virDomainDiskDiscardTypeToString(def->discard);
- const char *detect_zeroes = virDomainDiskDetectZeroesTypeToString(def->detect_zeroes);
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- if (!type || !def->src->type) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
-@@ -21139,35 +21140,33 @@ virDomainDiskDefFormat(virBufferPtr buf,
- virBufferAddLit(buf, ">\n");
- virBufferAdjustIndent(buf, 2);
-
-- if (def->src->driverName || def->src->format > 0 || def->cachemode ||
-- def->error_policy || def->rerror_policy || def->iomode ||
-- def->ioeventfd || def->event_idx || def->copy_on_read ||
-- def->discard || def->iothread || def->detect_zeroes) {
-+ virBufferEscapeString(&driverBuf, " name='%s'", def->src->driverName);
-+ if (def->src->format > 0)
-+ virBufferAsprintf(&driverBuf, " type='%s'",
-+ virStorageFileFormatTypeToString(def->src->format));
-+ if (def->cachemode)
-+ virBufferAsprintf(&driverBuf, " cache='%s'", cachemode);
-+ if (def->error_policy)
-+ virBufferAsprintf(&driverBuf, " error_policy='%s'", error_policy);
-+ if (def->rerror_policy)
-+ virBufferAsprintf(&driverBuf, " rerror_policy='%s'", rerror_policy);
-+ if (def->iomode)
-+ virBufferAsprintf(&driverBuf, " io='%s'", iomode);
-+ if (def->ioeventfd)
-+ virBufferAsprintf(&driverBuf, " ioeventfd='%s'", ioeventfd);
-+ if (def->event_idx)
-+ virBufferAsprintf(&driverBuf, " event_idx='%s'", event_idx);
-+ if (def->copy_on_read)
-+ virBufferAsprintf(&driverBuf, " copy_on_read='%s'", copy_on_read);
-+ if (def->discard)
-+ virBufferAsprintf(&driverBuf, " discard='%s'", discard);
-+ if (def->iothread)
-+ virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
-+ if (def->detect_zeroes)
-+ virBufferAsprintf(&driverBuf, " detect_zeroes='%s'", detect_zeroes);
-+ if (virBufferUse(&driverBuf)) {
- virBufferAddLit(buf, "src->driverName);
-- if (def->src->format > 0)
-- virBufferAsprintf(buf, " type='%s'",
-- virStorageFileFormatTypeToString(def->src->format));
-- if (def->cachemode)
-- virBufferAsprintf(buf, " cache='%s'", cachemode);
-- if (def->error_policy)
-- virBufferAsprintf(buf, " error_policy='%s'", error_policy);
-- if (def->rerror_policy)
-- virBufferAsprintf(buf, " rerror_policy='%s'", rerror_policy);
-- if (def->iomode)
-- virBufferAsprintf(buf, " io='%s'", iomode);
-- if (def->ioeventfd)
-- virBufferAsprintf(buf, " ioeventfd='%s'", ioeventfd);
-- if (def->event_idx)
-- virBufferAsprintf(buf, " event_idx='%s'", event_idx);
-- if (def->copy_on_read)
-- virBufferAsprintf(buf, " copy_on_read='%s'", copy_on_read);
-- if (def->discard)
-- virBufferAsprintf(buf, " discard='%s'", discard);
-- if (def->iothread)
-- virBufferAsprintf(buf, " iothread='%u'", def->iothread);
-- if (def->detect_zeroes)
-- virBufferAsprintf(buf, " detect_zeroes='%s'", detect_zeroes);
-+ virBufferAddBuffer(buf, &driverBuf);
- virBufferAddLit(buf, "/>\n");
- }
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Use-a-separate-buffer-for-filesystem-driver.patch b/SOURCES/libvirt-Use-a-separate-buffer-for-filesystem-driver.patch
deleted file mode 100644
index e1d6b72..0000000
--- a/SOURCES/libvirt-Use-a-separate-buffer-for-filesystem-driver.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 71aa3b75eb2f6e01c0c8e0d1bc5c0d29e310d3fd Mon Sep 17 00:00:00 2001
-Message-Id: <71aa3b75eb2f6e01c0c8e0d1bc5c0d29e310d3fd@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:54 +0200
-Subject: [PATCH] Use a separate buffer for
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Format the attributes in a separate buffer and only
-print the element if it's not empty.
-
-(cherry picked from commit 8d704e6cf7da60156a0b25b165d4780e99a0fa2f)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 12 +++++++++---
- 1 file changed, 9 insertions(+), 3 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 242a79a7e7..e004559f9f 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -21504,6 +21504,7 @@ virDomainFSDefFormat(virBufferPtr buf,
- const char *fsdriver = virDomainFSDriverTypeToString(def->fsdriver);
- const char *wrpolicy = virDomainFSWrpolicyTypeToString(def->wrpolicy);
- const char *src = def->src->path;
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- if (!type) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
-@@ -21523,16 +21524,21 @@ virDomainFSDefFormat(virBufferPtr buf,
- type, accessmode);
- virBufferAdjustIndent(buf, 2);
- if (def->fsdriver) {
-- virBufferAsprintf(buf, "format)
-- virBufferAsprintf(buf, " format='%s'",
-+ virBufferAsprintf(&driverBuf, " format='%s'",
- virStorageFileFormatTypeToString(def->format));
-
- /* Don't generate anything if wrpolicy is set to default */
- if (def->wrpolicy)
-- virBufferAsprintf(buf, " wrpolicy='%s'", wrpolicy);
-+ virBufferAsprintf(&driverBuf, " wrpolicy='%s'", wrpolicy);
-
-+ }
-+
-+ if (virBufferUse(&driverBuf)) {
-+ virBufferAddLit(buf, " \n");
- }
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-Use-a-separate-buffer-for-input-subelements.patch b/SOURCES/libvirt-Use-a-separate-buffer-for-input-subelements.patch
deleted file mode 100644
index 89dd9e0..0000000
--- a/SOURCES/libvirt-Use-a-separate-buffer-for-input-subelements.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From c8fc71708382f37cfc7437b15f58e3d5ab1f2cb1 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:51 +0200
-Subject: [PATCH] Use a separate buffer for subelements
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Instead of figuring out upfront whether will be a single
-or a pair element, format the subelements into a separate buffer
-and close early if this buffer is empty.
-
-(cherry picked from commit 51219e11b8c57c7a9755eedd72986269b78ccfb7)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 21 +++++++++++----------
- 1 file changed, 11 insertions(+), 10 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index b473ce6b1e..4228cad610 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -23152,6 +23152,7 @@ virDomainInputDefFormat(virBufferPtr buf,
- {
- const char *type = virDomainInputTypeToString(def->type);
- const char *bus = virDomainInputBusTypeToString(def->bus);
-+ virBuffer childbuf = VIR_BUFFER_INITIALIZER;
-
- /* don't format keyboard into migratable XML for backward compatibility */
- if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE &&
-@@ -23174,17 +23175,17 @@ virDomainInputDefFormat(virBufferPtr buf,
- virBufferAsprintf(buf, " info, flags) ||
-- def->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH) {
-- virBufferAddLit(buf, ">\n");
-- virBufferAdjustIndent(buf, 2);
-- virBufferEscapeString(buf, " \n", def->source.evdev);
-- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
-- return -1;
-- virBufferAdjustIndent(buf, -2);
-- virBufferAddLit(buf, "\n");
-- } else {
-+ virBufferAdjustIndent(&childbuf, virBufferGetIndent(buf, false) + 2);
-+ virBufferEscapeString(&childbuf, " \n", def->source.evdev);
-+ if (virDomainDeviceInfoFormat(&childbuf, &def->info, flags) < 0)
-+ return -1;
-+
-+ if (!virBufferUse(&childbuf)) {
- virBufferAddLit(buf, "/>\n");
-+ } else {
-+ virBufferAddLit(buf, ">\n");
-+ virBufferAddBuffer(buf, &childbuf);
-+ virBufferAddLit(buf, "\n");
- }
-
- return 0;
---
-2.13.1
-
diff --git a/SOURCES/libvirt-add-virtio-related-options-to-memballoon.patch b/SOURCES/libvirt-add-virtio-related-options-to-memballoon.patch
deleted file mode 100644
index 8204d2b..0000000
--- a/SOURCES/libvirt-add-virtio-related-options-to-memballoon.patch
+++ /dev/null
@@ -1,147 +0,0 @@
-From f9a338cd5d0477291a0001a527d0add941f7ea37 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:49:01 +0200
-Subject: [PATCH] add virtio-related options to memballoon
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 82223f9364a9f47a39b7c66c241b82ae62f9fb4b)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 7 +++++++
- docs/schemas/domaincommon.rng | 5 +++++
- src/conf/domain_conf.c | 24 ++++++++++++++++++++++
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argv-virtio-options.xml | 1 +
- 5 files changed, 38 insertions(+)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 23546daae9..2556f383fc 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -6913,6 +6913,7 @@ qemu-kvm -net nic,model=? /dev/null
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
- <stats period='10'/>
-+ <driver iommu='on' ats='on'/>
- </memballoon>
- </devices>
- </domain>
-@@ -6957,6 +6958,12 @@ qemu-kvm -net nic,model=? /dev/null
- Since 1.1.1, requires QEMU 1.5
-
-
-+ driver
-+
-+ For model virtio
memballoon,
-+ Virtio-specific options can also be
-+ set. (Since 3.5.0 )
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 9e68bbc52d..f571af6706 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3730,6 +3730,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index bba50cf3fd..4768d02029 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -2292,6 +2292,7 @@ void virDomainMemballoonDefFree(virDomainMemballoonDefPtr def)
- return;
-
- virDomainDeviceInfoClear(&def->info);
-+ VIR_FREE(def->virtio);
-
- VIR_FREE(def);
- }
-@@ -12970,6 +12971,9 @@ virDomainMemballoonDefParseXML(xmlNodePtr node,
- else if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
- goto error;
-
-+ if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
-+ goto error;
-+
- cleanup:
- VIR_FREE(model);
- VIR_FREE(deflate);
-@@ -19582,6 +19586,10 @@ virDomainMemballoonDefCheckABIStability(virDomainMemballoonDefPtr src,
- return false;
- }
-
-+ if (src->virtio && dst->virtio &&
-+ !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
-+ return false;
-+
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
- return false;
-
-@@ -22934,6 +22942,22 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
- return -1;
- }
-
-+ if (def->virtio) {
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-+
-+ virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
-+
-+ if (virBufferCheckError(&driverBuf) < 0) {
-+ virBufferFreeAndReset(&childrenBuf);
-+ return -1;
-+ }
-+ if (virBufferUse(&driverBuf)) {
-+ virBufferAddLit(&childrenBuf, " \n");
-+ }
-+ }
-+
- if (!virBufferUse(&childrenBuf)) {
- virBufferAddLit(buf, "/>\n");
- } else {
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 603d35bd50..f1f9208b91 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -1609,6 +1609,7 @@ struct _virDomainMemballoonDef {
- virDomainDeviceInfo info;
- int period; /* seconds between collections */
- int autodeflate; /* enum virTristateSwitch */
-+ virDomainVirtioOptionsPtr virtio;
- };
-
- struct _virDomainNVRAMDef {
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-index 3357bc6d1b..b16a9847fe 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-options.xml
-@@ -73,6 +73,7 @@
-
-
-
-+
-
-
- /dev/random
---
-2.13.1
-
diff --git a/SOURCES/libvirt-audit-Fix-the-output-message-for-shmem.patch b/SOURCES/libvirt-audit-Fix-the-output-message-for-shmem.patch
deleted file mode 100644
index c3e819a..0000000
--- a/SOURCES/libvirt-audit-Fix-the-output-message-for-shmem.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From c71f920357ffb17cd13aaf9a12e8d77d1b29b08c Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Martin Kletzander
-Date: Mon, 5 Jun 2017 17:02:03 +0200
-Subject: [PATCH] audit: Fix the output message for shmem
-
-After some discussion on and off the linux-audit mailing list, we
-should use different fields for the audit messages.
-
-Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1218603
-
-Signed-off-by: Martin Kletzander
-(cherry picked from commit 6d12a1cb2fb0e0152a19518423dceafa7cf088fb)
-Signed-off-by: Martin Kletzander
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_audit.c | 24 +++++++++++++-----------
- 1 file changed, 13 insertions(+), 11 deletions(-)
-
-diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
-index 2d9ff5e3ff..1e667af73c 100644
---- a/src/conf/domain_audit.c
-+++ b/src/conf/domain_audit.c
-@@ -983,15 +983,13 @@ virDomainAuditShmem(virDomainObjPtr vm,
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- char *vmname = virAuditEncode("vm", vm->def->name);
- const char *srcpath = virDomainAuditChardevPath(&def->server.chr);
-- char *src = virAuditEncode("server", VIR_AUDIT_STR(srcpath));
-- char *shmem = virAuditEncode("shmem", VIR_AUDIT_STR(def->name));
- const char *virt = virDomainVirtTypeToString(vm->def->virtType);
-- char *size = NULL;
-+ char *shmpath = NULL;
-
- virUUIDFormat(vm->def->uuid, uuidstr);
-
-- if (!vmname || !src || !shmem ||
-- virAsprintfQuiet(&size, "%llu", def->size) < 0) {
-+ if (!vmname ||
-+ virAsprintfQuiet(&shmpath, "/dev/shm/%s", def->name) < 0) {
- VIR_WARN("OOM while encoding audit message");
- goto cleanup;
- }
-@@ -1002,14 +1000,18 @@ virDomainAuditShmem(virDomainObjPtr vm,
- virt = "?";
- }
-
-- VIR_AUDIT(VIR_AUDIT_RECORD_RESOURCE, success,
-- "virt=%s resrc=shmem reason=%s %s uuid=%s size=%s %s %s",
-- virt, reason, vmname, uuidstr, size, shmem, src);
-+ if (def->server.enabled) {
-+ VIR_AUDIT(VIR_AUDIT_RECORD_RESOURCE, success,
-+ "virt=%s resrc=ivshmem-socket reason=%s %s uuid=%s path=%s",
-+ virt, reason, vmname, uuidstr, VIR_AUDIT_STR(srcpath));
-+ } else {
-+ VIR_AUDIT(VIR_AUDIT_RECORD_RESOURCE, success,
-+ "virt=%s resrc=shmem reason=%s %s uuid=%s size=%llu path=%s",
-+ virt, reason, vmname, uuidstr, def->size, VIR_AUDIT_STR(shmpath));
-+ }
-
- cleanup:
- VIR_FREE(vmname);
-- VIR_FREE(src);
-- VIR_FREE(size);
-- VIR_FREE(shmem);
-+ VIR_FREE(shmpath);
- return;
- }
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Add-check-for-non-scsi_host-parent-during-vport-delete.patch b/SOURCES/libvirt-conf-Add-check-for-non-scsi_host-parent-during-vport-delete.patch
deleted file mode 100644
index 66afa80..0000000
--- a/SOURCES/libvirt-conf-Add-check-for-non-scsi_host-parent-during-vport-delete.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From aa337656da6b3e44ccaae85ec64538dee80000cf Mon Sep 17 00:00:00 2001
-Message-Id:
-From: John Ferlan
-Date: Thu, 13 Apr 2017 10:38:35 -0400
-Subject: [PATCH] conf: Add check for non scsi_host parent during vport delete
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1420740
-
-If the parent is not a scsi_host, then we can just happily return since
-we won't be removing a vport.
-
-Fixes a bug with the following output:
-
-$ virsh pool-destroy host4_hba_pool
-error: Failed to destroy pool host4_hba_pool
-error: internal error: Invalid adapter name 'pci_0000_10_00_1' for SCSI pool
-
-$
-
-(cherry picked from commit 84f178bdc7ab38011cc1f76759b0a41335285a4f)
-Signed-off-by: John Ferlan
----
- src/conf/node_device_conf.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
-index 7d0baa9d1..cc3fad8b9 100644
---- a/src/conf/node_device_conf.c
-+++ b/src/conf/node_device_conf.c
-@@ -2074,6 +2074,13 @@ virNodeDeviceDeleteVport(virConnectPtr conn,
- if (!(vhba_parent = virNodeDeviceGetParentName(conn, scsi_host_name)))
- goto cleanup;
-
-+ /* If the parent is not a scsi_host, then this is a pool backed
-+ * directly to an HBA and there's no vHBA to remove - so we're done */
-+ if (!STRPREFIX(vhba_parent, "scsi_host")) {
-+ ret = 0;
-+ goto cleanup;
-+ }
-+
- if (virSCSIHostGetNumber(vhba_parent, &parent_host) < 0)
- goto cleanup;
- }
---
-2.12.2
-
diff --git a/SOURCES/libvirt-conf-Add-infrastructure-for-disk-source-private-data-XML.patch b/SOURCES/libvirt-conf-Add-infrastructure-for-disk-source-private-data-XML.patch
new file mode 100644
index 0000000..2015326
--- /dev/null
+++ b/SOURCES/libvirt-conf-Add-infrastructure-for-disk-source-private-data-XML.patch
@@ -0,0 +1,510 @@
+From 996dfd6322782e72583384381ffebf91ef1d3e27 Mon Sep 17 00:00:00 2001
+Message-Id: <996dfd6322782e72583384381ffebf91ef1d3e27@dist-git>
+From: Peter Krempa
+Date: Thu, 14 Dec 2017 14:31:51 +0100
+Subject: [PATCH] conf: Add infrastructure for disk source private data XML
+
+VM drivers may need to store additional private data to the status XML
+so that it can be restored after libvirtd restart. Since not everything
+is needed add a callback infrastructure, where VM drivers can add only
+stuff they need.
+
+Note that the private data is formatted as a sub-element
+of the or sub-element. This is done since
+storing it out of band (in the VM private data) would require a complex
+matching process to allow to put the data into correct place.
+
+(cherry picked from commit aed3d038a6565f3b0e916bdb004ca90b302b200d)
+
+ Conflicts:
+ tests/qemublocktest.c: This file does not exist downstream yet.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1523261
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 136 ++++++++++++++++++++++++++++++++++----------
+ src/conf/domain_conf.h | 17 +++++-
+ src/conf/snapshot_conf.c | 18 +++---
+ src/network/bridge_driver.c | 2 +-
+ src/qemu/qemu_domain.c | 2 +-
+ tests/virstoragetest.c | 2 +-
+ 6 files changed, 134 insertions(+), 43 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 2d54037b71..ad9c16a1e0 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -8550,11 +8550,43 @@ virDomainDiskSourceEncryptionParse(xmlNodePtr node,
+ }
+
+
++static int
++virDomainDiskSourcePrivateDataParse(xmlXPathContextPtr ctxt,
++ virStorageSourcePtr src,
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
++{
++ xmlNodePtr saveNode = ctxt->node;
++ xmlNodePtr node;
++ int ret = -1;
++
++ if (!(flags & VIR_DOMAIN_DEF_PARSE_STATUS) ||
++ !xmlopt || !xmlopt->privateData.storageParse)
++ return 0;
++
++ if (!(node = virXPathNode("./privateData", ctxt)))
++ return 0;
++
++ ctxt->node = node;
++
++ if (xmlopt->privateData.storageParse(ctxt, src) < 0)
++ goto cleanup;
++
++ ret = 0;
++
++ cleanup:
++ ctxt->node = saveNode;
++
++ return ret;
++}
++
++
+ int
+ virDomainDiskSourceParse(xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ virStorageSourcePtr src,
+- unsigned int flags)
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ int ret = -1;
+ xmlNodePtr saveNode = ctxt->node;
+@@ -8593,6 +8625,9 @@ virDomainDiskSourceParse(xmlNodePtr node,
+ if (virDomainDiskSourceEncryptionParse(node, &src->encryption) < 0)
+ goto cleanup;
+
++ if (virDomainDiskSourcePrivateDataParse(ctxt, src, flags, xmlopt) < 0)
++ goto cleanup;
++
+ /* People sometimes pass a bogus '' source path when they mean to omit the
+ * source element completely (e.g. CDROM without media). This is just a
+ * little compatibility check to help those broken apps */
+@@ -8610,7 +8645,8 @@ virDomainDiskSourceParse(xmlNodePtr node,
+ static int
+ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
+ virStorageSourcePtr src,
+- unsigned int flags)
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ virStorageSourcePtr backingStore = NULL;
+ xmlNodePtr save_ctxt = ctxt->node;
+@@ -8668,8 +8704,8 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
+ goto cleanup;
+ }
+
+- if (virDomainDiskSourceParse(source, ctxt, backingStore, flags) < 0 ||
+- virDomainDiskBackingStoreParse(ctxt, backingStore, flags) < 0)
++ if (virDomainDiskSourceParse(source, ctxt, backingStore, flags, xmlopt) < 0 ||
++ virDomainDiskBackingStoreParse(ctxt, backingStore, flags, xmlopt) < 0)
+ goto cleanup;
+
+ VIR_STEAL_PTR(src->backingStore, backingStore);
+@@ -8771,7 +8807,8 @@ static int
+ virDomainDiskDefMirrorParse(virDomainDiskDefPtr def,
+ xmlNodePtr cur,
+ xmlXPathContextPtr ctxt,
+- unsigned int flags)
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ xmlNodePtr mirrorNode;
+ char *mirrorFormat = NULL;
+@@ -8809,7 +8846,8 @@ virDomainDiskDefMirrorParse(virDomainDiskDefPtr def,
+ goto cleanup;
+ }
+
+- if (virDomainDiskSourceParse(mirrorNode, ctxt, def->mirror, flags) < 0)
++ if (virDomainDiskSourceParse(mirrorNode, ctxt, def->mirror,
++ flags, xmlopt) < 0)
+ goto cleanup;
+ } else {
+ /* For back-compat reasons, we handle a file name
+@@ -9235,7 +9273,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
+ if (!source && virXMLNodeNameEqual(cur, "source")) {
+ sourceNode = cur;
+
+- if (virDomainDiskSourceParse(cur, ctxt, def->src, flags) < 0)
++ if (virDomainDiskSourceParse(cur, ctxt, def->src, flags, xmlopt) < 0)
+ goto error;
+
+ /* If we've already found an as a child of and
+@@ -9316,7 +9354,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
+ } else if (!def->mirror &&
+ virXMLNodeNameEqual(cur, "mirror") &&
+ !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) {
+- if (virDomainDiskDefMirrorParse(def, cur, ctxt, flags) < 0)
++ if (virDomainDiskDefMirrorParse(def, cur, ctxt, flags, xmlopt) < 0)
+ goto error;
+ } else if (!authdef &&
+ virXMLNodeNameEqual(cur, "auth")) {
+@@ -9587,7 +9625,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
+ product = NULL;
+
+ if (!(flags & VIR_DOMAIN_DEF_PARSE_DISK_SOURCE)) {
+- if (virDomainDiskBackingStoreParse(ctxt, def->src, flags) < 0)
++ if (virDomainDiskBackingStoreParse(ctxt, def->src, flags, xmlopt) < 0)
+ goto error;
+ }
+
+@@ -22349,12 +22387,43 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf,
+ }
+
+
++static int
++virDomainDiskSourceFormatPrivateData(virBufferPtr buf,
++ virStorageSourcePtr src,
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
++{
++ virBuffer childBuf = VIR_BUFFER_INITIALIZER;
++ int ret = -1;
++
++ if (!(flags & VIR_DOMAIN_DEF_FORMAT_STATUS) ||
++ !xmlopt || !xmlopt->privateData.storageFormat)
++ return 0;
++
++ virBufferSetChildIndent(&childBuf, buf);
++
++ if (xmlopt->privateData.storageFormat(src, &childBuf) < 0)
++ goto cleanup;
++
++ if (virXMLFormatElement(buf, "privateData", NULL, &childBuf) < 0)
++ goto cleanup;
++
++ ret = 0;
++
++ cleanup:
++ virBufferFreeAndReset(&childBuf);
++
++ return ret;
++}
++
++
+ static int
+ virDomainDiskSourceFormatInternal(virBufferPtr buf,
+ virStorageSourcePtr src,
+ int policy,
+ unsigned int flags,
+- bool skipSeclabels)
++ bool skipSeclabels,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ const char *startupPolicy = NULL;
+ virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
+@@ -22436,6 +22505,9 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
+ virStorageEncryptionFormat(&childBuf, src->encryption) < 0)
+ return -1;
+
++ if (virDomainDiskSourceFormatPrivateData(&childBuf, src, flags, xmlopt) < 0)
++ return -1;
++
+ if (virXMLFormatElement(buf, "source", &attrBuf, &childBuf) < 0)
+ goto error;
+ }
+@@ -22453,15 +22525,18 @@ int
+ virDomainDiskSourceFormat(virBufferPtr buf,
+ virStorageSourcePtr src,
+ int policy,
+- unsigned int flags)
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
+ {
+- return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false);
++ return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false, xmlopt);
+ }
+
+
+ static int
+ virDomainDiskBackingStoreFormat(virBufferPtr buf,
+- virStorageSourcePtr backingStore)
++ virStorageSourcePtr backingStore,
++ virDomainXMLOptionPtr xmlopt,
++ unsigned int flags)
+ {
+ const char *format;
+
+@@ -22490,9 +22565,9 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf,
+
+ virBufferAsprintf(buf, " \n", format);
+ /* We currently don't output seclabels for backing chain element */
+- if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, 0, true) < 0 ||
+- virDomainDiskBackingStoreFormat(buf,
+- backingStore->backingStore) < 0)
++ if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true, xmlopt) < 0 ||
++ virDomainDiskBackingStoreFormat(buf, backingStore->backingStore,
++ xmlopt, flags) < 0)
+ return -1;
+
+ virBufferAdjustIndent(buf, -2);
+@@ -22510,7 +22585,8 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf,
+ static int
+ virDomainDiskDefFormat(virBufferPtr buf,
+ virDomainDiskDefPtr def,
+- unsigned int flags)
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ const char *type = virStorageTypeToString(def->src->type);
+ const char *device = virDomainDiskDeviceTypeToString(def->device);
+@@ -22623,13 +22699,14 @@ virDomainDiskDefFormat(virBufferPtr buf,
+ }
+
+ if (virDomainDiskSourceFormat(buf, def->src, def->startupPolicy,
+- flags) < 0)
++ flags, xmlopt) < 0)
+ return -1;
+
+ /* Don't format backingStore to inactive XMLs until the code for
+ * persistent storage of backing chains is ready. */
+ if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) &&
+- virDomainDiskBackingStoreFormat(buf, def->src->backingStore) < 0)
++ virDomainDiskBackingStoreFormat(buf, def->src->backingStore,
++ xmlopt, flags) < 0)
+ return -1;
+
+ virBufferEscapeString(buf, " \n", def->domain_name);
+@@ -22666,7 +22743,7 @@ virDomainDiskDefFormat(virBufferPtr buf,
+ virBufferAddLit(buf, ">\n");
+ virBufferAdjustIndent(buf, 2);
+ virBufferEscapeString(buf, " \n", formatStr);
+- if (virDomainDiskSourceFormat(buf, def->mirror, 0, 0) < 0)
++ if (virDomainDiskSourceFormat(buf, def->mirror, 0, 0, xmlopt) < 0)
+ return -1;
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "\n");
+@@ -25897,7 +25974,8 @@ int
+ virDomainDefFormatInternal(virDomainDefPtr def,
+ virCapsPtr caps,
+ unsigned int flags,
+- virBufferPtr buf)
++ virBufferPtr buf,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ unsigned char *uuid;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+@@ -25952,10 +26030,10 @@ virDomainDefFormatInternal(virDomainDefPtr def,
+ * but no leading indentation before the starting element.
+ * Thankfully, libxml maps what looks like globals into
+ * thread-local uses, so we are thread-safe. */
+- xmlIndentTreeOutput = 1;
+- xmlbuf = xmlBufferCreate();
+- if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
+- virBufferGetIndent(buf, false) / 2, 1) < 0) {
++ xmlIndentTreeOutput = 1;
++ xmlbuf = xmlBufferCreate();
++ if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
++ virBufferGetIndent(buf, false) / 2, 1) < 0) {
+ xmlBufferFree(xmlbuf);
+ xmlIndentTreeOutput = oldIndentTreeOutput;
+ goto error;
+@@ -26528,7 +26606,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
+ def->emulator);
+
+ for (n = 0; n < def->ndisks; n++)
+- if (virDomainDiskDefFormat(buf, def->disks[n], flags) < 0)
++ if (virDomainDiskDefFormat(buf, def->disks[n], flags, xmlopt) < 0)
+ goto error;
+
+ for (n = 0; n < def->ncontrollers; n++)
+@@ -26715,7 +26793,7 @@ virDomainDefFormat(virDomainDefPtr def, virCapsPtr caps, unsigned int flags)
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS, NULL);
+- if (virDomainDefFormatInternal(def, caps, flags, &buf) < 0)
++ if (virDomainDefFormatInternal(def, caps, flags, &buf, NULL) < 0)
+ return NULL;
+
+ return virBufferContentAndReset(&buf);
+@@ -26750,7 +26828,7 @@ virDomainObjFormat(virDomainXMLOptionPtr xmlopt,
+ xmlopt->privateData.format(&buf, obj) < 0)
+ goto error;
+
+- if (virDomainDefFormatInternal(obj->def, caps, flags, &buf) < 0)
++ if (virDomainDefFormatInternal(obj->def, caps, flags, &buf, xmlopt) < 0)
+ goto error;
+
+ virBufferAdjustIndent(&buf, -2);
+@@ -27704,7 +27782,7 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src,
+
+ switch ((virDomainDeviceType) src->type) {
+ case VIR_DOMAIN_DEVICE_DISK:
+- rc = virDomainDiskDefFormat(&buf, src->data.disk, flags);
++ rc = virDomainDiskDefFormat(&buf, src->data.disk, flags, xmlopt);
+ break;
+ case VIR_DOMAIN_DEVICE_LEASE:
+ rc = virDomainLeaseDefFormat(&buf, src->data.lease);
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 698d3280fe..5e67c9a9c1 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -2626,6 +2626,12 @@ typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr,
+ virDomainObjPtr,
+ virDomainDefParserConfigPtr);
+
++typedef int (*virDomainXMLPrivateDataStorageSourceParseFunc)(xmlXPathContextPtr ctxt,
++ virStorageSourcePtr src);
++typedef int (*virDomainXMLPrivateDataStorageSourceFormatFunc)(virStorageSourcePtr src,
++ virBufferPtr buf);
++
++
+ typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallbacks;
+ typedef virDomainXMLPrivateDataCallbacks *virDomainXMLPrivateDataCallbacksPtr;
+ struct _virDomainXMLPrivateDataCallbacks {
+@@ -2639,6 +2645,8 @@ struct _virDomainXMLPrivateDataCallbacks {
+ virDomainXMLPrivateDataNewFunc chrSourceNew;
+ virDomainXMLPrivateDataFormatFunc format;
+ virDomainXMLPrivateDataParseFunc parse;
++ virDomainXMLPrivateDataStorageSourceParseFunc storageParse;
++ virDomainXMLPrivateDataStorageSourceFormatFunc storageFormat;
+ };
+
+ typedef bool (*virDomainABIStabilityDomain)(const virDomainDef *src,
+@@ -2963,12 +2971,14 @@ char *virDomainObjFormat(virDomainXMLOptionPtr xmlopt,
+ int virDomainDefFormatInternal(virDomainDefPtr def,
+ virCapsPtr caps,
+ unsigned int flags,
+- virBufferPtr buf);
++ virBufferPtr buf,
++ virDomainXMLOptionPtr xmlopt);
+
+ int virDomainDiskSourceFormat(virBufferPtr buf,
+ virStorageSourcePtr src,
+ int policy,
+- unsigned int flags);
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt);
+
+ int virDomainNetDefFormat(virBufferPtr buf,
+ virDomainNetDefPtr def,
+@@ -3017,7 +3027,8 @@ virDomainDiskRemoveByName(virDomainDefPtr def, const char *name);
+ int virDomainDiskSourceParse(xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ virStorageSourcePtr src,
+- unsigned int flags);
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt);
+
+ int virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net);
+ virDomainNetDefPtr virDomainNetFind(virDomainDefPtr def, const char *device);
+diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
+index f0e852c92b..d7b086242b 100644
+--- a/src/conf/snapshot_conf.c
++++ b/src/conf/snapshot_conf.c
+@@ -110,7 +110,8 @@ static int
+ virDomainSnapshotDiskDefParseXML(xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ virDomainSnapshotDiskDefPtr def,
+- unsigned int flags)
++ unsigned int flags,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ int ret = -1;
+ char *snapshot = NULL;
+@@ -155,7 +156,7 @@ virDomainSnapshotDiskDefParseXML(xmlNodePtr node,
+ }
+
+ if ((cur = virXPathNode("./source", ctxt)) &&
+- virDomainDiskSourceParse(cur, ctxt, def->src, flags) < 0)
++ virDomainDiskSourceParse(cur, ctxt, def->src, flags, xmlopt) < 0)
+ goto cleanup;
+
+ if ((driver = virXPathString("string(./driver/@type)", ctxt))) {
+@@ -348,8 +349,8 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
+ goto cleanup;
+ def->ndisks = n;
+ for (i = 0; i < def->ndisks; i++) {
+- if (virDomainSnapshotDiskDefParseXML(nodes[i], ctxt,
+- &def->disks[i], flags) < 0)
++ if (virDomainSnapshotDiskDefParseXML(nodes[i], ctxt, &def->disks[i],
++ flags, xmlopt) < 0)
+ goto cleanup;
+ }
+ VIR_FREE(nodes);
+@@ -663,7 +664,8 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def,
+
+ static void
+ virDomainSnapshotDiskDefFormat(virBufferPtr buf,
+- virDomainSnapshotDiskDefPtr disk)
++ virDomainSnapshotDiskDefPtr disk,
++ virDomainXMLOptionPtr xmlopt)
+ {
+ int type = disk->src->type;
+
+@@ -686,7 +688,7 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf,
+ if (disk->src->format > 0)
+ virBufferEscapeString(buf, " \n",
+ virStorageFileFormatTypeToString(disk->src->format));
+- virDomainDiskSourceFormat(buf, disk->src, 0, 0);
++ virDomainDiskSourceFormat(buf, disk->src, 0, 0, xmlopt);
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, " \n");
+@@ -740,13 +742,13 @@ virDomainSnapshotDefFormat(const char *domain_uuid,
+ virBufferAddLit(&buf, "\n");
+ virBufferAdjustIndent(&buf, 2);
+ for (i = 0; i < def->ndisks; i++)
+- virDomainSnapshotDiskDefFormat(&buf, &def->disks[i]);
++ virDomainSnapshotDiskDefFormat(&buf, &def->disks[i], xmlopt);
+ virBufferAdjustIndent(&buf, -2);
+ virBufferAddLit(&buf, " \n");
+ }
+
+ if (def->dom) {
+- if (virDomainDefFormatInternal(def->dom, caps, flags, &buf) < 0)
++ if (virDomainDefFormatInternal(def->dom, caps, flags, &buf, xmlopt) < 0)
+ goto error;
+ } else if (domain_uuid) {
+ virBufferAddLit(&buf, "\n");
+diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
+index fcaa66df91..334da7a85d 100644
+--- a/src/network/bridge_driver.c
++++ b/src/network/bridge_driver.c
+@@ -233,7 +233,7 @@ networkRunHook(virNetworkObjPtr obj,
+ goto cleanup;
+ if (virNetworkDefFormatBuf(&buf, def, 0) < 0)
+ goto cleanup;
+- if (dom && virDomainDefFormatInternal(dom, NULL, 0, &buf) < 0)
++ if (dom && virDomainDefFormatInternal(dom, NULL, 0, &buf, NULL) < 0)
+ goto cleanup;
+
+ virBufferAdjustIndent(&buf, -2);
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index 9dd9db049b..625bcb20d5 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -5245,7 +5245,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+ format:
+ ret = virDomainDefFormatInternal(def, caps,
+ virDomainDefFormatConvertXMLFlags(flags),
+- buf);
++ buf, driver->xmlopt);
+
+ cleanup:
+ virDomainDefFree(copy);
+diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
+index e1d8751728..bdd0829c21 100644
+--- a/tests/virstoragetest.c
++++ b/tests/virstoragetest.c
+@@ -693,7 +693,7 @@ testBackingParse(const void *args)
+ goto cleanup;
+ }
+
+- if (virDomainDiskSourceFormat(&buf, src, 0, 0) < 0 ||
++ if (virDomainDiskSourceFormat(&buf, src, 0, 0, NULL) < 0 ||
+ !(xml = virBufferContentAndReset(&buf))) {
+ fprintf(stderr, "failed to format disk source xml\n");
+ goto cleanup;
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Add-save-cookie-callbacks-to-xmlopt.patch b/SOURCES/libvirt-conf-Add-save-cookie-callbacks-to-xmlopt.patch
deleted file mode 100644
index d7101a8..0000000
--- a/SOURCES/libvirt-conf-Add-save-cookie-callbacks-to-xmlopt.patch
+++ /dev/null
@@ -1,427 +0,0 @@
-From 7cf2eee78e7e0e08eb1203f7fdb5705aba6b0e42 Mon Sep 17 00:00:00 2001
-Message-Id: <7cf2eee78e7e0e08eb1203f7fdb5705aba6b0e42@dist-git>
-From: Jiri Denemark
-Date: Fri, 2 Jun 2017 00:44:46 +0200
-Subject: [PATCH] conf: Add save cookie callbacks to xmlopt
-
-virDomainXMLOption gains driver specific callbacks for parsing and
-formatting save cookies.
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 25af7e950a9e35a6cffeed32bbcdd95dd7e01035)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441662
-
-Signed-off-by: Jiri Denemark
----
- src/bhyve/bhyve_domain.c | 2 +-
- src/conf/domain_conf.c | 16 +++++++++++++++-
- src/conf/domain_conf.h | 7 ++++++-
- src/conf/snapshot_conf.c | 11 ++++++++++-
- src/conf/snapshot_conf.h | 2 ++
- src/libvirt_private.syms | 1 +
- src/libxl/libxl_conf.c | 2 +-
- src/lxc/lxc_conf.c | 2 +-
- src/openvz/openvz_driver.c | 2 +-
- src/phyp/phyp_driver.c | 2 +-
- src/qemu/qemu_capabilities.c | 2 +-
- src/qemu/qemu_conf.c | 3 ++-
- src/security/virt-aa-helper.c | 2 +-
- src/test/test_driver.c | 2 +-
- src/uml/uml_driver.c | 2 +-
- src/vbox/vbox_common.c | 2 +-
- src/vmware/vmware_driver.c | 3 ++-
- src/vmx/vmx.c | 2 +-
- src/vz/vz_driver.c | 2 +-
- src/xen/xen_driver.c | 2 +-
- src/xenapi/xenapi_driver.c | 2 +-
- tests/bhyveargv2xmltest.c | 2 +-
- tests/testutils.c | 2 +-
- 23 files changed, 54 insertions(+), 21 deletions(-)
-
-diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
-index 0a99550afa..20c82937b5 100644
---- a/src/bhyve/bhyve_domain.c
-+++ b/src/bhyve/bhyve_domain.c
-@@ -144,7 +144,7 @@ virBhyveDriverCreateXMLConf(bhyveConnPtr driver)
- virBhyveDriverDomainDefParserConfig.priv = driver;
- return virDomainXMLOptionNew(&virBhyveDriverDomainDefParserConfig,
- &virBhyveDriverPrivateDataCallbacks,
-- NULL, NULL);
-+ NULL, NULL, NULL);
- }
-
- virDomainDefParserConfig virBhyveDriverDomainDefParserConfig = {
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 395dcc0531..b473ce6b1e 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -79,6 +79,9 @@ struct _virDomainXMLOption {
-
- /* ABI stability callbacks */
- virDomainABIStability abi;
-+
-+ /* Private data for save image stored in snapshot XML */
-+ virSaveCookieCallbacks saveCookie;
- };
-
- #define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS \
-@@ -1054,7 +1057,8 @@ virDomainXMLOptionPtr
- virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
- virDomainXMLPrivateDataCallbacksPtr priv,
- virDomainXMLNamespacePtr xmlns,
-- virDomainABIStabilityPtr abi)
-+ virDomainABIStabilityPtr abi,
-+ virSaveCookieCallbacksPtr saveCookie)
- {
- virDomainXMLOptionPtr xmlopt;
-
-@@ -1076,6 +1080,9 @@ virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
- if (abi)
- xmlopt->abi = *abi;
-
-+ if (saveCookie)
-+ xmlopt->saveCookie = *saveCookie;
-+
- /* Technically this forbids to use one of Xerox's MAC address prefixes in
- * our hypervisor drivers. This shouldn't ever be a problem.
- *
-@@ -1106,6 +1113,13 @@ virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt)
- }
-
-
-+virSaveCookieCallbacksPtr
-+virDomainXMLOptionGetSaveCookie(virDomainXMLOptionPtr xmlopt)
-+{
-+ return &xmlopt->saveCookie;
-+}
-+
-+
- void
- virBlkioDeviceArrayClear(virBlkioDevicePtr devices,
- int ndevices)
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index d64ef1b6e9..706d106ad9 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -55,6 +55,7 @@
- # include "virgic.h"
- # include "virperf.h"
- # include "virtypedparam.h"
-+# include "virsavecookie.h"
-
- /* forward declarations of all device types, required by
- * virDomainDeviceDef
-@@ -2549,7 +2550,11 @@ struct _virDomainABIStability {
- virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
- virDomainXMLPrivateDataCallbacksPtr priv,
- virDomainXMLNamespacePtr xmlns,
-- virDomainABIStabilityPtr abi);
-+ virDomainABIStabilityPtr abi,
-+ virSaveCookieCallbacksPtr saveCookie);
-+
-+virSaveCookieCallbacksPtr
-+virDomainXMLOptionGetSaveCookie(virDomainXMLOptionPtr xmlopt);
-
- void virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt, virMacAddrPtr mac);
-
-diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
-index e3bba985d7..6330f7d1f9 100644
---- a/src/conf/snapshot_conf.c
-+++ b/src/conf/snapshot_conf.c
-@@ -102,6 +102,7 @@ void virDomainSnapshotDefFree(virDomainSnapshotDefPtr def)
- virDomainSnapshotDiskDefClear(&def->disks[i]);
- VIR_FREE(def->disks);
- virDomainDefFree(def->dom);
-+ virObjectUnref(def->cookie);
- VIR_FREE(def);
- }
-
-@@ -214,6 +215,7 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
- char *memorySnapshot = NULL;
- char *memoryFile = NULL;
- bool offline = !!(flags & VIR_DOMAIN_SNAPSHOT_PARSE_OFFLINE);
-+ virSaveCookieCallbacksPtr saveCookie = virDomainXMLOptionGetSaveCookie(xmlopt);
-
- if (VIR_ALLOC(def) < 0)
- goto cleanup;
-@@ -365,6 +367,9 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
- def->current = active != 0;
- }
-
-+ if (!offline && virSaveCookieParse(ctxt, &def->cookie, saveCookie) < 0)
-+ goto cleanup;
-+
- ret = def;
-
- cleanup:
-@@ -691,7 +696,7 @@ char *
- virDomainSnapshotDefFormat(const char *domain_uuid,
- virDomainSnapshotDefPtr def,
- virCapsPtr caps,
-- virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
-+ virDomainXMLOptionPtr xmlopt,
- unsigned int flags,
- int internal)
- {
-@@ -751,6 +756,10 @@ virDomainSnapshotDefFormat(const char *domain_uuid,
- virBufferAddLit(&buf, " \n");
- }
-
-+ if (virSaveCookieFormatBuf(&buf, def->cookie,
-+ virDomainXMLOptionGetSaveCookie(xmlopt)) < 0)
-+ goto error;
-+
- if (internal)
- virBufferAsprintf(&buf, "%d \n", def->current);
-
-diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
-index 2ce526fa6b..1d663c77bc 100644
---- a/src/conf/snapshot_conf.h
-+++ b/src/conf/snapshot_conf.h
-@@ -76,6 +76,8 @@ struct _virDomainSnapshotDef {
-
- virDomainDefPtr dom;
-
-+ virObjectPtr cookie;
-+
- /* Internal use. */
- bool current; /* At most one snapshot in the list should have this set */
- };
-diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
-index b4769080e8..88e3f4b8ac 100644
---- a/src/libvirt_private.syms
-+++ b/src/libvirt_private.syms
-@@ -533,6 +533,7 @@ virDomainWatchdogActionTypeToString;
- virDomainWatchdogModelTypeFromString;
- virDomainWatchdogModelTypeToString;
- virDomainXMLOptionGetNamespace;
-+virDomainXMLOptionGetSaveCookie;
- virDomainXMLOptionNew;
-
-
-diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
-index dd345c22cf..28d31db158 100644
---- a/src/libxl/libxl_conf.c
-+++ b/src/libxl/libxl_conf.c
-@@ -2147,5 +2147,5 @@ libxlCreateXMLConf(void)
- {
- return virDomainXMLOptionNew(&libxlDomainDefParserConfig,
- &libxlDomainXMLPrivateDataCallbacks,
-- NULL, NULL);
-+ NULL, NULL, NULL);
- }
-diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
-index b46fbc58ff..8adc408c32 100644
---- a/src/lxc/lxc_conf.c
-+++ b/src/lxc/lxc_conf.c
-@@ -213,7 +213,7 @@ lxcDomainXMLConfInit(void)
- return virDomainXMLOptionNew(&virLXCDriverDomainDefParserConfig,
- &virLXCDriverPrivateDataCallbacks,
- &virLXCDriverDomainXMLNamespace,
-- NULL);
-+ NULL, NULL);
- }
-
-
-diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
-index 44a6631a99..4392aa64c0 100644
---- a/src/openvz/openvz_driver.c
-+++ b/src/openvz/openvz_driver.c
-@@ -1493,7 +1493,7 @@ static virDrvOpenStatus openvzConnectOpen(virConnectPtr conn,
- goto cleanup;
-
- if (!(driver->xmlopt = virDomainXMLOptionNew(&openvzDomainDefParserConfig,
-- NULL, NULL, NULL)))
-+ NULL, NULL, NULL, NULL)))
- goto cleanup;
-
- if (openvzLoadDomains(driver) < 0)
-diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
-index e85f66ffab..32cb681c75 100644
---- a/src/phyp/phyp_driver.c
-+++ b/src/phyp/phyp_driver.c
-@@ -1199,7 +1199,7 @@ phypConnectOpen(virConnectPtr conn,
- goto failure;
-
- if (!(phyp_driver->xmlopt = virDomainXMLOptionNew(&virPhypDriverDomainDefParserConfig,
-- NULL, NULL, NULL)))
-+ NULL, NULL, NULL, NULL)))
- goto failure;
-
- conn->privateData = phyp_driver;
-diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
-index 72d3f25763..29bb9949af 100644
---- a/src/qemu/qemu_capabilities.c
-+++ b/src/qemu/qemu_capabilities.c
-@@ -5027,7 +5027,7 @@ virQEMUCapsInitQMPCommandRun(virQEMUCapsInitQMPCommandPtr cmd,
- goto ignore;
- }
-
-- if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL, NULL)) ||
-+ if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL, NULL, NULL)) ||
- !(cmd->vm = virDomainObjNew(xmlopt)))
- goto cleanup;
-
-diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
-index 76eed25277..96956b7779 100644
---- a/src/qemu/qemu_conf.c
-+++ b/src/qemu/qemu_conf.c
-@@ -908,7 +908,8 @@ virQEMUDriverCreateXMLConf(virQEMUDriverPtr driver)
- return virDomainXMLOptionNew(&virQEMUDriverDomainDefParserConfig,
- &virQEMUDriverPrivateDataCallbacks,
- &virQEMUDriverDomainXMLNamespace,
-- &virQEMUDriverDomainABIStability);
-+ &virQEMUDriverDomainABIStability,
-+ NULL);
- }
-
-
-diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
-index 48201d5b8c..97436e5dc7 100644
---- a/src/security/virt-aa-helper.c
-+++ b/src/security/virt-aa-helper.c
-@@ -667,7 +667,7 @@ get_definition(vahControl * ctl, const char *xmlStr)
- goto exit;
- }
-
-- if (!(ctl->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL, NULL))) {
-+ if (!(ctl->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL, NULL, NULL))) {
- vah_error(ctl, 0, _("Failed to create XML config object"));
- goto exit;
- }
-diff --git a/src/test/test_driver.c b/src/test/test_driver.c
-index c8085dd797..4fd14ddee6 100644
---- a/src/test/test_driver.c
-+++ b/src/test/test_driver.c
-@@ -414,7 +414,7 @@ testDriverNew(void)
- goto error;
- }
-
-- if (!(ret->xmlopt = virDomainXMLOptionNew(NULL, NULL, &ns, NULL)) ||
-+ if (!(ret->xmlopt = virDomainXMLOptionNew(NULL, NULL, &ns, NULL, NULL)) ||
- !(ret->eventState = virObjectEventStateNew()) ||
- !(ret->domains = virDomainObjListNew()) ||
- !(ret->networks = virNetworkObjListNew()))
-diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
-index ae75daa596..f91ee2961e 100644
---- a/src/uml/uml_driver.c
-+++ b/src/uml/uml_driver.c
-@@ -533,7 +533,7 @@ umlStateInitialize(bool privileged,
- goto out_of_memory;
-
- if (!(uml_driver->xmlopt = virDomainXMLOptionNew(¨DriverDomainDefParserConfig,
-- &privcb, NULL, NULL)))
-+ &privcb, NULL, NULL, NULL)))
- goto error;
-
- if ((uml_driver->inotifyFD = inotify_init()) < 0) {
-diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
-index c739031660..4a79c43a1a 100644
---- a/src/vbox/vbox_common.c
-+++ b/src/vbox/vbox_common.c
-@@ -139,7 +139,7 @@ vboxDriverObjNew(void)
-
- if (!(driver->caps = vboxCapsInit()) ||
- !(driver->xmlopt = virDomainXMLOptionNew(&vboxDomainDefParserConfig,
-- NULL, NULL, NULL)))
-+ NULL, NULL, NULL, NULL)))
- goto cleanup;
-
- return driver;
-diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
-index 24e97a4969..525c85edc8 100644
---- a/src/vmware/vmware_driver.c
-+++ b/src/vmware/vmware_driver.c
-@@ -114,7 +114,8 @@ vmwareDomainXMLConfigInit(void)
- virDomainXMLPrivateDataCallbacks priv = { .alloc = vmwareDataAllocFunc,
- .free = vmwareDataFreeFunc };
-
-- return virDomainXMLOptionNew(&vmwareDomainDefParserConfig, &priv, NULL, NULL);
-+ return virDomainXMLOptionNew(&vmwareDomainDefParserConfig, &priv,
-+ NULL, NULL, NULL);
- }
-
- static virDrvOpenStatus
-diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
-index 3289a20026..96507f10f3 100644
---- a/src/vmx/vmx.c
-+++ b/src/vmx/vmx.c
-@@ -591,7 +591,7 @@ virDomainXMLOptionPtr
- virVMXDomainXMLConfInit(void)
- {
- return virDomainXMLOptionNew(&virVMXDomainDefParserConfig, NULL,
-- &virVMXDomainXMLNamespace, NULL);
-+ &virVMXDomainXMLNamespace, NULL, NULL);
- }
-
- char *
-diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
-index f0b6722a6e..532a6841f3 100644
---- a/src/vz/vz_driver.c
-+++ b/src/vz/vz_driver.c
-@@ -326,7 +326,7 @@ vzDriverObjNew(void)
- if (!(driver->caps = vzBuildCapabilities()) ||
- !(driver->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
- &vzDomainXMLPrivateDataCallbacksPtr,
-- NULL, NULL)) ||
-+ NULL, NULL, NULL)) ||
- !(driver->domains = virDomainObjListNew()) ||
- !(driver->domainEventState = virObjectEventStateNew()) ||
- (vzInitVersion(driver) < 0) ||
-diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
-index 0c160f8370..ab74ba9928 100644
---- a/src/xen/xen_driver.c
-+++ b/src/xen/xen_driver.c
-@@ -401,7 +401,7 @@ virDomainXMLOptionPtr
- xenDomainXMLConfInit(void)
- {
- return virDomainXMLOptionNew(&xenDomainDefParserConfig,
-- NULL, NULL, NULL);
-+ NULL, NULL, NULL, NULL);
- }
-
-
-diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
-index 5623ddb507..c94fd422f9 100644
---- a/src/xenapi/xenapi_driver.c
-+++ b/src/xenapi/xenapi_driver.c
-@@ -200,7 +200,7 @@ xenapiConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
- }
-
- if (!(privP->xmlopt = virDomainXMLOptionNew(&xenapiDomainDefParserConfig,
-- NULL, NULL, NULL))) {
-+ NULL, NULL, NULL, NULL))) {
- xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to create XML conf object"));
- goto error;
-diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c
-index 5d7261a45b..43ef76a594 100644
---- a/tests/bhyveargv2xmltest.c
-+++ b/tests/bhyveargv2xmltest.c
-@@ -131,7 +131,7 @@ mymain(void)
- return EXIT_FAILURE;
-
- if ((driver.xmlopt = virDomainXMLOptionNew(NULL, NULL,
-- NULL, NULL)) == NULL)
-+ NULL, NULL, NULL)) == NULL)
- return EXIT_FAILURE;
-
- # define DO_TEST_FULL(name, flags) \
-diff --git a/tests/testutils.c b/tests/testutils.c
-index b7dc8d8408..0823469068 100644
---- a/tests/testutils.c
-+++ b/tests/testutils.c
-@@ -1136,7 +1136,7 @@ virDomainXMLOptionPtr virTestGenericDomainXMLConfInit(void)
- {
- return virDomainXMLOptionNew(&virTestGenericDomainDefParserConfig,
- &virTestGenericPrivateDataCallbacks,
-- NULL, NULL);
-+ NULL, NULL, NULL);
- }
-
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Add-spapr-pci-host-bridge-controller-model.patch b/SOURCES/libvirt-conf-Add-spapr-pci-host-bridge-controller-model.patch
deleted file mode 100644
index 015d42b..0000000
--- a/SOURCES/libvirt-conf-Add-spapr-pci-host-bridge-controller-model.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 851635352b217b63e7defc703f8a3f2a6719b490 Mon Sep 17 00:00:00 2001
-Message-Id: <851635352b217b63e7defc703f8a3f2a6719b490@dist-git>
-From: Andrea Bolognani
-Date: Mon, 17 Jul 2017 12:09:08 +0200
-Subject: [PATCH] conf: Add 'spapr-pci-host-bridge' controller model
-
-Adding it to the virDomainControllerPCIModelName enumeration
-is enough for existing code to handle it, so parsing and
-formatting will work without further tweaking.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit 90855eca3f7ceee964727c1d0f54541373d31908)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- docs/schemas/domaincommon.rng | 2 ++
- src/conf/domain_conf.c | 1 +
- src/conf/domain_conf.h | 1 +
- 3 files changed, 4 insertions(+)
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 78023ff4af..964e5c5bd5 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -1900,6 +1900,8 @@
-
-
-
-+
-+ spapr-pci-host-bridge
-
- pci-bridge
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 8e5c487df8..8a030c9b68 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -349,6 +349,7 @@ VIR_ENUM_IMPL(virDomainControllerPCIModelName,
- "pxb",
- "pxb-pcie",
- "pcie-root-port",
-+ "spapr-pci-host-bridge",
- );
-
- VIR_ENUM_IMPL(virDomainControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST,
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 4c33b0d15e..e287e6d7f3 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -710,6 +710,7 @@ typedef enum {
- VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB,
- VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB_PCIE,
- VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCIE_ROOT_PORT,
-+ VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE,
-
- VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_LAST
- } virDomainControllerPCIModelName;
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Add-support-for-cputune-cachetune.patch b/SOURCES/libvirt-conf-Add-support-for-cputune-cachetune.patch
new file mode 100644
index 0000000..5ff1f1b
--- /dev/null
+++ b/SOURCES/libvirt-conf-Add-support-for-cputune-cachetune.patch
@@ -0,0 +1,794 @@
+From ba1ce05bd6e49217cd8c89b75e741e518d2b9292 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Martin Kletzander
+Date: Wed, 31 Jan 2018 16:32:30 +0100
+Subject: [PATCH] conf: Add support for cputune/cachetune
+
+More info in the documentation, this is basically the XML parsing/formatting
+support, schemas, tests and documentation for the new cputune/cachetune element
+that will get used by following patches.
+
+Signed-off-by: Martin Kletzander
+(cherry picked from commit 7387e3fea44e28118e1f72841d79503849e15985)
+Signed-off-by: Martin Kletzander
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1289368
+
+Downstream changes:
+
+- Rename test XML files due to ab7a2fe230bb742cc4bc7f8d1475201b97fe49ab
+
+Signed-off-by: Martin Kletzander
+---
+ docs/formatdomain.html.in | 54 ++++
+ docs/schemas/domaincommon.rng | 32 +++
+ src/conf/domain_conf.c | 295 ++++++++++++++++++++-
+ src/conf/domain_conf.h | 13 +
+ .../genericxml2xmlindata/generic-cachetune-cdp.xml | 36 +++
+ .../generic-cachetune-colliding-allocs.xml | 30 +++
+ .../generic-cachetune-colliding-tunes.xml | 32 +++
+ .../generic-cachetune-colliding-types.xml | 30 +++
+ .../generic-cachetune-small.xml | 29 ++
+ tests/genericxml2xmlindata/generic-cachetune.xml | 33 +++
+ tests/genericxml2xmltest.c | 10 +
+ 11 files changed, 592 insertions(+), 2 deletions(-)
+ create mode 100644 tests/genericxml2xmlindata/generic-cachetune-cdp.xml
+ create mode 100644 tests/genericxml2xmlindata/generic-cachetune-colliding-allocs.xml
+ create mode 100644 tests/genericxml2xmlindata/generic-cachetune-colliding-tunes.xml
+ create mode 100644 tests/genericxml2xmlindata/generic-cachetune-colliding-types.xml
+ create mode 100644 tests/genericxml2xmlindata/generic-cachetune-small.xml
+ create mode 100644 tests/genericxml2xmlindata/generic-cachetune.xml
+
+diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
+index 0cfbf051b7..f33261d05c 100644
+--- a/docs/formatdomain.html.in
++++ b/docs/formatdomain.html.in
+@@ -689,6 +689,10 @@
+ <iothread_quota>-1</iothread_quota>
+ <vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
+ <iothreadsched iothreads='2' scheduler='batch'/>
++ <cachetune vcpus='0-3'>
++ <cache id='0' level='3' type='both' size='3' unit='MiB'/>
++ <cache id='1' level='3' type='both' size='3' unit='MiB'/>
++ </cachetune>
+ </cputune>
+ ...
+ </domain>
+@@ -834,6 +838,56 @@
+ Since 1.2.13
+
+
++ cachetune
Since 4.1.0
++
++ Optional cachetune
element can control allocations for CPU
++ caches using the resctrl on the host. Whether or not is this supported
++ can be gathered from capabilities where some limitations like minimum
++ size and required granularity are reported as well. The required
++ attribute vcpus
specifies to which vCPUs this allocation
++ applies. A vCPU can only be member of one cachetune
element
++ allocations. Supported subelements are:
++
++ cache
++
++ This element controls the allocation of CPU cache and has the
++ following attributes:
++
++ level
++
++ Host cache level from which to allocate.
++
++ id
++
++ Host cache id from which to allocate.
++
++ type
++
++ Type of allocation. Can be code
for code
++ (instructions), data
for data or both
++ for both code and data (unified). Currently the allocation can
++ be done only with the same type as the host supports, meaning
++ you cannot request both
for host with CDP
++ (code/data prioritization) enabled.
++
++ size
++
++ The size of the region to allocate. The value by default is in
++ bytes, but the unit
attribute can be used to scale
++ the value.
++
++ unit
(optional)
++
++ If specified it is the unit such as KiB, MiB, GiB, or TiB
++ (described in the memory
element
++ for Memory Allocation )
++ in which size
is specified, defaults to bytes.
++
++
++
++
++
++
+
+
+
+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
+index 05709afc0c..564674b659 100644
+--- a/docs/schemas/domaincommon.rng
++++ b/docs/schemas/domaincommon.rng
+@@ -900,6 +900,38 @@
+
+
+
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ both
++ code
++ data
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index ad9c16a1e0..181b035647 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -2886,6 +2886,19 @@ virDomainLoaderDefFree(virDomainLoaderDefPtr loader)
+ VIR_FREE(loader);
+ }
+
++
++static void
++virDomainCachetuneDefFree(virDomainCachetuneDefPtr cachetune)
++{
++ if (!cachetune)
++ return;
++
++ virObjectUnref(cachetune->alloc);
++ virBitmapFree(cachetune->vcpus);
++ VIR_FREE(cachetune);
++}
++
++
+ void virDomainDefFree(virDomainDefPtr def)
+ {
+ size_t i;
+@@ -3058,6 +3071,10 @@ void virDomainDefFree(virDomainDefPtr def)
+ virDomainShmemDefFree(def->shmems[i]);
+ VIR_FREE(def->shmems);
+
++ for (i = 0; i < def->ncachetunes; i++)
++ virDomainCachetuneDefFree(def->cachetunes[i]);
++ VIR_FREE(def->cachetunes);
++
+ VIR_FREE(def->keywrap);
+
+ if (def->namespaceData && def->ns.free)
+@@ -18233,6 +18250,194 @@ virDomainDefParseBootOptions(virDomainDefPtr def,
+ }
+
+
++static int
++virDomainCachetuneDefParseCache(xmlXPathContextPtr ctxt,
++ xmlNodePtr node,
++ virResctrlAllocPtr alloc)
++{
++ xmlNodePtr oldnode = ctxt->node;
++ unsigned int level;
++ unsigned int cache;
++ int type;
++ unsigned long long size;
++ char *tmp = NULL;
++ int ret = -1;
++
++ ctxt->node = node;
++
++ tmp = virXMLPropString(node, "id");
++ if (!tmp) {
++ virReportError(VIR_ERR_XML_ERROR, "%s",
++ _("Missing cachetune attribute 'id'"));
++ goto cleanup;
++ }
++ if (virStrToLong_uip(tmp, NULL, 10, &cache) < 0) {
++ virReportError(VIR_ERR_XML_ERROR,
++ _("Invalid cachetune attribute 'id' value '%s'"),
++ tmp);
++ goto cleanup;
++ }
++ VIR_FREE(tmp);
++
++ tmp = virXMLPropString(node, "level");
++ if (!tmp) {
++ virReportError(VIR_ERR_XML_ERROR, "%s",
++ _("Missing cachetune attribute 'level'"));
++ goto cleanup;
++ }
++ if (virStrToLong_uip(tmp, NULL, 10, &level) < 0) {
++ virReportError(VIR_ERR_XML_ERROR,
++ _("Invalid cachetune attribute 'level' value '%s'"),
++ tmp);
++ goto cleanup;
++ }
++ VIR_FREE(tmp);
++
++ tmp = virXMLPropString(node, "type");
++ if (!tmp) {
++ virReportError(VIR_ERR_XML_ERROR, "%s",
++ _("Missing cachetune attribute 'type'"));
++ goto cleanup;
++ }
++ type = virCacheTypeFromString(tmp);
++ if (type < 0) {
++ virReportError(VIR_ERR_XML_ERROR,
++ _("Invalid cachetune attribute 'type' value '%s'"),
++ tmp);
++ goto cleanup;
++ }
++ VIR_FREE(tmp);
++
++ if (virDomainParseScaledValue("./@size", "./@unit",
++ ctxt, &size, 1024,
++ ULLONG_MAX, true) < 0)
++ goto cleanup;
++
++ if (virResctrlAllocSetSize(alloc, level, type, cache, size) < 0)
++ goto cleanup;
++
++ ret = 0;
++ cleanup:
++ ctxt->node = oldnode;
++ VIR_FREE(tmp);
++ return ret;
++}
++
++
++static int
++virDomainCachetuneDefParse(virDomainDefPtr def,
++ xmlXPathContextPtr ctxt,
++ xmlNodePtr node,
++ unsigned int flags)
++{
++ xmlNodePtr oldnode = ctxt->node;
++ xmlNodePtr *nodes = NULL;
++ virBitmapPtr vcpus = NULL;
++ virResctrlAllocPtr alloc = virResctrlAllocNew();
++ virDomainCachetuneDefPtr tmp_cachetune = NULL;
++ char *tmp = NULL;
++ char *vcpus_str = NULL;
++ char *alloc_id = NULL;
++ ssize_t i = 0;
++ int n;
++ int ret = -1;
++
++ ctxt->node = node;
++
++ if (!alloc)
++ goto cleanup;
++
++ if (VIR_ALLOC(tmp_cachetune) < 0)
++ goto cleanup;
++
++ vcpus_str = virXMLPropString(node, "vcpus");
++ if (!vcpus_str) {
++ virReportError(VIR_ERR_XML_ERROR, "%s",
++ _("Missing cachetune attribute 'vcpus'"));
++ goto cleanup;
++ }
++ if (virBitmapParse(vcpus_str, &vcpus, VIR_DOMAIN_CPUMASK_LEN) < 0) {
++ virReportError(VIR_ERR_XML_ERROR,
++ _("Invalid cachetune attribute 'vcpus' value '%s'"),
++ vcpus_str);
++ goto cleanup;
++ }
++
++ /* We need to limit the bitmap to number of vCPUs. If there's nothing left,
++ * then we can just clean up and return 0 immediately */
++ virBitmapShrink(vcpus, def->maxvcpus);
++ if (virBitmapIsAllClear(vcpus)) {
++ ret = 0;
++ goto cleanup;
++ }
++
++ if ((n = virXPathNodeSet("./cache", ctxt, &nodes)) < 0) {
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("Cannot extract cache nodes under cachetune"));
++ goto cleanup;
++ }
++
++ for (i = 0; i < n; i++) {
++ if (virDomainCachetuneDefParseCache(ctxt, nodes[i], alloc) < 0)
++ goto cleanup;
++ }
++
++ if (virResctrlAllocIsEmpty(alloc)) {
++ ret = 0;
++ goto cleanup;
++ }
++
++ for (i = 0; i < def->ncachetunes; i++) {
++ if (virBitmapOverlaps(def->cachetunes[i]->vcpus, vcpus)) {
++ virReportError(VIR_ERR_XML_ERROR, "%s",
++ _("Overlapping vcpus in cachetunes"));
++ goto cleanup;
++ }
++ }
++
++ /* We need to format it back because we need to be consistent in the naming
++ * even when users specify some "sub-optimal" string there. */
++ VIR_FREE(vcpus_str);
++ vcpus_str = virBitmapFormat(vcpus);
++ if (!vcpus_str)
++ goto cleanup;
++
++ if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE))
++ alloc_id = virXMLPropString(node, "id");
++
++ if (!alloc_id) {
++ /* The number of allocations is limited and the directory structure is flat,
++ * not hierarchical, so we need to have all same allocations in one
++ * directory, so it's nice to have it named appropriately. For now it's
++ * 'vcpus_...' but it's designed in order for it to be changeable in the
++ * future (it's part of the status XML). */
++ if (virAsprintf(&alloc_id, "vcpus_%s", vcpus_str) < 0)
++ goto cleanup;
++ }
++
++ if (virResctrlAllocSetID(alloc, alloc_id) < 0)
++ goto cleanup;
++
++ VIR_STEAL_PTR(tmp_cachetune->vcpus, vcpus);
++ VIR_STEAL_PTR(tmp_cachetune->alloc, alloc);
++
++ if (VIR_APPEND_ELEMENT(def->cachetunes, def->ncachetunes, tmp_cachetune) < 0)
++ goto cleanup;
++
++ ret = 0;
++ cleanup:
++ ctxt->node = oldnode;
++ virDomainCachetuneDefFree(tmp_cachetune);
++ virObjectUnref(alloc);
++ virBitmapFree(vcpus);
++ VIR_FREE(alloc_id);
++ VIR_FREE(vcpus_str);
++ VIR_FREE(nodes);
++ VIR_FREE(tmp);
++ return ret;
++}
++
++
+ static virDomainDefPtr
+ virDomainDefParseXML(xmlDocPtr xml,
+ xmlNodePtr root,
+@@ -18785,6 +18990,18 @@ virDomainDefParseXML(xmlDocPtr xml,
+ }
+ VIR_FREE(nodes);
+
++ if ((n = virXPathNodeSet("./cputune/cachetune", ctxt, &nodes)) < 0) {
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("cannot extract cachetune nodes"));
++ goto error;
++ }
++
++ for (i = 0; i < n; i++) {
++ if (virDomainCachetuneDefParse(def, ctxt, nodes[i], flags) < 0)
++ goto error;
++ }
++ VIR_FREE(nodes);
++
+ if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &def->cpu) < 0)
+ goto error;
+
+@@ -25736,9 +25953,80 @@ virDomainSchedulerFormat(virBufferPtr buf,
+ }
+
+
++static int
++virDomainCachetuneDefFormatHelper(unsigned int level,
++ virCacheType type,
++ unsigned int cache,
++ unsigned long long size,
++ void *opaque)
++{
++ const char *unit;
++ virBufferPtr buf = opaque;
++ unsigned long long short_size = virFormatIntPretty(size, &unit);
++
++ virBufferAsprintf(buf,
++ " \n",
++ cache, level, virCacheTypeToString(type),
++ short_size, unit);
++
++ return 0;
++}
++
++
++static int
++virDomainCachetuneDefFormat(virBufferPtr buf,
++ virDomainCachetuneDefPtr cachetune,
++ unsigned int flags)
++{
++ virBuffer childrenBuf = VIR_BUFFER_INITIALIZER;
++ char *vcpus = NULL;
++ int ret = -1;
++
++ virBufferSetChildIndent(&childrenBuf, buf);
++ virResctrlAllocForeachSize(cachetune->alloc,
++ virDomainCachetuneDefFormatHelper,
++ &childrenBuf);
++
++
++ if (virBufferCheckError(&childrenBuf) < 0)
++ goto cleanup;
++
++ if (!virBufferUse(&childrenBuf)) {
++ ret = 0;
++ goto cleanup;
++ }
++
++ vcpus = virBitmapFormat(cachetune->vcpus);
++ if (!vcpus)
++ goto cleanup;
++
++ virBufferAsprintf(buf, "alloc);
++ if (!alloc_id)
++ goto cleanup;
++
++ virBufferAsprintf(buf, " id='%s'", alloc_id);
++ }
++ virBufferAddLit(buf, ">\n");
++
++ virBufferAddBuffer(buf, &childrenBuf);
++ virBufferAddLit(buf, " \n");
++
++ ret = 0;
++ cleanup:
++ virBufferFreeAndReset(&childrenBuf);
++ VIR_FREE(vcpus);
++ return ret;
++}
++
++
+ static int
+ virDomainCputuneDefFormat(virBufferPtr buf,
+- virDomainDefPtr def)
++ virDomainDefPtr def,
++ unsigned int flags)
+ {
+ size_t i;
+ virBuffer childrenBuf = VIR_BUFFER_INITIALIZER;
+@@ -25837,6 +26125,9 @@ virDomainCputuneDefFormat(virBufferPtr buf,
+ def->iothreadids[i]->iothread_id);
+ }
+
++ for (i = 0; i < def->ncachetunes; i++)
++ virDomainCachetuneDefFormat(&childrenBuf, def->cachetunes[i], flags);
++
+ if (virBufferCheckError(&childrenBuf) < 0)
+ return -1;
+
+@@ -26174,7 +26465,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
+ }
+ }
+
+- if (virDomainCputuneDefFormat(buf, def) < 0)
++ if (virDomainCputuneDefFormat(buf, def, flags) < 0)
+ goto error;
+
+ if (virDomainNumatuneFormatXML(buf, def->numa) < 0)
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 5e67c9a9c1..ed7b587bed 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -56,6 +56,7 @@
+ # include "virperf.h"
+ # include "virtypedparam.h"
+ # include "virsavecookie.h"
++# include "virresctrl.h"
+
+ /* forward declarations of all device types, required by
+ * virDomainDeviceDef
+@@ -2190,6 +2191,15 @@ struct _virDomainCputune {
+ };
+
+
++typedef struct _virDomainCachetuneDef virDomainCachetuneDef;
++typedef virDomainCachetuneDef *virDomainCachetuneDefPtr;
++
++struct _virDomainCachetuneDef {
++ virBitmapPtr vcpus;
++ virResctrlAllocPtr alloc;
++};
++
++
+ typedef struct _virDomainVcpuDef virDomainVcpuDef;
+ typedef virDomainVcpuDef *virDomainVcpuDefPtr;
+
+@@ -2318,6 +2328,9 @@ struct _virDomainDef {
+
+ virDomainCputune cputune;
+
++ virDomainCachetuneDefPtr *cachetunes;
++ size_t ncachetunes;
++
+ virDomainNumaPtr numa;
+ virDomainResourceDefPtr resource;
+ virDomainIdMapDef idmap;
+diff --git a/tests/genericxml2xmlindata/generic-cachetune-cdp.xml b/tests/genericxml2xmlindata/generic-cachetune-cdp.xml
+new file mode 100644
+index 0000000000..9718f06098
+--- /dev/null
++++ b/tests/genericxml2xmlindata/generic-cachetune-cdp.xml
+@@ -0,0 +1,36 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219136
++ 219136
++ 4
++
++
++
++
++
++
++
++
++
++
++
++
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-i686
++
++
++
++
++
++
++
++
+diff --git a/tests/genericxml2xmlindata/generic-cachetune-colliding-allocs.xml b/tests/genericxml2xmlindata/generic-cachetune-colliding-allocs.xml
+new file mode 100644
+index 0000000000..82c9176cba
+--- /dev/null
++++ b/tests/genericxml2xmlindata/generic-cachetune-colliding-allocs.xml
+@@ -0,0 +1,30 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219136
++ 219136
++ 4
++
++
++
++
++
++
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-i686
++
++
++
++
++
++
++
++
+diff --git a/tests/genericxml2xmlindata/generic-cachetune-colliding-tunes.xml b/tests/genericxml2xmlindata/generic-cachetune-colliding-tunes.xml
+new file mode 100644
+index 0000000000..a0f37028c9
+--- /dev/null
++++ b/tests/genericxml2xmlindata/generic-cachetune-colliding-tunes.xml
+@@ -0,0 +1,32 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219136
++ 219136
++ 4
++
++
++
++
++
++
++
++
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-i686
++
++
++
++
++
++
++
++
+diff --git a/tests/genericxml2xmlindata/generic-cachetune-colliding-types.xml b/tests/genericxml2xmlindata/generic-cachetune-colliding-types.xml
+new file mode 100644
+index 0000000000..c229eccee4
+--- /dev/null
++++ b/tests/genericxml2xmlindata/generic-cachetune-colliding-types.xml
+@@ -0,0 +1,30 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219136
++ 219136
++ 4
++
++
++
++
++
++
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-i686
++
++
++
++
++
++
++
++
+diff --git a/tests/genericxml2xmlindata/generic-cachetune-small.xml b/tests/genericxml2xmlindata/generic-cachetune-small.xml
+new file mode 100644
+index 0000000000..ab2d9cf885
+--- /dev/null
++++ b/tests/genericxml2xmlindata/generic-cachetune-small.xml
+@@ -0,0 +1,29 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219136
++ 219136
++ 4
++
++
++
++
++
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-i686
++
++
++
++
++
++
++
++
+diff --git a/tests/genericxml2xmlindata/generic-cachetune.xml b/tests/genericxml2xmlindata/generic-cachetune.xml
+new file mode 100644
+index 0000000000..645cab7771
+--- /dev/null
++++ b/tests/genericxml2xmlindata/generic-cachetune.xml
+@@ -0,0 +1,33 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219136
++ 219136
++ 4
++
++
++
++
++
++
++
++
++
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-i686
++
++
++
++
++
++
++
++
+diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
+index 0377a05e9c..4ced5c349c 100644
+--- a/tests/genericxml2xmltest.c
++++ b/tests/genericxml2xmltest.c
+@@ -130,6 +130,16 @@ mymain(void)
+ DO_TEST_FULL("chardev-reconnect-invalid-mode", 0, false,
+ TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE);
+
++ DO_TEST("cachetune");
++ DO_TEST("cachetune-small");
++ DO_TEST("cachetune-cdp");
++ DO_TEST_FULL("cachetune-colliding-allocs", false, true,
++ TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE);
++ DO_TEST_FULL("cachetune-colliding-tunes", false, true,
++ TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE);
++ DO_TEST_FULL("cachetune-colliding-types", false, true,
++ TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE);
++
+ virObjectUnref(caps);
+ virObjectUnref(xmlopt);
+
+--
+2.16.1
+
diff --git a/SOURCES/libvirt-conf-Add-target-type-and-model-for-pl011.patch b/SOURCES/libvirt-conf-Add-target-type-and-model-for-pl011.patch
new file mode 100644
index 0000000..fd6612b
--- /dev/null
+++ b/SOURCES/libvirt-conf-Add-target-type-and-model-for-pl011.patch
@@ -0,0 +1,952 @@
+From 623a617e8199a9c7abd1903399fdbeccf4e85add Mon Sep 17 00:00:00 2001
+Message-Id: <623a617e8199a9c7abd1903399fdbeccf4e85add@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:14 +0100
+Subject: [PATCH] conf: Add target type and model for pl011
+
+We can finally introduce a specific target model for the pl011 device
+used by mach-virt guests, which means isa-serial will no longer show
+up to confuse users.
+
+We make sure migration works in both directions by interpreting the
+isa-serial target type, or the lack of target type, appropriately
+when parsing the guest XML, and skipping the newly-introduced type
+when formatting if for migration. We also verify that pl011 is not
+used for non-mach-virt guests and add a bunch of test cases.
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit eccdcb81fcfd1641960d397c82986b4517841794)
+Signed-off-by: Jiri Denemark
+---
+ docs/formatdomain.html.in | 13 ++++---
+ docs/schemas/domaincommon.rng | 2 +
+ src/conf/domain_conf.c | 3 ++
+ src/conf/domain_conf.h | 2 +
+ src/qemu/qemu_command.c | 9 ++++-
+ src/qemu/qemu_domain.c | 26 +++++++++++++
+ src/qemu/qemu_domain_address.c | 1 +
+ .../qemuxml2argv-mach-virt-console-native.args | 1 +
+ .../qemuxml2argv-mach-virt-console-native.xml | 17 +++++++++
+ .../qemuxml2argv-mach-virt-console-virtio.args | 24 ++++++++++++
+ .../qemuxml2argv-mach-virt-console-virtio.xml | 19 ++++++++++
+ ...muxml2argv-mach-virt-serial+console-native.args | 1 +
+ ...emuxml2argv-mach-virt-serial+console-native.xml | 18 +++++++++
+ .../qemuxml2argv-mach-virt-serial-compat.args | 1 +
+ .../qemuxml2argv-mach-virt-serial-compat.xml | 19 ++++++++++
+ ...muxml2argv-mach-virt-serial-invalid-machine.xml | 21 +++++++++++
+ .../qemuxml2argv-mach-virt-serial-native.args | 23 +++++++++++
+ .../qemuxml2argv-mach-virt-serial-native.xml | 16 ++++++++
+ .../qemuxml2argv-mach-virt-serial-pci.args | 26 +++++++++++++
+ .../qemuxml2argv-mach-virt-serial-pci.xml | 18 +++++++++
+ .../qemuxml2argv-mach-virt-serial-usb.args | 27 +++++++++++++
+ .../qemuxml2argv-mach-virt-serial-usb.xml | 21 +++++++++++
+ tests/qemuxml2argvtest.c | 27 +++++++++++++
+ .../qemuxml2xmlout-aarch64-virtio-pci-default.xml | 4 +-
+ .../qemuxml2xmlout-mach-virt-console-native.xml | 1 +
+ .../qemuxml2xmlout-mach-virt-console-virtio.xml | 27 +++++++++++++
+ ...uxml2xmlout-mach-virt-serial+console-native.xml | 1 +
+ .../qemuxml2xmlout-mach-virt-serial-compat.xml | 31 +++++++++++++++
+ .../qemuxml2xmlout-mach-virt-serial-native.xml | 1 +
+ .../qemuxml2xmlout-mach-virt-serial-pci.xml | 44 ++++++++++++++++++++++
+ .../qemuxml2xmlout-mach-virt-serial-usb.xml | 41 ++++++++++++++++++++
+ tests/qemuxml2xmltest.c | 26 +++++++++++++
+ 32 files changed, 503 insertions(+), 8 deletions(-)
+ create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.xml
+ create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.xml
+ create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-invalid-machine.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.xml
+ create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-native.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-virtio.xml
+ create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial+console-native.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-compat.xml
+ create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-native.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-pci.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-usb.xml
+
+diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
+index 0634f3396a..87389f4e73 100644
+--- a/docs/formatdomain.html.in
++++ b/docs/formatdomain.html.in
+@@ -6463,8 +6463,9 @@ qemu-kvm -net nic,model=? /dev/null
+ with x86 guests), usb-serial
(usable whenever USB support
+ is available) and pci-serial
(usable whenever PCI support
+ is available); since 3.10.0 ,
+- spapr-vio-serial
(usable with ppc64/pseries guests)
+- is available as well.
++ spapr-vio-serial
(usable with ppc64/pseries guests) and
++ system-serial
(usable with aarch64/virt guests) are
++ available as well.
+
+
+
+@@ -6476,7 +6477,8 @@ qemu-kvm -net nic,model=? /dev/null
+ target type); pci-serial
+ (usable with the pci-serial
target type);
+ spapr-vty
(usable with the spapr-vio-serial
+- target type).
++ target type); pl011
(usable with the
++ system-serial
target type).
+
+
+
+@@ -6485,12 +6487,13 @@ qemu-kvm -net nic,model=? /dev/null
+
+
+
+- All of the target types support configuring the guest-visible device
++ Most target types support configuring the guest-visible device
+ address as documented above ; more
+ specifically, acceptable address types are isa
(for
+ isa-serial
), usb
(for usb-serial
),
+ pci
(for pci-serial
) and spapr-vio
+- (for spapr-vio-serial
).
++ (for spapr-vio-serial
). The system-serial
++ target type doesn't support specifying an address.
+
+
+
+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
+index 027d9ae7a1..957eae2832 100644
+--- a/docs/schemas/domaincommon.rng
++++ b/docs/schemas/domaincommon.rng
+@@ -3572,6 +3572,7 @@
+ usb-serial
+ pci-serial
+ spapr-vio-serial
++ system-serial
+
+
+
+@@ -3584,6 +3585,7 @@
+ usb-serial
+ pci-serial
+ spapr-vty
++ pl011
+
+
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 97c7a66b5b..32089df3c2 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -446,6 +446,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTarget,
+ "usb-serial",
+ "pci-serial",
+ "spapr-vio-serial",
++ "system-serial",
+ );
+
+ VIR_ENUM_IMPL(virDomainChrChannelTarget,
+@@ -474,6 +475,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
+ "usb-serial",
+ "pci-serial",
+ "spapr-vty",
++ "pl011",
+ );
+
+ VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
+@@ -4063,6 +4065,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
+ switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) {
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: {
+
+ /* Create a stub console to match the serial port.
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 979e8cca00..d6febf3059 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -1078,6 +1078,7 @@ typedef enum {
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM,
+
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST
+ } virDomainChrSerialTargetType;
+@@ -1111,6 +1112,7 @@ typedef enum {
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011,
+
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST
+ } virDomainChrSerialTargetModel;
+diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
+index 056dafea39..483eee6056 100644
+--- a/src/qemu/qemu_command.c
++++ b/src/qemu/qemu_command.c
+@@ -9230,6 +9230,7 @@ qemuChrSerialTargetModelToCaps(virDomainChrSerialTargetModel targetModel)
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
+ return QEMU_CAPS_DEVICE_SPAPR_VTY;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+ break;
+@@ -9261,10 +9262,13 @@ qemuChrIsPlatformDevice(const virDomainDef *def,
+ virDomainChrDefPtr chr)
+ {
+ if (def->os.arch == VIR_ARCH_ARMV7L || def->os.arch == VIR_ARCH_AARCH64) {
+- /* TARGET_TYPE_ISA here really means 'the default platform device' */
++
++ /* pl011 (used on mach-virt) is a platform device */
+ if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
+- chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA)
++ chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM &&
++ chr->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011) {
+ return true;
++ }
+ }
+
+ /* If we got all the way here and we're still stuck with the default
+@@ -10365,6 +10369,7 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
+ break;
+
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+ /* Except from _LAST, which is just a guard value and will never
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index 17c898896d..2fc173fa45 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -3468,6 +3468,7 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType)
+ return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ break;
+@@ -3489,6 +3490,8 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel)
+ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
+ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
++ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+ break;
+@@ -3525,6 +3528,16 @@ qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
+ }
+ break;
+
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
++ if (chr->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
++ _("Target type '%s' cannot have an "
++ "associated address"),
++ virDomainChrSerialTargetTypeToString(chr->targetType));
++ return -1;
++ }
++ break;
++
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ break;
+@@ -3536,6 +3549,7 @@ qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
+
+ expected = qemuDomainChrSerialTargetModelToTargetType(chr->targetModel);
+
+@@ -3592,6 +3606,12 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
+ isCompatible = false;
+ }
+
++ if (!qemuDomainIsVirt(def) &&
++ (dev->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM ||
++ dev->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011)) {
++ isCompatible = false;
++ }
++
+ if (!isCompatible) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Serial device with target type '%s' and "
+@@ -4243,6 +4263,8 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
+ } else if (qemuDomainIsPSeries(def)) {
+ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
++ } else if (qemuDomainIsVirt(def)) {
++ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM;
+ }
+ }
+
+@@ -4262,6 +4284,9 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY;
+ break;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
++ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011;
++ break;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ /* Nothing to do */
+@@ -5178,6 +5203,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+ if (flags & VIR_DOMAIN_XML_MIGRATABLE) {
+ switch ((virDomainChrSerialTargetType) serial->targetType) {
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
+ serial->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
+ serial->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE;
+ break;
+diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
+index f62bb2f97e..db9656a3a5 100644
+--- a/src/qemu/qemu_domain_address.c
++++ b/src/qemu/qemu_domain_address.c
+@@ -784,6 +784,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ return 0;
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.args
+new file mode 120000
+index 0000000000..1a90484d3b
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.args
+@@ -0,0 +1 @@
++qemuxml2argv-mach-virt-serial-native.args
+\ No newline at end of file
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.xml
+new file mode 100644
+index 0000000000..6aba864d0b
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-native.xml
+@@ -0,0 +1,17 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.args
+new file mode 100644
+index 0000000000..2a862bff18
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.args
+@@ -0,0 +1,24 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-aarch64 \
++-name guest \
++-S \
++-M virt \
++-m 512 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-no-acpi \
++-boot c \
++-device virtio-serial,id=virtio-serial0 \
++-chardev pty,id=charconsole0 \
++-device virtconsole,chardev=charconsole0,id=console0
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.xml
+new file mode 100644
+index 0000000000..92704504c8
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-console-virtio.xml
+@@ -0,0 +1,19 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.args
+new file mode 120000
+index 0000000000..1a90484d3b
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.args
+@@ -0,0 +1 @@
++qemuxml2argv-mach-virt-serial-native.args
+\ No newline at end of file
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.xml
+new file mode 100644
+index 0000000000..549b764e98
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial+console-native.xml
+@@ -0,0 +1,18 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.args
+new file mode 120000
+index 0000000000..1a90484d3b
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.args
+@@ -0,0 +1 @@
++qemuxml2argv-mach-virt-serial-native.args
+\ No newline at end of file
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.xml
+new file mode 100644
+index 0000000000..9e6be3ffeb
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-compat.xml
+@@ -0,0 +1,19 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-invalid-machine.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-invalid-machine.xml
+new file mode 100644
+index 0000000000..a8de76abf9
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-invalid-machine.xml
+@@ -0,0 +1,21 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-x86_64
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.args
+new file mode 100644
+index 0000000000..f4bfce376a
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.args
+@@ -0,0 +1,23 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-aarch64 \
++-name guest \
++-S \
++-M virt \
++-m 512 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-no-acpi \
++-boot c \
++-chardev pty,id=charserial0 \
++-serial chardev:charserial0
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.xml
+new file mode 100644
+index 0000000000..817f606eea
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-native.xml
+@@ -0,0 +1,16 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.args
+new file mode 100644
+index 0000000000..334194efe1
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.args
+@@ -0,0 +1,26 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-aarch64 \
++-name guest \
++-S \
++-M virt \
++-m 512 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-no-acpi \
++-boot c \
++-device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1 \
++-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x0 \
++-device pcie-root-port,port=0x10,chassis=3,id=pci.3,bus=pcie.0,addr=0x2 \
++-chardev pty,id=charserial0 \
++-device pci-serial,chardev=charserial0,id=serial0,bus=pci.2,addr=0x1
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.xml
+new file mode 100644
+index 0000000000..29aa7664b1
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-pci.xml
+@@ -0,0 +1,18 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.args b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.args
+new file mode 100644
+index 0000000000..44c4027acc
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.args
+@@ -0,0 +1,27 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-aarch64 \
++-name guest \
++-S \
++-M virt \
++-m 512 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-no-acpi \
++-boot c \
++-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\
++addr=0x1 \
++-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \
++-device qemu-xhci,id=usb,bus=pci.1,addr=0x0 \
++-chardev pty,id=charserial0 \
++-device usb-serial,chardev=charserial0,id=serial0,bus=usb.0,port=1
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.xml b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.xml
+new file mode 100644
+index 0000000000..35f192a3e5
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-mach-virt-serial-usb.xml
+@@ -0,0 +1,21 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
+index 2b3bbd1b8b..656b8c0995 100644
+--- a/tests/qemuxml2argvtest.c
++++ b/tests/qemuxml2argvtest.c
+@@ -1898,6 +1898,33 @@ mymain(void)
+ QEMU_CAPS_NODEFCONFIG);
+ DO_TEST_PARSE_ERROR("pseries-serial-invalid-machine", NONE);
+
++ DO_TEST("mach-virt-serial-native",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-serial+console-native",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-serial-compat",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-serial-pci",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_OBJECT_GPEX,
++ QEMU_CAPS_PCI_MULTIFUNCTION,
++ QEMU_CAPS_DEVICE_PCIE_ROOT_PORT,
++ QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
++ QEMU_CAPS_DEVICE_PCI_BRIDGE,
++ QEMU_CAPS_DEVICE_PCI_SERIAL);
++ DO_TEST("mach-virt-serial-usb",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_OBJECT_GPEX,
++ QEMU_CAPS_PCI_MULTIFUNCTION,
++ QEMU_CAPS_DEVICE_PCIE_ROOT_PORT,
++ QEMU_CAPS_DEVICE_QEMU_XHCI,
++ QEMU_CAPS_DEVICE_USB_SERIAL);
++ DO_TEST("mach-virt-console-native",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-console-virtio",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST_PARSE_ERROR("mach-virt-serial-invalid-machine", NONE);
++
+ DO_TEST("disk-ide-drive-split",
+ QEMU_CAPS_NODEFCONFIG,
+ QEMU_CAPS_IDE_CD);
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-virtio-pci-default.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-virtio-pci-default.xml
+index e5496424b3..9796d7f637 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-virtio-pci-default.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-virtio-pci-default.xml
+@@ -71,7 +71,9 @@
+
+
+
+-
++
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-native.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-native.xml
+new file mode 120000
+index 0000000000..a4768fcf86
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-native.xml
+@@ -0,0 +1 @@
++qemuxml2xmlout-mach-virt-serial-compat.xml
+\ No newline at end of file
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-virtio.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-virtio.xml
+new file mode 100644
+index 0000000000..3e46cd2012
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-console-virtio.xml
+@@ -0,0 +1,27 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 524288
++ 1
++
++ hvm
++
++
++
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial+console-native.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial+console-native.xml
+new file mode 120000
+index 0000000000..a4768fcf86
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial+console-native.xml
+@@ -0,0 +1 @@
++qemuxml2xmlout-mach-virt-serial-compat.xml
+\ No newline at end of file
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-compat.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-compat.xml
+new file mode 100644
+index 0000000000..3d7325a8db
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-compat.xml
+@@ -0,0 +1,31 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 524288
++ 1
++
++ hvm
++
++
++
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-native.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-native.xml
+new file mode 120000
+index 0000000000..a4768fcf86
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-native.xml
+@@ -0,0 +1 @@
++qemuxml2xmlout-mach-virt-serial-compat.xml
+\ No newline at end of file
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-pci.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-pci.xml
+new file mode 100644
+index 0000000000..4bcf69a3d1
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-pci.xml
+@@ -0,0 +1,44 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 524288
++ 1
++
++ hvm
++
++
++
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-usb.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-usb.xml
+new file mode 100644
+index 0000000000..01c2a52555
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-mach-virt-serial-usb.xml
+@@ -0,0 +1,41 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 524288
++ 1
++
++ hvm
++
++
++
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-aarch64
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
+index f76bd5a68d..bd18507bb6 100644
+--- a/tests/qemuxml2xmltest.c
++++ b/tests/qemuxml2xmltest.c
+@@ -788,6 +788,32 @@ mymain(void)
+ DO_TEST("pseries-console-virtio",
+ QEMU_CAPS_NODEFCONFIG);
+
++ DO_TEST("mach-virt-serial-native",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-serial+console-native",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-serial-compat",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-serial-pci",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_OBJECT_GPEX,
++ QEMU_CAPS_PCI_MULTIFUNCTION,
++ QEMU_CAPS_DEVICE_PCIE_ROOT_PORT,
++ QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
++ QEMU_CAPS_DEVICE_PCI_BRIDGE,
++ QEMU_CAPS_DEVICE_PCI_SERIAL);
++ DO_TEST("mach-virt-serial-usb",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_OBJECT_GPEX,
++ QEMU_CAPS_PCI_MULTIFUNCTION,
++ QEMU_CAPS_DEVICE_PCIE_ROOT_PORT,
++ QEMU_CAPS_DEVICE_QEMU_XHCI,
++ QEMU_CAPS_DEVICE_USB_SERIAL);
++ DO_TEST("mach-virt-console-native",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST("mach-virt-console-virtio",
++ QEMU_CAPS_NODEFCONFIG);
++
+ DO_TEST("balloon-device-auto", NONE);
+ DO_TEST("balloon-device-period", NONE);
+ DO_TEST("channel-virtio-auto", NONE);
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Add-target-type-and-model-for-spapr-vty.patch b/SOURCES/libvirt-conf-Add-target-type-and-model-for-spapr-vty.patch
new file mode 100644
index 0000000..610c5a2
--- /dev/null
+++ b/SOURCES/libvirt-conf-Add-target-type-and-model-for-spapr-vty.patch
@@ -0,0 +1,1042 @@
+From fd981b46a6729b5d5dac4923b860f888b0c193b9 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:12 +0100
+Subject: [PATCH] conf: Add target type and model for spapr-vty
+
+We can finally introduce a specific target model for the spapr-vty
+device used by pSeries guests, which means isa-serial will no longer
+show up to confuse users.
+
+We make sure migration works in both directions by interpreting the
+isa-serial target type, or the lack of target type, appropriately
+when parsing the guest XML, and skipping the newly-introduced type
+when formatting if for migration. We also verify that spapr-vty is
+not used for non-pSeries guests and add a bunch of test cases.
+
+This commit is best viewed with 'git show -w'.
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit c498a8921e447715189c8c6d22b7ca24cc810830)
+Signed-off-by: Jiri Denemark
+---
+ docs/formatdomain.html.in | 13 ++--
+ docs/schemas/domaincommon.rng | 2 +
+ src/conf/domain_conf.c | 6 +-
+ src/conf/domain_conf.h | 2 +
+ src/qemu/qemu_command.c | 67 +++++++++------------
+ src/qemu/qemu_domain.c | 69 ++++++++++++++++++----
+ src/qemu/qemu_domain_address.c | 1 +
+ .../qemuxml2argv-pseries-basic.args | 2 +-
+ .../qemuxml2argv-pseries-console-native.args | 1 +
+ .../qemuxml2argv-pseries-console-native.xml | 17 ++++++
+ .../qemuxml2argv-pseries-console-virtio.args | 23 ++++++++
+ .../qemuxml2argv-pseries-console-virtio.xml | 19 ++++++
+ .../qemuxml2argv-pseries-cpu-compat-power9.args | 2 +-
+ .../qemuxml2argv-pseries-cpu-compat.args | 2 +-
+ .../qemuxml2argv-pseries-cpu-exact.args | 2 +-
+ .../qemuxml2argv-pseries-cpu-le.args | 2 +-
+ .../qemuxml2argv-pseries-panic-missing.args | 2 +-
+ .../qemuxml2argv-pseries-panic-no-address.args | 2 +-
+ ...qemuxml2argv-pseries-serial+console-native.args | 1 +
+ .../qemuxml2argv-pseries-serial+console-native.xml | 18 ++++++
+ .../qemuxml2argv-pseries-serial-compat.args | 1 +
+ .../qemuxml2argv-pseries-serial-compat.xml | 19 ++++++
+ ...qemuxml2argv-pseries-serial-invalid-machine.xml | 19 ++++++
+ .../qemuxml2argv-pseries-serial-native.args | 22 +++++++
+ .../qemuxml2argv-pseries-serial-native.xml | 16 +++++
+ .../qemuxml2argv-pseries-usb-default.args | 2 +-
+ .../qemuxml2argv-pseries-usb-kbd.args | 2 +-
+ .../qemuxml2argv-pseries-usb-multi.args | 2 +-
+ .../qemuxml2argv-pseries-vio-user-assigned.args | 4 +-
+ .../qemuxml2argvdata/qemuxml2argv-pseries-vio.args | 4 +-
+ tests/qemuxml2argvtest.c | 16 +++++
+ .../qemuxml2xmlout-panic-pseries.xml | 4 +-
+ .../qemuxml2xmlout-pseries-console-native.xml | 1 +
+ .../qemuxml2xmlout-pseries-console-virtio.xml | 31 ++++++++++
+ .../qemuxml2xmlout-pseries-cpu-compat-power9.xml | 4 +-
+ .../qemuxml2xmlout-pseries-cpu-compat.xml | 4 +-
+ .../qemuxml2xmlout-pseries-cpu-exact.xml | 4 +-
+ .../qemuxml2xmlout-pseries-panic-missing.xml | 4 +-
+ .../qemuxml2xmlout-pseries-panic-no-address.xml | 4 +-
+ ...emuxml2xmlout-pseries-serial+console-native.xml | 1 +
+ .../qemuxml2xmlout-pseries-serial-compat.xml | 1 +
+ .../qemuxml2xmlout-pseries-serial-native.xml | 35 +++++++++++
+ tests/qemuxml2xmltest.c | 15 +++++
+ 43 files changed, 386 insertions(+), 82 deletions(-)
+ create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.xml
+ create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.xml
+ create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-invalid-machine.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.xml
+ create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-native.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-virtio.xml
+ create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial+console-native.xml
+ create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-compat.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-native.xml
+
+diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
+index cf1167b9c6..0634f3396a 100644
+--- a/docs/formatdomain.html.in
++++ b/docs/formatdomain.html.in
+@@ -6462,7 +6462,9 @@ qemu-kvm -net nic,model=? /dev/null
+ since 1.0.2 , isa-serial
(usable
+ with x86 guests), usb-serial
(usable whenever USB support
+ is available) and pci-serial
(usable whenever PCI support
+- is available).
++ is available); since 3.10.0 ,
++ spapr-vio-serial
(usable with ppc64/pseries guests)
++ is available as well.
+
+
+
+@@ -6472,7 +6474,9 @@ qemu-kvm -net nic,model=? /dev/null
+ isa-serial
(usable with the isa-serial
target
+ type); usb-serial
(usable with the usb-serial
+ target type); pci-serial
+- (usable with the pci-serial
target type).
++ (usable with the pci-serial
target type);
++ spapr-vty
(usable with the spapr-vio-serial
++ target type).
+
+
+
+@@ -6484,8 +6488,9 @@ qemu-kvm -net nic,model=? /dev/null
+ All of the target types support configuring the guest-visible device
+ address as documented above ; more
+ specifically, acceptable address types are isa
(for
+- isa-serial
), usb
(for usb-serial
)
+- and pci
(for pci-serial
).
++ isa-serial
), usb
(for usb-serial
),
++ pci
(for pci-serial
) and spapr-vio
++ (for spapr-vio-serial
).
+
+
+
+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
+index 3630e539e6..027d9ae7a1 100644
+--- a/docs/schemas/domaincommon.rng
++++ b/docs/schemas/domaincommon.rng
+@@ -3571,6 +3571,7 @@
+ isa-serial
+ usb-serial
+ pci-serial
++ spapr-vio-serial
+
+
+
+@@ -3582,6 +3583,7 @@
+ isa-serial
+ usb-serial
+ pci-serial
++ spapr-vty
+
+
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 692b9d9414..97c7a66b5b 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -444,7 +444,9 @@ VIR_ENUM_IMPL(virDomainChrSerialTarget,
+ "none",
+ "isa-serial",
+ "usb-serial",
+- "pci-serial")
++ "pci-serial",
++ "spapr-vio-serial",
++);
+
+ VIR_ENUM_IMPL(virDomainChrChannelTarget,
+ VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST,
+@@ -471,6 +473,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
+ "isa-serial",
+ "usb-serial",
+ "pci-serial",
++ "spapr-vty",
+ );
+
+ VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
+@@ -4059,6 +4062,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
+
+ switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) {
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: {
+
+ /* Create a stub console to match the serial port.
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 9dfe9388cd..979e8cca00 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -1077,6 +1077,7 @@ typedef enum {
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO,
+
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST
+ } virDomainChrSerialTargetType;
+@@ -1109,6 +1110,7 @@ typedef enum {
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY,
+
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST
+ } virDomainChrSerialTargetModel;
+diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
+index f8d5d317cd..91083dc73d 100644
+--- a/src/qemu/qemu_command.c
++++ b/src/qemu/qemu_command.c
+@@ -9227,6 +9227,8 @@ qemuChrSerialTargetModelToCaps(virDomainChrSerialTargetModel targetModel)
+ return QEMU_CAPS_DEVICE_USB_SERIAL;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
+ return QEMU_CAPS_DEVICE_PCI_SERIAL;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
++ return QEMU_CAPS_DEVICE_SPAPR_VTY;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+@@ -10354,52 +10356,39 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
+ virBuffer cmd = VIR_BUFFER_INITIALIZER;
+ virQEMUCapsFlags caps;
+
+- if (qemuDomainIsPSeries(def)) {
+- if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
+- serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
+- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_VTY)) {
+- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+- _("spapr-vty not supported in this QEMU binary"));
+- goto error;
+- }
++ switch ((virDomainChrSerialTargetModel) serial->targetModel) {
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
+
+- virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
+- serial->info.alias);
+- }
+- } else {
+- switch ((virDomainChrSerialTargetModel) serial->targetModel) {
+- case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
+- case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
++ caps = qemuChrSerialTargetModelToCaps(serial->targetModel);
+
+- caps = qemuChrSerialTargetModelToCaps(serial->targetModel);
+-
+- if (caps && !virQEMUCapsGet(qemuCaps, caps)) {
+- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+- _("'%s' is not supported in this QEMU binary"),
+- virDomainChrSerialTargetModelTypeToString(serial->targetModel));
+- goto error;
+- }
+- break;
+-
+- case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
+- break;
+-
+- case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+- case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+- /* Except from _LAST, which is just a guard value and will never
+- * be used, all of the above are platform devices, which means
+- * qemuBuildSerialCommandLine() will have taken the appropriate
+- * branch and we will not have ended up here. */
+- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+- _("Invalid target model for serial device"));
++ if (caps && !virQEMUCapsGet(qemuCaps, caps)) {
++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
++ _("'%s' is not supported in this QEMU binary"),
++ virDomainChrSerialTargetModelTypeToString(serial->targetModel));
+ goto error;
+ }
++ break;
+
+- virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
+- virDomainChrSerialTargetModelTypeToString(serial->targetModel),
+- serial->info.alias, serial->info.alias);
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
++ break;
++
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
++ /* Except from _LAST, which is just a guard value and will never
++ * be used, all of the above are platform devices, which means
++ * qemuBuildSerialCommandLine() will have taken the appropriate
++ * branch and we will not have ended up here. */
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("Invalid target model for serial device"));
++ goto error;
+ }
+
++ virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
++ virDomainChrSerialTargetModelTypeToString(serial->targetModel),
++ serial->info.alias, serial->info.alias);
++
+ if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
+ goto error;
+
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index 7b5bc97de6..17c898896d 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -3466,6 +3466,8 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType)
+ return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
+ return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
++ return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ break;
+@@ -3485,6 +3487,8 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel)
+ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
+ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
++ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+ break;
+@@ -3495,8 +3499,7 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel)
+
+
+ static int
+-qemuDomainChrTargetDefValidate(const virDomainDef *def,
+- const virDomainChrDef *chr)
++qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
+ {
+ int expected;
+
+@@ -3508,11 +3511,7 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
+-
+- /* Hack required until we have a proper type for pSeries
+- * serial consoles */
+- if (qemuDomainIsPSeries(def))
+- return 0;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+
+ expected = qemuDomainChrSerialTargetTypeToAddressType(chr->targetType);
+
+@@ -3536,6 +3535,7 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
+
+ expected = qemuDomainChrSerialTargetModelToTargetType(chr->targetModel);
+
+@@ -3573,7 +3573,7 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
+ if (qemuDomainChrSourceDefValidate(dev->source) < 0)
+ return -1;
+
+- if (qemuDomainChrTargetDefValidate(def, dev) < 0)
++ if (qemuDomainChrTargetDefValidate(dev) < 0)
+ return -1;
+
+ if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL &&
+@@ -3583,6 +3583,26 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
+ return -1;
+ }
+
++ if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) {
++ bool isCompatible = true;
++
++ if (!qemuDomainIsPSeries(def) &&
++ (dev->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO ||
++ dev->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY)) {
++ isCompatible = false;
++ }
++
++ if (!isCompatible) {
++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
++ _("Serial device with target type '%s' and "
++ "target model '%s' not compatible with guest "
++ "architecture or machine type"),
++ virDomainChrSerialTargetTypeToString(dev->targetType),
++ virDomainChrSerialTargetModelTypeToString(dev->targetModel));
++ return -1;
++ }
++ }
++
+ return 0;
+ }
+
+@@ -4222,10 +4242,7 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ if (ARCH_IS_X86(def->os.arch)) {
+ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
+ } else if (qemuDomainIsPSeries(def)) {
+- /* Setting TYPE_ISA here is just a temporary hack to reduce test
+- * suite churn. Later on we will have a proper serial type for
+- * pSeries and this line will be updated accordingly. */
+- chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
++ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
+ }
+ }
+
+@@ -4242,6 +4259,9 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
+ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL;
+ break;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
++ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY;
++ break;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ /* Nothing to do */
+@@ -5147,6 +5167,31 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+ goto cleanup;
+ }
+
++ for (i = 0; i < def->nserials; i++) {
++ virDomainChrDefPtr serial = def->serials[i];
++
++ /* Historically, the native console type for some machine types
++ * was not set at all, which means it defaulted to ISA even
++ * though that was not even remotely accurate. To ensure migration
++ * towards older libvirt versions works for such guests, we switch
++ * it back to the default here */
++ if (flags & VIR_DOMAIN_XML_MIGRATABLE) {
++ switch ((virDomainChrSerialTargetType) serial->targetType) {
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
++ serial->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
++ serial->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE;
++ break;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
++ /* Nothing to do */
++ break;
++ }
++ }
++ }
++
+ /* Replace the CPU definition updated according to QEMU with the one
+ * used for starting the domain. The updated def will be sent
+ * separately for backward compatibility.
+diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
+index 989c0e6c93..2319e503eb 100644
+--- a/src/qemu/qemu_domain_address.c
++++ b/src/qemu/qemu_domain_address.c
+@@ -782,6 +782,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
+
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ return 0;
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-basic.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-basic.args
+index 97a7057ba0..789d9f679e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-basic.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-basic.args
+@@ -20,4 +20,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.args
+new file mode 120000
+index 0000000000..d6c830ecdf
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.args
+@@ -0,0 +1 @@
++qemuxml2argv-pseries-serial-native.args
+\ No newline at end of file
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.xml
+new file mode 100644
+index 0000000000..9f37bf0dec
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.xml
+@@ -0,0 +1,17 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.args
+new file mode 100644
+index 0000000000..343018fb3e
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.args
+@@ -0,0 +1,23 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-ppc64 \
++-name guest \
++-S \
++-M pseries \
++-m 512 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-boot c \
++-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x1 \
++-chardev pty,id=charconsole0 \
++-device virtconsole,chardev=charconsole0,id=console0
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.xml
+new file mode 100644
+index 0000000000..0190ab63ac
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.xml
+@@ -0,0 +1,19 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args
+index af93d63dc9..9bb375aeba 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args
+@@ -21,4 +21,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat.args
+index 7740e2f5a9..5174aa760e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat.args
+@@ -21,4 +21,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-exact.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-exact.args
+index d2c99a7fa3..3790deca8c 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-exact.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-exact.args
+@@ -21,4 +21,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-le.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-le.args
+index 97a7057ba0..789d9f679e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-le.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-le.args
+@@ -20,4 +20,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args
+index 97a7057ba0..789d9f679e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args
+@@ -20,4 +20,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-no-address.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-no-address.args
+index 97a7057ba0..789d9f679e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-no-address.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-no-address.args
+@@ -20,4 +20,4 @@ server,nowait \
+ -boot c \
+ -usb \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.args
+new file mode 120000
+index 0000000000..d6c830ecdf
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.args
+@@ -0,0 +1 @@
++qemuxml2argv-pseries-serial-native.args
+\ No newline at end of file
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.xml
+new file mode 100644
+index 0000000000..2733baa980
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.xml
+@@ -0,0 +1,18 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.args
+new file mode 120000
+index 0000000000..d6c830ecdf
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.args
+@@ -0,0 +1 @@
++qemuxml2argv-pseries-serial-native.args
+\ No newline at end of file
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.xml
+new file mode 100644
+index 0000000000..2e182edbd0
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.xml
+@@ -0,0 +1,19 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-invalid-machine.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-invalid-machine.xml
+new file mode 100644
+index 0000000000..5482146a57
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-invalid-machine.xml
+@@ -0,0 +1,19 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-x86_64
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.args
+new file mode 100644
+index 0000000000..f72b8b6259
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.args
+@@ -0,0 +1,22 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-ppc64 \
++-name guest \
++-S \
++-M pseries \
++-m 512 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-boot c \
++-chardev pty,id=charserial0 \
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.xml
+new file mode 100644
+index 0000000000..6cec4bc9d3
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.xml
+@@ -0,0 +1,16 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-default.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-default.args
+index a92b1e01b1..37c0594032 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-default.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-default.args
+@@ -20,4 +20,4 @@ server,nowait \
+ -boot c \
+ -device pci-ohci,id=usb,bus=pci.0,addr=0x1 \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
+index caaccdbb8e..838b80453a 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-kbd.args
+@@ -20,5 +20,5 @@ server,nowait \
+ -boot c \
+ -device pci-ohci,id=usb,bus=pci.0,addr=0x1 \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000 \
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \
+ -device usb-kbd,id=input0,bus=usb.0,port=1
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-multi.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-multi.args
+index b9bd905a5d..56bc1d67ef 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-multi.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-multi.args
+@@ -21,4 +21,4 @@ server,nowait \
+ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1 \
+ -device pci-ohci,id=usb1,bus=pci.0,addr=0x2 \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio-user-assigned.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio-user-assigned.args
+index 63cf3c1830..0fcfbe3796 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio-user-assigned.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio-user-assigned.args
+@@ -25,6 +25,6 @@ server,nowait \
+ -device scsi-disk,bus=scsi1.0,channel=0,scsi-id=0,lun=0,\
+ drive=drive-scsi1-0-0-0,id=scsi1-0-0-0 \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x20000000 \
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x20000000 \
+ -chardev pty,id=charserial1 \
+--device spapr-vty,chardev=charserial1,reg=0x30001000
++-device spapr-vty,chardev=charserial1,id=serial1,reg=0x30001000
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio.args
+index 0294067bc8..8a9bdcc4cd 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-vio.args
+@@ -25,6 +25,6 @@ server,nowait \
+ -device scsi-disk,bus=scsi1.0,channel=0,scsi-id=0,lun=0,\
+ drive=drive-scsi1-0-0-0,id=scsi1-0-0-0 \
+ -chardev pty,id=charserial0 \
+--device spapr-vty,chardev=charserial0,reg=0x30000000 \
++-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \
+ -chardev pty,id=charserial1 \
+--device spapr-vty,chardev=charserial1,reg=0x30001000
++-device spapr-vty,chardev=charserial1,id=serial1,reg=0x30001000
+diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
+index 747ad24663..4b63dd141d 100644
+--- a/tests/qemuxml2argvtest.c
++++ b/tests/qemuxml2argvtest.c
+@@ -1875,6 +1875,22 @@ mymain(void)
+ QEMU_CAPS_MACHINE_OPT,
+ QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT);
+
++ DO_TEST("pseries-serial-native",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-serial+console-native",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-serial-compat",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-console-native",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-console-virtio",
++ QEMU_CAPS_NODEFCONFIG);
++ DO_TEST_PARSE_ERROR("pseries-serial-invalid-machine", NONE);
++
+ DO_TEST("disk-ide-drive-split",
+ QEMU_CAPS_NODEFCONFIG,
+ QEMU_CAPS_IDE_CD);
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
+index 496df0696c..484fe4cfa6 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
+@@ -22,8 +22,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-native.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-native.xml
+new file mode 120000
+index 0000000000..b0e645fc03
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-native.xml
+@@ -0,0 +1 @@
++qemuxml2xmlout-pseries-serial-native.xml
+\ No newline at end of file
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-virtio.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-virtio.xml
+new file mode 100644
+index 0000000000..48760f2824
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-virtio.xml
+@@ -0,0 +1,31 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 524288
++ 1
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml
+index 9d4c5efe67..404bb0c768 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml
+@@ -25,8 +25,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml
+index 6059859abd..1891fa5f48 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml
+@@ -25,8 +25,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml
+index f3216523ed..f08f3e005f 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml
+@@ -26,8 +26,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
+index 496df0696c..484fe4cfa6 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
+@@ -22,8 +22,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
+index 496df0696c..484fe4cfa6 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
+@@ -22,8 +22,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial+console-native.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial+console-native.xml
+new file mode 120000
+index 0000000000..b0e645fc03
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial+console-native.xml
+@@ -0,0 +1 @@
++qemuxml2xmlout-pseries-serial-native.xml
+\ No newline at end of file
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-compat.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-compat.xml
+new file mode 120000
+index 0000000000..b0e645fc03
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-compat.xml
+@@ -0,0 +1 @@
++qemuxml2xmlout-pseries-serial-native.xml
+\ No newline at end of file
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-native.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-native.xml
+new file mode 100644
+index 0000000000..fae7c54d5b
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-native.xml
+@@ -0,0 +1,35 @@
++
++ guest
++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7
++ 524288
++ 524288
++ 1
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-ppc64
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
+index 6687997900..ad429ead4d 100644
+--- a/tests/qemuxml2xmltest.c
++++ b/tests/qemuxml2xmltest.c
+@@ -766,6 +766,21 @@ mymain(void)
+ QEMU_CAPS_MACHINE_OPT,
+ QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT);
+
++ DO_TEST("pseries-serial-native",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-serial+console-native",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-serial-compat",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-console-native",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_DEVICE_SPAPR_VTY);
++ DO_TEST("pseries-console-virtio",
++ QEMU_CAPS_NODEFCONFIG);
++
+ DO_TEST("balloon-device-auto", NONE);
+ DO_TEST("balloon-device-period", NONE);
+ DO_TEST("channel-virtio-auto", NONE);
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Check-CPU-cache-for-ABI-stability.patch b/SOURCES/libvirt-conf-Check-CPU-cache-for-ABI-stability.patch
deleted file mode 100644
index 13fcb60..0000000
--- a/SOURCES/libvirt-conf-Check-CPU-cache-for-ABI-stability.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From b768a8cb9fbd84a96f576d1dd7468f664200683f Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Jiri Denemark
-Date: Wed, 10 May 2017 13:05:16 +0200
-Subject: [PATCH] conf: Check CPU cache for ABI stability
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Daniel P. Berrange
-(cherry picked from commit 1e9cf6e09ce242c94731bd21707dd3bcd41f854f)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1449595
-
-Signed-off-by: Jiri Denemark
----
- src/conf/cpu_conf.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
-index 1b098c476..a4be5742e 100644
---- a/src/conf/cpu_conf.c
-+++ b/src/conf/cpu_conf.c
-@@ -915,6 +915,16 @@ virCPUDefIsEqual(virCPUDefPtr src,
- }
- }
-
-+ if ((src->cache && !dst->cache) ||
-+ (!src->cache && dst->cache) ||
-+ (src->cache && dst->cache &&
-+ (src->cache->level != dst->cache->level ||
-+ src->cache->mode != dst->cache->mode))) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("Target CPU cache does not match source"));
-+ goto cleanup;
-+ }
-+
- identical = true;
-
- cleanup:
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-Check-virDomainChrSourceDefFormat-return-value.patch b/SOURCES/libvirt-conf-Check-virDomainChrSourceDefFormat-return-value.patch
new file mode 100644
index 0000000..0193671
--- /dev/null
+++ b/SOURCES/libvirt-conf-Check-virDomainChrSourceDefFormat-return-value.patch
@@ -0,0 +1,123 @@
+From 73650fdd9de90d6f5a6f4a3c6c19d60368411b07 Mon Sep 17 00:00:00 2001
+Message-Id: <73650fdd9de90d6f5a6f4a3c6c19d60368411b07@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:02 +0100
+Subject: [PATCH] conf: Check virDomainChrSourceDefFormat() return value
+
+The function can fail, but none of the caller were accounting
+for that.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 2cd323e382b4abfffda52fe49d1b50a087716e01)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 34 ++++++++++++++++++++++++----------
+ 1 file changed, 24 insertions(+), 10 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index cf1bd030a0..346edaa6bd 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -24045,7 +24045,9 @@ virDomainChrDefFormat(virBufferPtr buf,
+ if (virDomainChrAttrsDefFormat(buf, def->source, tty_compat) < 0)
+ return -1;
+ virBufferAddLit(buf, ">\n");
+- virDomainChrSourceDefFormat(buf, def->source, flags);
++
++ if (virDomainChrSourceDefFormat(buf, def->source, flags) < 0)
++ return -1;
+
+ if (virDomainChrTargetDefFormat(buf, def, flags) < 0)
+ return -1;
+@@ -24066,13 +24068,14 @@ virDomainSmartcardDefFormat(virBufferPtr buf,
+ const char *mode = virDomainSmartcardTypeToString(def->type);
+ virBuffer childBuf = VIR_BUFFER_INITIALIZER;
+ size_t i;
++ int ret = -1;
+
+ virBufferSetChildIndent(&childBuf, buf);
+
+ if (!mode) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected smartcard type %d"), def->type);
+- return -1;
++ goto cleanup;
+ }
+
+ switch (def->type) {
+@@ -24089,23 +24092,25 @@ virDomainSmartcardDefFormat(virBufferPtr buf,
+ break;
+
+ case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH:
+- virDomainChrSourceDefFormat(&childBuf, def->data.passthru, flags);
++ if (virDomainChrSourceDefFormat(&childBuf, def->data.passthru, flags) < 0)
++ goto cleanup;
+ break;
+
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected smartcard type %d"), def->type);
+- return -1;
++ goto cleanup;
+ }
+ virDomainDeviceInfoFormat(&childBuf, &def->info, flags);
+
+ if (virBufferCheckError(&childBuf) < 0)
+- return -1;
++ goto cleanup;
+
+ virBufferAsprintf(buf, "type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH &&
+- virDomainChrAttrsDefFormat(buf, def->data.passthru, false) < 0)
+- return -1;
++ virDomainChrAttrsDefFormat(buf, def->data.passthru, false) < 0) {
++ goto cleanup;
++ }
+
+ if (virBufferUse(&childBuf)) {
+ virBufferAddLit(buf, ">\n");
+@@ -24114,7 +24119,12 @@ virDomainSmartcardDefFormat(virBufferPtr buf,
+ } else {
+ virBufferAddLit(buf, "/>\n");
+ }
+- return 0;
++
++ ret = 0;
++
++ cleanup:
++ virBufferFreeAndReset(&childBuf);
++ return ret;
+ }
+
+ static int
+@@ -24416,7 +24426,8 @@ virDomainRNGDefFormat(virBufferPtr buf,
+ return -1;
+ virBufferAddLit(buf, ">\n");
+ virBufferAdjustIndent(buf, 2);
+- virDomainChrSourceDefFormat(buf, def->source.chardev, flags);
++ if (virDomainChrSourceDefFormat(buf, def->source.chardev, flags) < 0)
++ return -1;
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "\n");
+
+@@ -25261,7 +25272,10 @@ virDomainRedirdevDefFormat(virBufferPtr buf,
+ return -1;
+ virBufferAddLit(buf, ">\n");
+ virBufferAdjustIndent(buf, 2);
+- virDomainChrSourceDefFormat(buf, def->source, flags);
++
++ if (virDomainChrSourceDefFormat(buf, def->source, flags) < 0)
++ return -1;
++
+ virDomainDeviceInfoFormat(buf, &def->info,
+ flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT);
+ virBufferAdjustIndent(buf, -2);
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Don-t-assign-value-from-.TypeFromString-directly-to-enum.patch b/SOURCES/libvirt-conf-Don-t-assign-value-from-.TypeFromString-directly-to-enum.patch
deleted file mode 100644
index 6d2a136..0000000
--- a/SOURCES/libvirt-conf-Don-t-assign-value-from-.TypeFromString-directly-to-enum.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 8c00ca78eed4ffdb9238b89b58eb5975baf5e339 Mon Sep 17 00:00:00 2001
-Message-Id: <8c00ca78eed4ffdb9238b89b58eb5975baf5e339@dist-git>
-From: Peter Krempa
-Date: Fri, 19 May 2017 12:24:11 +0200
-Subject: [PATCH] conf: Don't assign value from ..TypeFromString directly to
- enum
-
-Enums are unsigned, so it's impossible to check whether the helper
-returned -1 for invalid conversions.
-
-Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1452454
-(cherry picked from commit 85d62624c5d02c38e00a275dc2b2957584454908)
-
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 15 +++++++++------
- 1 file changed, 9 insertions(+), 6 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 1653aa61d..a918ecd59 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -14065,6 +14065,7 @@ virDomainMemoryDefParseXML(xmlNodePtr memdevNode,
- xmlNodePtr save = ctxt->node;
- xmlNodePtr node;
- virDomainMemoryDefPtr def;
-+ int val;
-
- ctxt->node = memdevNode;
-
-@@ -14084,12 +14085,14 @@ virDomainMemoryDefParseXML(xmlNodePtr memdevNode,
- }
- VIR_FREE(tmp);
-
-- tmp = virXMLPropString(memdevNode, "access");
-- if (tmp &&
-- (def->access = virDomainMemoryAccessTypeFromString(tmp)) <= 0) {
-- virReportError(VIR_ERR_XML_ERROR,
-- _("invalid access mode '%s'"), tmp);
-- goto error;
-+ if ((tmp = virXMLPropString(memdevNode, "access"))) {
-+ if ((val = virDomainMemoryAccessTypeFromString(tmp)) <= 0) {
-+ virReportError(VIR_ERR_XML_ERROR,
-+ _("invalid access mode '%s'"), tmp);
-+ goto error;
-+ }
-+
-+ def->access = val;
- }
- VIR_FREE(tmp);
-
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-Don-t-inline-virDomainNetTypeSharesHostView.patch b/SOURCES/libvirt-conf-Don-t-inline-virDomainNetTypeSharesHostView.patch
new file mode 100644
index 0000000..76a771b
--- /dev/null
+++ b/SOURCES/libvirt-conf-Don-t-inline-virDomainNetTypeSharesHostView.patch
@@ -0,0 +1,136 @@
+From 0597400171b44e0d180196b2c04da72f8b1f225f Mon Sep 17 00:00:00 2001
+Message-Id: <0597400171b44e0d180196b2c04da72f8b1f225f@dist-git>
+From: Jiri Denemark
+Date: Thu, 2 Nov 2017 19:58:00 +0100
+Subject: [PATCH] conf: Don't inline virDomainNetTypeSharesHostView
+
+When coverage build is enabled, gcc complains about it:
+
+In file included from qemu/qemu_agent.h:29:0,
+ from qemu/qemu_driver.c:47:
+qemu/qemu_driver.c: In function 'qemuDomainSetInterfaceParameters':
+./conf/domain_conf.h:3397:1: error: inlining failed in call to
+'virDomainNetTypeSharesHostView': call is unlikely and code size would
+grow [-Werror=inline]
+ virDomainNetTypeSharesHostView(const virDomainNetDef *net)
+ ^
+
+Signed-off-by: Jiri Denemark
+(cherry picked from commit bce925dadaf8fe4693abee88fb68aa7ede9d209e)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1472263
+
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 36 ++++++++++++++++++++++++++++++++++++
+ src/conf/domain_conf.h | 37 +++----------------------------------
+ src/libvirt_private.syms | 1 +
+ 3 files changed, 40 insertions(+), 34 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 77c20c6972..394afb0d80 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -28082,3 +28082,39 @@ virDomainGenerateMachineName(const char *drivername,
+ virBufferCheckError(&buf);
+ return virBufferContentAndReset(&buf);
+ }
++
++
++/**
++ * virDomainNetTypeSharesHostView:
++ * @net: interface
++ *
++ * Some types of interfaces "share" the host view. For instance,
++ * for macvtap interface, every domain RX is the host RX too. And
++ * every domain TX is host TX too. IOW, for some types of
++ * interfaces guest and host are on the same side of RX/TX
++ * barrier. This is important so that we set up QoS correctly and
++ * report proper stats.
++ */
++bool
++virDomainNetTypeSharesHostView(const virDomainNetDef *net)
++{
++ virDomainNetType actualType = virDomainNetGetActualType(net);
++ switch (actualType) {
++ case VIR_DOMAIN_NET_TYPE_DIRECT:
++ case VIR_DOMAIN_NET_TYPE_ETHERNET:
++ return true;
++ case VIR_DOMAIN_NET_TYPE_USER:
++ case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
++ case VIR_DOMAIN_NET_TYPE_SERVER:
++ case VIR_DOMAIN_NET_TYPE_CLIENT:
++ case VIR_DOMAIN_NET_TYPE_MCAST:
++ case VIR_DOMAIN_NET_TYPE_NETWORK:
++ case VIR_DOMAIN_NET_TYPE_BRIDGE:
++ case VIR_DOMAIN_NET_TYPE_INTERNAL:
++ case VIR_DOMAIN_NET_TYPE_HOSTDEV:
++ case VIR_DOMAIN_NET_TYPE_UDP:
++ case VIR_DOMAIN_NET_TYPE_LAST:
++ break;
++ }
++ return false;
++}
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 38de70b154..171f340785 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -3382,40 +3382,9 @@ virDomainGenerateMachineName(const char *drivername,
+ int id,
+ const char *name,
+ bool privileged);
+-/**
+- * virDomainNetTypeSharesHostView:
+- * @net: interface
+- *
+- * Some types of interfaces "share" the host view. For instance,
+- * for macvtap interface, every domain RX is the host RX too. And
+- * every domain TX is host TX too. IOW, for some types of
+- * interfaces guest and host are on the same side of RX/TX
+- * barrier. This is important so that we set up QoS correctly and
+- * report proper stats.
+- */
+-static inline bool
+-virDomainNetTypeSharesHostView(const virDomainNetDef *net)
+-{
+- virDomainNetType actualType = virDomainNetGetActualType(net);
+- switch (actualType) {
+- case VIR_DOMAIN_NET_TYPE_DIRECT:
+- case VIR_DOMAIN_NET_TYPE_ETHERNET:
+- return true;
+- case VIR_DOMAIN_NET_TYPE_USER:
+- case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+- case VIR_DOMAIN_NET_TYPE_SERVER:
+- case VIR_DOMAIN_NET_TYPE_CLIENT:
+- case VIR_DOMAIN_NET_TYPE_MCAST:
+- case VIR_DOMAIN_NET_TYPE_NETWORK:
+- case VIR_DOMAIN_NET_TYPE_BRIDGE:
+- case VIR_DOMAIN_NET_TYPE_INTERNAL:
+- case VIR_DOMAIN_NET_TYPE_HOSTDEV:
+- case VIR_DOMAIN_NET_TYPE_UDP:
+- case VIR_DOMAIN_NET_TYPE_LAST:
+- break;
+- }
+- return false;
+-}
++
++bool
++virDomainNetTypeSharesHostView(const virDomainNetDef *net);
+
+ bool
+ virDomainDefLifecycleActionAllowed(virDomainLifecycle type,
+diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
+index 448d962b2d..811d9053e6 100644
+--- a/src/libvirt_private.syms
++++ b/src/libvirt_private.syms
+@@ -444,6 +444,7 @@ virDomainNetInsert;
+ virDomainNetRemove;
+ virDomainNetRemoveHostdev;
+ virDomainNetTypeFromString;
++virDomainNetTypeSharesHostView;
+ virDomainNetTypeToString;
+ virDomainNostateReasonTypeFromString;
+ virDomainNostateReasonTypeToString;
+--
+2.15.0
+
diff --git a/SOURCES/libvirt-conf-Drop-virDomainChrDeviceType.targetTypeAttr.patch b/SOURCES/libvirt-conf-Drop-virDomainChrDeviceType.targetTypeAttr.patch
new file mode 100644
index 0000000..ecce040
--- /dev/null
+++ b/SOURCES/libvirt-conf-Drop-virDomainChrDeviceType.targetTypeAttr.patch
@@ -0,0 +1,737 @@
+From 77bc396146f85ba8f767fd51f0238037cb9784cc Mon Sep 17 00:00:00 2001
+Message-Id: <77bc396146f85ba8f767fd51f0238037cb9784cc@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:22:59 +0100
+Subject: [PATCH] conf: Drop virDomainChrDeviceType.targetTypeAttr
+
+This attribute was used to decide whether to format the type
+attribute of the element, but the logic didn't take into
+account all possible cases and as such could lead to unexpected
+results. Moreover, it's one more thing to keep track of, and can
+easily fall out of sync with other attributes.
+
+Now that we have VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE, we can
+use that value to signal that no specific target type has been
+configured for the serial device and as such the attribute should
+not be formatted at all. All other values are now formatted.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 4fb8ff9987b7e34d331c4af8f573db11579a0e88)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 11 ++++-------
+ src/conf/domain_conf.h | 1 -
+ src/vz/vz_sdk.c | 3 +--
+ tests/qemuargv2xmldata/qemuargv2xml-console-compat.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-dev.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-file.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-many.xml | 4 ++--
+ tests/qemuargv2xmldata/qemuargv2xml-serial-pty.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-tcp-telnet.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-tcp.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-udp.xml | 4 ++--
+ tests/qemuargv2xmldata/qemuargv2xml-serial-unix.xml | 2 +-
+ tests/qemuargv2xmldata/qemuargv2xml-serial-vc.xml | 2 +-
+ .../qemuhotplug-console-compat-2-live+console-virtio.xml | 4 ++--
+ .../qemuhotplug-console-compat-2-live.xml | 4 ++--
+ .../qemuxml2argv-serial-tcp-tlsx509-chardev-notls.xml | 4 ++--
+ tests/qemuxml2argvdata/qemuxml2argv-user-aliases.xml | 4 ++--
+ .../qemuxml2xmlout-bios-nvram-os-interleave.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-chardev-label.xml | 4 ++--
+ .../qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat2.xml | 2 +-
+ .../qemuxml2xmloutdata/qemuxml2xmlout-console-virtio-many.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-driver.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-server.xml | 4 ++--
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth2.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml | 2 +-
+ .../qemuxml2xmlout-pseries-cpu-compat-power9.xml | 2 +-
+ .../qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml | 2 +-
+ .../qemuxml2xmlout-pseries-panic-missing.xml | 2 +-
+ .../qemuxml2xmlout-pseries-panic-no-address.xml | 2 +-
+ .../qemuxml2xmlout-q35-virt-manager-basic.xml | 2 +-
+ .../qemuxml2xmlout-serial-spiceport-nospice.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport.xml | 2 +-
+ .../qemuxml2xmlout-serial-target-port-auto.xml | 6 +++---
+ .../qemuxml2xmlout-serial-tcp-tlsx509-chardev.xml | 4 ++--
+ .../qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost.xml | 2 +-
+ tests/qemuxml2xmloutdata/qemuxml2xmlout-vhost_queues.xml | 2 +-
+ 43 files changed, 56 insertions(+), 61 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 3a5ecd3a9d..586a840672 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -11499,8 +11499,7 @@ virDomainChrDefaultTargetType(int devtype)
+ }
+
+ static int
+-virDomainChrTargetTypeFromString(virDomainChrDefPtr def,
+- int devtype,
++virDomainChrTargetTypeFromString(int devtype,
+ const char *targetType)
+ {
+ int ret = -1;
+@@ -11528,8 +11527,6 @@ virDomainChrTargetTypeFromString(virDomainChrDefPtr def,
+ break;
+ }
+
+- def->targetTypeAttr = true;
+-
+ return ret;
+ }
+
+@@ -11546,7 +11543,7 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def,
+ char *stateStr = NULL;
+
+ if ((def->targetType =
+- virDomainChrTargetTypeFromString(def, def->deviceType,
++ virDomainChrTargetTypeFromString(def->deviceType,
+ targetType)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown target type '%s' specified for character device"),
+@@ -16466,7 +16463,7 @@ virDomainChrEquals(virDomainChrDefPtr src,
+ break;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
+- if (src->targetTypeAttr != tgt->targetTypeAttr)
++ if (src->targetType != tgt->targetType)
+ return false;
+
+ ATTRIBUTE_FALLTHROUGH;
+@@ -24026,7 +24023,7 @@ virDomainChrDefFormat(virBufferPtr buf,
+ break;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
+- if (def->targetTypeAttr) {
++ if (def->targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE) {
+ virBufferAsprintf(buf,
+ " \n",
+ virDomainChrTargetTypeToString(def->deviceType,
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 9502573b34..bbb056cf21 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -1199,7 +1199,6 @@ struct _virDomainChrSourceDef {
+ struct _virDomainChrDef {
+ int deviceType; /* enum virDomainChrDeviceType */
+
+- bool targetTypeAttr;
+ int targetType; /* enum virDomainChrConsoleTargetType ||
+ enum virDomainChrChannelTargetType ||
+ enum virDomainChrSerialTargetType according to deviceType */
+diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
+index 3910deeb3a..c8de1b9598 100644
+--- a/src/vz/vz_sdk.c
++++ b/src/vz/vz_sdk.c
+@@ -1191,7 +1191,6 @@ prlsdkGetSerialInfo(PRL_HANDLE serialPort, virDomainChrDefPtr chr)
+ int ret = -1;
+
+ chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
+- chr->targetTypeAttr = false;
+ pret = PrlVmDev_GetIndex(serialPort, &serialPortIndex);
+ prlsdkCheckRetGoto(pret, cleanup);
+ chr->target.port = serialPortIndex;
+@@ -2864,7 +2863,7 @@ static int prlsdkCheckSerialUnsupportedParams(virDomainChrDefPtr chr)
+ return -1;
+ }
+
+- if (chr->targetTypeAttr) {
++ if (chr->targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Specified character device target type is not "
+ "supported by vz driver."));
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-console-compat.xml b/tests/qemuargv2xmldata/qemuargv2xml-console-compat.xml
+index f512844427..7c106f145c 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-console-compat.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-console-compat.xml
+@@ -28,7 +28,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-dev.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-dev.xml
+index aac814d59f..e76d0211dc 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-dev.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-dev.xml
+@@ -29,7 +29,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-file.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-file.xml
+index 64819a48ae..ed67ada0d8 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-file.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-file.xml
+@@ -29,7 +29,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-many.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-many.xml
+index e00afe317f..420771dc9c 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-many.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-many.xml
+@@ -28,11 +28,11 @@
+
+
+
+-
++
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-pty.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-pty.xml
+index f512844427..7c106f145c 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-pty.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-pty.xml
+@@ -28,7 +28,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp-telnet.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp-telnet.xml
+index c35a4ca73a..3fe61ffa05 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp-telnet.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp-telnet.xml
+@@ -30,7 +30,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp.xml
+index 0d218f5482..3fc9fd39b0 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-tcp.xml
+@@ -30,7 +30,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-udp.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-udp.xml
+index f7069d541f..5b4af3fe95 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-udp.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-udp.xml
+@@ -30,11 +30,11 @@
+
+
+
+-
++
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-unix.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-unix.xml
+index 14fc8fc7c9..6bb291ff7f 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-unix.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-unix.xml
+@@ -29,7 +29,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuargv2xmldata/qemuargv2xml-serial-vc.xml b/tests/qemuargv2xmldata/qemuargv2xml-serial-vc.xml
+index 95aa1c7b9b..41954fc85d 100644
+--- a/tests/qemuargv2xmldata/qemuargv2xml-serial-vc.xml
++++ b/tests/qemuargv2xmldata/qemuargv2xml-serial-vc.xml
+@@ -28,7 +28,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml
+index 4e1dd49c22..427f431cce 100644
+--- a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml
++++ b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml
+@@ -72,13 +72,13 @@
+
+
+
+-
++
+
+
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml
+index c56d13ef4a..144f6eff7a 100644
+--- a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml
++++ b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml
+@@ -72,13 +72,13 @@
+
+
+
+-
++
+
+
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-notls.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-notls.xml
+index a95e29ad8a..e6c4adb6f3 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-notls.xml
++++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-notls.xml
+@@ -29,12 +29,12 @@
+
+
+
+-
++
+
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-user-aliases.xml b/tests/qemuxml2argvdata/qemuxml2argv-user-aliases.xml
+index c760098fe0..f9724d320e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-user-aliases.xml
++++ b/tests/qemuxml2argvdata/qemuxml2argv-user-aliases.xml
+@@ -110,10 +110,10 @@
+
+
+
+-
++
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-bios-nvram-os-interleave.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-bios-nvram-os-interleave.xml
+index 033e86d3a3..5ee73b527e 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-bios-nvram-os-interleave.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-bios-nvram-os-interleave.xml
+@@ -33,7 +33,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-chardev-label.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-chardev-label.xml
+index 840bf69f61..ad77f62d9e 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-chardev-label.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-chardev-label.xml
+@@ -25,13 +25,13 @@
+
+
+
+-
++
+
+
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml
+index e76f857aee..cd9d75c4b7 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml
+@@ -27,7 +27,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat.xml
+index 8dc361dfc6..0c0bd7b348 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat.xml
+@@ -28,7 +28,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat2.xml
+index 858b2c6750..305c53eab7 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat2.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat2.xml
+@@ -31,7 +31,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio-many.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio-many.xml
+index f9f9abd2df..b38b3ce987 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio-many.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio-many.xml
+@@ -30,7 +30,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-driver.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-driver.xml
+index 1c55017678..06192fbb4a 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-driver.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-driver.xml
+@@ -47,7 +47,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-server.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-server.xml
+index 95b6e2df1a..a6eaa38079 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-server.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-interface-server.xml
+@@ -104,10 +104,10 @@
+
+
+
+-
++
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth.xml
+index 7fe69bd6cb..e6ad234240 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth.xml
+@@ -55,7 +55,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth2.xml
+index b631e5b515..66448ec3dd 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth2.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-bandwidth2.xml
+@@ -44,7 +44,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
+index fd5fdbece5..b1240b8ed1 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
+@@ -57,7 +57,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml
+index 4571b6a829..4f7ad323ed 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml
+@@ -54,7 +54,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
+index 7fb49feb0f..a563b6dddf 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
+@@ -22,7 +22,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml
+index f020056219..59587b3c32 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat-power9.xml
+@@ -25,7 +25,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml
+index 3cbce9fe6a..a39e1fd015 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-compat.xml
+@@ -25,7 +25,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml
+index d69b387686..666eede1a5 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-cpu-exact.xml
+@@ -26,7 +26,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
+index 7fb49feb0f..a563b6dddf 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
+@@ -22,7 +22,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
+index 7fb49feb0f..a563b6dddf 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
+@@ -22,7 +22,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virt-manager-basic.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virt-manager-basic.xml
+index c4ccd98aac..27baaa3f14 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virt-manager-basic.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virt-manager-basic.xml
+@@ -79,7 +79,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport-nospice.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport-nospice.xml
+index 79c4ebc734..63462e6f94 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport-nospice.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport-nospice.xml
+@@ -28,7 +28,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport.xml
+index 9527b2d15f..c90bbeb7d5 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-spiceport.xml
+@@ -28,7 +28,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml
+index 71516a31a9..a8790b5098 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml
+@@ -27,13 +27,13 @@
+
+
+
+-
++
+
+
+-
++
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-tcp-tlsx509-chardev.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-tcp-tlsx509-chardev.xml
+index 18f51e5383..a8af87b53b 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-tcp-tlsx509-chardev.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-tcp-tlsx509-chardev.xml
+@@ -29,12 +29,12 @@
+
+
+
+-
++
+
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml
+index 3a95b6088c..6d847de3a2 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml
+@@ -40,7 +40,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost.xml
+index 759b844395..30989658f4 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost.xml
+@@ -47,7 +47,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-vhost_queues.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vhost_queues.xml
+index 8c27470ddf..72cbcc4cb5 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-vhost_queues.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vhost_queues.xml
+@@ -46,7 +46,7 @@
+
+
+
+-
++
+
+
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Fix-backwards-migration-of-pSeries-guests.patch b/SOURCES/libvirt-conf-Fix-backwards-migration-of-pSeries-guests.patch
deleted file mode 100644
index cb4a237..0000000
--- a/SOURCES/libvirt-conf-Fix-backwards-migration-of-pSeries-guests.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From 7e3b03cbdee6a9fc694046ea3c98c5cdef941c92 Mon Sep 17 00:00:00 2001
-Message-Id: <7e3b03cbdee6a9fc694046ea3c98c5cdef941c92@dist-git>
-From: Andrea Bolognani
-Date: Tue, 25 Jul 2017 10:29:27 +0200
-Subject: [PATCH] conf: Fix backwards migration of pSeries guests
-
-Recent commits made it so that pci-root controllers for
-pSeries guests are automatically assigned the
-spapr-pci-host-bridge model name; however, that prevents
-guests to migrate to older versions of libvirt which don't
-know about that model name at all, which at the moment is
-all of them :)
-
-To avoid the issue, just strip the model name from PHBs
-when formatting the migratable XML; guests that use more
-than one PHB are not going to be migratable anyway.
-
-Signed-off-by: Andrea Bolognani
-(cherry picked from commit 9b45cd8fab1c7d7d07dd3ae64970b3c93b78e04c)
-
-Conflicts:
-
- * src/conf/domain_conf.c:
-
- caused by e146264aaadf5aecf727d8c7b3d85683b55b6c48,
- which significantly refactored
- virDomainControllerDefFormat(), not being in the tree.
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 17 +++++++++++++++++
- 1 file changed, 17 insertions(+)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 86415964dc..f28f6aff63 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -21670,6 +21670,23 @@ virDomainControllerDefFormat(virBufferPtr buf,
- pcihole64 = true;
- if (def->opts.pciopts.modelName != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE)
- pciModel = true;
-+ /* Historically, libvirt didn't support specifying a model name for
-+ * pci-root controllers; starting from 3.6.0, however, pSeries guests
-+ * use pci-root controllers with model name spapr-pci-host-bridge to
-+ * represent all PHBs, including the default one.
-+ *
-+ * In order to allow migration of pSeries guests from older libvirt
-+ * versions and back, we don't format the model name in the migratable
-+ * XML if it's spapr-pci-host-bridge, thus making "no model name" and
-+ * "spapr-pci-host-bridge model name" basically equivalent.
-+ *
-+ * The spapr-pci-host-bridge device is specific to pSeries.
-+ */
-+ if (def->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT &&
-+ def->opts.pciopts.modelName == VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE &&
-+ flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) {
-+ pciModel = false;
-+ }
- if (def->opts.pciopts.chassisNr != -1 ||
- def->opts.pciopts.chassis != -1 ||
- def->opts.pciopts.port != -1 ||
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Fix-memory-leak-for-distances-in-virDomainNumaFree.patch b/SOURCES/libvirt-conf-Fix-memory-leak-for-distances-in-virDomainNumaFree.patch
new file mode 100644
index 0000000..3747582
--- /dev/null
+++ b/SOURCES/libvirt-conf-Fix-memory-leak-for-distances-in-virDomainNumaFree.patch
@@ -0,0 +1,35 @@
+From 8e0151c7b6ce80dc8145511848155e6170ce2bf6 Mon Sep 17 00:00:00 2001
+Message-Id: <8e0151c7b6ce80dc8145511848155e6170ce2bf6@dist-git>
+From: John Ferlan
+Date: Mon, 4 Dec 2017 13:38:53 +0100
+Subject: [PATCH] conf: Fix memory leak for distances in virDomainNumaFree
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1454889
+
+Commit id '74119a03f' neglected to clean up @distances when
+the numa definition is cleaned up.
+
+(cherry picked from commit 9f0ccc717ba9026c30ce38951a354dd66fa12e3b)
+Signed-off-by: Michal Privoznik
+Signed-off-by: Jiri Denemark
+---
+ src/conf/numa_conf.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
+index 8fc3b0a196..466b64d5fa 100644
+--- a/src/conf/numa_conf.c
++++ b/src/conf/numa_conf.c
+@@ -362,6 +362,9 @@ virDomainNumaFree(virDomainNumaPtr numa)
+ for (i = 0; i < numa->nmem_nodes; i++) {
+ virBitmapFree(numa->mem_nodes[i].cpumask);
+ virBitmapFree(numa->mem_nodes[i].nodeset);
++
++ if (numa->mem_nodes[i].ndistances > 0)
++ VIR_FREE(numa->mem_nodes[i].distances);
+ }
+ VIR_FREE(numa->mem_nodes);
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Fix-message-when-maximum-vCPU-count-is-less-than-current.patch b/SOURCES/libvirt-conf-Fix-message-when-maximum-vCPU-count-is-less-than-current.patch
new file mode 100644
index 0000000..69ef6d6
--- /dev/null
+++ b/SOURCES/libvirt-conf-Fix-message-when-maximum-vCPU-count-is-less-than-current.patch
@@ -0,0 +1,37 @@
+From 73e3efc5dae126514b00a8538664609810cadbc4 Mon Sep 17 00:00:00 2001
+Message-Id: <73e3efc5dae126514b00a8538664609810cadbc4@dist-git>
+From: Peter Krempa
+Date: Mon, 13 Nov 2017 13:48:09 +0100
+Subject: [PATCH] conf: Fix message when maximum vCPU count is less than
+ current
+
+Reword the message and drop the numbers (which were reversed) from it
+so that it actually makes sense.
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1509151
+(cherry picked from commit 50712e14f40ffdac8a71ce9ef091e4e7bd822585)
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 3b337d1a64..ca5d0bcc54 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -1505,9 +1505,9 @@ virDomainDefSetVcpus(virDomainDefPtr def,
+ size_t i;
+
+ if (vcpus > def->maxvcpus) {
+- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+- _("maxvcpus must not be less than current vcpus (%u < %zu)"),
+- vcpus, def->maxvcpus);
++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
++ _("maximum vCPU count must not be less than current "
++ "vCPU count"));
+ return -1;
+ }
+
+--
+2.15.0
+
diff --git a/SOURCES/libvirt-conf-Format-cache-banks-in-capabilities-with-virFormatIntPretty.patch b/SOURCES/libvirt-conf-Format-cache-banks-in-capabilities-with-virFormatIntPretty.patch
new file mode 100644
index 0000000..a1d532b
--- /dev/null
+++ b/SOURCES/libvirt-conf-Format-cache-banks-in-capabilities-with-virFormatIntPretty.patch
@@ -0,0 +1,166 @@
+From 5a978253cced5135a6dd01c730faea2fd21a5dc9 Mon Sep 17 00:00:00 2001
+Message-Id: <5a978253cced5135a6dd01c730faea2fd21a5dc9@dist-git>
+From: Martin Kletzander
+Date: Wed, 31 Jan 2018 16:32:18 +0100
+Subject: [PATCH] conf: Format cache banks in capabilities with
+ virFormatIntPretty
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1289368
+
+Signed-off-by: Martin Kletzander
+Reviewed-by: John Ferlan
+(cherry picked from commit 63d95a19cc72d120d40092c1e97235d7b9d4eb29)
+Signed-off-by: Martin Kletzander
+---
+ src/conf/capabilities.c | 50 ++++++++++++++--------
+ tests/vircaps2xmldata/vircaps-x86_64-caches.xml | 2 +-
+ .../vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml | 4 +-
+ .../vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml | 4 +-
+ tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml | 4 +-
+ 5 files changed, 39 insertions(+), 25 deletions(-)
+
+diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
+index 1f7d8cdb31..798c9bdaea 100644
+--- a/src/conf/capabilities.c
++++ b/src/conf/capabilities.c
+@@ -883,7 +883,8 @@ virCapabilitiesFormatCaches(virBufferPtr buf,
+ for (i = 0; i < ncaches; i++) {
+ virCapsHostCacheBankPtr bank = caches[i];
+ char *cpus_str = virBitmapFormat(bank->cpus);
+- bool kilos = !(bank->size % 1024);
++ const char *unit = NULL;
++ unsigned long long short_size = virFormatIntPretty(bank->size, &unit);
+
+ if (!cpus_str)
+ return -1;
+@@ -897,34 +898,47 @@ virCapabilitiesFormatCaches(virBufferPtr buf,
+ "size='%llu' unit='%s' cpus='%s'",
+ bank->id, bank->level,
+ virCacheTypeToString(bank->type),
+- bank->size >> (kilos * 10),
+- kilos ? "KiB" : "B",
+- cpus_str);
++ short_size, unit, cpus_str);
+ VIR_FREE(cpus_str);
+
+ virBufferSetChildIndent(&controlBuf, buf);
+ for (j = 0; j < bank->ncontrols; j++) {
+- bool min_kilos = !(bank->controls[j]->granularity % 1024);
++ const char *min_unit;
++ virResctrlInfoPtr controls = bank->controls[j];
++ unsigned long long gran_short_size = controls->granularity;
++ unsigned long long min_short_size = controls->min;
+
+- /* Only use KiB if both values are divisible */
+- if (bank->controls[j]->min)
+- min_kilos = min_kilos && !(bank->controls[j]->min % 1024);
++ gran_short_size = virFormatIntPretty(gran_short_size, &unit);
++ min_short_size = virFormatIntPretty(min_short_size, &min_unit);
+
+- virBufferAsprintf(&controlBuf,
+- "controls[j]->granularity >> (min_kilos * 10));
++ /* Only use the smaller unit if they are different */
++ if (min_short_size) {
++ unsigned long long gran_div;
++ unsigned long long min_div;
+
+- if (bank->controls[j]->min) {
+- virBufferAsprintf(&controlBuf,
+- " min='%llu'",
+- bank->controls[j]->min >> (min_kilos * 10));
++ gran_div = controls->granularity / gran_short_size;
++ min_div = controls->min / min_short_size;
++
++ if (min_div > gran_div) {
++ min_short_size *= min_div / gran_div;
++ } else if (min_div < gran_div) {
++ unit = min_unit;
++ gran_short_size *= gran_div / min_div;
++ }
+ }
+
++ virBufferAsprintf(&controlBuf,
++ " \n",
+- min_kilos ? "KiB" : "B",
+- virCacheTypeToString(bank->controls[j]->scope),
+- bank->controls[j]->max_allocation);
++ unit,
++ virCacheTypeToString(controls->scope),
++ controls->max_allocation);
+ }
+
+ if (virBufferCheckError(&controlBuf) < 0)
+diff --git a/tests/vircaps2xmldata/vircaps-x86_64-caches.xml b/tests/vircaps2xmldata/vircaps-x86_64-caches.xml
+index fe0be6d08f..0c6f3769a2 100644
+--- a/tests/vircaps2xmldata/vircaps-x86_64-caches.xml
++++ b/tests/vircaps2xmldata/vircaps-x86_64-caches.xml
+@@ -29,7 +29,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml
+index 7361537bfb..443917c62d 100644
+--- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml
++++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml
+@@ -41,11 +41,11 @@
+
+
+
+-
++
+
+
+
+-
++
+
+
+
+diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml
+index 4e91c87de3..0cd25e59a9 100644
+--- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml
++++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml
+@@ -22,8 +22,8 @@
+
+
+
+-
+-
++
++
+
+
+
+diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml
+index eb02ad3322..7629259294 100644
+--- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml
++++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml
+@@ -41,10 +41,10 @@
+
+
+
+-
++
+
+
+-
++
+
+
+
+--
+2.16.1
+
diff --git a/SOURCES/libvirt-conf-Implement-isolation-rules.patch b/SOURCES/libvirt-conf-Implement-isolation-rules.patch
deleted file mode 100644
index 603e2e0..0000000
--- a/SOURCES/libvirt-conf-Implement-isolation-rules.patch
+++ /dev/null
@@ -1,164 +0,0 @@
-From 672fd7d403ef52f10084c5c0b6aaeeb94f6fba2a Mon Sep 17 00:00:00 2001
-Message-Id: <672fd7d403ef52f10084c5c0b6aaeeb94f6fba2a@dist-git>
-From: Andrea Bolognani
-Date: Tue, 18 Jul 2017 12:10:06 +0200
-Subject: [PATCH] conf: Implement isolation rules
-
-These rules will make it possible for libvirt to
-automatically assign PCI addresses in a way that
-respects any isolation constraints devices might
-have.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit 209dc615e898f027b6dc8fa6acd3aeba5fd465bd)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1280542
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_addr.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++---
- src/conf/domain_addr.h | 3 +++
- 2 files changed, 72 insertions(+), 4 deletions(-)
-
-diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
-index a067493136..d586bb7e47 100644
---- a/src/conf/domain_addr.c
-+++ b/src/conf/domain_addr.c
-@@ -369,6 +369,20 @@ virDomainPCIAddressBusIsFullyReserved(virDomainPCIAddressBusPtr bus)
- }
-
-
-+bool
-+virDomainPCIAddressBusIsEmpty(virDomainPCIAddressBusPtr bus)
-+{
-+ size_t i;
-+
-+ for (i = bus->minSlot; i <= bus->maxSlot; i++) {
-+ if (bus->slot[i].functions)
-+ return false;
-+ }
-+
-+ return true;
-+}
-+
-+
- /* Ensure addr fits in the address set, by expanding it if needed
- *
- * Return value:
-@@ -548,7 +562,7 @@ static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
- virDomainPCIAddressReserveAddrInternal(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr,
- virDomainPCIConnectFlags flags,
-- unsigned int isolationGroup ATTRIBUTE_UNUSED,
-+ unsigned int isolationGroup,
- bool fromConfig)
- {
- int ret = -1;
-@@ -586,6 +600,26 @@ virDomainPCIAddressReserveAddrInternal(virDomainPCIAddressSetPtr addrs,
- bus->slot[addr->slot].aggregate = true;
- }
-
-+ if (virDomainPCIAddressBusIsEmpty(bus) && !bus->isolationGroupLocked) {
-+ /* The first device decides the isolation group for the
-+ * entire bus */
-+ bus->isolationGroup = isolationGroup;
-+ VIR_DEBUG("PCI bus %.4x:%.2x assigned isolation group %u because of "
-+ "first device %s",
-+ addr->domain, addr->bus, isolationGroup, addrStr);
-+ } else if (bus->isolationGroup != isolationGroup && fromConfig) {
-+ /* If this is not the first function and its isolation group
-+ * doesn't match the bus', then it should not be using this
-+ * address. However, if the address comes from the user then
-+ * we comply with the request and change the isolation group
-+ * back to the default (because at that point isolation can't
-+ * be guaranteed anymore) */
-+ bus->isolationGroup = 0;
-+ VIR_DEBUG("PCI bus %.4x:%.2x assigned isolation group %u because of "
-+ "user assigned address %s",
-+ addr->domain, addr->bus, isolationGroup, addrStr);
-+ }
-+
- /* mark the requested function as reserved */
- bus->slot[addr->slot].functions |= (1 << addr->function);
- VIR_DEBUG("Reserving PCI address %s (aggregate='%s')", addrStr,
-@@ -763,7 +797,7 @@ static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
- virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr next_addr,
- virDomainPCIConnectFlags flags,
-- unsigned int isolationGroup ATTRIBUTE_UNUSED,
-+ unsigned int isolationGroup,
- int function)
- {
- virPCIDeviceAddress a = { 0 };
-@@ -779,12 +813,17 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- else
- a.function = function;
-
-- /* "Begin at the beginning," the King said, very gravely, "and go on
-- * till you come to the end: then stop." */
-+ /* When looking for a suitable bus for the device, start by being
-+ * very strict and ignoring all those where the isolation groups
-+ * don't match. This ensures all devices sharing the same isolation
-+ * group will end up on the same bus */
- for (a.bus = 0; a.bus < addrs->nbuses; a.bus++) {
- virDomainPCIAddressBusPtr bus = &addrs->buses[a.bus];
- bool found = false;
-
-+ if (bus->isolationGroup != isolationGroup)
-+ continue;
-+
- a.slot = bus->minSlot;
-
- if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, function,
-@@ -796,6 +835,32 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- goto success;
- }
-
-+ /* We haven't been able to find a perfectly matching bus, but we
-+ * might still be able to make this work by altering the isolation
-+ * group for a bus that's currently empty. So let's try that */
-+ for (a.bus = 0; a.bus < addrs->nbuses; a.bus++) {
-+ virDomainPCIAddressBusPtr bus = &addrs->buses[a.bus];
-+ bool found = false;
-+
-+ /* We can only change the isolation group for a bus when
-+ * plugging in the first device; moreover, some buses are
-+ * prevented from ever changing it */
-+ if (!virDomainPCIAddressBusIsEmpty(bus) || bus->isolationGroupLocked)
-+ continue;
-+
-+ a.slot = bus->minSlot;
-+
-+ if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, function,
-+ flags, &found) < 0) {
-+ goto error;
-+ }
-+
-+ /* The isolation group for the bus will actually be changed
-+ * later, in virDomainPCIAddressReserveAddrInternal() */
-+ if (found)
-+ goto success;
-+ }
-+
- /* There were no free slots after the last used one */
- if (addrs->dryRun) {
- /* a is already set to the first new bus */
-diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
-index 01dbc5114f..ae6a342dbc 100644
---- a/src/conf/domain_addr.h
-+++ b/src/conf/domain_addr.h
-@@ -150,6 +150,9 @@ int virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus,
- bool virDomainPCIAddressBusIsFullyReserved(virDomainPCIAddressBusPtr bus)
- ATTRIBUTE_NONNULL(1);
-
-+bool virDomainPCIAddressBusIsEmpty(virDomainPCIAddressBusPtr bus)
-+ ATTRIBUTE_NONNULL(1);
-+
- bool virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Improve-error-handling-in-virDomainChrDefFormat.patch b/SOURCES/libvirt-conf-Improve-error-handling-in-virDomainChrDefFormat.patch
new file mode 100644
index 0000000..d3f07fc
--- /dev/null
+++ b/SOURCES/libvirt-conf-Improve-error-handling-in-virDomainChrDefFormat.patch
@@ -0,0 +1,54 @@
+From f2dd85b3b81cd5c0842ffb55554c1a9cb5e8764b Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:01 +0100
+Subject: [PATCH] conf: Improve error handling in virDomainChrDefFormat()
+
+We don't need to store the return value since we never modify it.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit be956c4e38770dd61998815bbea4b7c2fc38a7d6)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index d68a5f415c..cf1bd030a0 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -24028,8 +24028,6 @@ virDomainChrDefFormat(virBufferPtr buf,
+ const char *elementName = virDomainChrDeviceTypeToString(def->deviceType);
+ bool tty_compat;
+
+- int ret = 0;
+-
+ if (!elementName) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected char device type %d"),
+@@ -24050,14 +24048,14 @@ virDomainChrDefFormat(virBufferPtr buf,
+ virDomainChrSourceDefFormat(buf, def->source, flags);
+
+ if (virDomainChrTargetDefFormat(buf, def, flags) < 0)
+- return -1;
++ return -1;
+
+ virDomainDeviceInfoFormat(buf, &def->info, flags);
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAsprintf(buf, "%s>\n", elementName);
+
+- return ret;
++ return 0;
+ }
+
+ static int
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Improve-virDomainChrTargetDefFormat.patch b/SOURCES/libvirt-conf-Improve-virDomainChrTargetDefFormat.patch
new file mode 100644
index 0000000..5d75d47
--- /dev/null
+++ b/SOURCES/libvirt-conf-Improve-virDomainChrTargetDefFormat.patch
@@ -0,0 +1,89 @@
+From 6e8cb0e122f7c269d1252ed7d55a7c82ae0062eb Mon Sep 17 00:00:00 2001
+Message-Id: <6e8cb0e122f7c269d1252ed7d55a7c82ae0062eb@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:03 +0100
+Subject: [PATCH] conf: Improve virDomainChrTargetDefFormat()
+
+Make the switch statement type-aware, avoid calling
+virDomainChrTargetTypeToString() more than once and check its
+return value before using it.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 46084f2aa1e9188709fcd7abc5c41fe165b2b19b)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 29 ++++++++++++++++++++++-------
+ 1 file changed, 22 insertions(+), 7 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 346edaa6bd..2489705d6b 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -23945,7 +23945,7 @@ virDomainChrTargetDefFormat(virBufferPtr buf,
+ const char *targetType = virDomainChrTargetTypeToString(def->deviceType,
+ def->targetType);
+
+- switch (def->deviceType) {
++ switch ((virDomainChrDeviceType) def->deviceType) {
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: {
+ if (!targetType) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+@@ -23992,28 +23992,43 @@ virDomainChrTargetDefFormat(virBufferPtr buf,
+ }
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
++ if (!targetType) {
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("Could not format console target type"));
++ return -1;
++ }
++
+ virBufferAsprintf(buf,
+ " \n",
+- virDomainChrTargetTypeToString(def->deviceType,
+- def->targetType),
+- def->target.port);
++ targetType, def->target.port);
+ break;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
++ if (!targetType) {
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("Could not format serial target type"));
++ return -1;
++ }
++
+ if (def->targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE) {
+ virBufferAsprintf(buf,
+ " \n",
+- virDomainChrTargetTypeToString(def->deviceType,
+- def->targetType),
++ targetType,
+ def->target.port);
+ break;
+ }
+ ATTRIBUTE_FALLTHROUGH;
+
+- default:
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
+ virBufferAsprintf(buf, " \n",
+ def->target.port);
+ break;
++
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST:
++ virReportError(VIR_ERR_INTERNAL_ERROR,
++ _("unexpected char device type %d"),
++ def->deviceType);
++ return -1;
+ }
+
+ return 0;
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Introduce-VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE.patch b/SOURCES/libvirt-conf-Introduce-VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE.patch
new file mode 100644
index 0000000..18c006d
--- /dev/null
+++ b/SOURCES/libvirt-conf-Introduce-VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE.patch
@@ -0,0 +1,159 @@
+From 4f4db541098163a2061cd63ce6bfb83ce2ed38b5 Mon Sep 17 00:00:00 2001
+Message-Id: <4f4db541098163a2061cd63ce6bfb83ce2ed38b5@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:22:58 +0100
+Subject: [PATCH] conf: Introduce VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE
+
+This is the first step in getting rid of the assumption that
+isa-serial is the default target type for serial devices.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 6385c8c14233388d929ed62717684e7352543416)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 8 +++++---
+ src/conf/domain_conf.h | 3 ++-
+ src/qemu/qemu_command.c | 13 +++++++++++++
+ src/qemu/qemu_domain.c | 21 +++++++++++++++++++++
+ src/qemu/qemu_domain_address.c | 1 +
+ 5 files changed, 42 insertions(+), 4 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 41674a85af..3a5ecd3a9d 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -441,6 +441,7 @@ VIR_ENUM_IMPL(virDomainChrDeviceState, VIR_DOMAIN_CHR_DEVICE_STATE_LAST,
+
+ VIR_ENUM_IMPL(virDomainChrSerialTarget,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST,
++ "none",
+ "isa-serial",
+ "usb-serial",
+ "pci-serial")
+@@ -4025,7 +4026,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
+
+ /* modify it to be a serial port */
+ def->serials[0]->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
+- def->serials[0]->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
++ def->serials[0]->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
+ def->serials[0]->target.port = 0;
+ } else {
+ /* if the console source doesn't match */
+@@ -4049,7 +4050,8 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
+ def->serials[0]->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) {
+
+ switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) {
+- case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: {
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: {
+
+ /* Create a stub console to match the serial port.
+ * console[0] either does not exist
+@@ -11485,7 +11487,7 @@ virDomainChrDefaultTargetType(int devtype)
+ return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
+- return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
++ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST:
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 09635763a1..9502573b34 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -1073,7 +1073,8 @@ typedef enum {
+ } virDomainChrDeviceType;
+
+ typedef enum {
+- VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA = 0,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE = 0,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI,
+
+diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
+index 3d970ed9d1..d593e60198 100644
+--- a/src/qemu/qemu_command.c
++++ b/src/qemu/qemu_command.c
+@@ -9255,6 +9255,14 @@ qemuChrIsPlatformDevice(const virDomainDef *def,
+ return true;
+ }
+
++ /* If we got all the way here and we're still stuck with the default
++ * target type for a serial device, it means we have no clue what kind of
++ * device we're talking about and we must treat it as a platform device. */
++ if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
++ chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE) {
++ return true;
++ }
++
+ return false;
+ }
+
+@@ -10378,7 +10386,12 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
+ }
+ break;
+
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
++ /* Except from _LAST, which is just a guard value and will never
++ * be used, all of the above are platform devices, which means
++ * qemuBuildSerialCommandLine() will have taken the appropriate
++ * branch and we will not have ended up here. */
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Invalid target type for serial device"));
+ goto error;
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index b15d994774..e43f7496c2 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -4095,6 +4095,27 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO;
+ }
+
++ /* Historically, isa-serial and the default matched, so in order to
++ * maintain backwards compatibility we map them here. The actual default
++ * will be picked below based on the architecture and machine type. */
++ if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
++ chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA) {
++ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
++ }
++
++ /* Set the default serial type */
++ if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
++ chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE) {
++ if (ARCH_IS_X86(def->os.arch)) {
++ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
++ } else if (qemuDomainIsPSeries(def)) {
++ /* Setting TYPE_ISA here is just a temporary hack to reduce test
++ * suite churn. Later on we will have a proper serial type for
++ * pSeries and this line will be updated accordingly. */
++ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
++ }
++ }
++
+ /* clear auto generated unix socket path for inactive definitions */
+ if (parseFlags & VIR_DOMAIN_DEF_PARSE_INACTIVE) {
+ if (qemuDomainChrDefDropDefaultPath(chr, driver) < 0)
+diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
+index 7f4ac0f45a..989c0e6c93 100644
+--- a/src/qemu/qemu_domain_address.c
++++ b/src/qemu/qemu_domain_address.c
+@@ -782,6 +782,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
+
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ return 0;
+ }
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Introduce-isolation-groups.patch b/SOURCES/libvirt-conf-Introduce-isolation-groups.patch
deleted file mode 100644
index ef6ce9f..0000000
--- a/SOURCES/libvirt-conf-Introduce-isolation-groups.patch
+++ /dev/null
@@ -1,324 +0,0 @@
-From 0b739987779a9f197d558f9c3b31d557a564bb6d Mon Sep 17 00:00:00 2001
-Message-Id: <0b739987779a9f197d558f9c3b31d557a564bb6d@dist-git>
-From: Andrea Bolognani
-Date: Tue, 18 Jul 2017 12:10:05 +0200
-Subject: [PATCH] conf: Introduce isolation groups
-
-Isolation groups will eventually allow us to make sure certain
-devices, eg. PCI hostdevs, are assigned to guest PCI buses in
-a way that guarantees improved isolation, error detection and
-recovery for machine types and hypervisors that support it,
-eg. pSeries guest on QEMU.
-
-This patch merely defines storage for the new information
-we're going to need later on and makes sure it is passed from
-the hypervisor driver (QEMU / bhyve) down to the generic PCI
-address allocation code.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit b8b6abbcd431d02ac106ee729204552d80762aae)
-
-Conflicts:
-
- * src/conf/device_conf.h:
-
- caused by 54fa1b44afc8bfe4a36c7c4e3b2fe1fafde0506c, where
- virDomainDeviceInfo::loadparm is introduced, not being
- present in the tree;
-
- * src/conf/domain_conf.c:
-
- caused mostly by the absence of commit
- 0c53382d820aac4767895a727c01de23397a6aaa and hence the
- virDomainSkipBackcompatConsole() function, but
- 54fa1b44afc8bfe4a36c7c4e3b2fe1fafde0506c mentioned above
- also plays a role.
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1280542
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/bhyve/bhyve_device.c | 4 ++--
- src/conf/device_conf.h | 10 ++++++++++
- src/conf/domain_addr.c | 17 ++++++++++++-----
- src/conf/domain_addr.h | 9 ++++++++-
- src/conf/domain_conf.c | 2 ++
- src/qemu/qemu_domain_address.c | 35 ++++++++++++++++++-----------------
- 6 files changed, 52 insertions(+), 25 deletions(-)
-
-diff --git a/src/bhyve/bhyve_device.c b/src/bhyve/bhyve_device.c
-index fdfd512e10..03aa6c93bd 100644
---- a/src/bhyve/bhyve_device.c
-+++ b/src/bhyve/bhyve_device.c
-@@ -57,7 +57,7 @@ bhyveCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
- }
-
- if (virDomainPCIAddressReserveAddr(addrs, addr,
-- VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) {
-+ VIR_PCI_CONNECT_TYPE_PCI_DEVICE, 0) < 0) {
- goto cleanup;
- }
-
-@@ -100,7 +100,7 @@ bhyveAssignDevicePCISlots(virDomainDefPtr def,
- lpc_addr.slot = 0x1;
-
- if (virDomainPCIAddressReserveAddr(addrs, &lpc_addr,
-- VIR_PCI_CONNECT_TYPE_PCI_DEVICE) < 0) {
-+ VIR_PCI_CONNECT_TYPE_PCI_DEVICE, 0) < 0) {
- goto error;
- }
-
-diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
-index a20de853f8..6436a8cf3f 100644
---- a/src/conf/device_conf.h
-+++ b/src/conf/device_conf.h
-@@ -167,6 +167,16 @@ struct _virDomainDeviceInfo {
- * assignment, never saved and never reported.
- */
- int pciConnectFlags; /* enum virDomainPCIConnectFlags */
-+
-+ /* PCI devices will only be automatically placed on a PCI bus
-+ * that shares the same isolation group */
-+ unsigned int isolationGroup;
-+
-+ /* Usually, PCI buses will take on the same isolation group
-+ * as the first device that is plugged into them, but in some
-+ * cases we might want to prevent that from happening by
-+ * locking the isolation group */
-+ bool isolationGroupLocked;
- };
-
-
-diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
-index 8990372ae0..a067493136 100644
---- a/src/conf/domain_addr.c
-+++ b/src/conf/domain_addr.c
-@@ -548,6 +548,7 @@ static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
- virDomainPCIAddressReserveAddrInternal(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr,
- virDomainPCIConnectFlags flags,
-+ unsigned int isolationGroup ATTRIBUTE_UNUSED,
- bool fromConfig)
- {
- int ret = -1;
-@@ -600,9 +601,11 @@ virDomainPCIAddressReserveAddrInternal(virDomainPCIAddressSetPtr addrs,
- int
- virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr,
-- virDomainPCIConnectFlags flags)
-+ virDomainPCIConnectFlags flags,
-+ unsigned int isolationGroup)
- {
-- return virDomainPCIAddressReserveAddrInternal(addrs, addr, flags, true);
-+ return virDomainPCIAddressReserveAddrInternal(addrs, addr, flags,
-+ isolationGroup, true);
- }
-
- int
-@@ -638,7 +641,8 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs,
- goto cleanup;
-
- ret = virDomainPCIAddressReserveAddrInternal(addrs, &dev->addr.pci,
-- flags, true);
-+ flags, dev->isolationGroup,
-+ true);
- } else {
- ret = virDomainPCIAddressReserveNextAddr(addrs, dev, flags, -1);
- }
-@@ -759,6 +763,7 @@ static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
- virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr next_addr,
- virDomainPCIConnectFlags flags,
-+ unsigned int isolationGroup ATTRIBUTE_UNUSED,
- int function)
- {
- virPCIDeviceAddress a = { 0 };
-@@ -839,10 +844,12 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
- {
- virPCIDeviceAddress addr;
-
-- if (virDomainPCIAddressGetNextAddr(addrs, &addr, flags, function) < 0)
-+ if (virDomainPCIAddressGetNextAddr(addrs, &addr, flags,
-+ dev->isolationGroup, function) < 0)
- return -1;
-
-- if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags, false) < 0)
-+ if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags,
-+ dev->isolationGroup, false) < 0)
- return -1;
-
- if (!addrs->dryRun) {
-diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
-index 49f30332f0..01dbc5114f 100644
---- a/src/conf/domain_addr.h
-+++ b/src/conf/domain_addr.h
-@@ -100,6 +100,12 @@ typedef struct {
- * bit is set, that function is in use by a device.
- */
- virDomainPCIAddressSlot slot[VIR_PCI_ADDRESS_SLOT_LAST + 1];
-+
-+ /* See virDomainDeviceInfo::isolationGroup */
-+ unsigned int isolationGroup;
-+
-+ /* See virDomainDeviceInfo::isolationGroupLocked */
-+ bool isolationGroupLocked;
- } virDomainPCIAddressBus;
- typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;
-
-@@ -155,7 +161,8 @@ int virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr addrs,
-
- int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr,
-- virDomainPCIConnectFlags flags)
-+ virDomainPCIConnectFlags flags,
-+ unsigned int isolationGroup)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-
- int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index f28f6aff63..5941a3a4c4 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -3608,6 +3608,8 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info)
- memset(&info->addr, 0, sizeof(info->addr));
- info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
- VIR_FREE(info->romfile);
-+ info->isolationGroup = 0;
-+ info->isolationGroupLocked = false;
- }
-
-
-diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
-index d19ffea7c9..02e214b8dd 100644
---- a/src/qemu/qemu_domain_address.c
-+++ b/src/qemu/qemu_domain_address.c
-@@ -1032,7 +1032,8 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
- }
-
- if (virDomainPCIAddressReserveAddr(addrs, addr,
-- info->pciConnectFlags) < 0) {
-+ info->pciConnectFlags,
-+ info->isolationGroup) < 0) {
- goto cleanup;
- }
-
-@@ -1077,6 +1078,10 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
- if (virDomainPCIAddressBusSetModel(&addrs->buses[idx], cont->model) < 0)
- goto error;
-
-+ /* Forward the information about isolation groups */
-+ addrs->buses[idx].isolationGroup = cont->info.isolationGroup;
-+ addrs->buses[idx].isolationGroupLocked = cont->info.isolationGroupLocked;
-+
- if (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT)
- hasPCIeRoot = true;
- }
-@@ -1193,7 +1198,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
- if (addrs->nbuses) {
- memset(&tmp_addr, 0, sizeof(tmp_addr));
- tmp_addr.slot = 1;
-- if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0)
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
- }
-
-@@ -1228,7 +1233,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
- goto cleanup;
- }
- } else {
-- if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0)
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
- primaryVideo->info.addr.pci = tmp_addr;
- primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
-@@ -1253,7 +1258,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
- VIR_DEBUG("PCI address 0:0:2.0 in use, future addition of a video"
- " device will not be possible without manual"
- " intervention");
-- } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0) {
-+ } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0) {
- goto cleanup;
- }
- }
-@@ -1329,10 +1334,8 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
- assign = true;
- }
- if (assign) {
-- if (virDomainPCIAddressReserveAddr(addrs,
-- &tmp_addr, flags) < 0) {
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
-- }
-
- cont->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
- cont->info.addr.pci.domain = 0;
-@@ -1354,10 +1357,8 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
- memset(&tmp_addr, 0, sizeof(tmp_addr));
- tmp_addr.slot = 0x1E;
- if (!virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) {
-- if (virDomainPCIAddressReserveAddr(addrs,
-- &tmp_addr, flags) < 0) {
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
-- }
-
- cont->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
- cont->info.addr.pci.domain = 0;
-@@ -1380,12 +1381,12 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
- tmp_addr.slot = 0x1F;
- tmp_addr.function = 0;
- tmp_addr.multi = VIR_TRISTATE_SWITCH_ON;
-- if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0)
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
-
- tmp_addr.function = 3;
- tmp_addr.multi = VIR_TRISTATE_SWITCH_ABSENT;
-- if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0)
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
- }
-
-@@ -1419,7 +1420,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
- goto cleanup;
- }
- } else {
-- if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0)
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
- primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
- primaryVideo->info.addr.pci = tmp_addr;
-@@ -1445,8 +1446,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
- " device will not be possible without manual"
- " intervention");
- virResetLastError();
-- } else if (virDomainPCIAddressReserveAddr(addrs,
-- &tmp_addr, flags) < 0) {
-+ } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0) {
- goto cleanup;
- }
- }
-@@ -1467,7 +1467,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
- !virDeviceInfoPCIAddressWanted(&sound->info)) {
- continue;
- }
-- if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags) < 0)
-+ if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0)
- goto cleanup;
-
- sound->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
-@@ -1671,7 +1671,8 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def,
- if (foundAddr) {
- /* Reserve this function on the slot we found */
- if (virDomainPCIAddressReserveAddr(addrs, &addr,
-- cont->info.pciConnectFlags) < 0) {
-+ cont->info.pciConnectFlags,
-+ cont->info.isolationGroup) < 0) {
- goto error;
- }
-
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Introduce-virDomainChrTargetDefFormat.patch b/SOURCES/libvirt-conf-Introduce-virDomainChrTargetDefFormat.patch
new file mode 100644
index 0000000..b4d2573
--- /dev/null
+++ b/SOURCES/libvirt-conf-Introduce-virDomainChrTargetDefFormat.patch
@@ -0,0 +1,115 @@
+From 10d833e6bb2798e23beb01ac50d6588bec15b8ad Mon Sep 17 00:00:00 2001
+Message-Id: <10d833e6bb2798e23beb01ac50d6588bec15b8ad@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:00 +0100
+Subject: [PATCH] conf: Introduce virDomainChrTargetDefFormat()
+
+Move formatting of the element for char devices out of
+virDomainChrDefFormat() and into its own function.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 00b7f81fa8f4e32a722ee2ccbb1862f03be062c0)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 67 ++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 40 insertions(+), 27 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 586a840672..d68a5f415c 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -23936,38 +23936,15 @@ virDomainChrSourceDefFormat(virBufferPtr buf,
+ return -1;
+ }
+
++
+ static int
+-virDomainChrDefFormat(virBufferPtr buf,
+- virDomainChrDefPtr def,
+- unsigned int flags)
++virDomainChrTargetDefFormat(virBufferPtr buf,
++ const virDomainChrDef *def,
++ unsigned int flags)
+ {
+- const char *elementName = virDomainChrDeviceTypeToString(def->deviceType);
+ const char *targetType = virDomainChrTargetTypeToString(def->deviceType,
+ def->targetType);
+- bool tty_compat;
+
+- int ret = 0;
+-
+- if (!elementName) {
+- virReportError(VIR_ERR_INTERNAL_ERROR,
+- _("unexpected char device type %d"),
+- def->deviceType);
+- return -1;
+- }
+-
+- virBufferAsprintf(buf, "<%s", elementName);
+- virBufferAdjustIndent(buf, 2);
+- tty_compat = (def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
+- def->target.port == 0 &&
+- def->source->type == VIR_DOMAIN_CHR_TYPE_PTY &&
+- !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) &&
+- def->source->data.file.path);
+- if (virDomainChrAttrsDefFormat(buf, def->source, tty_compat) < 0)
+- return -1;
+- virBufferAddLit(buf, ">\n");
+- virDomainChrSourceDefFormat(buf, def->source, flags);
+-
+- /* Format block */
+ switch (def->deviceType) {
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: {
+ if (!targetType) {
+@@ -24039,6 +24016,42 @@ virDomainChrDefFormat(virBufferPtr buf,
+ break;
+ }
+
++ return 0;
++}
++
++
++static int
++virDomainChrDefFormat(virBufferPtr buf,
++ virDomainChrDefPtr def,
++ unsigned int flags)
++{
++ const char *elementName = virDomainChrDeviceTypeToString(def->deviceType);
++ bool tty_compat;
++
++ int ret = 0;
++
++ if (!elementName) {
++ virReportError(VIR_ERR_INTERNAL_ERROR,
++ _("unexpected char device type %d"),
++ def->deviceType);
++ return -1;
++ }
++
++ virBufferAsprintf(buf, "<%s", elementName);
++ virBufferAdjustIndent(buf, 2);
++ tty_compat = (def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
++ def->target.port == 0 &&
++ def->source->type == VIR_DOMAIN_CHR_TYPE_PTY &&
++ !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) &&
++ def->source->data.file.path);
++ if (virDomainChrAttrsDefFormat(buf, def->source, tty_compat) < 0)
++ return -1;
++ virBufferAddLit(buf, ">\n");
++ virDomainChrSourceDefFormat(buf, def->source, flags);
++
++ if (virDomainChrTargetDefFormat(buf, def, flags) < 0)
++ return -1;
++
+ virDomainDeviceInfoFormat(buf, &def->info, flags);
+
+ virBufferAdjustIndent(buf, -2);
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Introduce-virSaveCookie.patch b/SOURCES/libvirt-conf-Introduce-virSaveCookie.patch
deleted file mode 100644
index fedfc8b..0000000
--- a/SOURCES/libvirt-conf-Introduce-virSaveCookie.patch
+++ /dev/null
@@ -1,290 +0,0 @@
-From 5785b4ff7c33f5e2eb16530f20b6b45d8809aae7 Mon Sep 17 00:00:00 2001
-Message-Id: <5785b4ff7c33f5e2eb16530f20b6b45d8809aae7@dist-git>
-From: Jiri Denemark
-Date: Fri, 2 Jun 2017 00:44:06 +0200
-Subject: [PATCH] conf: Introduce virSaveCookie
-
-The code will be used by snapshots and domain save/restore code to store
-additional data for a saved running domain. It is analogous to migration
-cookies, but simple and one way only.
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit e37daa1fb69ec30042cbc38d489217edb656bc30)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441662
-
-Signed-off-by: Jiri Denemark
----
- po/POTFILES.in | 1 +
- src/Makefile.am | 1 +
- src/conf/virsavecookie.c | 144 +++++++++++++++++++++++++++++++++++++++++++++++
- src/conf/virsavecookie.h | 62 ++++++++++++++++++++
- src/libvirt_private.syms | 7 +++
- 5 files changed, 215 insertions(+)
- create mode 100644 src/conf/virsavecookie.c
- create mode 100644 src/conf/virsavecookie.h
-
-diff --git a/po/POTFILES.in b/po/POTFILES.in
-index 064abd5bbb..cf64115719 100644
---- a/po/POTFILES.in
-+++ b/po/POTFILES.in
-@@ -47,6 +47,7 @@ src/conf/virdomainobjlist.c
- src/conf/virinterfaceobj.c
- src/conf/virnodedeviceobj.c
- src/conf/virnwfilterobj.c
-+src/conf/virsavecookie.c
- src/conf/virsecretobj.c
- src/conf/virstorageobj.c
- src/cpu/cpu.c
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 75e4344198..53550280bf 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -336,6 +336,7 @@ DOMAIN_CONF_SOURCES = \
- conf/domain_conf.c conf/domain_conf.h \
- conf/domain_audit.c conf/domain_audit.h \
- conf/domain_nwfilter.c conf/domain_nwfilter.h \
-+ conf/virsavecookie.c conf/virsavecookie.h \
- conf/snapshot_conf.c conf/snapshot_conf.h \
- conf/numa_conf.c conf/numa_conf.h \
- conf/virdomainobjlist.c conf/virdomainobjlist.h
-diff --git a/src/conf/virsavecookie.c b/src/conf/virsavecookie.c
-new file mode 100644
-index 0000000000..502c04d0f4
---- /dev/null
-+++ b/src/conf/virsavecookie.c
-@@ -0,0 +1,144 @@
-+/**
-+ * virsavecookie.c: Save cookie handling
-+ *
-+ * Copyright (C) 2017 Red Hat, Inc.
-+ *
-+ * 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
-+ * .
-+ */
-+
-+#include
-+
-+#include "virerror.h"
-+#include "virlog.h"
-+#include "virobject.h"
-+#include "virbuffer.h"
-+#include "virxml.h"
-+#include "virsavecookie.h"
-+
-+#define VIR_FROM_THIS VIR_FROM_CONF
-+
-+VIR_LOG_INIT("conf.savecookie");
-+
-+
-+static int
-+virSaveCookieParseNode(xmlXPathContextPtr ctxt,
-+ virObjectPtr *obj,
-+ virSaveCookieCallbacksPtr saveCookie)
-+{
-+ *obj = NULL;
-+
-+ if (!xmlStrEqual(ctxt->node->name, BAD_CAST "cookie")) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("XML does not contain expected 'cookie' element"));
-+ return -1;
-+ }
-+
-+ if (!saveCookie || !saveCookie->parse)
-+ return 0;
-+
-+ return saveCookie->parse(ctxt, obj);
-+}
-+
-+
-+int
-+virSaveCookieParse(xmlXPathContextPtr ctxt,
-+ virObjectPtr *obj,
-+ virSaveCookieCallbacksPtr saveCookie)
-+{
-+ xmlNodePtr node = ctxt->node;
-+ int ret = -1;
-+
-+ *obj = NULL;
-+
-+ if (!(ctxt->node = virXPathNode("./cookie", ctxt))) {
-+ ret = 0;
-+ goto cleanup;
-+ }
-+
-+ ret = virSaveCookieParseNode(ctxt, obj, saveCookie);
-+
-+ cleanup:
-+ ctxt->node = node;
-+ return ret;
-+}
-+
-+
-+int
-+virSaveCookieParseString(const char *xml,
-+ virObjectPtr *obj,
-+ virSaveCookieCallbacksPtr saveCookie)
-+{
-+ xmlDocPtr doc = NULL;
-+ xmlXPathContextPtr ctxt = NULL;
-+ int ret = -1;
-+
-+ *obj = NULL;
-+
-+ if (!xml) {
-+ ret = 0;
-+ goto cleanup;
-+ }
-+
-+ if (!(doc = virXMLParseStringCtxt(xml, _("(save cookie)"), &ctxt)))
-+ goto cleanup;
-+
-+ ret = virSaveCookieParseNode(ctxt, obj, saveCookie);
-+
-+ cleanup:
-+ xmlXPathFreeContext(ctxt);
-+ xmlFreeDoc(doc);
-+ return ret;
-+}
-+
-+
-+int
-+virSaveCookieFormatBuf(virBufferPtr buf,
-+ virObjectPtr obj,
-+ virSaveCookieCallbacksPtr saveCookie)
-+{
-+ if (!obj || !saveCookie || !saveCookie->format)
-+ return 0;
-+
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+
-+ if (saveCookie->format(buf, obj) < 0)
-+ return -1;
-+
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+
-+ return 0;
-+}
-+
-+
-+char *
-+virSaveCookieFormat(virObjectPtr obj,
-+ virSaveCookieCallbacksPtr saveCookie)
-+{
-+ virBuffer buf = VIR_BUFFER_INITIALIZER;
-+
-+ if (virSaveCookieFormatBuf(&buf, obj, saveCookie) < 0)
-+ goto error;
-+
-+ if (virBufferCheckError(&buf) < 0)
-+ goto error;
-+
-+ return virBufferContentAndReset(&buf);
-+
-+ error:
-+ virBufferFreeAndReset(&buf);
-+ return NULL;
-+}
-diff --git a/src/conf/virsavecookie.h b/src/conf/virsavecookie.h
-new file mode 100644
-index 0000000000..4aed18466c
---- /dev/null
-+++ b/src/conf/virsavecookie.h
-@@ -0,0 +1,62 @@
-+/**
-+ * virsavecookie.h: Save cookie handling
-+ *
-+ * Copyright (C) 2017 Red Hat, Inc.
-+ *
-+ * 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
-+ * .
-+ */
-+#ifndef __VIR_SAVE_COOKIE_H__
-+# define __VIR_SAVE_COOKIE_H__
-+
-+# include
-+
-+# include "internal.h"
-+# include "virobject.h"
-+# include "virbuffer.h"
-+
-+
-+typedef int (*virSaveCookieParseFunc)(xmlXPathContextPtr ctxt,
-+ virObjectPtr *obj);
-+typedef int (*virSaveCookieFormatFunc)(virBufferPtr buf,
-+ virObjectPtr obj);
-+
-+typedef struct _virSaveCookieCallbacks virSaveCookieCallbacks;
-+typedef virSaveCookieCallbacks *virSaveCookieCallbacksPtr;
-+struct _virSaveCookieCallbacks {
-+ virSaveCookieParseFunc parse;
-+ virSaveCookieFormatFunc format;
-+};
-+
-+
-+int
-+virSaveCookieParse(xmlXPathContextPtr ctxt,
-+ virObjectPtr *obj,
-+ virSaveCookieCallbacksPtr saveCookie);
-+
-+int
-+virSaveCookieParseString(const char *xml,
-+ virObjectPtr *obj,
-+ virSaveCookieCallbacksPtr saveCookie);
-+
-+int
-+virSaveCookieFormatBuf(virBufferPtr buf,
-+ virObjectPtr obj,
-+ virSaveCookieCallbacksPtr saveCookie);
-+
-+char *
-+virSaveCookieFormat(virObjectPtr obj,
-+ virSaveCookieCallbacksPtr saveCookie);
-+
-+#endif /*__VIR_SAVE_COOKIE_H__ */
-diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
-index a578dfba34..b4769080e8 100644
---- a/src/libvirt_private.syms
-+++ b/src/libvirt_private.syms
-@@ -971,6 +971,13 @@ virNWFilterObjTestUnassignDef;
- virNWFilterObjUnlock;
-
-
-+# conf/virsavecookie.h
-+virSaveCookieFormat;
-+virSaveCookieFormatBuf;
-+virSaveCookieParse;
-+virSaveCookieParseString;
-+
-+
- # conf/virsecretobj.h
- virSecretLoadAllConfigs;
- virSecretObjDeleteConfig;
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Make-error-reporting-in-virCPUDefIsEqual-optional.patch b/SOURCES/libvirt-conf-Make-error-reporting-in-virCPUDefIsEqual-optional.patch
deleted file mode 100644
index 7e24d8f..0000000
--- a/SOURCES/libvirt-conf-Make-error-reporting-in-virCPUDefIsEqual-optional.patch
+++ /dev/null
@@ -1,213 +0,0 @@
-From c1ad40f4ad3813ff3013efba80983f62113fc092 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Jiri Denemark
-Date: Wed, 31 May 2017 16:42:42 +0200
-Subject: [PATCH] conf: Make error reporting in virCPUDefIsEqual optional
-
-The function will be used in paths where mismatching CPU defs are not an
-error.
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 25ec7f6fe959f2811bb014a8c1f0c92bdf9ca13d)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441662
-
-Signed-off-by: Jiri Denemark
----
- src/conf/cpu_conf.c | 83 +++++++++++++++++++++++---------------------------
- src/conf/cpu_conf.h | 3 +-
- src/conf/domain_conf.c | 2 +-
- 3 files changed, 41 insertions(+), 47 deletions(-)
-
-diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
-index a4be5742e3..ffb2e83d67 100644
---- a/src/conf/cpu_conf.c
-+++ b/src/conf/cpu_conf.c
-@@ -811,7 +811,8 @@ virCPUDefAddFeature(virCPUDefPtr def,
-
- bool
- virCPUDefIsEqual(virCPUDefPtr src,
-- virCPUDefPtr dst)
-+ virCPUDefPtr dst,
-+ bool reportError)
- {
- bool identical = false;
- size_t i;
-@@ -819,98 +820,89 @@ virCPUDefIsEqual(virCPUDefPtr src,
- if (!src && !dst)
- return true;
-
-+#define MISMATCH(fmt, ...) \
-+ if (reportError) \
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, fmt, __VA_ARGS__)
-+
- if ((src && !dst) || (!src && dst)) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-- _("Target CPU does not match source"));
-+ MISMATCH("%s", _("Target CPU does not match source"));
- goto cleanup;
- }
-
- if (src->type != dst->type) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU type %s does not match source %s"),
-- virCPUTypeToString(dst->type),
-- virCPUTypeToString(src->type));
-+ MISMATCH(_("Target CPU type %s does not match source %s"),
-+ virCPUTypeToString(dst->type),
-+ virCPUTypeToString(src->type));
- goto cleanup;
- }
-
- if (src->mode != dst->mode) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU mode %s does not match source %s"),
-- virCPUModeTypeToString(dst->mode),
-- virCPUModeTypeToString(src->mode));
-+ MISMATCH(_("Target CPU mode %s does not match source %s"),
-+ virCPUModeTypeToString(dst->mode),
-+ virCPUModeTypeToString(src->mode));
- goto cleanup;
- }
-
- if (src->arch != dst->arch) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU arch %s does not match source %s"),
-- virArchToString(dst->arch),
-- virArchToString(src->arch));
-+ MISMATCH(_("Target CPU arch %s does not match source %s"),
-+ virArchToString(dst->arch),
-+ virArchToString(src->arch));
- goto cleanup;
- }
-
- if (STRNEQ_NULLABLE(src->model, dst->model)) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU model %s does not match source %s"),
-- NULLSTR(dst->model), NULLSTR(src->model));
-+ MISMATCH(_("Target CPU model %s does not match source %s"),
-+ NULLSTR(dst->model), NULLSTR(src->model));
- goto cleanup;
- }
-
- if (STRNEQ_NULLABLE(src->vendor, dst->vendor)) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU vendor %s does not match source %s"),
-- NULLSTR(dst->vendor), NULLSTR(src->vendor));
-+ MISMATCH(_("Target CPU vendor %s does not match source %s"),
-+ NULLSTR(dst->vendor), NULLSTR(src->vendor));
- goto cleanup;
- }
-
- if (STRNEQ_NULLABLE(src->vendor_id, dst->vendor_id)) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU vendor id %s does not match source %s"),
-- NULLSTR(dst->vendor_id), NULLSTR(src->vendor_id));
-+ MISMATCH(_("Target CPU vendor id %s does not match source %s"),
-+ NULLSTR(dst->vendor_id), NULLSTR(src->vendor_id));
- goto cleanup;
- }
-
- if (src->sockets != dst->sockets) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU sockets %d does not match source %d"),
-- dst->sockets, src->sockets);
-+ MISMATCH(_("Target CPU sockets %d does not match source %d"),
-+ dst->sockets, src->sockets);
- goto cleanup;
- }
-
- if (src->cores != dst->cores) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU cores %d does not match source %d"),
-- dst->cores, src->cores);
-+ MISMATCH(_("Target CPU cores %d does not match source %d"),
-+ dst->cores, src->cores);
- goto cleanup;
- }
-
- if (src->threads != dst->threads) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU threads %d does not match source %d"),
-- dst->threads, src->threads);
-+ MISMATCH(_("Target CPU threads %d does not match source %d"),
-+ dst->threads, src->threads);
- goto cleanup;
- }
-
- if (src->nfeatures != dst->nfeatures) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU feature count %zu does not match source %zu"),
-- dst->nfeatures, src->nfeatures);
-+ MISMATCH(_("Target CPU feature count %zu does not match source %zu"),
-+ dst->nfeatures, src->nfeatures);
- goto cleanup;
- }
-
- for (i = 0; i < src->nfeatures; i++) {
- if (STRNEQ(src->features[i].name, dst->features[i].name)) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU feature %s does not match source %s"),
-- dst->features[i].name, src->features[i].name);
-+ MISMATCH(_("Target CPU feature %s does not match source %s"),
-+ dst->features[i].name, src->features[i].name);
- goto cleanup;
- }
-
- if (src->features[i].policy != dst->features[i].policy) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target CPU feature policy %s does not match source %s"),
-- virCPUFeaturePolicyTypeToString(dst->features[i].policy),
-- virCPUFeaturePolicyTypeToString(src->features[i].policy));
-+ MISMATCH(_("Target CPU feature policy %s does not match source %s"),
-+ virCPUFeaturePolicyTypeToString(dst->features[i].policy),
-+ virCPUFeaturePolicyTypeToString(src->features[i].policy));
- goto cleanup;
- }
- }
-@@ -920,11 +912,12 @@ virCPUDefIsEqual(virCPUDefPtr src,
- (src->cache && dst->cache &&
- (src->cache->level != dst->cache->level ||
- src->cache->mode != dst->cache->mode))) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-- _("Target CPU cache does not match source"));
-+ MISMATCH("%s", _("Target CPU cache does not match source"));
- goto cleanup;
- }
-
-+#undef MISMATCH
-+
- identical = true;
-
- cleanup:
-diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
-index 09438b68b4..b0d891552a 100644
---- a/src/conf/cpu_conf.h
-+++ b/src/conf/cpu_conf.h
-@@ -189,7 +189,8 @@ virCPUDefParseXML(xmlNodePtr node,
-
- bool
- virCPUDefIsEqual(virCPUDefPtr src,
-- virCPUDefPtr dst);
-+ virCPUDefPtr dst,
-+ bool reportError);
-
- char *
- virCPUDefFormat(virCPUDefPtr def,
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index bab85c6362..2197330a22 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -20042,7 +20042,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr src,
- goto error;
- }
-
-- if (!virCPUDefIsEqual(src->cpu, dst->cpu))
-+ if (!virCPUDefIsEqual(src->cpu, dst->cpu, true))
- goto error;
-
- if (!virSysinfoIsEqual(src->sysinfo, dst->sysinfo))
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Make-virDomainSnapshotDefFormat-easier-to-read.patch b/SOURCES/libvirt-conf-Make-virDomainSnapshotDefFormat-easier-to-read.patch
deleted file mode 100644
index 5ed7558..0000000
--- a/SOURCES/libvirt-conf-Make-virDomainSnapshotDefFormat-easier-to-read.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-From d1adb920ad7f460e32b1cc68e68120b3c655bc18 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Jiri Denemark
-Date: Thu, 1 Jun 2017 15:57:55 +0200
-Subject: [PATCH] conf: Make virDomainSnapshotDefFormat easier to read
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 00968dca967f4bf9d4f496e5c971bff3f8147ed8)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441662
-
-Signed-off-by: Jiri Denemark
----
- src/conf/snapshot_conf.c | 30 +++++++++++++++++++++---------
- 1 file changed, 21 insertions(+), 9 deletions(-)
-
-diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
-index b6cba5ac38..7daa9b22ad 100644
---- a/src/conf/snapshot_conf.c
-+++ b/src/conf/snapshot_conf.c
-@@ -686,11 +686,13 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf,
- virBufferAddLit(buf, "\n");
- }
-
--char *virDomainSnapshotDefFormat(const char *domain_uuid,
-- virDomainSnapshotDefPtr def,
-- virCapsPtr caps,
-- unsigned int flags,
-- int internal)
-+
-+char *
-+virDomainSnapshotDefFormat(const char *domain_uuid,
-+ virDomainSnapshotDefPtr def,
-+ virCapsPtr caps,
-+ unsigned int flags,
-+ int internal)
- {
- virBuffer buf = VIR_BUFFER_INITIALIZER;
- size_t i;
-@@ -702,12 +704,14 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid,
-
- virBufferAddLit(&buf, "\n");
- virBufferAdjustIndent(&buf, 2);
-+
- virBufferEscapeString(&buf, "%s \n", def->name);
- if (def->description)
- virBufferEscapeString(&buf, "%s \n",
- def->description);
- virBufferAsprintf(&buf, "%s \n",
- virDomainSnapshotStateTypeToString(def->state));
-+
- if (def->parent) {
- virBufferAddLit(&buf, "\n");
- virBufferAdjustIndent(&buf, 2);
-@@ -715,14 +719,17 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid,
- virBufferAdjustIndent(&buf, -2);
- virBufferAddLit(&buf, " \n");
- }
-+
- virBufferAsprintf(&buf, "%lld \n",
- def->creationTime);
-+
- if (def->memory) {
- virBufferAsprintf(&buf, "memory));
- virBufferEscapeString(&buf, " file='%s'", def->file);
- virBufferAddLit(&buf, "/>\n");
- }
-+
- if (def->ndisks) {
- virBufferAddLit(&buf, "\n");
- virBufferAdjustIndent(&buf, 2);
-@@ -731,11 +738,10 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid,
- virBufferAdjustIndent(&buf, -2);
- virBufferAddLit(&buf, " \n");
- }
-+
- if (def->dom) {
-- if (virDomainDefFormatInternal(def->dom, caps, flags, &buf) < 0) {
-- virBufferFreeAndReset(&buf);
-- return NULL;
-- }
-+ if (virDomainDefFormatInternal(def->dom, caps, flags, &buf) < 0)
-+ goto error;
- } else if (domain_uuid) {
- virBufferAddLit(&buf, "\n");
- virBufferAdjustIndent(&buf, 2);
-@@ -743,8 +749,10 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid,
- virBufferAdjustIndent(&buf, -2);
- virBufferAddLit(&buf, " \n");
- }
-+
- if (internal)
- virBufferAsprintf(&buf, "%d \n", def->current);
-+
- virBufferAdjustIndent(&buf, -2);
- virBufferAddLit(&buf, " \n");
-
-@@ -752,6 +760,10 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid,
- return NULL;
-
- return virBufferContentAndReset(&buf);
-+
-+ error:
-+ virBufferFreeAndReset(&buf);
-+ return NULL;
- }
-
- /* Snapshot Obj functions */
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Move-index-number-checking-to-drivers.patch b/SOURCES/libvirt-conf-Move-index-number-checking-to-drivers.patch
deleted file mode 100644
index 52cbf17..0000000
--- a/SOURCES/libvirt-conf-Move-index-number-checking-to-drivers.patch
+++ /dev/null
@@ -1,101 +0,0 @@
-From 711a3ca4a1c0c9bc31a98cd6afcedeb3107157c8 Mon Sep 17 00:00:00 2001
-Message-Id: <711a3ca4a1c0c9bc31a98cd6afcedeb3107157c8@dist-git>
-From: Andrea Bolognani
-Date: Mon, 17 Jul 2017 12:09:06 +0200
-Subject: [PATCH] conf: Move index number checking to drivers
-
-pSeries guests will soon be allowed to have multiple
-PHBs (pci-root controllers), which of course means that
-all but one of them will have a non-zero index; hence,
-we'll need to relax the current check.
-
-However, right now the check is performed in the conf
-module, which is generic rather than tied to the QEMU
-driver, and where we don't have information such as the
-guest machine type available.
-
-To make this change of behavior possible down the line,
-we need to move the check from the XML parser to the
-drivers. Luckily, only QEMU and bhyve are using PCI
-controllers, so this doesn't result in much duplication.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit 620c390c7308f61027cf28000fcfcfcb01e3ae89)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/bhyve/bhyve_domain.c | 15 +++++++++++++++
- src/conf/domain_conf.c | 6 ------
- src/qemu/qemu_domain.c | 9 +++++++++
- 3 files changed, 24 insertions(+), 6 deletions(-)
-
-diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
-index 20c82937b5..71764554eb 100644
---- a/src/bhyve/bhyve_domain.c
-+++ b/src/bhyve/bhyve_domain.c
-@@ -122,6 +122,21 @@ bhyveDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
- bhyveDomainDiskDefAssignAddress(driver, disk, def) < 0)
- return -1;
- }
-+
-+ if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
-+ virDomainControllerDefPtr cont = dev->data.controller;
-+
-+ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
-+ (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
-+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
-+ cont->idx != 0) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("pci-root and pcie-root controllers "
-+ "should have index 0"));
-+ return -1;
-+ }
-+ }
-+
- return 0;
- }
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index d8ca25da38..8e5c487df8 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -9157,12 +9157,6 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- "have an address"));
- goto error;
- }
-- if (def->idx > 0) {
-- virReportError(VIR_ERR_XML_ERROR, "%s",
-- _("pci-root and pcie-root controllers "
-- "should have index 0"));
-- goto error;
-- }
- if ((rc = virDomainParseScaledValue("./pcihole64", NULL,
- ctxt, &bytes, 1024,
- 1024ULL * ULONG_MAX, false)) < 0)
-diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
-index 1528c6a137..87a437eccf 100644
---- a/src/qemu/qemu_domain.c
-+++ b/src/qemu/qemu_domain.c
-@@ -3378,6 +3378,15 @@ qemuDomainControllerDefPostParse(virDomainControllerDefPtr cont,
- break;
-
- case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
-+ if ((cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
-+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
-+ cont->idx != 0) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("pci-root and pcie-root controllers "
-+ "should have index 0"));
-+ return -1;
-+ }
-+
- if (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS &&
- !qemuDomainIsI440FX(def)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Move-target-index-validation.patch b/SOURCES/libvirt-conf-Move-target-index-validation.patch
deleted file mode 100644
index 6c37fc1..0000000
--- a/SOURCES/libvirt-conf-Move-target-index-validation.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 3e5618223a9e21597ed9e95edfc79139563be301 Mon Sep 17 00:00:00 2001
-Message-Id: <3e5618223a9e21597ed9e95edfc79139563be301@dist-git>
-From: Andrea Bolognani
-Date: Mon, 21 Aug 2017 14:46:38 +0200
-Subject: [PATCH] conf: Move target index validation
-
-Validation should happen after parsing, so the proper
-location for it is virDomainControllerDefValidate()
-rather than virDomainControllerDefParseXML().
-
-Signed-off-by: Andrea Bolognani
-(cherry picked from commit c9d75d655ae73693a08123aca75677caf579f9e9)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1479647
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 40 ++++++++++++++++++++++++----------------
- 1 file changed, 24 insertions(+), 16 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 7ba2bc01ca..7889f5335c 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -5046,12 +5046,34 @@ static int
- virDomainControllerDefValidate(const virDomainControllerDef *controller)
- {
- if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
-+ const virDomainPCIControllerOpts *opts = &controller->opts.pciopts;
-+
- if (controller->idx > 255) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("PCI controller index %d too high, maximum is 255"),
- controller->idx);
- return -1;
- }
-+
-+ /* Only validate the target index if it's been set */
-+ if (opts->targetIndex != -1) {
-+
-+ if (opts->targetIndex < 0 || opts->targetIndex > 31) {
-+ virReportError(VIR_ERR_XML_ERROR,
-+ _("PCI controller target index '%d' out of "
-+ "range - must be 0-31"),
-+ opts->targetIndex);
-+ return -1;
-+ }
-+
-+ if ((controller->idx == 0 && opts->targetIndex != 0) ||
-+ (controller->idx != 0 && opts->targetIndex == 0)) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("Only the PCI controller with index 0 can "
-+ "have target index 0, and vice versa"));
-+ return -1;
-+ }
-+ }
- }
- return 0;
- }
-@@ -9292,27 +9314,13 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- }
- if (targetIndex) {
- if (virStrToLong_i(targetIndex, NULL, 0,
-- &def->opts.pciopts.targetIndex) < 0) {
-+ &def->opts.pciopts.targetIndex) < 0 ||
-+ def->opts.pciopts.targetIndex == -1) {
- virReportError(VIR_ERR_XML_ERROR,
- _("Invalid target index '%s' in PCI controller"),
- targetIndex);
- goto error;
- }
-- if (def->opts.pciopts.targetIndex < 0 ||
-- def->opts.pciopts.targetIndex > 31) {
-- virReportError(VIR_ERR_XML_ERROR,
-- _("PCI controller target index '%s' out of "
-- "range - must be 0-31"),
-- targetIndex);
-- goto error;
-- }
-- if ((def->idx == 0 && def->opts.pciopts.targetIndex != 0) ||
-- (def->idx != 0 && def->opts.pciopts.targetIndex == 0)) {
-- virReportError(VIR_ERR_XML_ERROR, "%s",
-- _("Only the PCI controller with index 0 can "
-- "have target index 0, and vice versa"));
-- goto error;
-- }
- }
- if (numaNode >= 0) {
- if (def->idx == 0) {
---
-2.14.1
-
diff --git a/SOURCES/libvirt-conf-Move-virDomainPCIAddressBusIsFullyReserved.patch b/SOURCES/libvirt-conf-Move-virDomainPCIAddressBusIsFullyReserved.patch
deleted file mode 100644
index 838066c..0000000
--- a/SOURCES/libvirt-conf-Move-virDomainPCIAddressBusIsFullyReserved.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From 9d0d053dc7f8af8ebb3c7fbb3a11335e4b50717b Mon Sep 17 00:00:00 2001
-Message-Id: <9d0d053dc7f8af8ebb3c7fbb3a11335e4b50717b@dist-git>
-From: Andrea Bolognani
-Date: Mon, 17 Jul 2017 12:08:58 +0200
-Subject: [PATCH] conf: Move virDomainPCIAddressBusIsFullyReserved()
-
-This function was private to the QEMU driver and was,
-accordingly, called qemuDomainPCIBusFullyReserved().
-
-However the function is really not QEMU-specific at
-all, so it makes sense to move it closer to the
-virDomainPCIAddressBus struct it operates on.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit c79f97c83ce1421f79756a9a344e8e77ceeeb1d8)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_addr.c | 14 ++++++++++++++
- src/conf/domain_addr.h | 3 +++
- src/libvirt_private.syms | 1 +
- src/qemu/qemu_domain_address.c | 15 +--------------
- 4 files changed, 19 insertions(+), 14 deletions(-)
-
-diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
-index 639168effa..0ae1ed93af 100644
---- a/src/conf/domain_addr.c
-+++ b/src/conf/domain_addr.c
-@@ -355,6 +355,20 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus,
- }
-
-
-+bool
-+virDomainPCIAddressBusIsFullyReserved(virDomainPCIAddressBusPtr bus)
-+{
-+ size_t i;
-+
-+ for (i = bus->minSlot; i <= bus->maxSlot; i++) {
-+ if (!bus->slot[i].functions)
-+ return false;
-+ }
-+
-+ return true;
-+}
-+
-+
- /* Ensure addr fits in the address set, by expanding it if needed
- *
- * Return value:
-diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
-index f884b8af2b..c90a335919 100644
---- a/src/conf/domain_addr.h
-+++ b/src/conf/domain_addr.h
-@@ -141,6 +141,9 @@ int virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus,
- virDomainControllerModelPCI model)
- ATTRIBUTE_NONNULL(1);
-
-+bool virDomainPCIAddressBusIsFullyReserved(virDomainPCIAddressBusPtr bus)
-+ ATTRIBUTE_NONNULL(1);
-+
- bool virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
-index 9c596e3f1c..7876ffb208 100644
---- a/src/libvirt_private.syms
-+++ b/src/libvirt_private.syms
-@@ -105,6 +105,7 @@ virDomainCCWAddressSetFree;
- virDomainCCWAddressValidate;
- virDomainGetBlkioParametersAssignFromDef;
- virDomainPCIAddressAsString;
-+virDomainPCIAddressBusIsFullyReserved;
- virDomainPCIAddressBusSetModel;
- virDomainPCIAddressEnsureAddr;
- virDomainPCIAddressFlagsCompatible;
-diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
-index 3da6b7369d..ff57edb564 100644
---- a/src/qemu/qemu_domain_address.c
-+++ b/src/qemu/qemu_domain_address.c
-@@ -1494,19 +1494,6 @@ qemuDomainValidateDevicePCISlotsChipsets(virDomainDefPtr def,
- }
-
-
--static bool
--qemuDomainPCIBusFullyReserved(virDomainPCIAddressBusPtr bus)
--{
-- size_t i;
--
-- for (i = bus->minSlot; i <= bus->maxSlot; i++)
-- if (!bus->slot[i].functions)
-- return false;
--
-- return true;
--}
--
--
- /*
- * This assigns static PCI slots to all configured devices.
- * The ordering here is chosen to match the ordering used
-@@ -2038,7 +2025,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
- bool buses_reserved = true;
-
- for (i = 0; i < addrs->nbuses; i++) {
-- if (!qemuDomainPCIBusFullyReserved(&addrs->buses[i])) {
-+ if (!virDomainPCIAddressBusIsFullyReserved(&addrs->buses[i])) {
- buses_reserved = false;
- break;
- }
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Parse-and-format-target-index.patch b/SOURCES/libvirt-conf-Parse-and-format-target-index.patch
deleted file mode 100644
index fcc68a5..0000000
--- a/SOURCES/libvirt-conf-Parse-and-format-target-index.patch
+++ /dev/null
@@ -1,161 +0,0 @@
-From 4c2b1b9cf0bcd8af7a7d011cd758bb6f11e5477b Mon Sep 17 00:00:00 2001
-Message-Id: <4c2b1b9cf0bcd8af7a7d011cd758bb6f11e5477b@dist-git>
-From: Andrea Bolognani
-Date: Mon, 17 Jul 2017 12:09:09 +0200
-Subject: [PATCH] conf: Parse and format
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit 47dd6e282ab8b0db662092cf0cc53163d805ac4d)
-
-Conflicts:
- * src/conf/domain_conf.c:
-
- caused by e146264aaadf5aecf727d8c7b3d85683b55b6c48,
- which significantly refactored
- virDomainControllerDefFormat(), not being in the tree.
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 6 ++++++
- docs/schemas/domaincommon.rng | 5 +++++
- src/conf/domain_conf.c | 32 ++++++++++++++++++++++++++++++++
- src/conf/domain_conf.h | 1 +
- 4 files changed, 44 insertions(+)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index dc8e7d2dc7..bc67a53408 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -3760,6 +3760,12 @@
- libvirt API to attach host devices to the correct
- pci-expander-bus when assigning them to the domain).
-
-+ index
-+
-+ pci-root controllers for pSeries guests use this attribute to
-+ record the order they will show up in the guest.
-+ Since 3.6.0
-+
-
-
- For machine types which provide an implicit PCI bus, the pci-root
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 964e5c5bd5..b1461d4c61 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -1945,6 +1945,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 8a030c9b68..599db5cafe 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -1854,6 +1854,7 @@ virDomainControllerDefNew(virDomainControllerType type)
- def->opts.pciopts.chassis = -1;
- def->opts.pciopts.port = -1;
- def->opts.pciopts.busNr = -1;
-+ def->opts.pciopts.targetIndex = -1;
- def->opts.pciopts.numaNode = -1;
- break;
- case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
-@@ -8964,6 +8965,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- char *chassis = NULL;
- char *port = NULL;
- char *busNr = NULL;
-+ char *targetIndex = NULL;
- int numaNode = -1;
- char *ioeventfd = NULL;
- char *portsStr = NULL;
-@@ -9036,6 +9038,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- chassis = virXMLPropString(cur, "chassis");
- port = virXMLPropString(cur, "port");
- busNr = virXMLPropString(cur, "busNr");
-+ targetIndex = virXMLPropString(cur, "index");
- processedTarget = true;
- }
- }
-@@ -9254,6 +9257,30 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- goto error;
- }
- }
-+ if (targetIndex) {
-+ if (virStrToLong_i(targetIndex, NULL, 0,
-+ &def->opts.pciopts.targetIndex) < 0) {
-+ virReportError(VIR_ERR_XML_ERROR,
-+ _("Invalid target index '%s' in PCI controller"),
-+ targetIndex);
-+ goto error;
-+ }
-+ if (def->opts.pciopts.targetIndex < 0 ||
-+ def->opts.pciopts.targetIndex > 31) {
-+ virReportError(VIR_ERR_XML_ERROR,
-+ _("PCI controller target index '%s' out of "
-+ "range - must be 0-31"),
-+ targetIndex);
-+ goto error;
-+ }
-+ if ((def->idx == 0 && def->opts.pciopts.targetIndex != 0) ||
-+ (def->idx != 0 && def->opts.pciopts.targetIndex == 0)) {
-+ virReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("Only the PCI controller with index 0 can "
-+ "have target index 0, and vice versa"));
-+ goto error;
-+ }
-+ }
- if (numaNode >= 0)
- def->opts.pciopts.numaNode = numaNode;
- break;
-@@ -9275,6 +9302,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
- VIR_FREE(chassis);
- VIR_FREE(port);
- VIR_FREE(busNr);
-+ VIR_FREE(targetIndex);
- VIR_FREE(ioeventfd);
- VIR_FREE(portsStr);
- VIR_FREE(iothread);
-@@ -21615,6 +21643,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
- def->opts.pciopts.chassis != -1 ||
- def->opts.pciopts.port != -1 ||
- def->opts.pciopts.busNr != -1 ||
-+ def->opts.pciopts.targetIndex != -1 ||
- def->opts.pciopts.numaNode != -1)
- pciTarget = true;
- break;
-@@ -21655,6 +21684,9 @@ virDomainControllerDefFormat(virBufferPtr buf,
- if (def->opts.pciopts.busNr != -1)
- virBufferAsprintf(buf, " busNr='%d'",
- def->opts.pciopts.busNr);
-+ if (def->opts.pciopts.targetIndex != -1)
-+ virBufferAsprintf(buf, " index='%d'",
-+ def->opts.pciopts.targetIndex);
- if (def->opts.pciopts.numaNode == -1) {
- virBufferAddLit(buf, "/>\n");
- } else {
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index e287e6d7f3..50fdc6e2a6 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -786,6 +786,7 @@ struct _virDomainPCIControllerOpts {
- int chassis;
- int port;
- int busNr; /* used by pci-expander-bus, -1 == unspecified */
-+ int targetIndex; /* used by spapr-pci-host-bridge, -1 == unspecified */
- /* numaNode is a *subelement* of target (to match existing
- * item in memory target config) -1 == unspecified
- */
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Parse-and-format-virDomainChrSerialTargetModel.patch b/SOURCES/libvirt-conf-Parse-and-format-virDomainChrSerialTargetModel.patch
new file mode 100644
index 0000000..560296f
--- /dev/null
+++ b/SOURCES/libvirt-conf-Parse-and-format-virDomainChrSerialTargetModel.patch
@@ -0,0 +1,253 @@
+From f39b12fb966c2dfe7841a299f00ff5c6fa68095e Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:07 +0100
+Subject: [PATCH] conf: Parse and format virDomainChrSerialTargetModel
+
+This information will be used to select, and store in the guest
+configuration in order to guarantee ABI stability, the concrete
+(hypervisor-specific) model for serial devices.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 5ad9d9afd4738ea716a6f820bbb53eecf5604a2f)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ docs/formatdomain.html.in | 16 ++++++++--
+ docs/schemas/domaincommon.rng | 15 +++++++++
+ src/conf/domain_conf.c | 72 ++++++++++++++++++++++++++++++++++++++++++-
+ src/conf/domain_conf.h | 12 ++++++++
+ 4 files changed, 112 insertions(+), 3 deletions(-)
+
+diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
+index f57a124056..cf1167b9c6 100644
+--- a/docs/formatdomain.html.in
++++ b/docs/formatdomain.html.in
+@@ -6447,7 +6447,9 @@ qemu-kvm -net nic,model=? /dev/null
+ <devices>
+ <!-- USB serial port -->
+ <serial type='pty'>
+- <target type='usb-serial' port='0'/>
++ <target type='usb-serial' port='0'>
++ <model name='usb-serial'/>
++ </target>
+ <address type='usb' bus='0' port='1'/>
+ </serial>
+ </devices>
+@@ -6463,6 +6465,16 @@ qemu-kvm -net nic,model=? /dev/null
+ is available).
+
+
++
++ Since 3.10.0 , the target
++ element can have an optional model
subelement;
++ valid values for its name
attribute are:
++ isa-serial
(usable with the isa-serial
target
++ type); usb-serial
(usable with the usb-serial
++ target type); pci-serial
++ (usable with the pci-serial
target type).
++
++
+
+ If any of the attributes is not specified by the user, libvirt will
+ choose a value suitable for most users.
+@@ -6489,7 +6501,7 @@ qemu-kvm -net nic,model=? /dev/null
+ <!-- Serial console -->
+ <console type='pty'>
+ <source path='/dev/pts/2'/>
+- <target type='serial' port='0'/>
++ <target type='serial' port='0'/>
+ </console>
+ </devices>
+ ...
+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
+index 367861c1ea..3630e539e6 100644
+--- a/docs/schemas/domaincommon.rng
++++ b/docs/schemas/domaincommon.rng
+@@ -3575,6 +3575,18 @@
+
+
+
++
++
++
++
++ isa-serial
++ usb-serial
++ pci-serial
++
++
++
++
++
+
+
+
+@@ -3589,6 +3601,9 @@
+
+
+
++
++
++
+
+
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 44d9bbe01d..692b9d9414 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -465,6 +465,14 @@ VIR_ENUM_IMPL(virDomainChrConsoleTarget,
+ "sclp",
+ "sclplm")
+
++VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST,
++ "none",
++ "isa-serial",
++ "usb-serial",
++ "pci-serial",
++);
++
+ VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
+ "parallel",
+ "serial",
+@@ -11530,14 +11538,42 @@ virDomainChrTargetTypeFromString(int devtype,
+ return ret;
+ }
+
++static int
++virDomainChrTargetModelFromString(int devtype,
++ const char *targetModel)
++{
++ int ret = -1;
++
++ if (!targetModel)
++ return 0;
++
++ switch ((virDomainChrDeviceType) devtype) {
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
++ ret = virDomainChrSerialTargetModelTypeFromString(targetModel);
++ break;
++
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
++ case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST:
++ /* Target model not supported yet */
++ ret = 0;
++ break;
++ }
++
++ return ret;
++}
++
+ static int
+ virDomainChrDefParseTargetXML(virDomainChrDefPtr def,
+ xmlNodePtr cur,
+ unsigned int flags)
+ {
+ int ret = -1;
++ xmlNodePtr child;
+ unsigned int port;
+ char *targetType = virXMLPropString(cur, "type");
++ char *targetModel = NULL;
+ char *addrStr = NULL;
+ char *portStr = NULL;
+ char *stateStr = NULL;
+@@ -11551,6 +11587,24 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def,
+ goto error;
+ }
+
++ child = cur->children;
++ while (child != NULL) {
++ if (child->type == XML_ELEMENT_NODE &&
++ virXMLNodeNameEqual(child, "model")) {
++ targetModel = virXMLPropString(child, "name");
++ }
++ child = child->next;
++ }
++
++ if ((def->targetModel =
++ virDomainChrTargetModelFromString(def->deviceType,
++ targetModel)) < 0) {
++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
++ _("unknown target model '%s' specified for character device"),
++ targetModel);
++ goto error;
++ }
++
+ switch (def->deviceType) {
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
+ switch (def->targetType) {
+@@ -11639,6 +11693,7 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def,
+ ret = 0;
+ error:
+ VIR_FREE(targetType);
++ VIR_FREE(targetModel);
+ VIR_FREE(addrStr);
+ VIR_FREE(portStr);
+ VIR_FREE(stateStr);
+@@ -24019,8 +24074,23 @@ virDomainChrTargetDefFormat(virBufferPtr buf,
+ }
+
+ virBufferAsprintf(buf,
+- "port='%d'/>\n",
++ "port='%d'",
+ def->target.port);
++
++ if (def->targetModel != VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE) {
++ virBufferAddLit(buf, ">\n");
++
++ virBufferAdjustIndent(buf, 2);
++ virBufferAsprintf(buf,
++ " \n",
++ virDomainChrSerialTargetModelTypeToString(def->targetModel));
++ virBufferAdjustIndent(buf, -2);
++
++ virBufferAddLit(buf, "
\n");
++ } else {
++ virBufferAddLit(buf, "/>\n");
++ }
++
+ break;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index bbb056cf21..9dfe9388cd 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -1104,6 +1104,17 @@ typedef enum {
+ VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST
+ } virDomainChrConsoleTargetType;
+
++typedef enum {
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE = 0,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL,
++
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST
++} virDomainChrSerialTargetModel;
++
++VIR_ENUM_DECL(virDomainChrSerialTargetModel);
++
+ typedef enum {
+ VIR_DOMAIN_CHR_TYPE_NULL,
+ VIR_DOMAIN_CHR_TYPE_VC,
+@@ -1202,6 +1213,7 @@ struct _virDomainChrDef {
+ int targetType; /* enum virDomainChrConsoleTargetType ||
+ enum virDomainChrChannelTargetType ||
+ enum virDomainChrSerialTargetType according to deviceType */
++ int targetModel; /* enum virDomainChrSerialTargetModel */
+
+ union {
+ int port; /* parallel, serial, console */
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Pass-xmlopt-to-virDomainSnapshotDefFormat.patch b/SOURCES/libvirt-conf-Pass-xmlopt-to-virDomainSnapshotDefFormat.patch
deleted file mode 100644
index d546c53..0000000
--- a/SOURCES/libvirt-conf-Pass-xmlopt-to-virDomainSnapshotDefFormat.patch
+++ /dev/null
@@ -1,251 +0,0 @@
-From 49f9421cddc176e39cbb062f26e80ec93341ef0d Mon Sep 17 00:00:00 2001
-Message-Id: <49f9421cddc176e39cbb062f26e80ec93341ef0d@dist-git>
-From: Jiri Denemark
-Date: Fri, 2 Jun 2017 00:27:33 +0200
-Subject: [PATCH] conf: Pass xmlopt to virDomainSnapshotDefFormat
-
-This will be used later when a save cookie will become part of the
-snapshot XML using new driver specific parser/formatter functions.
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 957cd268a98043fe061227a8e829c622a6fb4b86)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441662
-
-Signed-off-by: Jiri Denemark
----
- src/conf/snapshot_conf.c | 1 +
- src/conf/snapshot_conf.h | 1 +
- src/esx/esx_driver.c | 2 +-
- src/qemu/qemu_domain.c | 4 +++-
- src/qemu/qemu_domain.h | 1 +
- src/qemu/qemu_driver.c | 16 ++++++++++++----
- src/test/test_driver.c | 1 +
- src/vbox/vbox_common.c | 4 ++--
- src/vz/vz_driver.c | 1 +
- tests/domainsnapshotxml2xmltest.c | 1 +
- 10 files changed, 24 insertions(+), 8 deletions(-)
-
-diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
-index 7daa9b22ad..e3bba985d7 100644
---- a/src/conf/snapshot_conf.c
-+++ b/src/conf/snapshot_conf.c
-@@ -691,6 +691,7 @@ char *
- virDomainSnapshotDefFormat(const char *domain_uuid,
- virDomainSnapshotDefPtr def,
- virCapsPtr caps,
-+ virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
- unsigned int flags,
- int internal)
- {
-diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
-index da904f9460..2ce526fa6b 100644
---- a/src/conf/snapshot_conf.h
-+++ b/src/conf/snapshot_conf.h
-@@ -114,6 +114,7 @@ void virDomainSnapshotDefFree(virDomainSnapshotDefPtr def);
- char *virDomainSnapshotDefFormat(const char *domain_uuid,
- virDomainSnapshotDefPtr def,
- virCapsPtr caps,
-+ virDomainXMLOptionPtr xmlopt,
- unsigned int flags,
- int internal);
- int virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr snapshot,
-diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
-index 166d4bcfcc..c4e1f58a0b 100644
---- a/src/esx/esx_driver.c
-+++ b/src/esx/esx_driver.c
-@@ -4282,7 +4282,7 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
-
- virUUIDFormat(snapshot->domain->uuid, uuid_string);
-
-- xml = virDomainSnapshotDefFormat(uuid_string, &def, priv->caps,
-+ xml = virDomainSnapshotDefFormat(uuid_string, &def, priv->caps, priv->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
-
-diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
-index 11be085801..09903bdd5f 100644
---- a/src/qemu/qemu_domain.c
-+++ b/src/qemu/qemu_domain.c
-@@ -4794,6 +4794,7 @@ int
- qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
- virDomainSnapshotObjPtr snapshot,
- virCapsPtr caps,
-+ virDomainXMLOptionPtr xmlopt,
- char *snapshotDir)
- {
- char *newxml = NULL;
-@@ -4804,7 +4805,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
-
- virUUIDFormat(vm->def->uuid, uuidstr);
- newxml = virDomainSnapshotDefFormat(
-- uuidstr, snapshot->def, caps,
-+ uuidstr, snapshot->def, caps, xmlopt,
- virDomainDefFormatConvertXMLFlags(QEMU_DOMAIN_FORMAT_LIVE_FLAGS),
- 1);
- if (newxml == NULL)
-@@ -4965,6 +4966,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
- } else {
- parentsnap->def->current = true;
- if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver->caps,
-+ driver->xmlopt,
- cfg->snapshotDir) < 0) {
- VIR_WARN("failed to set parent snapshot '%s' as current",
- snap->def->parent);
-diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
-index 2994398a9e..4db92fac8a 100644
---- a/src/qemu/qemu_domain.h
-+++ b/src/qemu/qemu_domain.h
-@@ -557,6 +557,7 @@ const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
- int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
- virDomainSnapshotObjPtr snapshot,
- virCapsPtr caps,
-+ virDomainXMLOptionPtr xmlopt,
- char *snapshotDir);
-
- int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
-diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
-index 354329fe64..2688c3eec7 100644
---- a/src/qemu/qemu_driver.c
-+++ b/src/qemu/qemu_driver.c
-@@ -14650,7 +14650,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
- if (update_current) {
- vm->current_snapshot->def->current = false;
- if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot,
-- driver->caps,
-+ driver->caps, driver->xmlopt,
- cfg->snapshotDir) < 0)
- goto endjob;
- vm->current_snapshot = NULL;
-@@ -14700,6 +14700,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
- endjob:
- if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) {
- if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps,
-+ driver->xmlopt,
- cfg->snapshotDir) < 0) {
- /* if writing of metadata fails, error out rather than trying
- * to silently carry on without completing the snapshot */
-@@ -15037,7 +15038,8 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
-
- virUUIDFormat(snapshot->domain->uuid, uuidstr);
-
-- xml = virDomainSnapshotDefFormat(uuidstr, snap->def, driver->caps,
-+ xml = virDomainSnapshotDefFormat(uuidstr, snap->def,
-+ driver->caps, driver->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
-
-@@ -15219,7 +15221,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
- if (vm->current_snapshot) {
- vm->current_snapshot->def->current = false;
- if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot,
-- driver->caps, cfg->snapshotDir) < 0)
-+ driver->caps, driver->xmlopt,
-+ cfg->snapshotDir) < 0)
- goto endjob;
- vm->current_snapshot = NULL;
- /* XXX Should we restore vm->current_snapshot after this point
-@@ -15459,6 +15462,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
- cleanup:
- if (ret == 0) {
- if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps,
-+ driver->xmlopt,
- cfg->snapshotDir) < 0)
- ret = -1;
- else
-@@ -15495,6 +15499,7 @@ struct _virQEMUSnapReparent {
- virDomainSnapshotObjPtr parent;
- virDomainObjPtr vm;
- virCapsPtr caps;
-+ virDomainXMLOptionPtr xmlopt;
- int err;
- virDomainSnapshotObjPtr last;
- };
-@@ -15523,7 +15528,8 @@ qemuDomainSnapshotReparentChildren(void *payload,
- if (!snap->sibling)
- rep->last = snap;
-
-- rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap, rep->caps,
-+ rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap,
-+ rep->caps, rep->xmlopt,
- rep->cfg->snapshotDir);
- return 0;
- }
-@@ -15594,6 +15600,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
- if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) {
- snap->def->current = true;
- if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps,
-+ driver->xmlopt,
- cfg->snapshotDir) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("failed to set snapshot '%s' as current"),
-@@ -15611,6 +15618,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
- rep.err = 0;
- rep.last = NULL;
- rep.caps = driver->caps;
-+ rep.xmlopt = driver->xmlopt;
- virDomainSnapshotForEachChild(snap,
- qemuDomainSnapshotReparentChildren,
- &rep);
-diff --git a/src/test/test_driver.c b/src/test/test_driver.c
-index 39df646260..c8085dd797 100644
---- a/src/test/test_driver.c
-+++ b/src/test/test_driver.c
-@@ -6348,6 +6348,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
- virUUIDFormat(snapshot->domain->uuid, uuidstr);
-
- xml = virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->caps,
-+ privconn->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
-
-diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
-index dcc64b579c..c739031660 100644
---- a/src/vbox/vbox_common.c
-+++ b/src/vbox/vbox_common.c
-@@ -5115,7 +5115,7 @@ vboxSnapshotRedefine(virDomainPtr dom,
- VIR_FREE(currentSnapshotXmlFilePath);
- if (virAsprintf(¤tSnapshotXmlFilePath, "%s%s.xml", machineLocationPath, snapshotMachineDesc->currentSnapshot) < 0)
- goto cleanup;
-- char *snapshotContent = virDomainSnapshotDefFormat(NULL, def, data->caps, VIR_DOMAIN_DEF_FORMAT_SECURE, 0);
-+ char *snapshotContent = virDomainSnapshotDefFormat(NULL, def, data->caps, data->xmlopt, VIR_DOMAIN_DEF_FORMAT_SECURE, 0);
- if (snapshotContent == NULL) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Unable to get snapshot content"));
-@@ -6037,7 +6037,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
-
- virUUIDFormat(dom->uuid, uuidstr);
- memcpy(def->dom->uuid, dom->uuid, VIR_UUID_BUFLEN);
-- ret = virDomainSnapshotDefFormat(uuidstr, def, data->caps,
-+ ret = virDomainSnapshotDefFormat(uuidstr, def, data->caps, data->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
-
-diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
-index 26c4f48459..f0b6722a6e 100644
---- a/src/vz/vz_driver.c
-+++ b/src/vz/vz_driver.c
-@@ -2309,6 +2309,7 @@ vzDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned int flags)
- virUUIDFormat(snapshot->domain->uuid, uuidstr);
-
- xml = virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->driver->caps,
-+ privconn->driver->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
-
-diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xmltest.c
-index f5fec47520..df204f9f16 100644
---- a/tests/domainsnapshotxml2xmltest.c
-+++ b/tests/domainsnapshotxml2xmltest.c
-@@ -101,6 +101,7 @@ testCompareXMLToXMLFiles(const char *inxml,
- goto cleanup;
-
- if (!(actual = virDomainSnapshotDefFormat(uuid, def, driver.caps,
-+ driver.xmlopt,
- VIR_DOMAIN_DEF_FORMAT_SECURE,
- internal)))
- goto cleanup;
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Properly-parse-backingStore.patch b/SOURCES/libvirt-conf-Properly-parse-backingStore.patch
new file mode 100644
index 0000000..5e9b08e
--- /dev/null
+++ b/SOURCES/libvirt-conf-Properly-parse-backingStore.patch
@@ -0,0 +1,200 @@
+From fee89d5de8520422225dc06fa95cc2dad66d7ebe Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Peter Krempa
+Date: Mon, 13 Nov 2017 13:25:01 +0100
+Subject: [PATCH] conf: Properly parse
+
+The terminator would not be parsed properly since the XPath selector was
+looking for an populated element, and also the code did not bother
+assigning the terminating virStorageSourcePtr to the backingStore
+property of the parent.
+
+Some tests would catch it if there wasn't bigger fallout from the change
+to backing store termination in a693fdba0111. Fix them properly now.
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1509110
+(cherry picked from commit 19448a2561699807c075e071a45df292efd01f6b)
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 18 ++++++++----------
+ ...base-live+disk-scsi-wwn+disk-scsi-duplicate-wwn.xml | 1 +
+ .../qemuxml2xmlout-disk-active-commit.xml | 1 +
+ .../qemuxml2xmlout-disk-backing-chains-active.xml | 3 +++
+ .../qemuxml2xmlout-disk-mirror-active.xml | 4 ++++
+ .../qemuxml2xmlout-disk-mirror-old.xml | 4 ++++
+ .../qemuxml2xmlout-seclabel-static-labelskip.xml | 1 +
+ 7 files changed, 22 insertions(+), 10 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 27cfecffda..3b337d1a64 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -8539,16 +8539,7 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
+ char *idx = NULL;
+ int ret = -1;
+
+- if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
+- ret = 0;
+- goto cleanup;
+- }
+-
+- if (!(type = virXMLPropString(ctxt->node, "type"))) {
+- /* terminator does not have a type */
+- if (VIR_ALLOC(backingStore) < 0)
+- goto cleanup;
+-
++ if (!(ctxt->node = virXPathNode("./backingStore", ctxt))) {
+ ret = 0;
+ goto cleanup;
+ }
+@@ -8556,6 +8547,13 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
+ if (VIR_ALLOC(backingStore) < 0)
+ goto cleanup;
+
++ /* terminator does not have a type */
++ if (!(type = virXMLPropString(ctxt->node, "type"))) {
++ VIR_STEAL_PTR(src->backingStore, backingStore);
++ ret = 0;
++ goto cleanup;
++ }
++
+ if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
+ (idx = virXMLPropString(ctxt->node, "index")) &&
+ virStrToLong_uip(idx, NULL, 10, &backingStore->id) < 0) {
+diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+disk-scsi-wwn+disk-scsi-duplicate-wwn.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+disk-scsi-wwn+disk-scsi-duplicate-wwn.xml
+index 9482b6794a..16caeb3542 100644
+--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+disk-scsi-wwn+disk-scsi-duplicate-wwn.xml
++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+disk-scsi-wwn+disk-scsi-duplicate-wwn.xml
+@@ -22,6 +22,7 @@
+
+
+
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
+index 5766e4aea8..cc26af1096 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
+@@ -20,6 +20,7 @@
+
+
+
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
+index 828defcc25..d1fd2442c3 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
+@@ -49,6 +49,7 @@
+
+
+
++
+
+
+
+@@ -63,6 +64,7 @@
+
+
+
++
+
+
+
+@@ -79,6 +81,7 @@
+
+
+
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
+index 252bde3389..c1e8a33ec1 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
+@@ -16,6 +16,7 @@
+ /usr/bin/qemu-system-i686
+
+
++
+
+
+
+@@ -24,12 +25,14 @@
+
+
+
++
+
+
+
+
+
+
++
+
+
+
+@@ -39,6 +42,7 @@
+
+
+
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
+index f4bd39a580..e390bc02f2 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
+@@ -16,6 +16,7 @@
+ /usr/bin/qemu-system-i686
+
+
++
+
+
+
+@@ -24,12 +25,14 @@
+
+
+
++
+
+
+
+
+
+
++
+
+
+
+@@ -39,6 +42,7 @@
+
+
+
++
+
+
+
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
+index 91f573db7d..d37b950cbf 100644
+--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
+@@ -18,6 +18,7 @@
+
+
+
++
+
+
+
+--
+2.15.0
+
diff --git a/SOURCES/libvirt-conf-Refactor-virCPUDefParseXML.patch b/SOURCES/libvirt-conf-Refactor-virCPUDefParseXML.patch
deleted file mode 100644
index eaa2ab7..0000000
--- a/SOURCES/libvirt-conf-Refactor-virCPUDefParseXML.patch
+++ /dev/null
@@ -1,413 +0,0 @@
-From 7bdac52dd6979f76f9a75a404a76e79f7da11a06 Mon Sep 17 00:00:00 2001
-Message-Id: <7bdac52dd6979f76f9a75a404a76e79f7da11a06@dist-git>
-From: Jiri Denemark
-Date: Tue, 23 May 2017 09:29:36 +0200
-Subject: [PATCH] conf: Refactor virCPUDefParseXML
-
-Signed-off-by: Jiri Denemark
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 702013f3b3ad8bd28c326058e2dd9ea8afbd1e61)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1441662
-
-Signed-off-by: Jiri Denemark
----
- src/conf/cpu_conf.c | 109 +++++++++++++++++++++++++++----------------------
- src/conf/cpu_conf.h | 9 ++--
- src/conf/domain_conf.c | 12 +-----
- src/cpu/cpu.c | 5 +--
- tests/cputest.c | 5 +--
- 5 files changed, 72 insertions(+), 68 deletions(-)
-
-diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
-index ffb2e83d67..da40e9ba97 100644
---- a/src/conf/cpu_conf.c
-+++ b/src/conf/cpu_conf.c
-@@ -245,12 +245,25 @@ virCPUDefCopy(const virCPUDef *cpu)
- }
-
-
--virCPUDefPtr
--virCPUDefParseXML(xmlNodePtr node,
-- xmlXPathContextPtr ctxt,
-- virCPUType type)
-+/*
-+ * Parses CPU definition XML from a node pointed to by @xpath. If @xpath is
-+ * NULL, the current node of @ctxt is used (i.e., it is a shortcut to ".").
-+ *
-+ * Missing element in the XML document is not considered an error unless
-+ * @xpath is NULL in which case the function expects it was provided with a
-+ * valid element already. In other words, the function returns success
-+ * and sets @cpu to NULL if @xpath is not NULL and the node pointed to by
-+ * @xpath is not found.
-+ *
-+ * Returns 0 on success, -1 on error.
-+ */
-+int
-+virCPUDefParseXML(xmlXPathContextPtr ctxt,
-+ const char *xpath,
-+ virCPUType type,
-+ virCPUDefPtr *cpu)
- {
-- virCPUDefPtr def;
-+ virCPUDefPtr def = NULL;
- xmlNodePtr *nodes = NULL;
- xmlNodePtr oldnode = ctxt->node;
- int n;
-@@ -258,15 +271,23 @@ virCPUDefParseXML(xmlNodePtr node,
- char *cpuMode;
- char *fallback = NULL;
- char *vendor_id = NULL;
-+ int ret = -1;
-
-- if (!xmlStrEqual(node->name, BAD_CAST "cpu")) {
-+ *cpu = NULL;
-+
-+ if (xpath && !(ctxt->node = virXPathNode(xpath, ctxt))) {
-+ ret = 0;
-+ goto cleanup;
-+ }
-+
-+ if (!xmlStrEqual(ctxt->node->name, BAD_CAST "cpu")) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("XML does not contain expected 'cpu' element"));
-- return NULL;
-+ goto cleanup;
- }
-
- if (VIR_ALLOC(def) < 0)
-- return NULL;
-+ goto cleanup;
-
- if (type == VIR_CPU_TYPE_AUTO) {
- if (virXPathBoolean("boolean(./arch)", ctxt)) {
-@@ -274,7 +295,7 @@ virCPUDefParseXML(xmlNodePtr node,
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("'arch' element cannot be used inside 'cpu'"
- " element with 'match' attribute'"));
-- goto error;
-+ goto cleanup;
- }
- def->type = VIR_CPU_TYPE_HOST;
- } else {
-@@ -284,12 +305,12 @@ virCPUDefParseXML(xmlNodePtr node,
- def->type = type;
- }
-
-- if ((cpuMode = virXMLPropString(node, "mode"))) {
-+ if ((cpuMode = virXMLPropString(ctxt->node, "mode"))) {
- if (def->type == VIR_CPU_TYPE_HOST) {
- VIR_FREE(cpuMode);
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Attribute mode is only allowed for guest CPU"));
-- goto error;
-+ goto cleanup;
- } else {
- def->mode = virCPUModeTypeFromString(cpuMode);
-
-@@ -298,7 +319,7 @@ virCPUDefParseXML(xmlNodePtr node,
- _("Invalid mode attribute '%s'"),
- cpuMode);
- VIR_FREE(cpuMode);
-- goto error;
-+ goto cleanup;
- }
- VIR_FREE(cpuMode);
- }
-@@ -310,7 +331,7 @@ virCPUDefParseXML(xmlNodePtr node,
- }
-
- if (def->type == VIR_CPU_TYPE_GUEST) {
-- char *match = virXMLPropString(node, "match");
-+ char *match = virXMLPropString(ctxt->node, "match");
- char *check;
-
- if (!match) {
-@@ -326,11 +347,11 @@ virCPUDefParseXML(xmlNodePtr node,
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Invalid match attribute for CPU "
- "specification"));
-- goto error;
-+ goto cleanup;
- }
- }
-
-- if ((check = virXMLPropString(node, "check"))) {
-+ if ((check = virXMLPropString(ctxt->node, "check"))) {
- int value = virCPUCheckTypeFromString(check);
- VIR_FREE(check);
-
-@@ -338,7 +359,7 @@ virCPUDefParseXML(xmlNodePtr node,
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Invalid check attribute for CPU "
- "specification"));
-- goto error;
-+ goto cleanup;
- }
- def->check = value;
- }
-@@ -349,13 +370,13 @@ virCPUDefParseXML(xmlNodePtr node,
- if (!arch) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing CPU architecture"));
-- goto error;
-+ goto cleanup;
- }
- if ((def->arch = virArchFromString(arch)) == VIR_ARCH_NONE) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("Unknown architecture %s"), arch);
- VIR_FREE(arch);
-- goto error;
-+ goto cleanup;
- }
- VIR_FREE(arch);
- }
-@@ -364,7 +385,7 @@ virCPUDefParseXML(xmlNodePtr node,
- def->type == VIR_CPU_TYPE_HOST) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing CPU model name"));
-- goto error;
-+ goto cleanup;
- }
-
- if (def->type == VIR_CPU_TYPE_GUEST &&
-@@ -374,7 +395,7 @@ virCPUDefParseXML(xmlNodePtr node,
- if ((def->fallback = virCPUFallbackTypeFromString(fallback)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Invalid fallback attribute"));
-- goto error;
-+ goto cleanup;
- }
- }
-
-@@ -384,14 +405,14 @@ virCPUDefParseXML(xmlNodePtr node,
- virReportError(VIR_ERR_XML_ERROR,
- _("vendor_id must be exactly %d characters long"),
- VIR_CPU_VENDOR_ID_LENGTH);
-- goto error;
-+ goto cleanup;
- }
-
- /* ensure that the string can be passed to qemu*/
- if (strchr(vendor_id, ',')) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("vendor id is invalid"));
-- goto error;
-+ goto cleanup;
- }
-
- def->vendor_id = vendor_id;
-@@ -403,61 +424,54 @@ virCPUDefParseXML(xmlNodePtr node,
- if (def->vendor && !def->model) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("CPU vendor specified without CPU model"));
-- goto error;
-+ goto cleanup;
- }
-
- if (virXPathNode("./topology[1]", ctxt)) {
-- int ret;
- unsigned long ul;
-
-- ret = virXPathULong("string(./topology[1]/@sockets)",
-- ctxt, &ul);
-- if (ret < 0) {
-+ if (virXPathULong("string(./topology[1]/@sockets)", ctxt, &ul) < 0) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing 'sockets' attribute in CPU topology"));
-- goto error;
-+ goto cleanup;
- }
- def->sockets = (unsigned int) ul;
-
-- ret = virXPathULong("string(./topology[1]/@cores)",
-- ctxt, &ul);
-- if (ret < 0) {
-+ if (virXPathULong("string(./topology[1]/@cores)", ctxt, &ul) < 0) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing 'cores' attribute in CPU topology"));
-- goto error;
-+ goto cleanup;
- }
- def->cores = (unsigned int) ul;
-
-- ret = virXPathULong("string(./topology[1]/@threads)",
-- ctxt, &ul);
-- if (ret < 0) {
-+ if (virXPathULong("string(./topology[1]/@threads)", ctxt, &ul) < 0) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing 'threads' attribute in CPU topology"));
-- goto error;
-+ goto cleanup;
- }
- def->threads = (unsigned int) ul;
-
- if (!def->sockets || !def->cores || !def->threads) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Invalid CPU topology"));
-- goto error;
-+ goto cleanup;
- }
- }
-
- if ((n = virXPathNodeSet("./feature", ctxt, &nodes)) < 0)
-- goto error;
-+ goto cleanup;
-
- if (n > 0) {
- if (!def->model && def->mode == VIR_CPU_MODE_CUSTOM) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Non-empty feature list specified without "
- "CPU model"));
-- goto error;
-+ goto cleanup;
- }
-
- if (VIR_RESIZE_N(def->features, def->nfeatures_max,
- def->nfeatures, n) < 0)
-- goto error;
-+ goto cleanup;
-
- def->nfeatures = n;
- }
-@@ -480,7 +494,7 @@ virCPUDefParseXML(xmlNodePtr node,
- if (policy < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Invalid CPU feature policy"));
-- goto error;
-+ goto cleanup;
- }
- } else {
- policy = -1;
-@@ -490,7 +504,7 @@ virCPUDefParseXML(xmlNodePtr node,
- VIR_FREE(name);
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Invalid CPU feature name"));
-- goto error;
-+ goto cleanup;
- }
-
- for (j = 0; j < i; j++) {
-@@ -499,7 +513,7 @@ virCPUDefParseXML(xmlNodePtr node,
- _("CPU feature '%s' specified more than once"),
- name);
- VIR_FREE(name);
-- goto error;
-+ goto cleanup;
- }
- }
-
-@@ -542,17 +556,16 @@ virCPUDefParseXML(xmlNodePtr node,
- def->cache->mode = mode;
- }
-
-+ VIR_STEAL_PTR(*cpu, def);
-+ ret = 0;
-+
- cleanup:
- ctxt->node = oldnode;
- VIR_FREE(fallback);
- VIR_FREE(vendor_id);
- VIR_FREE(nodes);
-- return def;
--
-- error:
- virCPUDefFree(def);
-- def = NULL;
-- goto cleanup;
-+ return ret;
- }
-
-
-diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
-index b0d891552a..b44974f47e 100644
---- a/src/conf/cpu_conf.h
-+++ b/src/conf/cpu_conf.h
-@@ -182,10 +182,11 @@ virCPUDefCopy(const virCPUDef *cpu);
- virCPUDefPtr
- virCPUDefCopyWithoutModel(const virCPUDef *cpu);
-
--virCPUDefPtr
--virCPUDefParseXML(xmlNodePtr node,
-- xmlXPathContextPtr ctxt,
-- virCPUType mode);
-+int
-+virCPUDefParseXML(xmlXPathContextPtr ctxt,
-+ const char *xpath,
-+ virCPUType mode,
-+ virCPUDefPtr *cpu);
-
- bool
- virCPUDefIsEqual(virCPUDefPtr src,
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 2197330a22..395dcc0531 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -17418,16 +17418,8 @@ virDomainDefParseXML(xmlDocPtr xml,
- }
- VIR_FREE(nodes);
-
-- /* analysis of cpu handling */
-- if ((node = virXPathNode("./cpu[1]", ctxt)) != NULL) {
-- xmlNodePtr oldnode = ctxt->node;
-- ctxt->node = node;
-- def->cpu = virCPUDefParseXML(node, ctxt, VIR_CPU_TYPE_GUEST);
-- ctxt->node = oldnode;
--
-- if (def->cpu == NULL)
-- goto error;
-- }
-+ if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &def->cpu) < 0)
-+ goto error;
-
- if (virDomainNumaDefCPUParseXML(def->numa, ctxt) < 0)
- goto error;
-diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
-index 702b14dbb7..96160901e1 100644
---- a/src/cpu/cpu.c
-+++ b/src/cpu/cpu.c
-@@ -130,7 +130,7 @@ virCPUCompareXML(virArch arch,
- if (!(doc = virXMLParseStringCtxt(xml, _("(CPU_definition)"), &ctxt)))
- goto cleanup;
-
-- if (!(cpu = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO)))
-+ if (virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_AUTO, &cpu) < 0)
- goto cleanup;
-
- ret = virCPUCompare(arch, host, cpu, failIncompatible);
-@@ -562,8 +562,7 @@ cpuBaselineXML(const char **xmlCPUs,
- if (!(doc = virXMLParseStringCtxt(xmlCPUs[i], _("(CPU_definition)"), &ctxt)))
- goto error;
-
-- cpus[i] = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_HOST);
-- if (cpus[i] == NULL)
-+ if (virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_HOST, &cpus[i]) < 0)
- goto error;
-
- xmlXPathFreeContext(ctxt);
-diff --git a/tests/cputest.c b/tests/cputest.c
-index efa891dc18..97b34de9ed 100644
---- a/tests/cputest.c
-+++ b/tests/cputest.c
-@@ -88,7 +88,7 @@ cpuTestLoadXML(virArch arch, const char *name)
- if (!(doc = virXMLParseFileCtxt(xml, &ctxt)))
- goto cleanup;
-
-- cpu = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO);
-+ virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_AUTO, &cpu);
-
- cleanup:
- xmlXPathFreeContext(ctxt);
-@@ -126,8 +126,7 @@ cpuTestLoadMultiXML(virArch arch,
-
- for (i = 0; i < n; i++) {
- ctxt->node = nodes[i];
-- cpus[i] = virCPUDefParseXML(nodes[i], ctxt, VIR_CPU_TYPE_HOST);
-- if (!cpus[i])
-+ if (virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_HOST, &cpus[i]) < 0)
- goto cleanup_cpus;
- }
-
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-Remove-ATTRIBUTE_FALLTHROUGH-from-virDomainChrTargetDefFormat.patch b/SOURCES/libvirt-conf-Remove-ATTRIBUTE_FALLTHROUGH-from-virDomainChrTargetDefFormat.patch
new file mode 100644
index 0000000..c95b076
--- /dev/null
+++ b/SOURCES/libvirt-conf-Remove-ATTRIBUTE_FALLTHROUGH-from-virDomainChrTargetDefFormat.patch
@@ -0,0 +1,55 @@
+From d91de09fa0a626e200ac0db133a6af69a0706105 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:23:04 +0100
+Subject: [PATCH] conf: Remove ATTRIBUTE_FALLTHROUGH from
+ virDomainChrTargetDefFormat()
+
+Formatting the element for serial devices will become a
+bit more complicated later on, and leaving the fallthrough behavior
+there would do nothing but complicate it further.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 7983068fa50ea5222e62b24ea912a529994276f0)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 2489705d6b..44d9bbe01d 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -24010,14 +24010,18 @@ virDomainChrTargetDefFormat(virBufferPtr buf,
+ return -1;
+ }
+
++ virBufferAddLit(buf, "targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE) {
+ virBufferAsprintf(buf,
+- " \n",
+- targetType,
+- def->target.port);
+- break;
++ "type='%s' ",
++ targetType);
+ }
+- ATTRIBUTE_FALLTHROUGH;
++
++ virBufferAsprintf(buf,
++ "port='%d'/>\n",
++ def->target.port);
++ break;
+
+ case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
+ virBufferAsprintf(buf, " \n",
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Rename-mode-parameter-in-virCPUDefParseXML.patch b/SOURCES/libvirt-conf-Rename-mode-parameter-in-virCPUDefParseXML.patch
deleted file mode 100644
index 1c46aaf..0000000
--- a/SOURCES/libvirt-conf-Rename-mode-parameter-in-virCPUDefParseXML.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 46761b7fdb0707036482c98eb3a80279753df484 Mon Sep 17 00:00:00 2001
-Message-Id: <46761b7fdb0707036482c98eb3a80279753df484@dist-git>
-From: Jiri Denemark
-Date: Mon, 24 Apr 2017 15:38:41 +0200
-Subject: [PATCH] conf: Rename mode parameter in virCPUDefParseXML
-
-The type of this parameter is virCPUType so calling it 'mode' is pretty
-strange, 'type' is a much better name.
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit e841a41169dd726af13f29cb57fbafe658b7011a)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1428952
-
-Signed-off-by: Jiri Denemark
----
- src/conf/cpu_conf.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
-index b78531e60..623b1699f 100644
---- a/src/conf/cpu_conf.c
-+++ b/src/conf/cpu_conf.c
-@@ -230,7 +230,7 @@ virCPUDefCopy(const virCPUDef *cpu)
- virCPUDefPtr
- virCPUDefParseXML(xmlNodePtr node,
- xmlXPathContextPtr ctxt,
-- virCPUType mode)
-+ virCPUType type)
- {
- virCPUDefPtr def;
- xmlNodePtr *nodes = NULL;
-@@ -250,7 +250,7 @@ virCPUDefParseXML(xmlNodePtr node,
- if (VIR_ALLOC(def) < 0)
- return NULL;
-
-- if (mode == VIR_CPU_TYPE_AUTO) {
-+ if (type == VIR_CPU_TYPE_AUTO) {
- if (virXPathBoolean("boolean(./arch)", ctxt)) {
- if (virXPathBoolean("boolean(./@match)", ctxt)) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
-@@ -263,7 +263,7 @@ virCPUDefParseXML(xmlNodePtr node,
- def->type = VIR_CPU_TYPE_GUEST;
- }
- } else {
-- def->type = mode;
-+ def->type = type;
- }
-
- if ((cpuMode = virXMLPropString(node, "mode"))) {
---
-2.12.2
-
diff --git a/SOURCES/libvirt-conf-Resolve-corner-case-on-fc_host-deletion.patch b/SOURCES/libvirt-conf-Resolve-corner-case-on-fc_host-deletion.patch
deleted file mode 100644
index b5bfc3e..0000000
--- a/SOURCES/libvirt-conf-Resolve-corner-case-on-fc_host-deletion.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From 70c60798f09324a9e4d91f787cad493a1ceca5d9 Mon Sep 17 00:00:00 2001
-Message-Id: <70c60798f09324a9e4d91f787cad493a1ceca5d9@dist-git>
-From: John Ferlan
-Date: Wed, 24 May 2017 10:27:57 -0400
-Subject: [PATCH] conf: Resolve corner case on fc_host deletion
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1420740
-
-Testing found an inventive way to cause an error at shutdown by providing the
-parent name for the fc host creation using the "same name" as the HBA. Since
-the code thus assumed the parent host name provided was the parent HBA and
-just extracted out the host number and sent that along to the vport_destroy
-this avoided checks made for equality.
-
-So just add the equality check to that path to resolve.
-
-(cherry picked from commit 2c8e30ee7e287d6490f643ccd2d7653a834e75e5)
-Signed-off-by: John Ferlan
-Signed-off-by: Jiri Denemark
----
- src/conf/node_device_conf.c | 14 +++++++++++---
- 1 file changed, 11 insertions(+), 3 deletions(-)
-
-diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
-index ac61db34c..2d0b14850 100644
---- a/src/conf/node_device_conf.c
-+++ b/src/conf/node_device_conf.c
-@@ -2300,17 +2300,25 @@ virNodeDeviceDeleteVport(virConnectPtr conn,
- goto cleanup;
- }
-
-+ if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0)
-+ goto cleanup;
-+
- /* If at startup time we provided a parent, then use that to
- * get the parent_host value; otherwise, we have to determine
- * the parent scsi_host which we did not save at startup time
- */
- if (fchost->parent) {
-+ /* Someone provided a parent string at startup time that
-+ * was the same as the scsi_host - meaning we have a pool
-+ * backed to an HBA, so there won't be a vHBA to delete */
-+ if (STREQ(scsi_host_name, fchost->parent)) {
-+ ret = 0;
-+ goto cleanup;
-+ }
-+
- if (virSCSIHostGetNumber(fchost->parent, &parent_host) < 0)
- goto cleanup;
- } else {
-- if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0)
-- goto cleanup;
--
- if (!(vhba_parent = virNodeDeviceGetParentName(conn, scsi_host_name)))
- goto cleanup;
-
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-Run-devicePostParse-again-for-the-first-serial-device.patch b/SOURCES/libvirt-conf-Run-devicePostParse-again-for-the-first-serial-device.patch
new file mode 100644
index 0000000..baa288e
--- /dev/null
+++ b/SOURCES/libvirt-conf-Run-devicePostParse-again-for-the-first-serial-device.patch
@@ -0,0 +1,60 @@
+From 0c9561ff6de749954395f562cbb8e3d12954566c Mon Sep 17 00:00:00 2001
+Message-Id: <0c9561ff6de749954395f562cbb8e3d12954566c@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:22:57 +0100
+Subject: [PATCH] conf: Run devicePostParse() again for the first serial device
+
+The devicePostParse() callback is invoked for all devices so that
+drivers have a chance to set their own specific values; however,
+virDomainDefAddImplicitDevices() runs *after* the devicePostParse()
+callbacks have been invoked and can add new devices, in which case
+the driver wouldn't have a chance to customize them.
+
+Work around the issue by invoking the devicePostParse() callback
+after virDomainDefAddImplicitDevices(), only for the first serial
+devices, which might have been added by it. The same was already
+happening for the first video device for the very same reason.
+
+This will become important later on, when we will change
+virDomainDefAddConsoleCompat() not to set a targetType for
+automatically added serial devices.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 2628afc143224d38e6ef8c06a8fbec1d0f69fb86)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 4b5e7c214f..41674a85af 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -4948,6 +4948,18 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
+ return -1;
+ }
+
++ if (def->nserials != 0) {
++ virDomainDeviceDef device = {
++ .type = VIR_DOMAIN_DEVICE_CHR,
++ .data.chr = def->serials[0],
++ };
++
++ /* serials[0] might have been added in AddImplicitDevices, after we've
++ * done the per-device post-parse */
++ if (virDomainDefPostParseDeviceIterator(def, &device, NULL, data) < 0)
++ return -1;
++ }
++
+ /* clean up possibly duplicated metadata entries */
+ virXMLNodeSanitizeNamespaces(def->metadata);
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-Simplify-slot-allocation.patch b/SOURCES/libvirt-conf-Simplify-slot-allocation.patch
deleted file mode 100644
index 9d214e6..0000000
--- a/SOURCES/libvirt-conf-Simplify-slot-allocation.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From af91509dfc59e90262117b96a2a365d5ece29393 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Andrea Bolognani
-Date: Mon, 17 Jul 2017 12:09:03 +0200
-Subject: [PATCH] conf: Simplify slot allocation
-
-The current algorithm for slot allocation tries to be clever
-and avoid looking at buses / slots more than once unless it's
-necessary. Unfortunately that makes the code more complex,
-and it will cause problem later on in some situations unless
-even more complex code is added.
-
-Since the performance gains are going to be pretty modest
-anyway, we can just get rid of the extra complexity and use a
-completely straighforward implementation instead.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit 2bd0658d7cc886209a53bae23c20adbb7d4f91ac)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_addr.c | 47 +++++++++--------------------------------------
- src/conf/domain_addr.h | 2 --
- 2 files changed, 9 insertions(+), 40 deletions(-)
-
-diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
-index b17bb61a1d..b8e5902c07 100644
---- a/src/conf/domain_addr.c
-+++ b/src/conf/domain_addr.c
-@@ -755,46 +755,34 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- virDomainPCIConnectFlags flags,
- int function)
- {
-- /* default to starting the search for a free slot from
-- * the first slot of domain 0 bus 0...
-- */
- virPCIDeviceAddress a = { 0 };
-- bool found = false;
-
- if (addrs->nbuses == 0) {
- virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available"));
- goto error;
- }
-
-- /* ...unless this search is for the exact same type of device as
-- * last time, then continue the search from the slot where we
-- * found the previous match (it's possible there will still be a
-- * function available on that slot).
-- */
-- if (flags == addrs->lastFlags)
-- a = addrs->lastaddr;
-- else
-- a.slot = addrs->buses[0].minSlot;
--
- /* if the caller asks for "any function", give them function 0 */
- if (function == -1)
- a.function = 0;
- else
- a.function = function;
-
-- while (a.bus < addrs->nbuses) {
-- if (virDomainPCIAddressFindUnusedFunctionOnBus(&addrs->buses[a.bus],
-- &a, function,
-+ /* "Begin at the beginning," the King said, very gravely, "and go on
-+ * till you come to the end: then stop." */
-+ for (a.bus = 0; a.bus < addrs->nbuses; a.bus++) {
-+ virDomainPCIAddressBusPtr bus = &addrs->buses[a.bus];
-+ bool found = false;
-+
-+ a.slot = bus->minSlot;
-+
-+ if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, function,
- flags, &found) < 0) {
- goto error;
- }
-
- if (found)
- goto success;
--
-- /* nothing on this bus, go to the next bus */
-- if (++a.bus < addrs->nbuses)
-- a.slot = addrs->buses[a.bus].minSlot;
- }
-
- /* There were no free slots after the last used one */
-@@ -805,20 +793,6 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- /* this device will use the first slot of the new bus */
- a.slot = addrs->buses[a.bus].minSlot;
- goto success;
-- } else if (flags == addrs->lastFlags) {
-- /* Check the buses from 0 up to the last used one */
-- for (a.bus = 0; a.bus <= addrs->lastaddr.bus; a.bus++) {
-- a.slot = addrs->buses[a.bus].minSlot;
--
-- if (virDomainPCIAddressFindUnusedFunctionOnBus(&addrs->buses[a.bus],
-- &a, function,
-- flags, &found) < 0) {
-- goto error;
-- }
--
-- if (found)
-- goto success;
-- }
- }
-
- virReportError(VIR_ERR_INTERNAL_ERROR,
-@@ -865,9 +839,6 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
- if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags, false) < 0)
- return -1;
-
-- addrs->lastaddr = addr;
-- addrs->lastFlags = flags;
--
- if (!addrs->dryRun) {
- dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
- dev->addr.pci = addr;
-diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
-index bb10f1abf3..a5afefda95 100644
---- a/src/conf/domain_addr.h
-+++ b/src/conf/domain_addr.h
-@@ -106,8 +106,6 @@ typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;
- struct _virDomainPCIAddressSet {
- virDomainPCIAddressBus *buses;
- size_t nbuses;
-- virPCIDeviceAddress lastaddr;
-- virDomainPCIConnectFlags lastFlags;
- bool dryRun; /* on a dry run, new buses are auto-added
- and addresses aren't saved in device infos */
- };
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Sort-cache-banks-in-capabilities-XML.patch b/SOURCES/libvirt-conf-Sort-cache-banks-in-capabilities-XML.patch
new file mode 100644
index 0000000..571ab1d
--- /dev/null
+++ b/SOURCES/libvirt-conf-Sort-cache-banks-in-capabilities-XML.patch
@@ -0,0 +1,67 @@
+From 6532e10f6ddec18ab70f58dc660062d369b82304 Mon Sep 17 00:00:00 2001
+Message-Id: <6532e10f6ddec18ab70f58dc660062d369b82304@dist-git>
+From: Martin Kletzander
+Date: Wed, 31 Jan 2018 16:32:17 +0100
+Subject: [PATCH] conf: Sort cache banks in capabilities XML
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1289368
+
+Because the cache banks are initialized based on the order in which their
+respective directories exist on the filesystem, they can appear in different
+order. This is here mainly for tests because the cache directory might have
+different order of children nodes and tests would fail otherwise. It should not
+be the case with sysfs, but one can never be sure. And this does not take
+almost any extra time, mainly because it gets initialized once per driver.
+
+Signed-off-by: Martin Kletzander
+Reviewed-by: John Ferlan
+(cherry picked from commit b4698edcb0a459332b24410f59698005af37eecb)
+Signed-off-by: Martin Kletzander
+---
+ src/conf/capabilities.c | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
+index 9920a675ac..1f7d8cdb31 100644
+--- a/src/conf/capabilities.c
++++ b/src/conf/capabilities.c
+@@ -1561,6 +1561,23 @@ virCapsHostCacheBankFree(virCapsHostCacheBankPtr ptr)
+ VIR_FREE(ptr);
+ }
+
++
++static int
++virCapsHostCacheBankSorter(const void *a,
++ const void *b)
++{
++ virCapsHostCacheBankPtr ca = *(virCapsHostCacheBankPtr *)a;
++ virCapsHostCacheBankPtr cb = *(virCapsHostCacheBankPtr *)b;
++
++ if (ca->level < cb->level)
++ return -1;
++ if (ca->level > cb->level)
++ return 1;
++
++ return ca->id - cb->id;
++}
++
++
+ int
+ virCapabilitiesInitCaches(virCapsPtr caps)
+ {
+@@ -1700,6 +1717,12 @@ virCapabilitiesInitCaches(virCapsPtr caps)
+ goto cleanup;
+ }
+
++ /* Sort the array in order for the tests to be predictable. This way we can
++ * still traverse the directory instead of guessing names (in case there is
++ * 'index1' and 'index3' but no 'index2'). */
++ qsort(caps->host.caches, caps->host.ncaches,
++ sizeof(*caps->host.caches), virCapsHostCacheBankSorter);
++
+ ret = 0;
+ cleanup:
+ VIR_FREE(type);
+--
+2.16.1
+
diff --git a/SOURCES/libvirt-conf-Tweak-virDomainPCIAddressGetNextAddr-signature.patch b/SOURCES/libvirt-conf-Tweak-virDomainPCIAddressGetNextAddr-signature.patch
deleted file mode 100644
index ebfcb3a..0000000
--- a/SOURCES/libvirt-conf-Tweak-virDomainPCIAddressGetNextAddr-signature.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 2d719331886e3f4ed927449ffde6a854e9deec1b Mon Sep 17 00:00:00 2001
-Message-Id: <2d719331886e3f4ed927449ffde6a854e9deec1b@dist-git>
-From: Andrea Bolognani
-Date: Mon, 17 Jul 2017 12:08:59 +0200
-Subject: [PATCH] conf: Tweak virDomainPCIAddressGetNextAddr() signature
-
-Move @function after @flags to match other functions in the
-same module like virDomainPCIAddressReserveNextAddr().
-
-Also move virDomainPCIAddressReserveNextAddr() closer to
-virDomainPCIAddressReserveAddr() in the header file.
-
-Signed-off-by: Andrea Bolognani
-Reviewed-by: Laine Stump
-(cherry picked from commit c949f6e69cbe91b9897e37e525181710f5c75b35)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_addr.c | 6 +++---
- src/conf/domain_addr.h | 12 ++++++------
- 2 files changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
-index 0ae1ed93af..b17bb61a1d 100644
---- a/src/conf/domain_addr.c
-+++ b/src/conf/domain_addr.c
-@@ -752,8 +752,8 @@ virDomainPCIAddressFindUnusedFunctionOnBus(virDomainPCIAddressBusPtr bus,
- static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
- virDomainPCIAddressGetNextAddr(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr next_addr,
-- int function,
-- virDomainPCIConnectFlags flags)
-+ virDomainPCIConnectFlags flags,
-+ int function)
- {
- /* default to starting the search for a free slot from
- * the first slot of domain 0 bus 0...
-@@ -859,7 +859,7 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
- {
- virPCIDeviceAddress addr;
-
-- if (virDomainPCIAddressGetNextAddr(addrs, &addr, function, flags) < 0)
-+ if (virDomainPCIAddressGetNextAddr(addrs, &addr, flags, function) < 0)
- return -1;
-
- if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags, false) < 0)
-diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
-index c90a335919..bb10f1abf3 100644
---- a/src/conf/domain_addr.h
-+++ b/src/conf/domain_addr.h
-@@ -158,6 +158,12 @@ int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs,
- virDomainPCIConnectFlags flags)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-
-+int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
-+ virDomainDeviceInfoPtr dev,
-+ virDomainPCIConnectFlags flags,
-+ int function)
-+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-+
- int virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs,
- virDomainDeviceInfoPtr dev,
- virDomainPCIConnectFlags flags)
-@@ -167,12 +173,6 @@ int virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs,
- virPCIDeviceAddressPtr addr)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-
--int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
-- virDomainDeviceInfoPtr dev,
-- virDomainPCIConnectFlags flags,
-- int function)
-- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
--
- void virDomainPCIAddressSetAllMulti(virDomainDefPtr def)
- ATTRIBUTE_NONNULL(1);
-
---
-2.13.3
-
diff --git a/SOURCES/libvirt-conf-Use-the-correct-limit-for-the-number-of-PHBs.patch b/SOURCES/libvirt-conf-Use-the-correct-limit-for-the-number-of-PHBs.patch
deleted file mode 100644
index 4ceca53..0000000
--- a/SOURCES/libvirt-conf-Use-the-correct-limit-for-the-number-of-PHBs.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From e2bf7a17d464c989378278c3121425e7b90442e3 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Andrea Bolognani
-Date: Mon, 21 Aug 2017 14:46:39 +0200
-Subject: [PATCH] conf: Use the correct limit for the number of PHBs
-
-I mistakenly thought pSeries guests supported 32 PHBs,
-but it turns out they only support 31. Validate the
-target index accordingly.
-
-Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1479647
-
-Signed-off-by: Andrea Bolognani
-(cherry picked from commit 64357c3f9373127aa8bdf5a829df4a9d895e1ef9)
-
-Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1479647
-
-Signed-off-by: Andrea Bolognani
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 4 ++--
- .../qemuxml2argv-pseries-phb-invalid-target-index-3.xml | 6 +++---
- 2 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 7889f5335c..3d38f668fa 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -5058,10 +5058,10 @@ virDomainControllerDefValidate(const virDomainControllerDef *controller)
- /* Only validate the target index if it's been set */
- if (opts->targetIndex != -1) {
-
-- if (opts->targetIndex < 0 || opts->targetIndex > 31) {
-+ if (opts->targetIndex < 0 || opts->targetIndex > 30) {
- virReportError(VIR_ERR_XML_ERROR,
- _("PCI controller target index '%d' out of "
-- "range - must be 0-31"),
-+ "range - must be 0-30"),
- opts->targetIndex);
- return -1;
- }
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-phb-invalid-target-index-3.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-phb-invalid-target-index-3.xml
-index 864c5d8758..3d99da4995 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-phb-invalid-target-index-3.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-phb-invalid-target-index-3.xml
-@@ -8,10 +8,10 @@
-
-
- /usr/bin/qemu-system-ppc64
--
-+
-
--
-+
-
-
-
---
-2.14.1
-
diff --git a/SOURCES/libvirt-conf-Use-virResctrlInfo-in-capabilities.patch b/SOURCES/libvirt-conf-Use-virResctrlInfo-in-capabilities.patch
new file mode 100644
index 0000000..3121e3d
--- /dev/null
+++ b/SOURCES/libvirt-conf-Use-virResctrlInfo-in-capabilities.patch
@@ -0,0 +1,131 @@
+From af86f99a7745f9d54c3f4e42f58130478e6aa9f5 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Martin Kletzander
+Date: Wed, 31 Jan 2018 16:32:26 +0100
+Subject: [PATCH] conf: Use virResctrlInfo in capabilities
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1289368
+
+Signed-off-by: Martin Kletzander
+(cherry picked from commit 3bbae43d8cc79ef1cd0b9a4ea2440203a0edc959)
+Signed-off-by: Martin Kletzander
+---
+ src/conf/capabilities.c | 53 ++++++++++++++++++++++++-------------------------
+ src/conf/capabilities.h | 2 ++
+ 2 files changed, 28 insertions(+), 27 deletions(-)
+
+diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
+index e93eaed2f0..edf9f54f77 100644
+--- a/src/conf/capabilities.c
++++ b/src/conf/capabilities.c
+@@ -245,6 +245,7 @@ virCapabilitiesDispose(void *object)
+ VIR_FREE(caps->host.netprefix);
+ VIR_FREE(caps->host.pagesSize);
+ virCPUDefFree(caps->host.cpu);
++ virObjectUnref(caps->host.resctrl);
+ }
+
+ /**
+@@ -1592,6 +1593,20 @@ virCapsHostCacheBankSorter(const void *a,
+ }
+
+
++static int
++virCapabilitiesInitResctrl(virCapsPtr caps)
++{
++ if (caps->host.resctrl)
++ return 0;
++
++ caps->host.resctrl = virResctrlInfoNew();
++ if (!caps->host.resctrl)
++ return -1;
++
++ return virResctrlGetInfo(caps->host.resctrl);
++}
++
++
+ int
+ virCapabilitiesInitCaches(virCapsPtr caps)
+ {
+@@ -1600,7 +1615,6 @@ virCapabilitiesInitCaches(virCapsPtr caps)
+ ssize_t pos = -1;
+ DIR *dirp = NULL;
+ int ret = -1;
+- int typeret;
+ char *path = NULL;
+ char *type = NULL;
+ struct dirent *ent = NULL;
+@@ -1611,6 +1625,9 @@ virCapabilitiesInitCaches(virCapsPtr caps)
+ * lose information. */
+ const int cache_min_level = 3;
+
++ if (virCapabilitiesInitResctrl(caps) < 0)
++ return -1;
++
+ /* offline CPUs don't provide cache info */
+ if (virFileReadValueBitmap(&cpus, "%s/cpu/online", SYSFS_SYSTEM_PATH) < 0)
+ return -1;
+@@ -1676,32 +1693,6 @@ virCapabilitiesInitCaches(virCapsPtr caps)
+ SYSFS_SYSTEM_PATH, pos, ent->d_name) < 0)
+ goto cleanup;
+
+- typeret = virResctrlGetCacheControlType(bank->level);
+- if (typeret < 0)
+- goto cleanup;
+-
+- if (typeret == 1) {
+- if (virResctrlGetCacheInfo(bank->level,
+- bank->size,
+- VIR_CACHE_TYPE_BOTH,
+- &bank->controls,
+- &bank->ncontrols) < 0)
+- goto cleanup;
+- } else if (typeret == 2) {
+- if (virResctrlGetCacheInfo(bank->level,
+- bank->size,
+- VIR_CACHE_TYPE_CODE,
+- &bank->controls,
+- &bank->ncontrols) < 0)
+- goto cleanup;
+- if (virResctrlGetCacheInfo(bank->level,
+- bank->size,
+- VIR_CACHE_TYPE_DATA,
+- &bank->controls,
+- &bank->ncontrols) < 0)
+- goto cleanup;
+- }
+-
+ kernel_type = virCacheKernelTypeFromString(type);
+ if (kernel_type < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+@@ -1717,6 +1708,14 @@ virCapabilitiesInitCaches(virCapsPtr caps)
+ break;
+ }
+ if (i == caps->host.ncaches) {
++ /* If it is a new cache, then update its resctrl information. */
++ if (virResctrlInfoGetCache(caps->host.resctrl,
++ bank->level,
++ bank->size,
++ &bank->ncontrols,
++ &bank->controls) < 0)
++ goto cleanup;
++
+ if (VIR_APPEND_ELEMENT(caps->host.caches,
+ caps->host.ncaches,
+ bank) < 0) {
+diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
+index 27b88cb5ed..694a3590bf 100644
+--- a/src/conf/capabilities.h
++++ b/src/conf/capabilities.h
+@@ -170,6 +170,8 @@ struct _virCapsHost {
+ size_t nnumaCell_max;
+ virCapsHostNUMACellPtr *numaCell;
+
++ virResctrlInfoPtr resctrl;
++
+ size_t ncaches;
+ virCapsHostCacheBankPtr *caches;
+
+--
+2.16.1
+
diff --git a/SOURCES/libvirt-conf-add-ABI-stability-checks-for-IOMMU-options.patch b/SOURCES/libvirt-conf-add-ABI-stability-checks-for-IOMMU-options.patch
deleted file mode 100644
index c3c59ef..0000000
--- a/SOURCES/libvirt-conf-add-ABI-stability-checks-for-IOMMU-options.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 4383e358e2d8a85bd46936c997071c3b776fffd0 Mon Sep 17 00:00:00 2001
-Message-Id: <4383e358e2d8a85bd46936c997071c3b776fffd0@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Tue, 16 May 2017 10:44:59 +0200
-Subject: [PATCH] conf: add ABI stability checks for IOMMU options
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1427005
-(cherry picked from commit 935d927aa881753fff30f6236eedcf9680bca638)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 26 ++++++++++++++++++++++++++
- 1 file changed, 26 insertions(+)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 7bf480f2a..370916396 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -19682,6 +19682,16 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
- }
- }
-
-+ /* ioapic */
-+ if (src->ioapic != dst->ioapic) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("State of ioapic differs: "
-+ "source: '%s', destination: '%s'"),
-+ virDomainIOAPICTypeToString(src->ioapic),
-+ virDomainIOAPICTypeToString(dst->ioapic));
-+ return false;
-+ }
-+
- return true;
- }
-
-@@ -19821,6 +19831,22 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUDefPtr src,
- virDomainIOMMUModelTypeToString(src->model));
- return false;
- }
-+ if (src->intremap != dst->intremap) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target domain IOMMU device intremap value '%s' "
-+ "does not match source '%s'"),
-+ virTristateSwitchTypeToString(dst->intremap),
-+ virTristateSwitchTypeToString(src->intremap));
-+ return false;
-+ }
-+ if (src->caching_mode != dst->caching_mode) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target domain IOMMU device caching mode '%s' "
-+ "does not match source '%s'"),
-+ virTristateSwitchTypeToString(dst->caching_mode),
-+ virTristateSwitchTypeToString(src->caching_mode));
-+ return false;
-+ }
- return true;
- }
-
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-add-VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP.patch b/SOURCES/libvirt-conf-add-VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP.patch
new file mode 100644
index 0000000..a1b7f82
--- /dev/null
+++ b/SOURCES/libvirt-conf-add-VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP.patch
@@ -0,0 +1,605 @@
+From f93cc7753900a7ff80a32dae2fd3337939909b86 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Pino Toscano
+Date: Wed, 29 Nov 2017 16:23:15 +0100
+Subject: [PATCH] conf: add VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP
+
+Introduce specific a target types with two models for the console
+devices (sclp and sclplm) used in s390 and s390x guests, so isa-serial
+is no more used for them.
+
+This makes usable on s390 and s390x guests, with at most only
+a single sclpconsole and one sclplmconsole devices usable in a single
+guest (due to limitations in QEMU, which will enforce already at
+runtime).
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+
+Signed-off-by: Pino Toscano
+Reviewed-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 21332bf6587c23409fecb06ab81dbc14dd52c10b)
+Signed-off-by: Jiri Denemark
+---
+ docs/formatdomain.html.in | 19 ++++++++----
+ docs/schemas/domaincommon.rng | 3 ++
+ src/conf/domain_conf.c | 4 +++
+ src/conf/domain_conf.h | 3 ++
+ src/qemu/qemu_command.c | 6 ++++
+ src/qemu/qemu_domain.c | 20 +++++++++++++
+ src/qemu/qemu_domain_address.c | 1 +
+ .../qemuxml2argv-s390-serial-2.args | 24 +++++++++++++++
+ .../qemuxml2argv-s390-serial-2.xml | 19 ++++++++++++
+ .../qemuxml2argv-s390-serial-console.args | 25 ++++++++++++++++
+ .../qemuxml2argv-s390-serial-console.xml | 15 ++++++++++
+ .../qemuxml2argvdata/qemuxml2argv-s390-serial.args | 22 ++++++++++++++
+ .../qemuxml2argvdata/qemuxml2argv-s390-serial.xml | 14 +++++++++
+ tests/qemuxml2argvtest.c | 16 ++++++++++
+ .../qemuxml2xmlout-s390-serial-2.xml | 33 +++++++++++++++++++++
+ .../qemuxml2xmlout-s390-serial-console.xml | 34 ++++++++++++++++++++++
+ .../qemuxml2xmlout-s390-serial.xml | 28 ++++++++++++++++++
+ tests/qemuxml2xmltest.c | 6 ++++
+ 18 files changed, 286 insertions(+), 6 deletions(-)
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.xml
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-s390-serial.args
+ create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-s390-serial.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-2.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-console.xml
+ create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial.xml
+
+diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
+index 87389f4e73..62dd6e1ec4 100644
+--- a/docs/formatdomain.html.in
++++ b/docs/formatdomain.html.in
+@@ -6463,8 +6463,9 @@ qemu-kvm -net nic,model=? /dev/null
+ with x86 guests), usb-serial
(usable whenever USB support
+ is available) and pci-serial
(usable whenever PCI support
+ is available); since 3.10.0 ,
+- spapr-vio-serial
(usable with ppc64/pseries guests) and
+- system-serial
(usable with aarch64/virt guests) are
++ spapr-vio-serial
(usable with ppc64/pseries guests),
++ system-serial
(usable with aarch64/virt guests) and
++ sclp-serial
(usable with s390 and s390x guests) are
+ available as well.
+
+
+@@ -6478,7 +6479,9 @@ qemu-kvm -net nic,model=? /dev/null
+ (usable with the pci-serial
target type);
+ spapr-vty
(usable with the spapr-vio-serial
+ target type); pl011
(usable with the
+- system-serial
target type).
++ system-serial
target type); sclpconsole
and
++ sclplmconsole
(usable with the sclp-serial
++ target type).
+
+
+
+@@ -6493,7 +6496,8 @@ qemu-kvm -net nic,model=? /dev/null
+ isa-serial
), usb
(for usb-serial
),
+ pci
(for pci-serial
) and spapr-vio
+ (for spapr-vio-serial
). The system-serial
+- target type doesn't support specifying an address.
++ and sclp-serial
target types don't support specifying an
++ address.
+
+
+
+@@ -6541,8 +6545,11 @@ qemu-kvm -net nic,model=? /dev/null
+ virtio
(usable whenever VirtIO support is available);
+ xen
, lxc
, uml
and
+ openvz
(available when the corresponding hypervisor is in
+- use); sclp
and sclplm
(usable for s390 and
+- s390x QEMU guests).
++ use). sclp
and sclplm
(usable for s390 and
++ s390x QEMU guests) are supported for compatibility reasons but should
++ not be used for new guests: use the sclpconsole
and
++ sclplmconsole
target models, respectively, with the
++ serial
element instead.
+
+
+
+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
+index 957eae2832..5576128db5 100644
+--- a/docs/schemas/domaincommon.rng
++++ b/docs/schemas/domaincommon.rng
+@@ -3573,6 +3573,7 @@
+ pci-serial
+ spapr-vio-serial
+ system-serial
++ sclp-serial
+
+
+
+@@ -3586,6 +3587,8 @@
+ pci-serial
+ spapr-vty
+ pl011
++ sclpconsole
++ sclplmconsole
+
+
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 32089df3c2..c58dae197c 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -447,6 +447,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTarget,
+ "pci-serial",
+ "spapr-vio-serial",
+ "system-serial",
++ "sclp-serial",
+ );
+
+ VIR_ENUM_IMPL(virDomainChrChannelTarget,
+@@ -476,6 +477,8 @@ VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
+ "pci-serial",
+ "spapr-vty",
+ "pl011",
++ "sclpconsole",
++ "sclplmconsole",
+ );
+
+ VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
+@@ -4066,6 +4069,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: {
+
+ /* Create a stub console to match the serial port.
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index d6febf3059..0e97f0437e 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -1079,6 +1079,7 @@ typedef enum {
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP,
+
+ VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST
+ } virDomainChrSerialTargetType;
+@@ -1113,6 +1114,8 @@ typedef enum {
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY,
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE,
++ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE,
+
+ VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST
+ } virDomainChrSerialTargetModel;
+diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
+index 483eee6056..a2cfb3d4a3 100644
+--- a/src/qemu/qemu_command.c
++++ b/src/qemu/qemu_command.c
+@@ -9229,6 +9229,10 @@ qemuChrSerialTargetModelToCaps(virDomainChrSerialTargetModel targetModel)
+ return QEMU_CAPS_DEVICE_PCI_SERIAL;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
+ return QEMU_CAPS_DEVICE_SPAPR_VTY;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE:
++ return QEMU_CAPS_DEVICE_SCLPCONSOLE;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE:
++ return QEMU_CAPS_DEVICE_SCLPLMCONSOLE;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+@@ -10355,6 +10359,8 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE:
+
+ caps = qemuChrSerialTargetModelToCaps(serial->targetModel);
+
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index 2fc173fa45..91c0e163e1 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -3469,6 +3469,7 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType)
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ break;
+@@ -3492,6 +3493,9 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel)
+ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
+ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE:
++ return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
+ break;
+@@ -3529,6 +3533,7 @@ qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
+ break;
+
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
+ if (chr->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target type '%s' cannot have an "
+@@ -3550,6 +3555,8 @@ qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE:
+
+ expected = qemuDomainChrSerialTargetModelToTargetType(chr->targetModel);
+
+@@ -3612,6 +3619,13 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
+ isCompatible = false;
+ }
+
++ if (!ARCH_IS_S390(def->os.arch) &&
++ (dev->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP ||
++ dev->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE ||
++ dev->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE)) {
++ isCompatible = false;
++ }
++
+ if (!isCompatible) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Serial device with target type '%s' and "
+@@ -4265,6 +4279,8 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
+ } else if (qemuDomainIsVirt(def)) {
+ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM;
++ } else if (ARCH_IS_S390(def->os.arch)) {
++ chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP;
+ }
+ }
+
+@@ -4287,6 +4303,9 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
+ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011;
+ break;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
++ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE;
++ break;
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ /* Nothing to do */
+@@ -5210,6 +5229,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ /* Nothing to do */
+diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
+index db9656a3a5..a40cdb3993 100644
+--- a/src/qemu/qemu_domain_address.c
++++ b/src/qemu/qemu_domain_address.c
+@@ -785,6 +785,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+ return 0;
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.args b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.args
+new file mode 100644
+index 0000000000..346dcd16bb
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.args
+@@ -0,0 +1,24 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-s390x \
++-name QEMUGuest1 \
++-S \
++-M s390-ccw-virtio \
++-m 214 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-boot c \
++-chardev pty,id=charserial0 \
++-device sclpconsole,chardev=charserial0,id=serial0 \
++-chardev pty,id=charserial1 \
++-device sclplmconsole,chardev=charserial1,id=serial1
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.xml b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.xml
+new file mode 100644
+index 0000000000..b6eb377c98
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-2.xml
+@@ -0,0 +1,19 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219100
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-s390x
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.args b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.args
+new file mode 100644
+index 0000000000..c405fb59ee
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.args
+@@ -0,0 +1,25 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-s390x \
++-name QEMUGuest1 \
++-S \
++-M s390-ccw-virtio \
++-m 214 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-boot c \
++-device virtio-serial-ccw,id=virtio-serial0,devno=fe.0.0000 \
++-chardev pty,id=charserial0 \
++-device sclpconsole,chardev=charserial0,id=serial0 \
++-chardev pty,id=charconsole1 \
++-device virtconsole,chardev=charconsole1,id=console1
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.xml b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.xml
+new file mode 100644
+index 0000000000..c841f1f245
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial-console.xml
+@@ -0,0 +1,15 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219100
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-s390x
++
++
++
++
++
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-s390-serial.args b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial.args
+new file mode 100644
+index 0000000000..20968f7945
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial.args
+@@ -0,0 +1,22 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-s390x \
++-name QEMUGuest1 \
++-S \
++-M s390-ccw-virtio \
++-m 214 \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
++-nographic \
++-nodefconfig \
++-nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
++server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline \
++-boot c \
++-chardev pty,id=charserial0 \
++-device sclpconsole,chardev=charserial0,id=serial0
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-s390-serial.xml b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial.xml
+new file mode 100644
+index 0000000000..55b45bac00
+--- /dev/null
++++ b/tests/qemuxml2argvdata/qemuxml2argv-s390-serial.xml
+@@ -0,0 +1,14 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219100
++ 1
++
++ hvm
++
++
++ /usr/bin/qemu-system-s390x
++
++
++
++
+diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
+index 656b8c0995..852525e7b4 100644
+--- a/tests/qemuxml2argvtest.c
++++ b/tests/qemuxml2argvtest.c
+@@ -2049,6 +2049,22 @@ mymain(void)
+ QEMU_CAPS_NODEFCONFIG,
+ QEMU_CAPS_VIRTIO_CCW,
+ QEMU_CAPS_VIRTIO_S390);
++ DO_TEST("s390-serial",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_VIRTIO_CCW,
++ QEMU_CAPS_VIRTIO_S390,
++ QEMU_CAPS_DEVICE_SCLPCONSOLE);
++ DO_TEST("s390-serial-2",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_VIRTIO_CCW,
++ QEMU_CAPS_VIRTIO_S390,
++ QEMU_CAPS_DEVICE_SCLPCONSOLE,
++ QEMU_CAPS_DEVICE_SCLPLMCONSOLE);
++ DO_TEST("s390-serial-console",
++ QEMU_CAPS_NODEFCONFIG,
++ QEMU_CAPS_VIRTIO_CCW,
++ QEMU_CAPS_VIRTIO_S390,
++ QEMU_CAPS_DEVICE_SCLPCONSOLE);
+
+ DO_TEST("ppc-dtb",
+ QEMU_CAPS_KVM,
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-2.xml
+new file mode 100644
+index 0000000000..bb9ca30f1d
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-2.xml
+@@ -0,0 +1,33 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219100
++ 219100
++ 1
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-s390x
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-console.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-console.xml
+new file mode 100644
+index 0000000000..db3023b7a6
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial-console.xml
+@@ -0,0 +1,34 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219100
++ 219100
++ 1
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-s390x
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial.xml
+new file mode 100644
+index 0000000000..9c9b4dd27a
+--- /dev/null
++++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-s390-serial.xml
+@@ -0,0 +1,28 @@
++
++ QEMUGuest1
++ c7a5fdbd-edaf-9455-926a-d65c16db1809
++ 219100
++ 219100
++ 1
++
++ hvm
++
++
++
++ destroy
++ restart
++ destroy
++
++ /usr/bin/qemu-system-s390x
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
+index bd18507bb6..8766646738 100644
+--- a/tests/qemuxml2xmltest.c
++++ b/tests/qemuxml2xmltest.c
+@@ -1155,6 +1155,12 @@ mymain(void)
+ QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390);
+ DO_TEST("s390-panic-no-address",
+ QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390);
++ DO_TEST("s390-serial",
++ QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390);
++ DO_TEST("s390-serial-2",
++ QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390);
++ DO_TEST("s390-serial-console",
++ QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390);
+
+ DO_TEST("pcihole64", NONE);
+ DO_TEST("pcihole64-gib", NONE);
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-add-a-new-parse-flag-VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION.patch b/SOURCES/libvirt-conf-add-a-new-parse-flag-VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION.patch
deleted file mode 100644
index 6ce10e4..0000000
--- a/SOURCES/libvirt-conf-add-a-new-parse-flag-VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From b24b004e1196889201142d1fc7d51e2fafdbe328 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Pavel Hrdina
-Date: Thu, 20 Apr 2017 09:16:20 +0200
-Subject: [PATCH] conf: add a new parse flag
- VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION
-
-So far there is probably no change that is allowed to be done
-by the VIR_DOMAIN_DEF_PARSE_ABI_UPDATE flag that would break
-guest ABI but this may change in the future.
-
-This introduces new VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION
-which should be used only for ABI updates that are "safe" for
-persistent migration.
-
-Signed-off-by: Pavel Hrdina
-(cherry picked from commit 5c7d88085a762cf4ecc9416a3b7581fa45738c2a)
-
-Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1373184
-
-Signed-off-by: Pavel Hrdina
----
- src/conf/domain_conf.c | 3 ++-
- src/conf/domain_conf.h | 4 ++++
- src/qemu/qemu_migration_cookie.c | 2 +-
- 3 files changed, 7 insertions(+), 2 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 1b0a55b27..71f0c95c3 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -3805,7 +3805,8 @@ virDomainDefPostParseMemory(virDomainDefPtr def,
- /* Attempt to infer the initial memory size from the sum NUMA memory sizes
- * in case ABI updates are allowed or the element wasn't specified */
- if (def->mem.total_memory == 0 ||
-- parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE)
-+ parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE ||
-+ parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION)
- numaMemory = virDomainNumaGetMemorySize(def->numa);
-
- /* calculate the sizes of hotplug memory */
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 47eaacef3..71e651975 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -2725,6 +2725,10 @@ typedef enum {
- VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE = 1 << 10,
- /* skip parsing of security labels */
- VIR_DOMAIN_DEF_PARSE_SKIP_SECLABEL = 1 << 11,
-+ /* Allows updates in post parse callback for incoming persistent migration
-+ * that would break ABI otherwise. This should be used only if it's safe
-+ * to do such change. */
-+ VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION = 1 << 12,
- } virDomainDefParseFlags;
-
- typedef enum {
-diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
-index bd12f1124..12887892d 100644
---- a/src/qemu/qemu_migration_cookie.c
-+++ b/src/qemu/qemu_migration_cookie.c
-@@ -1173,7 +1173,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
- mig->persistent = virDomainDefParseNode(doc, nodes[0],
- caps, driver->xmlopt, NULL,
- VIR_DOMAIN_DEF_PARSE_INACTIVE |
-- VIR_DOMAIN_DEF_PARSE_ABI_UPDATE |
-+ VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION |
- VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE);
- if (!mig->persistent) {
- /* virDomainDefParseNode already reported
---
-2.12.2
-
diff --git a/SOURCES/libvirt-conf-add-caching_mode-attribute-to-iommu-device.patch b/SOURCES/libvirt-conf-add-caching_mode-attribute-to-iommu-device.patch
deleted file mode 100644
index 5e209b4..0000000
--- a/SOURCES/libvirt-conf-add-caching_mode-attribute-to-iommu-device.patch
+++ /dev/null
@@ -1,196 +0,0 @@
-From 3b7b827deb9eb7f43f548aabd27c300ae24c7db3 Mon Sep 17 00:00:00 2001
-Message-Id: <3b7b827deb9eb7f43f548aabd27c300ae24c7db3@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Tue, 16 May 2017 10:44:56 +0200
-Subject: [PATCH] conf: add caching_mode attribute to iommu device
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add a new attribute to control the caching mode.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1427005
-(cherry picked from commit d12781b47eb0c9f3a498d88b632c327aa08aaf8a)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 9 ++++
- docs/schemas/domaincommon.rng | 5 +++
- src/conf/domain_conf.c | 24 +++++++++--
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argv-intel-iommu-caching-mode.xml | 50 ++++++++++++++++++++++
- .../qemuxml2xmlout-intel-iommu-caching-mode.xml | 1 +
- tests/qemuxml2xmltest.c | 1 +
- 7 files changed, 88 insertions(+), 3 deletions(-)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.xml
- create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 41b8bfb50..43a75c1ee 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -7424,6 +7424,15 @@ qemu-kvm -net nic,model=? /dev/null
- Since 3.4.0 (QEMU/KVM only)
-
-
-+ caching_mode
-+
-+
-+ The caching_mode
attribute with possible values
-+ on
and off
can be used to
-+ turn on the VT-d caching mode (useful for assigned devices).
-+ Since 3.4.0 (QEMU/KVM only)
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index a400d961b..12ccbd4e2 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3900,6 +3900,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 45473f65b..e77b542f3 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -14167,6 +14167,15 @@ virDomainIOMMUDefParseXML(xmlNodePtr node,
- iommu->intremap = val;
- }
-
-+ VIR_FREE(tmp);
-+ if ((tmp = virXPathString("string(./driver/@caching_mode)", ctxt))) {
-+ if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-+ virReportError(VIR_ERR_XML_ERROR, _("unknown caching_mode value: %s"), tmp);
-+ goto cleanup;
-+ }
-+ iommu->caching_mode = val;
-+ }
-+
- ret = iommu;
- iommu = NULL;
-
-@@ -24114,9 +24123,18 @@ virDomainIOMMUDefFormat(virBufferPtr buf,
-
- virBufferAdjustIndent(&childBuf, virBufferGetIndent(buf, false) + 2);
-
-- if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT) {
-- virBufferAsprintf(&childBuf, " \n",
-- virTristateSwitchTypeToString(iommu->intremap));
-+ if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT ||
-+ iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAddLit(&childBuf, "intremap != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(&childBuf, " intremap='%s'",
-+ virTristateSwitchTypeToString(iommu->intremap));
-+ }
-+ if (iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(&childBuf, " caching_mode='%s'",
-+ virTristateSwitchTypeToString(iommu->caching_mode));
-+ }
-+ virBufferAddLit(&childBuf, "/>\n");
- }
-
- virBufferAsprintf(buf, "
-+ QEMUGuest1
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219100
-+ 219100
-+ 1
-+
-+ hvm
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+ /usr/bin/qemu-system-x86_64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml
-new file mode 120000
-index 000000000..d971a35dc
---- /dev/null
-+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml
-@@ -0,0 +1 @@
-+../qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.xml
-\ No newline at end of file
-diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
-index 0482ad9cb..e1938421a 100644
---- a/tests/qemuxml2xmltest.c
-+++ b/tests/qemuxml2xmltest.c
-@@ -1129,6 +1129,7 @@ mymain(void)
- QEMU_CAPS_MACHINE_OPT,
- QEMU_CAPS_MACHINE_IOMMU);
- DO_TEST("intel-iommu-ioapic", NONE);
-+ DO_TEST("intel-iommu-caching-mode", NONE);
-
- DO_TEST("cpu-check-none", NONE);
- DO_TEST("cpu-check-partial", NONE);
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-add-driver-intremap-to-iommu.patch b/SOURCES/libvirt-conf-add-driver-intremap-to-iommu.patch
deleted file mode 100644
index 8bd9e7f..0000000
--- a/SOURCES/libvirt-conf-add-driver-intremap-to-iommu.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-From 2bb15d3f041ec2506012aa701547334af429b915 Mon Sep 17 00:00:00 2001
-Message-Id: <2bb15d3f041ec2506012aa701547334af429b915@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Tue, 16 May 2017 10:44:54 +0200
-Subject: [PATCH] conf: add to
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add a new attribute to control interrupt remapping.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1427005
-(cherry picked from commit 2020e2c6f2656ca1aa9032859ccde76185c37c39)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 24 +++++++++++++-
- docs/schemas/domaincommon.rng | 9 +++++
- src/conf/domain_conf.c | 38 +++++++++++++++++++---
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argv-intel-iommu-ioapic.xml | 4 ++-
- 5 files changed, 70 insertions(+), 6 deletions(-)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 869c1f73e..41b8bfb50 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -7393,7 +7393,9 @@ qemu-kvm -net nic,model=? /dev/null
-
- ...
- <devices>
-- <iommu model='intel'/>
-+ <iommu model='intel'>
-+ <driver intremap='on'/>
-+ </iommu>
- </devices>
- ...
-
-@@ -7404,6 +7406,26 @@ qemu-kvm -net nic,model=? /dev/null
- Currently only the intel
model is supported.
-
-
-+ driver
-+
-+
-+ The driver
subelement can be used to configure
-+ additional options:
-+
-+
-+ intremap
-+
-+
-+ The intremap
attribute with possible values
-+ on
and off
can be used to
-+ turn on interrupt remapping, a part of the VT-d functionality.
-+ Currently this requires split I/O APIC
-+ (<ioapic driver='qemu'/>
).
-+ Since 3.4.0 (QEMU/KVM only)
-+
-+
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index c72ba7e97..a400d961b 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3893,6 +3893,15 @@
-
- intel
-
-+
-+
-+
-+
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index d5c4f6ddd..45473f65b 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -14132,12 +14132,16 @@ virDomainMemoryDefParseXML(xmlNodePtr memdevNode,
-
-
- static virDomainIOMMUDefPtr
--virDomainIOMMUDefParseXML(xmlNodePtr node)
-+virDomainIOMMUDefParseXML(xmlNodePtr node,
-+ xmlXPathContextPtr ctxt)
- {
- virDomainIOMMUDefPtr iommu = NULL, ret = NULL;
-+ xmlNodePtr save = ctxt->node;
- char *tmp = NULL;
- int val;
-
-+ ctxt->node = node;
-+
- if (VIR_ALLOC(iommu) < 0)
- goto cleanup;
-
-@@ -14154,10 +14158,20 @@ virDomainIOMMUDefParseXML(xmlNodePtr node)
-
- iommu->model = val;
-
-+ VIR_FREE(tmp);
-+ if ((tmp = virXPathString("string(./driver/@intremap)", ctxt))) {
-+ if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-+ virReportError(VIR_ERR_XML_ERROR, _("unknown intremap value: %s"), tmp);
-+ goto cleanup;
-+ }
-+ iommu->intremap = val;
-+ }
-+
- ret = iommu;
- iommu = NULL;
-
- cleanup:
-+ ctxt->node = save;
- VIR_FREE(iommu);
- VIR_FREE(tmp);
- return ret;
-@@ -14310,7 +14324,7 @@ virDomainDeviceDefParse(const char *xmlStr,
- goto error;
- break;
- case VIR_DOMAIN_DEVICE_IOMMU:
-- if (!(dev->data.iommu = virDomainIOMMUDefParseXML(node)))
-+ if (!(dev->data.iommu = virDomainIOMMUDefParseXML(node, ctxt)))
- goto error;
- break;
- case VIR_DOMAIN_DEVICE_NONE:
-@@ -18440,7 +18454,7 @@ virDomainDefParseXML(xmlDocPtr xml,
- }
-
- if (n > 0) {
-- if (!(def->iommu = virDomainIOMMUDefParseXML(nodes[0])))
-+ if (!(def->iommu = virDomainIOMMUDefParseXML(nodes[0], ctxt)))
- goto error;
- }
- VIR_FREE(nodes);
-@@ -24096,8 +24110,24 @@ static void
- virDomainIOMMUDefFormat(virBufferPtr buf,
- const virDomainIOMMUDef *iommu)
- {
-- virBufferAsprintf(buf, " \n",
-+ virBuffer childBuf = VIR_BUFFER_INITIALIZER;
-+
-+ virBufferAdjustIndent(&childBuf, virBufferGetIndent(buf, false) + 2);
-+
-+ if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(&childBuf, " \n",
-+ virTristateSwitchTypeToString(iommu->intremap));
-+ }
-+
-+ virBufferAsprintf(buf, "model));
-+ if (virBufferUse(&childBuf)) {
-+ virBufferAddLit(buf, ">\n");
-+ virBufferAddBuffer(buf, &childBuf);
-+ virBufferAddLit(buf, " \n");
-+ } else {
-+ virBufferAddLit(buf, "/>\n");
-+ }
- }
-
-
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 4cb37b1fc..8eb422a57 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -2209,6 +2209,7 @@ typedef enum {
-
- struct _virDomainIOMMUDef {
- virDomainIOMMUModel model;
-+ virTristateSwitch intremap;
- };
- /*
- * Guest VM main configuration
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
-index 284d63a30..bfe714ad8 100644
---- a/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
-@@ -24,6 +24,8 @@
-
-
-
--
-+
-+
-+
-
-
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-add-eim-attribute-to-iommu-driver.patch b/SOURCES/libvirt-conf-add-eim-attribute-to-iommu-driver.patch
deleted file mode 100644
index 8297928..0000000
--- a/SOURCES/libvirt-conf-add-eim-attribute-to-iommu-driver.patch
+++ /dev/null
@@ -1,191 +0,0 @@
-From d7a019948e1c1f0400ee174ef60bf0cb32d181f9 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 26 May 2017 08:52:56 +0200
-Subject: [PATCH] conf: add eim attribute to
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add an attribute to control extended interrupt mode.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1451282
-
-Reviewed-by: Andrea Bolognani
-(cherry picked from commit dc61d927589b2b122868e6abea86b73caa682226)
-
-Signed-off-by: Ján Tomko
-
-Also:
-https://bugzilla.redhat.com/show_bug.cgi?id=1289153
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 13 +++++++++
- docs/schemas/domaincommon.rng | 5 ++++
- src/conf/domain_conf.c | 21 +++++++++++++++
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argv-intel-iommu-eim.xml | 31 ++++++++++++++++++++++
- .../qemuxml2xmlout-intel-iommu-eim.xml | 1 +
- tests/qemuxml2xmltest.c | 1 +
- 7 files changed, 73 insertions(+)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-eim.xml
- create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-eim.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 43a75c1ee..e886e4e17 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -7433,6 +7433,19 @@ qemu-kvm -net nic,model=? /dev/null
- Since 3.4.0 (QEMU/KVM only)
-
-
-+ eim
-+
-+
-+ The eim
attribute (with possible values
-+ on
and off
) can be used to
-+ configure Extended Interrupt Mode. A q35 domain with
-+ split I/O APIC (as described in
-+ hypervisor features ),
-+ and both interrupt remapping and EIM turned on for
-+ the IOMMU, will be able to use more than 255 vCPUs.
-+ Since 3.4.0 (QEMU/KVM only)
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 12ccbd4e2..af7824aa0 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3905,6 +3905,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 370916396..4404b8f73 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -14176,6 +14176,15 @@ virDomainIOMMUDefParseXML(xmlNodePtr node,
- iommu->caching_mode = val;
- }
-
-+ VIR_FREE(tmp);
-+ if ((tmp = virXPathString("string(./driver/@eim)", ctxt))) {
-+ if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-+ virReportError(VIR_ERR_XML_ERROR, _("unknown eim value: %s"), tmp);
-+ goto cleanup;
-+ }
-+ iommu->eim = val;
-+ }
-+
- ret = iommu;
- iommu = NULL;
-
-@@ -19847,6 +19856,14 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUDefPtr src,
- virTristateSwitchTypeToString(src->caching_mode));
- return false;
- }
-+ if (src->eim != dst->eim) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target domain IOMMU device eim value '%s' "
-+ "does not match source '%s'"),
-+ virTristateSwitchTypeToString(dst->eim),
-+ virTristateSwitchTypeToString(src->eim));
-+ return false;
-+ }
- return true;
- }
-
-@@ -24170,6 +24187,10 @@ virDomainIOMMUDefFormat(virBufferPtr buf,
- virBufferAsprintf(&childBuf, " caching_mode='%s'",
- virTristateSwitchTypeToString(iommu->caching_mode));
- }
-+ if (iommu->eim != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(&childBuf, " eim='%s'",
-+ virTristateSwitchTypeToString(iommu->eim));
-+ }
- virBufferAddLit(&childBuf, "/>\n");
- }
-
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 825158a7d..980aafa66 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -2211,6 +2211,7 @@ struct _virDomainIOMMUDef {
- virDomainIOMMUModel model;
- virTristateSwitch intremap;
- virTristateSwitch caching_mode;
-+ virTristateSwitch eim;
- };
- /*
- * Guest VM main configuration
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-eim.xml b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-eim.xml
-new file mode 100644
-index 000000000..8642ed349
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-eim.xml
-@@ -0,0 +1,31 @@
-+
-+ QEMUGuest1
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219100
-+ 219100
-+ 288
-+
-+ hvm
-+
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+ /usr/bin/qemu-system-x86_64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-eim.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-eim.xml
-new file mode 120000
-index 000000000..9fbec36dc
---- /dev/null
-+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-eim.xml
-@@ -0,0 +1 @@
-+../qemuxml2argvdata/qemuxml2argv-intel-iommu-eim.xml
-\ No newline at end of file
-diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
-index e1938421a..6283da409 100644
---- a/tests/qemuxml2xmltest.c
-+++ b/tests/qemuxml2xmltest.c
-@@ -1130,6 +1130,7 @@ mymain(void)
- QEMU_CAPS_MACHINE_IOMMU);
- DO_TEST("intel-iommu-ioapic", NONE);
- DO_TEST("intel-iommu-caching-mode", NONE);
-+ DO_TEST("intel-iommu-eim", NONE);
-
- DO_TEST("cpu-check-none", NONE);
- DO_TEST("cpu-check-partial", NONE);
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-add-ioapic-driver-to-features.patch b/SOURCES/libvirt-conf-add-ioapic-driver-to-features.patch
deleted file mode 100644
index c7b34fa..0000000
--- a/SOURCES/libvirt-conf-add-ioapic-driver-to-features.patch
+++ /dev/null
@@ -1,249 +0,0 @@
-From abbea18f4b3747d738d05f36884dda3202128b65 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Tue, 16 May 2017 10:44:52 +0200
-Subject: [PATCH] conf: add to
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add a new element with a driver attribute.
-
-Possible values are qemu and kvm. With 'qemu', the I/O
-APIC can be put in the userspace even for KVM domains.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1427005
-(cherry picked from commit 8023b21a95f271e51810de7f1362e609eaadc1e4)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 9 ++++++
- docs/schemas/domaincommon.rng | 15 ++++++++++
- src/conf/domain_conf.c | 33 +++++++++++++++++++++-
- src/conf/domain_conf.h | 11 ++++++++
- .../qemuxml2argv-intel-iommu-ioapic.xml | 29 +++++++++++++++++++
- .../qemuxml2xmlout-intel-iommu-ioapic.xml | 1 +
- tests/qemuxml2xmltest.c | 1 +
- 7 files changed, 98 insertions(+), 1 deletion(-)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
- create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 7e55b0327..869c1f73e 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -1675,6 +1675,7 @@
- </kvm>
- <pvspinlock state='on'/>
- <gic version='2'/>
-+ <ioapic driver='qemu'/>
-
- </features>
- ...
-@@ -1836,6 +1837,14 @@
- for hypervisor to decide.
- Since 2.1.0
-
-+ ioapic
-+ Tune the I/O APIC. Possible values for the
-+ driver
attribute are:
-+ kvm
(default for KVM domains)
-+ and qemu
which puts I/O APIC in userspace
-+ which is also known as a split I/O APIC mode.
-+ Since 3.4.0 (QEMU/KVM only)
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index 7271f0113..c72ba7e97 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -4515,6 +4515,9 @@
-
-
-
-+
-+
-+
-
-
-
-@@ -4693,6 +4696,18 @@
-
-
-
-+
-+
-+
-+
-+ qemu
-+ kvm
-+
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 4096b9caf..d5c4f6ddd 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -141,7 +141,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
- "pmu",
- "vmport",
- "gic",
-- "smm")
-+ "smm",
-+ "ioapic")
-
- VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
- "default",
-@@ -859,6 +860,11 @@ VIR_ENUM_IMPL(virDomainLoader,
- "rom",
- "pflash")
-
-+VIR_ENUM_IMPL(virDomainIOAPIC,
-+ VIR_DOMAIN_IOAPIC_LAST,
-+ "qemu",
-+ "kvm")
-+
- /* Internal mapping: subset of block job types that can be present in
- * XML (remaining types are not two-phase). */
- VIR_ENUM_DECL(virDomainBlockJob)
-@@ -17518,6 +17524,24 @@ virDomainDefParseXML(xmlDocPtr xml,
- ctxt->node = node;
- break;
-
-+ case VIR_DOMAIN_FEATURE_IOAPIC:
-+ node = ctxt->node;
-+ ctxt->node = nodes[i];
-+ tmp = virXPathString("string(./@driver)", ctxt);
-+ if (tmp) {
-+ int value = virDomainIOAPICTypeFromString(tmp);
-+ if (value < 0) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Unknown driver mode: %s"),
-+ tmp);
-+ goto error;
-+ }
-+ def->ioapic = value;
-+ def->features[val] = VIR_TRISTATE_SWITCH_ON;
-+ }
-+ ctxt->node = node;
-+ break;
-+
- /* coverity[dead_error_begin] */
- case VIR_DOMAIN_FEATURE_LAST:
- break;
-@@ -24598,6 +24622,13 @@ virDomainDefFormatInternal(virDomainDefPtr def,
- }
- break;
-
-+ case VIR_DOMAIN_FEATURE_IOAPIC:
-+ if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
-+ virBufferAsprintf(buf, " \n",
-+ virDomainIOAPICTypeToString(def->ioapic));
-+ }
-+ break;
-+
- /* coverity[dead_error_begin] */
- case VIR_DOMAIN_FEATURE_LAST:
- break;
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index f1e9fc2ba..4cb37b1fc 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -1670,6 +1670,7 @@ typedef enum {
- VIR_DOMAIN_FEATURE_VMPORT,
- VIR_DOMAIN_FEATURE_GIC,
- VIR_DOMAIN_FEATURE_SMM,
-+ VIR_DOMAIN_FEATURE_IOAPIC,
-
- VIR_DOMAIN_FEATURE_LAST
- } virDomainFeature;
-@@ -1809,6 +1810,15 @@ struct _virDomainLoaderDef {
-
- void virDomainLoaderDefFree(virDomainLoaderDefPtr loader);
-
-+typedef enum {
-+ VIR_DOMAIN_IOAPIC_QEMU = 0,
-+ VIR_DOMAIN_IOAPIC_KVM,
-+
-+ VIR_DOMAIN_IOAPIC_LAST
-+} virDomainIOAPIC;
-+
-+VIR_ENUM_DECL(virDomainIOAPIC);
-+
- /* Operating system configuration data & machine / arch */
- typedef struct _virDomainOSDef virDomainOSDef;
- typedef virDomainOSDef *virDomainOSDefPtr;
-@@ -2258,6 +2268,7 @@ struct _virDomainDef {
- unsigned int hyperv_spinlocks;
- virGICVersion gic_version;
- char *hyperv_vendor_id;
-+ virDomainIOAPIC ioapic;
-
- /* These options are of type virTristateSwitch: ON = keep, OFF = drop */
- int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST];
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
-new file mode 100644
-index 000000000..284d63a30
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
-@@ -0,0 +1,29 @@
-+
-+ QEMUGuest1
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219100
-+ 219100
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+ /usr/bin/qemu-system-x86_64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml
-new file mode 120000
-index 000000000..42d17b2c0
---- /dev/null
-+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml
-@@ -0,0 +1 @@
-+../qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
-\ No newline at end of file
-diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
-index ff533ab19..0482ad9cb 100644
---- a/tests/qemuxml2xmltest.c
-+++ b/tests/qemuxml2xmltest.c
-@@ -1128,6 +1128,7 @@ mymain(void)
- DO_TEST("intel-iommu-machine",
- QEMU_CAPS_MACHINE_OPT,
- QEMU_CAPS_MACHINE_IOMMU);
-+ DO_TEST("intel-iommu-ioapic", NONE);
-
- DO_TEST("cpu-check-none", NONE);
- DO_TEST("cpu-check-partial", NONE);
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-add-iotlb-attribute-to-iommu.patch b/SOURCES/libvirt-conf-add-iotlb-attribute-to-iommu.patch
deleted file mode 100644
index d8b4894..0000000
--- a/SOURCES/libvirt-conf-add-iotlb-attribute-to-iommu.patch
+++ /dev/null
@@ -1,194 +0,0 @@
-From 1e915e38d422df8b3cb4e049e932a5e6900735bc Mon Sep 17 00:00:00 2001
-Message-Id: <1e915e38d422df8b3cb4e049e932a5e6900735bc@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:56 +0200
-Subject: [PATCH] conf: add iotlb attribute to iommu
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add a new iotlb attribute to the iommu device
-to control the device IOTLB support for intel-iommu.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit 27b187be3988c60cd26e08ab4bcab66bed5a3646)
-Signed-off-by: Ján Tomko
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 10 +++++++
- docs/schemas/domaincommon.rng | 5 ++++
- src/conf/domain_conf.c | 23 +++++++++++++++-
- src/conf/domain_conf.h | 1 +
- .../qemuxml2argv-intel-iommu-device-iotlb.xml | 31 ++++++++++++++++++++++
- .../qemuxml2xmlout-intel-iommu-device-iotlb.xml | 1 +
- tests/qemuxml2xmltest.c | 1 +
- 7 files changed, 71 insertions(+), 1 deletion(-)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-device-iotlb.xml
- create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-device-iotlb.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index e886e4e17e..e8a3367bac 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -7446,6 +7446,16 @@ qemu-kvm -net nic,model=? /dev/null
- Since 3.4.0 (QEMU/KVM only)
-
-
-+ iotlb
-+
-+
-+ The iotlb
attribute with possible values
-+ on
and off
can be used to
-+ turn on the IOTLB used to cache address translation
-+ requests from devices.
-+ Since 3.5.0 (QEMU/KVM only)
-+
-+
-
-
-
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index af7824aa02..1b66362f17 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -3910,6 +3910,11 @@
-
-
-
-+
-+
-+
-+
-+
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 275145b1ec..701a6d2136 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -14196,6 +14196,14 @@ virDomainIOMMUDefParseXML(xmlNodePtr node,
- }
- iommu->caching_mode = val;
- }
-+ VIR_FREE(tmp);
-+ if ((tmp = virXPathString("string(./driver/@iotlb)", ctxt))) {
-+ if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-+ virReportError(VIR_ERR_XML_ERROR, _("unknown iotlb value: %s"), tmp);
-+ goto cleanup;
-+ }
-+ iommu->iotlb = val;
-+ }
-
- VIR_FREE(tmp);
- if ((tmp = virXPathString("string(./driver/@eim)", ctxt))) {
-@@ -19877,6 +19885,14 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUDefPtr src,
- virTristateSwitchTypeToString(src->eim));
- return false;
- }
-+ if (src->iotlb != dst->iotlb) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target domain IOMMU device iotlb value '%s' "
-+ "does not match source '%s'"),
-+ virTristateSwitchTypeToString(dst->iotlb),
-+ virTristateSwitchTypeToString(src->iotlb));
-+ return false;
-+ }
- return true;
- }
-
-@@ -24212,7 +24228,8 @@ virDomainIOMMUDefFormat(virBufferPtr buf,
- virBufferAdjustIndent(&childBuf, virBufferGetIndent(buf, false) + 2);
-
- if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT ||
-- iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT) {
-+ iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT ||
-+ iommu->iotlb != VIR_TRISTATE_SWITCH_ABSENT) {
- virBufferAddLit(&childBuf, "intremap != VIR_TRISTATE_SWITCH_ABSENT) {
- virBufferAsprintf(&childBuf, " intremap='%s'",
-@@ -24226,6 +24243,10 @@ virDomainIOMMUDefFormat(virBufferPtr buf,
- virBufferAsprintf(&childBuf, " eim='%s'",
- virTristateSwitchTypeToString(iommu->eim));
- }
-+ if (iommu->iotlb != VIR_TRISTATE_SWITCH_ABSENT) {
-+ virBufferAsprintf(&childBuf, " iotlb='%s'",
-+ virTristateSwitchTypeToString(iommu->iotlb));
-+ }
- virBufferAddLit(&childBuf, "/>\n");
- }
-
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 706d106ad9..e6c20a9e1e 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -2213,6 +2213,7 @@ struct _virDomainIOMMUDef {
- virTristateSwitch intremap;
- virTristateSwitch caching_mode;
- virTristateSwitch eim;
-+ virTristateSwitch iotlb;
- };
- /*
- * Guest VM main configuration
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-device-iotlb.xml b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-device-iotlb.xml
-new file mode 100644
-index 0000000000..3eb08ab9af
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-device-iotlb.xml
-@@ -0,0 +1,31 @@
-+
-+ QEMUGuest1
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219100
-+ 219100
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ destroy
-+
-+ /usr/bin/qemu-system-x86_64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-device-iotlb.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-device-iotlb.xml
-new file mode 120000
-index 0000000000..3120d9f677
---- /dev/null
-+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-device-iotlb.xml
-@@ -0,0 +1 @@
-+../qemuxml2argvdata/qemuxml2argv-intel-iommu-device-iotlb.xml
-\ No newline at end of file
-diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
-index 6283da4096..3f7c268e43 100644
---- a/tests/qemuxml2xmltest.c
-+++ b/tests/qemuxml2xmltest.c
-@@ -1131,6 +1131,7 @@ mymain(void)
- DO_TEST("intel-iommu-ioapic", NONE);
- DO_TEST("intel-iommu-caching-mode", NONE);
- DO_TEST("intel-iommu-eim", NONE);
-+ DO_TEST("intel-iommu-device-iotlb", NONE);
-
- DO_TEST("cpu-check-none", NONE);
- DO_TEST("cpu-check-partial", NONE);
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-docs-Add-support-for-coalesce-setting-s.patch b/SOURCES/libvirt-conf-docs-Add-support-for-coalesce-setting-s.patch
deleted file mode 100644
index f7166fc..0000000
--- a/SOURCES/libvirt-conf-docs-Add-support-for-coalesce-setting-s.patch
+++ /dev/null
@@ -1,557 +0,0 @@
-From 705cbf8998e405b98f2d536f6d92c524755fe219 Mon Sep 17 00:00:00 2001
-Message-Id: <705cbf8998e405b98f2d536f6d92c524755fe219@dist-git>
-From: Martin Kletzander
-Date: Tue, 25 Apr 2017 13:41:16 +0200
-Subject: [PATCH] conf, docs: Add support for coalesce setting(s)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1414627
-
-We are currently parsing only rx/frames/max because that's the only
-value that makes sense for us. The tun device just added support for
-this one and the others are only supported by hardware devices which
-we don't need to worry about as the only way we'd pass those to the
-domain is using or . And in
-those cases the guest can modify the settings itself.
-
-Signed-off-by: Martin Kletzander
-(cherry picked from commit 523c9960621eaf307ae8d4ae2735fb66f89d5634)
-Signed-off-by: Martin Kletzander
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 27 +++++
- docs/schemas/domaincommon.rng | 131 +++++++++++++++++++++
- src/conf/domain_conf.c | 80 +++++++++++++
- src/conf/domain_conf.h | 2 +
- src/qemu/qemu_domain.c | 31 +++++
- .../qemuxml2argvdata/qemuxml2argv-net-coalesce.xml | 68 +++++++++++
- .../qemuxml2xmlout-net-coalesce.xml | 71 +++++++++++
- tests/qemuxml2xmltest.c | 1 +
- 8 files changed, 411 insertions(+)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
- create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index aee1e1442..7374cb243 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -5437,6 +5437,33 @@ qemu-kvm -net nic,model=? /dev/null
- Since 3.1.0
-
-
-+
-+
-+...
-+<devices>
-+ <interface type='network'>
-+ <source network='default'/>
-+ <target dev='vnet0'/>
-+ <coalesce>
-+ <rx>
-+ <frames max='7'/>
-+ </rx>
-+ </coalesce>
-+ </interface>
-+</devices>
-+...
-+
-+
-+ This element provides means of setting coalesce settings for
-+ some interface devices (currently only type network
-+ and bridge
. Currently there is just one attribute,
-+ max
, to tweak, in element frames for
-+ the rx
group, which accepts a non-negative integer
-+ that specifies the maximum number of packets that will be
-+ received before an interrupt.
-+ Since 3.3.0
-+
-+
-
-
- ...
-diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
-index d5c28ee3c..7a9b4b702 100644
---- a/docs/schemas/domaincommon.rng
-+++ b/docs/schemas/domaincommon.rng
-@@ -2509,6 +2509,9 @@
-
-
-
-+
-+
-+
-
-
-
-@@ -5746,4 +5749,132 @@
-
-
-
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 71f0c95c3..f2801ec84 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -6759,6 +6759,77 @@ virDomainNetIPInfoParseXML(const char *source,
- return ret;
- }
-
-+
-+static virNetDevCoalescePtr
-+virDomainNetDefCoalesceParseXML(xmlNodePtr node,
-+ xmlXPathContextPtr ctxt)
-+{
-+ virNetDevCoalescePtr ret = NULL;
-+ xmlNodePtr save = NULL;
-+ char *str = NULL;
-+ unsigned long long tmp = 0;
-+
-+ save = ctxt->node;
-+ ctxt->node = node;
-+
-+ str = virXPathString("string(./rx/frames/@max)", ctxt);
-+ if (!str)
-+ goto cleanup;
-+
-+ if (!ret && VIR_ALLOC(ret) < 0)
-+ goto cleanup;
-+
-+ if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
-+ virReportError(VIR_ERR_XML_DETAIL,
-+ _("cannot parse value '%s' for coalesce parameter"),
-+ str);
-+ VIR_FREE(str);
-+ goto error;
-+ }
-+ VIR_FREE(str);
-+
-+ if (tmp > UINT32_MAX) {
-+ virReportError(VIR_ERR_OVERFLOW,
-+ _("value '%llu' is too big for coalesce "
-+ "parameter, maximum is '%lu'"),
-+ tmp, (unsigned long) UINT32_MAX);
-+ goto error;
-+ }
-+ ret->rx_max_coalesced_frames = tmp;
-+
-+ cleanup:
-+ ctxt->node = save;
-+ return ret;
-+
-+ error:
-+ VIR_FREE(ret);
-+ goto cleanup;
-+}
-+
-+static void
-+virDomainNetDefCoalesceFormatXML(virBufferPtr buf,
-+ virNetDevCoalescePtr coalesce)
-+{
-+ if (!coalesce || !coalesce->rx_max_coalesced_frames)
-+ return;
-+
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+
-+ virBufferAsprintf(buf, " \n",
-+ coalesce->rx_max_coalesced_frames);
-+
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+}
-+
-+
- static int
- virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
- xmlXPathContextPtr ctxt,
-@@ -10242,6 +10313,13 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
- goto error;
- }
-
-+ node = virXPathNode("./coalesce", ctxt);
-+ if (node) {
-+ def->coalesce = virDomainNetDefCoalesceParseXML(node, ctxt);
-+ if (!def->coalesce)
-+ goto error;
-+ }
-+
- cleanup:
- ctxt->node = oldnode;
- VIR_FREE(macaddr);
-@@ -22135,6 +22213,8 @@ virDomainNetDefFormat(virBufferPtr buf,
- if (def->mtu)
- virBufferAsprintf(buf, " \n", def->mtu);
-
-+ virDomainNetDefCoalesceFormatXML(buf, def->coalesce);
-+
- if (virDomainDeviceInfoFormat(buf, &def->info,
- flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT
- | VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM) < 0)
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index 71e651975..1dbbcdc51 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -41,6 +41,7 @@
- # include "numa_conf.h"
- # include "virnetdevmacvlan.h"
- # include "virsysinfo.h"
-+# include "virnetdev.h"
- # include "virnetdevip.h"
- # include "virnetdevvportprofile.h"
- # include "virnetdevbandwidth.h"
-@@ -1036,6 +1037,7 @@ struct _virDomainNetDef {
- int trustGuestRxFilters; /* enum virTristateBool */
- int linkstate;
- unsigned int mtu;
-+ virNetDevCoalescePtr coalesce;
- };
-
- /* Used for prefix of ifname of any network name generated dynamically
-diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
-index d31645fd1..53586878b 100644
---- a/src/qemu/qemu_domain.c
-+++ b/src/qemu/qemu_domain.c
-@@ -3012,6 +3012,30 @@ qemuDomainDefValidate(const virDomainDef *def,
- }
-
-
-+static bool
-+qemuDomainNetSupportsCoalesce(virDomainNetType type)
-+{
-+ switch (type) {
-+ case VIR_DOMAIN_NET_TYPE_NETWORK:
-+ case VIR_DOMAIN_NET_TYPE_BRIDGE:
-+ return true;
-+ case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
-+ case VIR_DOMAIN_NET_TYPE_ETHERNET:
-+ case VIR_DOMAIN_NET_TYPE_DIRECT:
-+ case VIR_DOMAIN_NET_TYPE_HOSTDEV:
-+ 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_UDP:
-+ case VIR_DOMAIN_NET_TYPE_LAST:
-+ break;
-+ }
-+ return false;
-+}
-+
-+
- static int
- qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
- const virDomainDef *def ATTRIBUTE_UNUSED,
-@@ -3046,6 +3070,13 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
- virDomainNetTypeToString(net->type));
- goto cleanup;
- }
-+
-+ if (net->coalesce && !qemuDomainNetSupportsCoalesce(net->type)) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("coalesce settings on interface type %s are not supported"),
-+ virDomainNetTypeToString(net->type));
-+ goto cleanup;
-+ }
- }
-
- ret = 0;
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
-new file mode 100644
-index 000000000..b51032442
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
-@@ -0,0 +1,68 @@
-+
-+ test
-+ 15d091de-0181-456b-9554-e4382dc1f1ab
-+ 1048576
-+ 1048576
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ restart
-+
-+ /usr/bin/qemu-system-x86_64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
-new file mode 100644
-index 000000000..fd5fdbece
---- /dev/null
-+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
-@@ -0,0 +1,71 @@
-+
-+ test
-+ 15d091de-0181-456b-9554-e4382dc1f1ab
-+ 1048576
-+ 1048576
-+ 1
-+
-+ hvm
-+
-+
-+
-+
-+
-+ destroy
-+ restart
-+ restart
-+
-+ /usr/bin/qemu-system-x86_64
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
-index eae999dd6..26a2259fd 100644
---- a/tests/qemuxml2xmltest.c
-+++ b/tests/qemuxml2xmltest.c
-@@ -532,6 +532,7 @@ mymain(void)
- DO_TEST("net-bandwidth", NONE);
- DO_TEST("net-bandwidth2", NONE);
- DO_TEST("net-mtu", NONE);
-+ DO_TEST("net-coalesce", NONE);
-
- DO_TEST("serial-vc", NONE);
- DO_TEST("serial-pty", NONE);
---
-2.12.2
-
diff --git a/SOURCES/libvirt-conf-don-t-ignore-target-dev-blah-for-macvtap-interfaces.patch b/SOURCES/libvirt-conf-don-t-ignore-target-dev-blah-for-macvtap-interfaces.patch
deleted file mode 100644
index 4b716d6..0000000
--- a/SOURCES/libvirt-conf-don-t-ignore-target-dev-blah-for-macvtap-interfaces.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From c2e748f3d928f8030e5c12b474c427086c962ad4 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Laine Stump
-Date: Tue, 2 May 2017 12:33:11 -0400
-Subject: [PATCH] conf: don't ignore for macvtap
- interfaces
-
-The parser had been clearing out *all* suggested device names for
-type='direct' (aka macvtap) interfaces. All of the code implementing
-macvtap allows for a user-specified device name, so we should allow
-it. In the case that an interface name starts with "macvtap" or
-"macvlan" though, we do still clear it out, just as we do with "vnet"
-(which is the prefix used for automatically generated tap device
-names), since those are the prefixes for the names we autogenerate for
-macvtap and macvlan devices.
-
-Resolves: https://bugzilla.redhat.com/1335798
-(cherry picked from commit 9cb891141c4a5a96243c61518c4e0dbcf6a86c24)
-
-Signed-off-by: Jiri Denemark
----
- docs/formatdomain.html.in | 6 +++---
- src/conf/domain_conf.c | 7 ++++++-
- 2 files changed, 9 insertions(+), 4 deletions(-)
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index 2dc5e751a..7e55b0327 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -5207,9 +5207,9 @@ qemu-kvm -net nic,model=? /dev/null
- If no target is specified, certain hypervisors will
- automatically generate a name for the created tun device. This
- name can be manually specified, however the name should not
-- start with either 'vnet' or 'vif' , which are prefixes
-- reserved by libvirt and certain hypervisors. Manually specified
-- targets using these prefixes may be ignored.
-+ start with either 'vnet', 'vif', 'macvtap', or 'macvlan',
-+ which are prefixes reserved by libvirt and certain hypervisors.
-+ Manually specified targets using these prefixes may be ignored.
-
-
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 7ab5e5051..84a8a94e5 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -55,6 +55,7 @@
- #include "virtpm.h"
- #include "virstring.h"
- #include "virnetdev.h"
-+#include "virnetdevmacvlan.h"
- #include "virhostdev.h"
- #include "virmdev.h"
-
-@@ -10016,8 +10017,12 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
- def->data.direct.linkdev = dev;
- dev = NULL;
-
-- if (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)
-+ if (ifname &&
-+ flags & VIR_DOMAIN_DEF_PARSE_INACTIVE &&
-+ (STRPREFIX(ifname, VIR_NET_GENERATED_MACVTAP_PREFIX) ||
-+ STRPREFIX(ifname, VIR_NET_GENERATED_MACVTAP_PREFIX))) {
- VIR_FREE(ifname);
-+ }
-
- break;
-
---
-2.12.2
-
diff --git a/SOURCES/libvirt-conf-fix-migratable-XML-for-graphics-if-socket-is-generated-based-on-config.patch b/SOURCES/libvirt-conf-fix-migratable-XML-for-graphics-if-socket-is-generated-based-on-config.patch
new file mode 100644
index 0000000..10cf184
--- /dev/null
+++ b/SOURCES/libvirt-conf-fix-migratable-XML-for-graphics-if-socket-is-generated-based-on-config.patch
@@ -0,0 +1,57 @@
+From a1c433306e79ec6b5c0ca4b3e3243875ccabdeb2 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Pavel Hrdina
+Date: Thu, 30 Nov 2017 17:56:41 +0100
+Subject: [PATCH] conf: fix migratable XML for graphics if socket is generated
+ based on config
+
+The graphics code is complex and there are a lot of exceptions and
+backward compatible combinations. One of them is the possibility
+to configure "spice_auto_unix_socket" in qemu.conf which will convert
+all spice graphics with listen type "address" without any address
+specified to listen type "socket" when the guest is started.
+
+We don't format this generated socket into migratable XML to make
+migration work with older libvirt. However, spice has another
+exception that if autoport='no' and there is no port configured
+it is converted to listen type "none". Because of this we need
+to format autoport='yes' to make sure that the listen type will
+be the same as the offline XML.
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1511407
+
+Reviewed-by: Jiri Denemark
+Signed-off-by: Pavel Hrdina
+(cherry picked from commit cb06ea57ad80a964028f22fb49d6ab96648ae741)
+Signed-off-by: Pavel Hrdina
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index c58dae197c..ec138ea861 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -25150,6 +25150,18 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
++ /* If socket is auto-generated based on config option we don't
++ * add any listen element into migratable XML because the original
++ * listen type is "address".
++ * We need to set autoport to make sure that libvirt on destination
++ * will parse it as listen type "address", without autoport it is
++ * parsed as listen type "none". */
++ if ((flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) &&
++ glisten->fromConfig) {
++ virBufferAddStr(buf, " autoport='yes'");
++ }
++ break;
++
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+ break;
+ }
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-honor-maxnames-in-nodeListDevices-API.patch b/SOURCES/libvirt-conf-honor-maxnames-in-nodeListDevices-API.patch
new file mode 100644
index 0000000..f7b19a7
--- /dev/null
+++ b/SOURCES/libvirt-conf-honor-maxnames-in-nodeListDevices-API.patch
@@ -0,0 +1,36 @@
+From a64f825a244c77556c0ed7c5f425ba70b28cca70 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Pavel Hrdina
+Date: Tue, 2 Jan 2018 12:39:13 +0100
+Subject: [PATCH] conf: honor maxnames in nodeListDevices API
+
+Introduced by commit <4ae9dbea99c>.
+
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1528572
+
+Signed-off-by: Pavel Hrdina
+(cherry picked from commit bbf6573e94528ac8a8867855e6671b48e13f1cd1)
+Signed-off-by: Pavel Hrdina
+Reviewed-by: Erik Skultety
+Signed-off-by: Jiri Denemark
+---
+ src/conf/virnodedeviceobj.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
+index 872ec1fd4b..c4e3a40d3a 100644
+--- a/src/conf/virnodedeviceobj.c
++++ b/src/conf/virnodedeviceobj.c
+@@ -798,6 +798,9 @@ virNodeDeviceObjListGetNamesCallback(void *payload,
+ if (data->error)
+ return 0;
+
++ if (data->nnames >= data->maxnames)
++ return 0;
++
+ virObjectLock(obj);
+ def = obj->def;
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-include-x86-microcode-version-in-virsh-capabiltiies.patch b/SOURCES/libvirt-conf-include-x86-microcode-version-in-virsh-capabiltiies.patch
new file mode 100644
index 0000000..edf12a0
--- /dev/null
+++ b/SOURCES/libvirt-conf-include-x86-microcode-version-in-virsh-capabiltiies.patch
@@ -0,0 +1,133 @@
+From 4f1684dd855d48517e04507edadba2fd454e4ada Mon Sep 17 00:00:00 2001
+Message-Id: <4f1684dd855d48517e04507edadba2fd454e4ada@dist-git>
+From: Paolo Bonzini
+Date: Tue, 12 Dec 2017 16:23:40 +0100
+Subject: [PATCH] conf: include x86 microcode version in virsh capabiltiies
+
+A microcode update can cause the CPUID bits to change; an example
+from the past was the update that disabled TSX on several Haswell and
+Broadwell machines.
+
+In order to track the x86 microcode version in the QEMU capabilities,
+we have to fetch it and store it in the host CPU. This also makes the
+version visible in "virsh capabilities", which is a nice side effect.
+
+CVE-2017-5715
+
+Signed-off-by: Paolo Bonzini
+Signed-off-by: Jiri Denemark
+---
+ src/conf/cpu_conf.c | 14 ++++++++++++++
+ src/conf/cpu_conf.h | 1 +
+ src/cpu/cpu_x86.c | 9 +++++++++
+ 3 files changed, 24 insertions(+)
+
+diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
+index 669935acf8..7e00299c66 100644
+--- a/src/conf/cpu_conf.c
++++ b/src/conf/cpu_conf.c
+@@ -130,6 +130,7 @@ virCPUDefCopyModelFilter(virCPUDefPtr dst,
+ VIR_STRDUP(dst->vendor_id, src->vendor_id) < 0 ||
+ VIR_ALLOC_N(dst->features, src->nfeatures) < 0)
+ return -1;
++ dst->microcodeVersion = src->microcodeVersion;
+ dst->nfeatures_max = src->nfeatures;
+ dst->nfeatures = 0;
+
+@@ -181,6 +182,7 @@ virCPUDefStealModel(virCPUDefPtr dst,
+
+ VIR_STEAL_PTR(dst->model, src->model);
+ VIR_STEAL_PTR(dst->features, src->features);
++ dst->microcodeVersion = src->microcodeVersion;
+ dst->nfeatures_max = src->nfeatures_max;
+ src->nfeatures_max = 0;
+ dst->nfeatures = src->nfeatures;
+@@ -382,6 +384,14 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
+ goto cleanup;
+ }
+ VIR_FREE(arch);
++
++ if (virXPathBoolean("boolean(./microcode[1]/@version)", ctxt) > 0 &&
++ virXPathUInt("string(./microcode[1]/@version)", ctxt,
++ &def->microcodeVersion) < 0) {
++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
++ _("invalid microcode version"));
++ goto cleanup;
++ }
+ }
+
+ if (!(def->model = virXPathString("string(./model[1])", ctxt)) &&
+@@ -720,6 +730,10 @@ virCPUDefFormatBuf(virBufferPtr buf,
+ if (formatModel && def->vendor)
+ virBufferEscapeString(buf, "%s \n", def->vendor);
+
++ if (def->type == VIR_CPU_TYPE_HOST && def->microcodeVersion)
++ virBufferAsprintf(buf, " \n",
++ def->microcodeVersion);
++
+ if (def->sockets && def->cores && def->threads) {
+ virBufferAddLit(buf, "sockets);
+diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
+index d1983f5d4f..9f2e7ee264 100644
+--- a/src/conf/cpu_conf.h
++++ b/src/conf/cpu_conf.h
+@@ -133,6 +133,7 @@ struct _virCPUDef {
+ char *vendor_id; /* vendor id returned by CPUID in the guest */
+ int fallback; /* enum virCPUFallback */
+ char *vendor;
++ unsigned int microcodeVersion;
+ unsigned int sockets;
+ unsigned int cores;
+ unsigned int threads;
+diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
+index 693e571a3d..ad35532fc1 100644
+--- a/src/cpu/cpu_x86.c
++++ b/src/cpu/cpu_x86.c
+@@ -33,6 +33,7 @@
+ #include "virbuffer.h"
+ #include "virendian.h"
+ #include "virstring.h"
++#include "virhostcpu.h"
+
+ #define VIR_FROM_THIS VIR_FROM_CPU
+
+@@ -153,6 +154,8 @@ struct _virCPUx86Map {
+ };
+
+ static virCPUx86MapPtr cpuMap;
++static unsigned int microcodeVersion;
++
+ int virCPUx86DriverOnceInit(void);
+ VIR_ONCE_GLOBAL_INIT(virCPUx86Driver);
+
+@@ -1409,6 +1412,8 @@ virCPUx86DriverOnceInit(void)
+ if (!(cpuMap = virCPUx86LoadMap()))
+ return -1;
+
++ microcodeVersion = virHostCPUGetMicrocodeVersion();
++
+ return 0;
+ }
+
+@@ -2424,6 +2429,9 @@ virCPUx86GetHost(virCPUDefPtr cpu,
+ virCPUDataPtr cpuData = NULL;
+ int ret = -1;
+
++ if (virCPUx86DriverInitialize() < 0)
++ goto cleanup;
++
+ if (!(cpuData = virCPUDataNew(archs[0])))
+ goto cleanup;
+
+@@ -2432,6 +2440,7 @@ virCPUx86GetHost(virCPUDefPtr cpu,
+ goto cleanup;
+
+ ret = x86DecodeCPUData(cpu, cpuData, models);
++ cpu->microcodeVersion = microcodeVersion;
+
+ cleanup:
+ virCPUx86DataFree(cpuData);
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-introduce-virDomainControllerDriverFormat.patch b/SOURCES/libvirt-conf-introduce-virDomainControllerDriverFormat.patch
deleted file mode 100644
index 5f37f4f..0000000
--- a/SOURCES/libvirt-conf-introduce-virDomainControllerDriverFormat.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 8874ecd393f7098376d9c46c34f43d47a697f932 Mon Sep 17 00:00:00 2001
-Message-Id: <8874ecd393f7098376d9c46c34f43d47a697f932@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:55 +0200
-Subject: [PATCH] conf: introduce virDomainControllerDriverFormat
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Split out formatting the subelement of
-to make adding new options easier.
-
-(cherry picked from commit fe262186dccfa5c5cbcfe5ab7eb95195cf3b10f5)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 55 +++++++++++++++++++++++++++++---------------------
- 1 file changed, 32 insertions(+), 23 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index e004559f9f..275145b1ec 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -21323,6 +21323,37 @@ virDomainDiskDefFormat(virBufferPtr buf,
- #undef FORMAT_IOTUNE
-
-
-+static void
-+virDomainControllerDriverFormat(virBufferPtr buf,
-+ virDomainControllerDefPtr def)
-+{
-+ virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-+
-+ if (def->queues)
-+ virBufferAsprintf(&driverBuf, " queues='%u'", def->queues);
-+
-+ if (def->cmd_per_lun)
-+ virBufferAsprintf(&driverBuf, " cmd_per_lun='%u'", def->cmd_per_lun);
-+
-+ if (def->max_sectors)
-+ virBufferAsprintf(&driverBuf, " max_sectors='%u'", def->max_sectors);
-+
-+ if (def->ioeventfd) {
-+ virBufferAsprintf(&driverBuf, " ioeventfd='%s'",
-+ virTristateSwitchTypeToString(def->ioeventfd));
-+ }
-+
-+ if (def->iothread)
-+ virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
-+
-+ if (virBufferUse(&driverBuf)) {
-+ virBufferAddLit(buf, " \n");
-+ }
-+}
-+
-+
- static int
- virDomainControllerDefFormat(virBufferPtr buf,
- virDomainControllerDefPtr def,
-@@ -21332,7 +21363,6 @@ virDomainControllerDefFormat(virBufferPtr buf,
- const char *model = NULL;
- const char *modelName = NULL;
- bool pcihole64 = false, pciModel = false, pciTarget = false;
-- virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
-
- if (!type) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
-@@ -21437,28 +21467,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
- }
- }
-
-- if (def->queues)
-- virBufferAsprintf(&driverBuf, " queues='%u'", def->queues);
--
-- if (def->cmd_per_lun)
-- virBufferAsprintf(&driverBuf, " cmd_per_lun='%u'", def->cmd_per_lun);
--
-- if (def->max_sectors)
-- virBufferAsprintf(&driverBuf, " max_sectors='%u'", def->max_sectors);
--
-- if (def->ioeventfd) {
-- virBufferAsprintf(&driverBuf, " ioeventfd='%s'",
-- virTristateSwitchTypeToString(def->ioeventfd));
-- }
--
-- if (def->iothread)
-- virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
--
-- if (virBufferUse(&driverBuf)) {
-- virBufferAddLit(buf, " \n");
-- }
-+ virDomainControllerDriverFormat(buf, def);
-
- if (virDomainDeviceInfoNeedsFormat(&def->info, flags) &&
- virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
---
-2.13.1
-
diff --git a/SOURCES/libvirt-conf-move-generated-member-from-virMacAddr-to-virDomainNetDef.patch b/SOURCES/libvirt-conf-move-generated-member-from-virMacAddr-to-virDomainNetDef.patch
new file mode 100644
index 0000000..32863e9
--- /dev/null
+++ b/SOURCES/libvirt-conf-move-generated-member-from-virMacAddr-to-virDomainNetDef.patch
@@ -0,0 +1,162 @@
+From 5b225fe7ac882c8696b9759251c519c785f5407c Mon Sep 17 00:00:00 2001
+Message-Id: <5b225fe7ac882c8696b9759251c519c785f5407c@dist-git>
+From: Laine Stump
+Date: Tue, 6 Mar 2018 16:19:31 -0500
+Subject: [PATCH] conf: move 'generated' member from virMacAddr to
+ virDomainNetDef
+
+Commit 7e62c4cd26d (first appearing in libvirt-3.9.0 as a resolution
+to rhbz #1343919) added a "generated" attribute to virMacAddr that was
+set whenever a mac address was auto-generated by libvirt. This
+knowledge was used in a single place - when trying to match a NetDef
+from the Domain to Delete with user-provided XML. Since the XML parser
+always auto-generates a MAC address for NetDefs when none is provided,
+it was previously impossible to make a search where the MAC address
+isn't significant, but the addition of the "generated" attribute made
+it possible for the search function to ignore auto-generated MACs.
+
+This implementation had a problem though - it was adding a field to a
+"low level" struct - virMacAddr - which is used in other places with
+the assumption that it contains exactly a 6 byte MAC address and
+nothing else. In particular, virNWFilterSnoopEthHdr uses virMacAddr as
+part of the definition of an ethernet packet header, whose layout must
+of course match an actual ethernet packet. Adding the extra bools into
+virNWFilterSnoopEthHdr caused the nwfilter driver's "IP discovery via
+DHCP packet snooping" functionality to mysteriously stop working.
+
+In order to fix that behavior, and prevent potential future similar
+odd behavior, this patch moves the "generated" member out of
+virMacAddr (so that it is again really is just a MAC address) into
+virDomainNetDef, and sets it only when virDomainNetGenerateMAC() is
+called from virDomainNetDefParseXML() (which is the only time we care
+about it).
+
+Resolves: https://bugzilla.redhat.com/1529338
+
+(It should also be applied to any maintenance branch that applies
+commit 7e62c4cd26 and friends to resolve
+https://bugzilla.redhat.com/1343919)
+
+Signed-off-by: Laine Stump
+(cherry picked from commit e62cb4a9b78c7f4499a206635fb4f06e6ac627e5)
+---
+ src/conf/domain_conf.c | 3 ++-
+ src/conf/domain_conf.h | 1 +
+ src/util/virmacaddr.c | 5 -----
+ src/util/virmacaddr.h | 9 +++++++--
+ tests/bhyveargv2xmlmock.c | 1 -
+ 5 files changed, 10 insertions(+), 9 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 0af3dd5ab6..1a3db4a7be 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -10989,6 +10989,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
+ }
+ } else {
+ virDomainNetGenerateMAC(xmlopt, &def->mac);
++ def->mac_generated = true;
+ }
+
+ if (devaddr) {
+@@ -16205,7 +16206,7 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
+ size_t i;
+ int matchidx = -1;
+ char mac[VIR_MAC_STRING_BUFLEN];
+- bool MACAddrSpecified = !net->mac.generated;
++ bool MACAddrSpecified = !net->mac_generated;
+ bool PCIAddrSpecified = virDomainDeviceAddressIsValid(&net->info,
+ VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI);
+
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index ed7b587bed..3817887322 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -962,6 +962,7 @@ struct _virDomainActualNetDef {
+ struct _virDomainNetDef {
+ virDomainNetType type;
+ virMacAddr mac;
++ bool mac_generated; /* true if mac was *just now* auto-generated by libvirt */
+ char *model;
+ union {
+ struct {
+diff --git a/src/util/virmacaddr.c b/src/util/virmacaddr.c
+index 409fdc34d5..7afe032b9c 100644
+--- a/src/util/virmacaddr.c
++++ b/src/util/virmacaddr.c
+@@ -107,7 +107,6 @@ void
+ virMacAddrSet(virMacAddrPtr dst, const virMacAddr *src)
+ {
+ memcpy(dst, src, sizeof(*src));
+- dst->generated = false;
+ }
+
+ /**
+@@ -121,7 +120,6 @@ void
+ virMacAddrSetRaw(virMacAddrPtr dst, const unsigned char src[VIR_MAC_BUFLEN])
+ {
+ memcpy(dst->addr, src, VIR_MAC_BUFLEN);
+- dst->generated = false;
+ }
+
+ /**
+@@ -151,7 +149,6 @@ virMacAddrParse(const char* str, virMacAddrPtr addr)
+ {
+ size_t i;
+
+- addr->generated = false;
+ errno = 0;
+ for (i = 0; i < VIR_MAC_BUFLEN; i++) {
+ char *end_ptr;
+@@ -220,7 +217,6 @@ virMacAddrParseHex(const char *str, virMacAddrPtr addr)
+ str[VIR_MAC_HEXLEN])
+ return -1;
+
+- addr->generated = false;
+ for (i = 0; i < VIR_MAC_BUFLEN; i++)
+ addr->addr[i] = (virHexToBin(str[2 * i]) << 4 |
+ virHexToBin(str[2 * i + 1]));
+@@ -236,7 +232,6 @@ void virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN],
+ addr->addr[3] = virRandomBits(8);
+ addr->addr[4] = virRandomBits(8);
+ addr->addr[5] = virRandomBits(8);
+- addr->generated = true;
+ }
+
+ /* The low order bit of the first byte is the "multicast" bit. */
+diff --git a/src/util/virmacaddr.h b/src/util/virmacaddr.h
+index ef4285d639..d0dd4a45c6 100644
+--- a/src/util/virmacaddr.h
++++ b/src/util/virmacaddr.h
+@@ -36,9 +36,14 @@ typedef virMacAddr *virMacAddrPtr;
+
+ struct _virMacAddr {
+ unsigned char addr[VIR_MAC_BUFLEN];
+- bool generated; /* True if MAC address was autogenerated,
+- false otherwise. */
+ };
++/* This struct is used as a part of a larger struct that is
++ * overlaid on an ethernet packet captured with libpcap, so it
++ * must not have any extra members added - it must remain exactly
++ * 6 bytes in length.
++ */
++verify(sizeof(struct _virMacAddr) == 6);
++
+
+ int virMacAddrCompare(const char *mac1, const char *mac2);
+ int virMacAddrCmp(const virMacAddr *mac1, const virMacAddr *mac2);
+diff --git a/tests/bhyveargv2xmlmock.c b/tests/bhyveargv2xmlmock.c
+index dd25f4e13a..1f08bebb7b 100644
+--- a/tests/bhyveargv2xmlmock.c
++++ b/tests/bhyveargv2xmlmock.c
+@@ -16,7 +16,6 @@ virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN],
+ addr->addr[3] = 0;
+ addr->addr[4] = 0;
+ addr->addr[5] = 0;
+- addr->generated = true;
+ }
+
+ int
+--
+2.16.2
+
diff --git a/SOURCES/libvirt-conf-nodedev-Split-virNodeDeviceDefFormat-into-more-functions.patch b/SOURCES/libvirt-conf-nodedev-Split-virNodeDeviceDefFormat-into-more-functions.patch
deleted file mode 100644
index 7cd3720..0000000
--- a/SOURCES/libvirt-conf-nodedev-Split-virNodeDeviceDefFormat-into-more-functions.patch
+++ /dev/null
@@ -1,644 +0,0 @@
-From f636c368f181c9f18ee135e8902490faf30186f9 Mon Sep 17 00:00:00 2001
-Message-Id:
-From: Erik Skultety
-Date: Thu, 18 May 2017 14:02:48 +0200
-Subject: [PATCH] conf: nodedev: Split virNodeDeviceDefFormat into more
- functions
-
-Make the code look cleaner by moving the capability specific bits into
-separate functions.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1452072
-
-Signed-off-by: Erik Skultety
-(cherry picked from commit bfaaaf108da087c38cc0f2890ed96730a3734ba8)
-Signed-off-by: Erik Skultety
-Signed-off-by: Jiri Denemark
----
- src/conf/node_device_conf.c | 578 ++++++++++++++++++++++++--------------------
- 1 file changed, 322 insertions(+), 256 deletions(-)
-
-diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
-index cc3fad8b9..02215f32d 100644
---- a/src/conf/node_device_conf.c
-+++ b/src/conf/node_device_conf.c
-@@ -155,6 +155,320 @@ virPCIEDeviceInfoFormat(virBufferPtr buf,
- }
-
-
-+static void
-+virNodeDeviceCapSystemDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ char uuidstr[VIR_UUID_STRING_BUFLEN];
-+
-+ if (data->system.product_name)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.product_name);
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+ if (data->system.hardware.vendor_name)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.hardware.vendor_name);
-+ if (data->system.hardware.version)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.hardware.version);
-+ if (data->system.hardware.serial)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.hardware.serial);
-+ virUUIDFormat(data->system.hardware.uuid, uuidstr);
-+ virBufferAsprintf(buf, "%s \n", uuidstr);
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+ if (data->system.firmware.vendor_name)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.firmware.vendor_name);
-+ if (data->system.firmware.version)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.firmware.version);
-+ if (data->system.firmware.release_date)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->system.firmware.release_date);
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+}
-+
-+
-+static void
-+virNodeDeviceCapPCIDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ size_t i;
-+
-+ virBufferAsprintf(buf, "%d \n",
-+ data->pci_dev.domain);
-+ virBufferAsprintf(buf, "%d \n", data->pci_dev.bus);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->pci_dev.slot);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->pci_dev.function);
-+ virBufferAsprintf(buf, "pci_dev.product);
-+ if (data->pci_dev.product_name)
-+ virBufferEscapeString(buf, ">%s \n",
-+ data->pci_dev.product_name);
-+ else
-+ virBufferAddLit(buf, " />\n");
-+ virBufferAsprintf(buf, "pci_dev.vendor);
-+ if (data->pci_dev.vendor_name)
-+ virBufferEscapeString(buf, ">%s \n",
-+ data->pci_dev.vendor_name);
-+ else
-+ virBufferAddLit(buf, " />\n");
-+ if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION) {
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+ virBufferAsprintf(buf,
-+ " \n",
-+ data->pci_dev.physical_function->domain,
-+ data->pci_dev.physical_function->bus,
-+ data->pci_dev.physical_function->slot,
-+ data->pci_dev.physical_function->function);
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+ }
-+ if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION) {
-+ virBufferAddLit(buf, "pci_dev.max_virtual_functions)
-+ virBufferAsprintf(buf, " maxCount='%u'",
-+ data->pci_dev.max_virtual_functions);
-+ if (data->pci_dev.num_virtual_functions == 0) {
-+ virBufferAddLit(buf, "/>\n");
-+ } else {
-+ virBufferAddLit(buf, ">\n");
-+ virBufferAdjustIndent(buf, 2);
-+ for (i = 0; i < data->pci_dev.num_virtual_functions; i++) {
-+ virBufferAsprintf(buf,
-+ " \n",
-+ data->pci_dev.virtual_functions[i]->domain,
-+ data->pci_dev.virtual_functions[i]->bus,
-+ data->pci_dev.virtual_functions[i]->slot,
-+ data->pci_dev.virtual_functions[i]->function);
-+ }
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+ }
-+ }
-+ if (data->pci_dev.hdrType) {
-+ virBufferAsprintf(buf, " \n",
-+ virPCIHeaderTypeToString(data->pci_dev.hdrType));
-+ }
-+ if (data->pci_dev.nIommuGroupDevices) {
-+ virBufferAsprintf(buf, "\n",
-+ data->pci_dev.iommuGroupNumber);
-+ virBufferAdjustIndent(buf, 2);
-+ for (i = 0; i < data->pci_dev.nIommuGroupDevices; i++) {
-+ virBufferAsprintf(buf,
-+ " \n",
-+ data->pci_dev.iommuGroupDevices[i]->domain,
-+ data->pci_dev.iommuGroupDevices[i]->bus,
-+ data->pci_dev.iommuGroupDevices[i]->slot,
-+ data->pci_dev.iommuGroupDevices[i]->function);
-+ }
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+ }
-+ if (data->pci_dev.numa_node >= 0)
-+ virBufferAsprintf(buf, " \n",
-+ data->pci_dev.numa_node);
-+
-+ if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCIE)
-+ virPCIEDeviceInfoFormat(buf, data->pci_dev.pci_express);
-+}
-+
-+
-+static void
-+virNodeDeviceCapUSBDevDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ virBufferAsprintf(buf, "%d \n", data->usb_dev.bus);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->usb_dev.device);
-+ virBufferAsprintf(buf, "usb_dev.product);
-+ if (data->usb_dev.product_name)
-+ virBufferEscapeString(buf, ">%s \n",
-+ data->usb_dev.product_name);
-+ else
-+ virBufferAddLit(buf, " />\n");
-+ virBufferAsprintf(buf, "usb_dev.vendor);
-+ if (data->usb_dev.vendor_name)
-+ virBufferEscapeString(buf, ">%s \n",
-+ data->usb_dev.vendor_name);
-+ else
-+ virBufferAddLit(buf, " />\n");
-+}
-+
-+
-+static void
-+virNodeDeviceCapUSBInterfaceDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ virBufferAsprintf(buf, "%d \n",
-+ data->usb_if.number);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->usb_if._class);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->usb_if.subclass);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->usb_if.protocol);
-+ if (data->usb_if.description)
-+ virBufferEscapeString(buf,
-+ "%s \n",
-+ data->usb_if.description);
-+}
-+
-+
-+static void
-+virNodeDeviceCapNetDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ size_t i;
-+
-+ virBufferEscapeString(buf, "%s \n",
-+ data->net.ifname);
-+ if (data->net.address)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->net.address);
-+ virInterfaceLinkFormat(buf, &data->net.lnk);
-+ if (data->net.features) {
-+ for (i = 0; i < VIR_NET_DEV_FEAT_LAST; i++) {
-+ if (virBitmapIsBitSet(data->net.features, i)) {
-+ virBufferAsprintf(buf, " \n",
-+ virNetDevFeatureTypeToString(i));
-+ }
-+ }
-+ }
-+ if (data->net.subtype != VIR_NODE_DEV_CAP_NET_LAST) {
-+ const char *subtyp =
-+ virNodeDevNetCapTypeToString(data->net.subtype);
-+ virBufferEscapeString(buf, " \n",
-+ subtyp);
-+ }
-+}
-+
-+
-+static void
-+virNodeDeviceCapSCSIHostDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ virBufferAsprintf(buf, "%d \n",
-+ data->scsi_host.host);
-+ if (data->scsi_host.unique_id != -1)
-+ virBufferAsprintf(buf, "%d \n",
-+ data->scsi_host.unique_id);
-+ if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+ virBufferEscapeString(buf, "%s \n",
-+ data->scsi_host.wwnn);
-+ virBufferEscapeString(buf, "%s \n",
-+ data->scsi_host.wwpn);
-+ virBufferEscapeString(buf, "%s \n",
-+ data->scsi_host.fabric_wwn);
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+ }
-+ if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) {
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->scsi_host.max_vports);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->scsi_host.vports);
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+ }
-+}
-+
-+
-+static void
-+virNodeDeviceCapSCSIDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ virBufferAsprintf(buf, "%d \n", data->scsi.host);
-+ virBufferAsprintf(buf, "%d \n", data->scsi.bus);
-+ virBufferAsprintf(buf, "%d \n",
-+ data->scsi.target);
-+ virBufferAsprintf(buf, "%d \n", data->scsi.lun);
-+ if (data->scsi.type)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->scsi.type);
-+}
-+
-+
-+static void
-+virNodeDeviceCapStorageDefFormat(virBufferPtr buf,
-+ const virNodeDevCapData *data)
-+{
-+ virBufferEscapeString(buf, "%s \n",
-+ data->storage.block);
-+ if (data->storage.bus)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->storage.bus);
-+ if (data->storage.drive_type)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->storage.drive_type);
-+ if (data->storage.model)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->storage.model);
-+ if (data->storage.vendor)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->storage.vendor);
-+ if (data->storage.serial)
-+ virBufferEscapeString(buf, "%s \n",
-+ data->storage.serial);
-+ if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE) {
-+ int avl = data->storage.flags &
-+ VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE;
-+ virBufferAddLit(buf, "\n");
-+ virBufferAdjustIndent(buf, 2);
-+ virBufferAsprintf(buf, "%d"
-+ " \n", avl ? 1 : 0);
-+ virBufferAsprintf(buf, "%llu \n",
-+ data->storage.removable_media_size);
-+ if (data->storage.media_label)
-+ virBufferEscapeString(buf,
-+ "%s \n",
-+ data->storage.media_label);
-+ if (data->storage.logical_block_size > 0)
-+ virBufferAsprintf(buf, "%llu"
-+ " \n",
-+ data->storage.logical_block_size);
-+ if (data->storage.num_blocks > 0)
-+ virBufferAsprintf(buf,
-+ "%llu \n",
-+ data->storage.num_blocks);
-+ virBufferAdjustIndent(buf, -2);
-+ virBufferAddLit(buf, " \n");
-+ } else {
-+ virBufferAsprintf(buf, "%llu \n",
-+ data->storage.size);
-+ if (data->storage.logical_block_size > 0)
-+ virBufferAsprintf(buf, "%llu"
-+ " \n",
-+ data->storage.logical_block_size);
-+ if (data->storage.num_blocks > 0)
-+ virBufferAsprintf(buf, "%llu \n",
-+ data->storage.num_blocks);
-+ }
-+ if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE)
-+ virBufferAddLit(buf, " \n");
-+}
-+
-+
- char *
- virNodeDeviceDefFormat(const virNodeDeviceDef *def)
- {
-@@ -185,7 +499,6 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def)
- }
-
- for (caps = def->caps; caps; caps = caps->next) {
-- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virNodeDevCapDataPtr data = &caps->data;
-
- virBufferAsprintf(&buf, "\n",
-@@ -193,279 +506,32 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def)
- virBufferAdjustIndent(&buf, 2);
- switch (caps->data.type) {
- case VIR_NODE_DEV_CAP_SYSTEM:
-- if (data->system.product_name)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.product_name);
-- virBufferAddLit(&buf, "\n");
-- virBufferAdjustIndent(&buf, 2);
-- if (data->system.hardware.vendor_name)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.hardware.vendor_name);
-- if (data->system.hardware.version)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.hardware.version);
-- if (data->system.hardware.serial)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.hardware.serial);
-- virUUIDFormat(data->system.hardware.uuid, uuidstr);
-- virBufferAsprintf(&buf, "%s \n", uuidstr);
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
--
-- virBufferAddLit(&buf, "\n");
-- virBufferAdjustIndent(&buf, 2);
-- if (data->system.firmware.vendor_name)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.firmware.vendor_name);
-- if (data->system.firmware.version)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.firmware.version);
-- if (data->system.firmware.release_date)
-- virBufferEscapeString(&buf, "%s \n",
-- data->system.firmware.release_date);
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-+ virNodeDeviceCapSystemDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_PCI_DEV:
-- virBufferAsprintf(&buf, "%d \n",
-- data->pci_dev.domain);
-- virBufferAsprintf(&buf, "%d \n", data->pci_dev.bus);
-- virBufferAsprintf(&buf, "%d \n",
-- data->pci_dev.slot);
-- virBufferAsprintf(&buf, "%d \n",
-- data->pci_dev.function);
-- virBufferAsprintf(&buf, "pci_dev.product);
-- if (data->pci_dev.product_name)
-- virBufferEscapeString(&buf, ">%s \n",
-- data->pci_dev.product_name);
-- else
-- virBufferAddLit(&buf, " />\n");
-- virBufferAsprintf(&buf, "pci_dev.vendor);
-- if (data->pci_dev.vendor_name)
-- virBufferEscapeString(&buf, ">%s \n",
-- data->pci_dev.vendor_name);
-- else
-- virBufferAddLit(&buf, " />\n");
-- if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION) {
-- virBufferAddLit(&buf, "\n");
-- virBufferAdjustIndent(&buf, 2);
-- virBufferAsprintf(&buf,
-- " \n",
-- data->pci_dev.physical_function->domain,
-- data->pci_dev.physical_function->bus,
-- data->pci_dev.physical_function->slot,
-- data->pci_dev.physical_function->function);
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-- }
-- if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION) {
-- virBufferAddLit(&buf, "pci_dev.max_virtual_functions)
-- virBufferAsprintf(&buf, " maxCount='%u'",
-- data->pci_dev.max_virtual_functions);
-- if (data->pci_dev.num_virtual_functions == 0) {
-- virBufferAddLit(&buf, "/>\n");
-- } else {
-- virBufferAddLit(&buf, ">\n");
-- virBufferAdjustIndent(&buf, 2);
-- for (i = 0; i < data->pci_dev.num_virtual_functions; i++) {
-- virBufferAsprintf(&buf,
-- " \n",
-- data->pci_dev.virtual_functions[i]->domain,
-- data->pci_dev.virtual_functions[i]->bus,
-- data->pci_dev.virtual_functions[i]->slot,
-- data->pci_dev.virtual_functions[i]->function);
-- }
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-- }
-- }
-- if (data->pci_dev.hdrType) {
-- virBufferAsprintf(&buf, " \n",
-- virPCIHeaderTypeToString(data->pci_dev.hdrType));
-- }
-- if (data->pci_dev.nIommuGroupDevices) {
-- virBufferAsprintf(&buf, "\n",
-- data->pci_dev.iommuGroupNumber);
-- virBufferAdjustIndent(&buf, 2);
-- for (i = 0; i < data->pci_dev.nIommuGroupDevices; i++) {
-- virBufferAsprintf(&buf,
-- " \n",
-- data->pci_dev.iommuGroupDevices[i]->domain,
-- data->pci_dev.iommuGroupDevices[i]->bus,
-- data->pci_dev.iommuGroupDevices[i]->slot,
-- data->pci_dev.iommuGroupDevices[i]->function);
-- }
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-- }
-- if (data->pci_dev.numa_node >= 0)
-- virBufferAsprintf(&buf, " \n",
-- data->pci_dev.numa_node);
--
-- if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCIE)
-- virPCIEDeviceInfoFormat(&buf, data->pci_dev.pci_express);
-+ virNodeDeviceCapPCIDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_USB_DEV:
-- virBufferAsprintf(&buf, "%d \n", data->usb_dev.bus);
-- virBufferAsprintf(&buf, "%d \n",
-- data->usb_dev.device);
-- virBufferAsprintf(&buf, "usb_dev.product);
-- if (data->usb_dev.product_name)
-- virBufferEscapeString(&buf, ">%s \n",
-- data->usb_dev.product_name);
-- else
-- virBufferAddLit(&buf, " />\n");
-- virBufferAsprintf(&buf, "usb_dev.vendor);
-- if (data->usb_dev.vendor_name)
-- virBufferEscapeString(&buf, ">%s \n",
-- data->usb_dev.vendor_name);
-- else
-- virBufferAddLit(&buf, " />\n");
-+ virNodeDeviceCapUSBDevDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_USB_INTERFACE:
-- virBufferAsprintf(&buf, "%d \n",
-- data->usb_if.number);
-- virBufferAsprintf(&buf, "%d \n",
-- data->usb_if._class);
-- virBufferAsprintf(&buf, "%d \n",
-- data->usb_if.subclass);
-- virBufferAsprintf(&buf, "%d \n",
-- data->usb_if.protocol);
-- if (data->usb_if.description)
-- virBufferEscapeString(&buf,
-- "%s \n",
-- data->usb_if.description);
-+ virNodeDeviceCapUSBInterfaceDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_NET:
-- virBufferEscapeString(&buf, "%s \n",
-- data->net.ifname);
-- if (data->net.address)
-- virBufferEscapeString(&buf, "%s \n",
-- data->net.address);
-- virInterfaceLinkFormat(&buf, &data->net.lnk);
-- if (data->net.features) {
-- for (i = 0; i < VIR_NET_DEV_FEAT_LAST; i++) {
-- if (virBitmapIsBitSet(data->net.features, i)) {
-- virBufferAsprintf(&buf, " \n",
-- virNetDevFeatureTypeToString(i));
-- }
-- }
-- }
-- if (data->net.subtype != VIR_NODE_DEV_CAP_NET_LAST) {
-- const char *subtyp =
-- virNodeDevNetCapTypeToString(data->net.subtype);
-- virBufferEscapeString(&buf, " \n",
-- subtyp);
-- }
-+ virNodeDeviceCapNetDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_SCSI_HOST:
-- virBufferAsprintf(&buf, "%d \n",
-- data->scsi_host.host);
-- if (data->scsi_host.unique_id != -1)
-- virBufferAsprintf(&buf, "%d \n",
-- data->scsi_host.unique_id);
-- if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
-- virBufferAddLit(&buf, "\n");
-- virBufferAdjustIndent(&buf, 2);
-- virBufferEscapeString(&buf, "%s \n",
-- data->scsi_host.wwnn);
-- virBufferEscapeString(&buf, "%s \n",
-- data->scsi_host.wwpn);
-- virBufferEscapeString(&buf, "%s \n",
-- data->scsi_host.fabric_wwn);
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-- }
-- if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) {
-- virBufferAddLit(&buf, "\n");
-- virBufferAdjustIndent(&buf, 2);
-- virBufferAsprintf(&buf, "%d \n",
-- data->scsi_host.max_vports);
-- virBufferAsprintf(&buf, "%d \n",
-- data->scsi_host.vports);
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-- }
--
-+ virNodeDeviceCapSCSIHostDefFormat(&buf, data);
- break;
--
- case VIR_NODE_DEV_CAP_SCSI_TARGET:
- virBufferEscapeString(&buf, "%s \n",
- data->scsi_target.name);
- break;
--
- case VIR_NODE_DEV_CAP_SCSI:
-- virBufferAsprintf(&buf, "%d \n", data->scsi.host);
-- virBufferAsprintf(&buf, "%d \n", data->scsi.bus);
-- virBufferAsprintf(&buf, "%d \n",
-- data->scsi.target);
-- virBufferAsprintf(&buf, "%d \n", data->scsi.lun);
-- if (data->scsi.type)
-- virBufferEscapeString(&buf, "%s \n",
-- data->scsi.type);
-+ virNodeDeviceCapSCSIDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_STORAGE:
-- virBufferEscapeString(&buf, "%s \n",
-- data->storage.block);
-- if (data->storage.bus)
-- virBufferEscapeString(&buf, "%s \n",
-- data->storage.bus);
-- if (data->storage.drive_type)
-- virBufferEscapeString(&buf, "%s \n",
-- data->storage.drive_type);
-- if (data->storage.model)
-- virBufferEscapeString(&buf, "%s \n",
-- data->storage.model);
-- if (data->storage.vendor)
-- virBufferEscapeString(&buf, "%s \n",
-- data->storage.vendor);
-- if (data->storage.serial)
-- virBufferEscapeString(&buf, "%s \n",
-- data->storage.serial);
-- if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE) {
-- int avl = data->storage.flags &
-- VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE;
-- virBufferAddLit(&buf, "\n");
-- virBufferAdjustIndent(&buf, 2);
-- virBufferAsprintf(&buf, "%d"
-- " \n", avl ? 1 : 0);
-- virBufferAsprintf(&buf, "%llu \n",
-- data->storage.removable_media_size);
-- if (data->storage.media_label)
-- virBufferEscapeString(&buf,
-- "%s \n",
-- data->storage.media_label);
-- if (data->storage.logical_block_size > 0)
-- virBufferAsprintf(&buf, "%llu"
-- " \n",
-- data->storage.logical_block_size);
-- if (data->storage.num_blocks > 0)
-- virBufferAsprintf(&buf,
-- "%llu \n",
-- data->storage.num_blocks);
-- virBufferAdjustIndent(&buf, -2);
-- virBufferAddLit(&buf, " \n");
-- } else {
-- virBufferAsprintf(&buf, "%llu \n",
-- data->storage.size);
-- if (data->storage.logical_block_size > 0)
-- virBufferAsprintf(&buf, "%llu"
-- " \n",
-- data->storage.logical_block_size);
-- if (data->storage.num_blocks > 0)
-- virBufferAsprintf(&buf, "%llu \n",
-- data->storage.num_blocks);
-- }
-- if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE)
-- virBufferAddLit(&buf, " \n");
-+ virNodeDeviceCapStorageDefFormat(&buf, data);
- break;
- case VIR_NODE_DEV_CAP_SCSI_GENERIC:
- virBufferEscapeString(&buf, "%s \n",
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-qemu-Use-type-aware-switches-where-possible.patch b/SOURCES/libvirt-conf-qemu-Use-type-aware-switches-where-possible.patch
new file mode 100644
index 0000000..0af72f8
--- /dev/null
+++ b/SOURCES/libvirt-conf-qemu-Use-type-aware-switches-where-possible.patch
@@ -0,0 +1,115 @@
+From 08c0c0562f8444859cc110e4fc2199d2c4254a53 Mon Sep 17 00:00:00 2001
+Message-Id: <08c0c0562f8444859cc110e4fc2199d2c4254a53@dist-git>
+From: Andrea Bolognani
+Date: Wed, 29 Nov 2017 16:22:54 +0100
+Subject: [PATCH] conf, qemu: Use type-aware switches where possible
+
+The compiler can warn us if we add a value to the
+virDomainChrSerialTargetType enumeration but forget to handle
+it properly in the code. Let's take advantage of that.
+
+This commit is best viewed with 'git diff -w'.
+
+Signed-off-by: Andrea Bolognani
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit 18dfc0014501c3811ee32669ea96583131dca9b3)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1449265
+https://bugzilla.redhat.com/show_bug.cgi?id=1511421
+https://bugzilla.redhat.com/show_bug.cgi?id=1512929
+https://bugzilla.redhat.com/show_bug.cgi?id=1512934
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 47 ++++++++++++++++++++++++++++++-----------------
+ src/qemu/qemu_command.c | 7 ++++++-
+ 2 files changed, 36 insertions(+), 18 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 530fae9d9d..4b5e7c214f 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -4046,26 +4046,39 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
+ def->consoles[0]->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ }
+ } else if (def->os.type == VIR_DOMAIN_OSTYPE_HVM && def->nserials > 0 &&
+- def->serials[0]->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
+- def->serials[0]->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA) {
+- /* Create a stub console to match the serial port.
+- * console[0] either does not exist
+- * or has a different type than SERIAL or NONE.
+- */
+- virDomainChrDefPtr chr;
+- if (!(chr = virDomainChrDefNew(NULL)))
+- return -1;
++ def->serials[0]->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) {
+
+- if (VIR_INSERT_ELEMENT(def->consoles,
+- 0,
+- def->nconsoles,
+- chr) < 0) {
+- virDomainChrDefFree(chr);
+- return -1;
++ switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) {
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: {
++
++ /* Create a stub console to match the serial port.
++ * console[0] either does not exist
++ * or has a different type than SERIAL or NONE.
++ */
++ virDomainChrDefPtr chr;
++ if (!(chr = virDomainChrDefNew(NULL)))
++ return -1;
++
++ if (VIR_INSERT_ELEMENT(def->consoles,
++ 0,
++ def->nconsoles,
++ chr) < 0) {
++ virDomainChrDefFree(chr);
++ return -1;
++ }
++
++ def->consoles[0]->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
++ def->consoles[0]->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
++
++ break;
+ }
+
+- def->consoles[0]->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
+- def->consoles[0]->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
++ /* Nothing to do */
++ break;
++ }
+ }
+
+ return 0;
+diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
+index 19a819a3aa..3d970ed9d1 100644
+--- a/src/qemu/qemu_command.c
++++ b/src/qemu/qemu_command.c
+@@ -10338,7 +10338,7 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
+ serial->info.alias);
+ }
+ } else {
+- switch (serial->targetType) {
++ switch ((virDomainChrSerialTargetType) serial->targetType) {
+ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_SERIAL)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+@@ -10377,6 +10377,11 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
+ goto error;
+ }
+ break;
++
++ case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
++ _("Invalid target type for serial device"));
++ goto error;
+ }
+
+ virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-conf-s-virDomainObjGetShortName-virDomainDefGetShortName.patch b/SOURCES/libvirt-conf-s-virDomainObjGetShortName-virDomainDefGetShortName.patch
new file mode 100644
index 0000000..7e74c84
--- /dev/null
+++ b/SOURCES/libvirt-conf-s-virDomainObjGetShortName-virDomainDefGetShortName.patch
@@ -0,0 +1,130 @@
+From db9daffe41e8804f9db0fb70678be99e02efc168 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Michal Privoznik
+Date: Thu, 9 Nov 2017 16:06:42 +0100
+Subject: [PATCH] conf: s/virDomainObjGetShortName/virDomainDefGetShortName/
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1461214
+
+This function works over domain definition and not domain object.
+Its name is thus misleading.
+
+Signed-off-by: Michal Privoznik
+Reviewed-by: John Ferlan
+(cherry picked from commit fe70fd0c106e7fbe4f7272e5c041324ea3633ce4)
+Signed-off-by: Michal Privoznik
+Signed-off-by: Jiri Denemark
+---
+ src/conf/domain_conf.c | 4 ++--
+ src/conf/domain_conf.h | 2 +-
+ src/libvirt_private.syms | 2 +-
+ src/qemu/qemu_conf.c | 2 +-
+ src/qemu/qemu_domain.c | 4 ++--
+ src/qemu/qemu_driver.c | 2 +-
+ 6 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 394afb0d80..27cfecffda 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -27871,14 +27871,14 @@ virDomainDefHasMemballoon(const virDomainDef *def)
+ #define VIR_DOMAIN_SHORT_NAME_MAX 20
+
+ /**
+- * virDomainObjGetShortName:
++ * virDomainDefGetShortName:
+ * @vm: Machine for which to get a name
+ * @unique: Make sure the name is unique (use id as well)
+ *
+ * Shorten domain name to avoid possible path length limitations.
+ */
+ char *
+-virDomainObjGetShortName(const virDomainDef *def)
++virDomainDefGetShortName(const virDomainDef *def)
+ {
+ wchar_t wshortname[VIR_DOMAIN_SHORT_NAME_MAX + 1] = {0};
+ size_t len = 0;
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 171f340785..388fa92dda 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -3366,7 +3366,7 @@ int virDomainDefGetVcpuPinInfoHelper(virDomainDefPtr def,
+
+ bool virDomainDefHasMemballoon(const virDomainDef *def) ATTRIBUTE_NONNULL(1);
+
+-char *virDomainObjGetShortName(const virDomainDef *def) ATTRIBUTE_NONNULL(1);
++char *virDomainDefGetShortName(const virDomainDef *def) ATTRIBUTE_NONNULL(1);
+
+ int
+ virDomainGetBlkioParametersAssignFromDef(virDomainDefPtr def,
+diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
+index 811d9053e6..6653f95722 100644
+--- a/src/libvirt_private.syms
++++ b/src/libvirt_private.syms
+@@ -262,6 +262,7 @@ virDomainDefGetMemoryInitial;
+ virDomainDefGetMemoryTotal;
+ virDomainDefGetOnlineVcpumap;
+ virDomainDefGetSecurityLabelDef;
++virDomainDefGetShortName;
+ virDomainDefGetVcpu;
+ virDomainDefGetVcpuPinInfoHelper;
+ virDomainDefGetVcpus;
+@@ -458,7 +459,6 @@ virDomainObjGetMetadata;
+ virDomainObjGetOneDef;
+ virDomainObjGetOneDefState;
+ virDomainObjGetPersistentDef;
+-virDomainObjGetShortName;
+ virDomainObjGetState;
+ virDomainObjNew;
+ virDomainObjParseNode;
+diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
+index 4e5b33b788..66f9761eea 100644
+--- a/src/qemu/qemu_conf.c
++++ b/src/qemu/qemu_conf.c
+@@ -1676,7 +1676,7 @@ qemuGetDomainHugepagePath(const virDomainDef *def,
+ virHugeTLBFSPtr hugepage)
+ {
+ char *base = qemuGetBaseHugepagePath(hugepage);
+- char *domPath = virDomainObjGetShortName(def);
++ char *domPath = virDomainDefGetShortName(def);
+ char *ret = NULL;
+
+ if (base && domPath)
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index 81bfef946e..27117d83ef 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -1706,7 +1706,7 @@ qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
+ {
+ virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+- char *domname = virDomainObjGetShortName(vm->def);
++ char *domname = virDomainDefGetShortName(vm->def);
+ int ret = -1;
+
+ if (!domname)
+@@ -8207,7 +8207,7 @@ qemuDomainGetPreservedMountPath(virQEMUDriverConfigPtr cfg,
+ char *path = NULL;
+ char *tmp;
+ const char *suffix = mountpoint + strlen(DEVPREFIX);
+- char *domname = virDomainObjGetShortName(vm->def);
++ char *domname = virDomainDefGetShortName(vm->def);
+ size_t off;
+
+ if (!domname)
+diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
+index 82c60e6ef1..5617c78997 100644
+--- a/src/qemu/qemu_driver.c
++++ b/src/qemu/qemu_driver.c
+@@ -4088,7 +4088,7 @@ getAutoDumpPath(virQEMUDriverPtr driver,
+ virDomainObjPtr vm)
+ {
+ char *dumpfile = NULL;
+- char *domname = virDomainObjGetShortName(vm->def);
++ char *domname = virDomainDefGetShortName(vm->def);
+ char timestr[100];
+ struct tm time_info;
+ time_t curtime = time(NULL);
+--
+2.15.0
+
diff --git a/SOURCES/libvirt-conf-split-out-virDomainIOMMUDefCheckABIStability.patch b/SOURCES/libvirt-conf-split-out-virDomainIOMMUDefCheckABIStability.patch
deleted file mode 100644
index 9d33757..0000000
--- a/SOURCES/libvirt-conf-split-out-virDomainIOMMUDefCheckABIStability.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 244b42c385fc611380bfb2532905a63ce4380254 Mon Sep 17 00:00:00 2001
-Message-Id: <244b42c385fc611380bfb2532905a63ce4380254@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Tue, 16 May 2017 10:44:58 +0200
-Subject: [PATCH] conf: split out virDomainIOMMUDefCheckABIStability
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-(cherry picked from commit 3a276c6524026b661ed7bee4539fc5387b963611)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1427005
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 24 +++++++++++++++++-------
- 1 file changed, 17 insertions(+), 7 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index e77b542f3..7bf480f2a 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -19810,6 +19810,22 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDefPtr src,
-
-
- static bool
-+virDomainIOMMUDefCheckABIStability(virDomainIOMMUDefPtr src,
-+ virDomainIOMMUDefPtr dst)
-+{
-+ if (src->model != dst->model) {
-+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("Target domain IOMMU device model '%s' "
-+ "does not match source '%s'"),
-+ virDomainIOMMUModelTypeToString(dst->model),
-+ virDomainIOMMUModelTypeToString(src->model));
-+ return false;
-+ }
-+ return true;
-+}
-+
-+
-+static bool
- virDomainDefVcpuCheckAbiStability(virDomainDefPtr src,
- virDomainDefPtr dst)
- {
-@@ -20275,14 +20291,8 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr src,
- }
-
- if (src->iommu &&
-- src->iommu->model != dst->iommu->model) {
-- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- _("Target domain IOMMU device model '%s' "
-- "does not match source '%s'"),
-- virDomainIOMMUModelTypeToString(dst->iommu->model),
-- virDomainIOMMUModelTypeToString(src->iommu->model));
-+ !virDomainIOMMUDefCheckABIStability(src->iommu, dst->iommu))
- goto error;
-- }
-
- /* Coverity is not very happy with this - all dead_error_condition */
- #if !STATIC_ANALYSIS
---
-2.13.0
-
diff --git a/SOURCES/libvirt-conf-use-a-leading-space-in-virDomainVirtioNetDriverFormat.patch b/SOURCES/libvirt-conf-use-a-leading-space-in-virDomainVirtioNetDriverFormat.patch
deleted file mode 100644
index fe28da8..0000000
--- a/SOURCES/libvirt-conf-use-a-leading-space-in-virDomainVirtioNetDriverFormat.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From 5238dd8211d06fc8c7003bb608e41bb2a4653dec Mon Sep 17 00:00:00 2001
-Message-Id: <5238dd8211d06fc8c7003bb608e41bb2a4653dec@dist-git>
-From: =?UTF-8?q?J=C3=A1n=20Tomko?=
-Date: Fri, 9 Jun 2017 12:48:59 +0200
-Subject: [PATCH] conf: use a leading space in virDomainVirtioNetDriverFormat
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Instead of formatting a space after every option.
-
-Reviewed-by: Pavel Hrdina
-(cherry picked from commit d1feb4773d41b928dc1079dfc19d17b5a0e5957b)
-Signed-off-by: Ján Tomko
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1283251
-Signed-off-by: Jiri Denemark
----
- src/conf/domain_conf.c | 18 ++++++++----------
- 1 file changed, 8 insertions(+), 10 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 701a6d2136..4652e1c72b 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -22053,29 +22053,27 @@ virDomainVirtioNetDriverFormat(char **outstr,
- {
- virBuffer buf = VIR_BUFFER_INITIALIZER;
- if (def->driver.virtio.name) {
-- virBufferAsprintf(&buf, "name='%s' ",
-+ virBufferAsprintf(&buf, " name='%s'",
- virDomainNetBackendTypeToString(def->driver.virtio.name));
- }
- if (def->driver.virtio.txmode) {
-- virBufferAsprintf(&buf, "txmode='%s' ",
-+ virBufferAsprintf(&buf, " txmode='%s'",
- virDomainNetVirtioTxModeTypeToString(def->driver.virtio.txmode));
- }
- if (def->driver.virtio.ioeventfd) {
-- virBufferAsprintf(&buf, "ioeventfd='%s' ",
-+ virBufferAsprintf(&buf, " ioeventfd='%s'",
- virTristateSwitchTypeToString(def->driver.virtio.ioeventfd));
- }
- if (def->driver.virtio.event_idx) {
-- virBufferAsprintf(&buf, "event_idx='%s' ",
-+ virBufferAsprintf(&buf, " event_idx='%s'",
- virTristateSwitchTypeToString(def->driver.virtio.event_idx));
- }
- if (def->driver.virtio.queues)
-- virBufferAsprintf(&buf, "queues='%u' ", def->driver.virtio.queues);
-+ virBufferAsprintf(&buf, " queues='%u'", def->driver.virtio.queues);
- if (def->driver.virtio.rx_queue_size)
-- virBufferAsprintf(&buf, "rx_queue_size='%u' ",
-+ virBufferAsprintf(&buf, " rx_queue_size='%u'",
- def->driver.virtio.rx_queue_size);
-
-- virBufferTrim(&buf, " ", -1);
--
- if (virBufferCheckError(&buf) < 0)
- return -1;
-
-@@ -22323,10 +22321,10 @@ virDomainNetDefFormat(virBufferPtr buf,
-
- if (!gueststr && !hoststr) {
- if (str)
-- virBufferAsprintf(buf, " \n", str);
-+ virBufferAsprintf(buf, " \n", str);
- } else {
- if (str)
-- virBufferAsprintf(buf, "\n", str);
-+ virBufferAsprintf(buf, "\n", str);
- else
- virBufferAddLit(buf, "\n");
- virBufferAdjustIndent(buf, 2);
---
-2.13.1
-
diff --git a/SOURCES/libvirt-cpu-Drop-feature-filtering-from-virCPUUpdate.patch b/SOURCES/libvirt-cpu-Drop-feature-filtering-from-virCPUUpdate.patch
deleted file mode 100644
index 239d248..0000000
--- a/SOURCES/libvirt-cpu-Drop-feature-filtering-from-virCPUUpdate.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 2642333131bda397dc4b00fd945efdd34e2aa314 Mon Sep 17 00:00:00 2001
-Message-Id: <2642333131bda397dc4b00fd945efdd34e2aa314@dist-git>
-From: Jiri Denemark
-Date: Wed, 29 Mar 2017 15:00:21 +0200
-Subject: [PATCH] cpu: Drop feature filtering from virCPUUpdate
-
-Because of the changes done in the previous commit, @host is already a
-migratable CPU and there's no need to do any additional filtering.
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit 232d87c7dd081d126a079fb45178e0be096cc680)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1444421
-
-Signed-off-by: Jiri Denemark
----
- src/cpu/cpu_x86.c | 9 +++------
- 1 file changed, 3 insertions(+), 6 deletions(-)
-
-diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
-index a771b251e..53359ff9b 100644
---- a/src/cpu/cpu_x86.c
-+++ b/src/cpu/cpu_x86.c
-@@ -2549,8 +2549,7 @@ x86Baseline(virCPUDefPtr *cpus,
-
- static int
- x86UpdateHostModel(virCPUDefPtr guest,
-- const virCPUDef *host,
-- virCPUx86MapPtr map)
-+ const virCPUDef *host)
- {
- virCPUDefPtr updated = NULL;
- size_t i;
-@@ -2559,11 +2558,9 @@ x86UpdateHostModel(virCPUDefPtr guest,
- if (!(updated = virCPUDefCopyWithoutModel(host)))
- goto cleanup;
-
-- /* Remove non-migratable features by default */
- updated->type = VIR_CPU_TYPE_GUEST;
- updated->mode = VIR_CPU_MODE_CUSTOM;
-- if (virCPUDefCopyModelFilter(updated, host, true,
-- x86FeatureIsMigratable, map) < 0)
-+ if (virCPUDefCopyModel(updated, host, true) < 0)
- goto cleanup;
-
- if (guest->vendor_id) {
-@@ -2627,7 +2624,7 @@ virCPUx86Update(virCPUDefPtr guest,
-
- if (guest->mode == VIR_CPU_MODE_HOST_MODEL ||
- guest->match == VIR_CPU_MATCH_MINIMUM)
-- ret = x86UpdateHostModel(guest, host, map);
-+ ret = x86UpdateHostModel(guest, host);
- else
- ret = 0;
-
---
-2.12.2
-
diff --git a/SOURCES/libvirt-cpu-Introduce-virCPUCopyMigratable.patch b/SOURCES/libvirt-cpu-Introduce-virCPUCopyMigratable.patch
deleted file mode 100644
index 382224f..0000000
--- a/SOURCES/libvirt-cpu-Introduce-virCPUCopyMigratable.patch
+++ /dev/null
@@ -1,154 +0,0 @@
-From 57b2e02a1c4cf52f3ea1ec3af469dd4e44402595 Mon Sep 17 00:00:00 2001
-Message-Id: <57b2e02a1c4cf52f3ea1ec3af469dd4e44402595@dist-git>
-From: Jiri Denemark
-Date: Wed, 29 Mar 2017 14:45:44 +0200
-Subject: [PATCH] cpu: Introduce virCPUCopyMigratable
-
-This new internal API makes a copy of virCPUDef while removing all
-features which would block migration. It uses cpu_map.xml as a database
-of such features, which should only be used as a fallback when we cannot
-get the data from a hypervisor. The main goal of this API is to decouple
-this filtering from virCPUUpdate so that the hypervisor driver can
-filter the features according to the hypervisor.
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit 05e91c79f19e0be96526098d58a3498dac3f8529)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1444421
-
-Signed-off-by: Jiri Denemark
----
- src/cpu/cpu.c | 31 +++++++++++++++++++++++++++++++
- src/cpu/cpu.h | 8 ++++++++
- src/cpu/cpu_x86.c | 25 +++++++++++++++++++++++++
- src/libvirt_private.syms | 1 +
- 4 files changed, 65 insertions(+)
-
-diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
-index 93647a2ed..8a407ac18 100644
---- a/src/cpu/cpu.c
-+++ b/src/cpu/cpu.c
-@@ -1130,3 +1130,34 @@ virCPUExpandFeatures(virArch arch,
- VIR_DEBUG("nfeatures=%zu", cpu->nfeatures);
- return 0;
- }
-+
-+
-+/**
-+ * virCPUCopyMigratable:
-+ *
-+ * @arch: CPU architecture
-+ * @cpu: CPU definition to be copied
-+ *
-+ * Makes a copy of @cpu with all features which would block migration removed.
-+ * If this doesn't make sense for a given architecture, the function returns a
-+ * plain copy of @cpu (i.e., a copy with no features removed).
-+ *
-+ * Returns the copy of the CPU or NULL on error.
-+ */
-+virCPUDefPtr
-+virCPUCopyMigratable(virArch arch,
-+ virCPUDefPtr cpu)
-+{
-+ struct cpuArchDriver *driver;
-+
-+ VIR_DEBUG("arch=%s, cpu=%p, model=%s",
-+ virArchToString(arch), cpu, NULLSTR(cpu->model));
-+
-+ if (!(driver = cpuGetSubDriver(arch)))
-+ return NULL;
-+
-+ if (driver->copyMigratable)
-+ return driver->copyMigratable(cpu);
-+ else
-+ return virCPUDefCopy(cpu);
-+}
-diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
-index 8c238ad55..352445c40 100644
---- a/src/cpu/cpu.h
-+++ b/src/cpu/cpu.h
-@@ -118,6 +118,9 @@ typedef int
- typedef int
- (*virCPUArchExpandFeatures)(virCPUDefPtr cpu);
-
-+typedef virCPUDefPtr
-+(*virCPUArchCopyMigratable)(virCPUDefPtr cpu);
-+
- struct cpuArchDriver {
- const char *name;
- const virArch *arch;
-@@ -138,6 +141,7 @@ struct cpuArchDriver {
- virCPUArchTranslate translate;
- virCPUArchConvertLegacy convertLegacy;
- virCPUArchExpandFeatures expandFeatures;
-+ virCPUArchCopyMigratable copyMigratable;
- };
-
-
-@@ -254,6 +258,10 @@ int
- virCPUExpandFeatures(virArch arch,
- virCPUDefPtr cpu);
-
-+virCPUDefPtr
-+virCPUCopyMigratable(virArch arch,
-+ virCPUDefPtr cpu);
-+
- /* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and
- * have no real-life usage
- */
-diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
-index 48648a7f4..a771b251e 100644
---- a/src/cpu/cpu_x86.c
-+++ b/src/cpu/cpu_x86.c
-@@ -2903,6 +2903,30 @@ virCPUx86ExpandFeatures(virCPUDefPtr cpu)
- }
-
-
-+static virCPUDefPtr
-+virCPUx86CopyMigratable(virCPUDefPtr cpu)
-+{
-+ virCPUDefPtr copy;
-+ virCPUx86MapPtr map;
-+
-+ if (!(map = virCPUx86GetMap()))
-+ return NULL;
-+
-+ if (!(copy = virCPUDefCopyWithoutModel(cpu)))
-+ return NULL;
-+
-+ if (virCPUDefCopyModelFilter(copy, cpu, false,
-+ x86FeatureIsMigratable, map) < 0)
-+ goto error;
-+
-+ return copy;
-+
-+ error:
-+ virCPUDefFree(copy);
-+ return NULL;
-+}
-+
-+
- int
- virCPUx86DataAddCPUID(virCPUDataPtr cpuData,
- const virCPUx86CPUID *cpuid)
-@@ -2978,4 +3002,5 @@ struct cpuArchDriver cpuDriverX86 = {
- .getModels = virCPUx86GetModels,
- .translate = virCPUx86Translate,
- .expandFeatures = virCPUx86ExpandFeatures,
-+ .copyMigratable = virCPUx86CopyMigratable,
- };
-diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
-index 9a334311d..cc78c5975 100644
---- a/src/libvirt_private.syms
-+++ b/src/libvirt_private.syms
-@@ -1018,6 +1018,7 @@ virCPUCheckFeature;
- virCPUCompare;
- virCPUCompareXML;
- virCPUConvertLegacy;
-+virCPUCopyMigratable;
- virCPUDataCheckFeature;
- virCPUDataFormat;
- virCPUDataFree;
---
-2.12.2
-
diff --git a/SOURCES/libvirt-cpu-Introduce-virCPUGetHostIsSupported.patch b/SOURCES/libvirt-cpu-Introduce-virCPUGetHostIsSupported.patch
deleted file mode 100644
index 87757a9..0000000
--- a/SOURCES/libvirt-cpu-Introduce-virCPUGetHostIsSupported.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 401cbf50f18234b0631b4b0e01b9e403137fee95 Mon Sep 17 00:00:00 2001
-Message-Id: <401cbf50f18234b0631b4b0e01b9e403137fee95@dist-git>
-From: Jiri Denemark
-Date: Tue, 11 Apr 2017 20:45:07 +0200
-Subject: [PATCH] cpu: Introduce virCPUGetHostIsSupported
-
-Sometimes we want to call virCPUGetHost only when it is implemented for
-a given architecture to avoid logging expected and possibly misleading
-errors. The new virCPUGetHostIsSupported API may be used to guard such
-calls to virCPUGetHost.
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit bf1a881715c905c67f7d38dcd5bd6c2afbff1f9b)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1444421
-
-Signed-off-by: Jiri Denemark
----
- src/cpu/cpu.c | 20 ++++++++++++++++++++
- src/cpu/cpu.h | 3 +++
- src/libvirt_private.syms | 1 +
- 3 files changed, 24 insertions(+)
-
-diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
-index 8a407ac18..702b14dbb 100644
---- a/src/cpu/cpu.c
-+++ b/src/cpu/cpu.c
-@@ -358,6 +358,26 @@ virCPUDataFree(virCPUDataPtr data)
-
-
- /**
-+ * virCPUGetHostIsSupported:
-+ *
-+ * @arch: CPU architecture
-+ *
-+ * Check whether virCPUGetHost is supported for @arch.
-+ *
-+ * Returns true if virCPUGetHost is supported, false otherwise.
-+ */
-+bool
-+virCPUGetHostIsSupported(virArch arch)
-+{
-+ struct cpuArchDriver *driver;
-+
-+ VIR_DEBUG("arch=%s", virArchToString(arch));
-+
-+ return (driver = cpuGetSubDriver(arch)) && driver->getHost;
-+}
-+
-+
-+/**
- * virCPUGetHost:
- *
- * @arch: CPU architecture
-diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
-index 352445c40..c6ca111e9 100644
---- a/src/cpu/cpu.h
-+++ b/src/cpu/cpu.h
-@@ -183,6 +183,9 @@ virCPUDataNew(virArch arch);
- void
- virCPUDataFree(virCPUDataPtr data);
-
-+bool
-+virCPUGetHostIsSupported(virArch arch);
-+
- virCPUDefPtr
- virCPUGetHost(virArch arch,
- virCPUType type,
-diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
-index cc78c5975..d802e7598 100644
---- a/src/libvirt_private.syms
-+++ b/src/libvirt_private.syms
-@@ -1026,6 +1026,7 @@ virCPUDataNew;
- virCPUDataParse;
- virCPUExpandFeatures;
- virCPUGetHost;
-+virCPUGetHostIsSupported;
- virCPUGetModels;
- virCPUProbeHost;
- virCPUTranslate;
---
-2.12.2
-
diff --git a/SOURCES/libvirt-cpu-add-CPU-features-and-model-for-indirect-branch-prediction-protection.patch b/SOURCES/libvirt-cpu-add-CPU-features-and-model-for-indirect-branch-prediction-protection.patch
new file mode 100644
index 0000000..a915513
--- /dev/null
+++ b/SOURCES/libvirt-cpu-add-CPU-features-and-model-for-indirect-branch-prediction-protection.patch
@@ -0,0 +1,171 @@
+From 9df09ec5e1afef8659271c6cc4a5b741d5d06815 Mon Sep 17 00:00:00 2001
+Message-Id: <9df09ec5e1afef8659271c6cc4a5b741d5d06815@dist-git>
+From: Paolo Bonzini
+Date: Tue, 12 Dec 2017 16:23:42 +0100
+Subject: [PATCH] cpu: add CPU features and model for indirect branch
+ prediction protection
+
+CVE-2017-5715
+
+Signed-off-by: Paolo Bonzini
+Signed-off-by: Jiri Denemark
+---
+ src/cpu/cpu_map.xml | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 58 insertions(+)
+
+diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
+index 96f4ce60dd..a7888ec134 100644
+--- a/src/cpu/cpu_map.xml
++++ b/src/cpu/cpu_map.xml
+@@ -292,6 +292,15 @@
+
+
+
++
++
++
++
++
++
++
++
++
+
+
+
+@@ -420,6 +429,11 @@
+
+
+
++
++
++
++
++
+
+
+
+@@ -866,6 +880,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -903,6 +921,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -946,6 +968,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -995,6 +1021,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1048,6 +1078,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1103,6 +1137,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1160,6 +1198,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1219,6 +1261,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1287,6 +1333,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1362,6 +1412,10 @@
+
+
+
++
++
++
++
+
+
+
+@@ -1700,6 +1754,10 @@
+
+
+
++
++
++
++
+
+
+
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-cpu_ppc64-Add-support-for-host-model-on-POWER9.patch b/SOURCES/libvirt-cpu_ppc64-Add-support-for-host-model-on-POWER9.patch
deleted file mode 100644
index db7e944..0000000
--- a/SOURCES/libvirt-cpu_ppc64-Add-support-for-host-model-on-POWER9.patch
+++ /dev/null
@@ -1,182 +0,0 @@
-From 3feb7797cfe7ac9cfd05fbc5d008527b1a88c06a Mon Sep 17 00:00:00 2001
-Message-Id: <3feb7797cfe7ac9cfd05fbc5d008527b1a88c06a@dist-git>
-From: Jiri Denemark
-Date: Wed, 17 May 2017 16:39:16 +0200
-Subject: [PATCH] cpu_ppc64: Add support for host-model on POWER9
-
-Signed-off-by: Jiri Denemark
-(cherry picked from commit 5c8c2d1633f3d2500e49132296793fc267648d2b)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1450770
-
-Signed-off-by: Jiri Denemark
----
- src/cpu/cpu_ppc64.c | 8 ++++----
- .../qemuxml2argv-pseries-cpu-compat-power9.args | 24 ++++++++++++++++++++++
- .../qemuxml2argv-pseries-cpu-compat-power9.xml | 21 +++++++++++++++++++
- tests/qemuxml2argvtest.c | 7 +++++++
- tests/testutilsqemu.c | 13 +++++++++++-
- tests/testutilsqemu.h | 1 +
- 6 files changed, 69 insertions(+), 5 deletions(-)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.xml
-
-diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c
-index f64592b558..bf08599049 100644
---- a/src/cpu/cpu_ppc64.c
-+++ b/src/cpu/cpu_ppc64.c
-@@ -92,22 +92,22 @@ ppc64CheckCompatibilityMode(const char *host_model,
- if (!compat_mode)
- return VIR_CPU_COMPARE_IDENTICAL;
-
-- /* Valid host CPUs: POWER6, POWER7, POWER8 */
-+ /* Valid host CPUs: POWER6, POWER7, POWER8, POWER9 */
- if (!STRPREFIX(host_model, "POWER") ||
- !(tmp = (char *) host_model + strlen("POWER")) ||
- virStrToLong_i(tmp, NULL, 10, &host) < 0 ||
-- host < 6 || host > 8) {
-+ host < 6 || host > 9) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s",
- _("Host CPU does not support compatibility modes"));
- goto out;
- }
-
-- /* Valid compatibility modes: power6, power7, power8 */
-+ /* Valid compatibility modes: power6, power7, power8, power9 */
- if (!STRPREFIX(compat_mode, "power") ||
- !(tmp = (char *) compat_mode + strlen("power")) ||
- virStrToLong_i(tmp, NULL, 10, &compat) < 0 ||
-- compat < 6 || compat > 8) {
-+ compat < 6 || compat > 9) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Unknown compatibility mode %s"),
- compat_mode);
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args
-new file mode 100644
-index 0000000000..af93d63dc9
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.args
-@@ -0,0 +1,24 @@
-+LC_ALL=C \
-+PATH=/bin \
-+HOME=/home/test \
-+USER=test \
-+LOGNAME=test \
-+QEMU_AUDIO_DRV=none \
-+/usr/bin/qemu-system-ppc64 \
-+-name QEMUGuest1 \
-+-S \
-+-M pseries \
-+-cpu host,compat=power9 \
-+-m 256 \
-+-smp 4,sockets=4,cores=1,threads=1 \
-+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-+-nographic \
-+-nodefconfig \
-+-nodefaults \
-+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
-+server,nowait \
-+-mon chardev=charmonitor,id=monitor,mode=readline \
-+-boot c \
-+-usb \
-+-chardev pty,id=charserial0 \
-+-device spapr-vty,chardev=charserial0,reg=0x30000000
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.xml
-new file mode 100644
-index 0000000000..30ab5c2679
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-cpu-compat-power9.xml
-@@ -0,0 +1,21 @@
-+
-+ QEMUGuest1
-+ c7a5fdbd-edaf-9455-926a-d65c16db1809
-+ 219100
-+ 219100
-+ 4
-+
-+ hvm
-+
-+
-+ power9
-+
-+
-+
-+ /usr/bin/qemu-system-ppc64
-+
-+
-+
-+
-+
-+
-diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
-index 5ca27f105d..6ac24c9bb0 100644
---- a/tests/qemuxml2argvtest.c
-+++ b/tests/qemuxml2argvtest.c
-@@ -1688,6 +1688,13 @@ mymain(void)
- QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
- DO_TEST("pseries-cpu-le", QEMU_CAPS_KVM,
- QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
-+ DO_TEST_FAILURE("pseries-cpu-compat-power9", QEMU_CAPS_KVM);
-+
-+ qemuTestSetHostCPU(driver.caps, cpuPower9);
-+ DO_TEST("pseries-cpu-compat-power9",
-+ QEMU_CAPS_KVM, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
-+ qemuTestSetHostCPU(driver.caps, NULL);
-+
- qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
-
- DO_TEST("pseries-panic-missing",
-diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
-index 4cc482dfb0..fe2941efbf 100644
---- a/tests/testutilsqemu.c
-+++ b/tests/testutilsqemu.c
-@@ -17,6 +17,7 @@
- virCPUDefPtr cpuDefault;
- virCPUDefPtr cpuHaswell;
- virCPUDefPtr cpuPower8;
-+virCPUDefPtr cpuPower9;
-
- static virCPUFeatureDef cpuDefaultFeatures[] = {
- { (char *) "ds", -1 },
-@@ -94,6 +95,15 @@ static virCPUDef cpuPower8Data = {
- .threads = 8,
- };
-
-+static virCPUDef cpuPower9Data = {
-+ .type = VIR_CPU_TYPE_HOST,
-+ .arch = VIR_ARCH_PPC64,
-+ .model = (char *) "POWER9",
-+ .sockets = 1,
-+ .cores = 16,
-+ .threads = 1,
-+};
-+
- static virCapsGuestMachinePtr *testQemuAllocMachines(int *nmachines)
- {
- virCapsGuestMachinePtr *machines;
-@@ -334,7 +344,8 @@ virCapsPtr testQemuCapsInit(void)
-
- if (!(cpuDefault = virCPUDefCopy(&cpuDefaultData)) ||
- !(cpuHaswell = virCPUDefCopy(&cpuHaswellData)) ||
-- !(cpuPower8 = virCPUDefCopy(&cpuPower8Data)))
-+ !(cpuPower8 = virCPUDefCopy(&cpuPower8Data)) ||
-+ !(cpuPower9 = virCPUDefCopy(&cpuPower9Data)))
- goto cleanup;
-
- qemuTestSetHostCPU(caps, NULL);
-diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h
-index 047a64d1ac..781b435cc2 100644
---- a/tests/testutilsqemu.h
-+++ b/tests/testutilsqemu.h
-@@ -21,6 +21,7 @@ virQEMUCapsPtr qemuTestParseCapabilities(virCapsPtr caps,
- extern virCPUDefPtr cpuDefault;
- extern virCPUDefPtr cpuHaswell;
- extern virCPUDefPtr cpuPower8;
-+extern virCPUDefPtr cpuPower9;
-
- void qemuTestSetHostArch(virCapsPtr caps,
- virArch arch);
---
-2.13.1
-
diff --git a/SOURCES/libvirt-cpu_x86-Copy-CPU-signature-from-ancestor.patch b/SOURCES/libvirt-cpu_x86-Copy-CPU-signature-from-ancestor.patch
new file mode 100644
index 0000000..b81e716
--- /dev/null
+++ b/SOURCES/libvirt-cpu_x86-Copy-CPU-signature-from-ancestor.patch
@@ -0,0 +1,47 @@
+From 38b3d773dddd7f3cfe715b9cbabaa296c16c1290 Mon Sep 17 00:00:00 2001
+Message-Id: <38b3d773dddd7f3cfe715b9cbabaa296c16c1290@dist-git>
+From: Jiri Denemark
+Date: Fri, 5 Jan 2018 17:43:03 +0100
+Subject: [PATCH] cpu_x86: Copy CPU signature from ancestor
+
+When specifying a new CPU model in cpu_map.xml as an extension to an
+existing model, we forgot to copy the signature (family + model) from
+the original CPU model.
+
+We don't use this way of specifying CPU models, but it's still supported
+and it becomes useful when someone wants to quickly hack up a CPU model
+for testing or when creating additional variants of existing models to
+help with fixing some spectral issues.
+
+Signed-off-by: Jiri Denemark
+Reviewed-by: Pavel Hrdina
+(cherry picked from commit b427cf4831d0ea7aac9dd1a3aa7682478356a483)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1533125
+
+The new -IBRS and -IBPB CPU models were defined via inheritance from
+their original models in RHEL. Thus when the host CPU matches the
+signature of the original model from cpu_map.xml, libvirt will detect
+the host CPU as the original model + the new feature rather than
+reporting it as the -IBRS/-IBPB variant.
+
+Signed-off-by: Jiri Denemark
+---
+ src/cpu/cpu_x86.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
+index ad35532fc1..001109f701 100644
+--- a/src/cpu/cpu_x86.c
++++ b/src/cpu/cpu_x86.c
+@@ -1227,6 +1227,7 @@ x86ModelParse(xmlXPathContextPtr ctxt,
+ VIR_FREE(name);
+
+ model->vendor = ancestor->vendor;
++ model->signature = ancestor->signature;
+ if (x86DataCopy(&model->data, &ancestor->data) < 0)
+ goto error;
+ }
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-cpu_x86-Rename-virCPUx86MapInitialize.patch b/SOURCES/libvirt-cpu_x86-Rename-virCPUx86MapInitialize.patch
new file mode 100644
index 0000000..b757b16
--- /dev/null
+++ b/SOURCES/libvirt-cpu_x86-Rename-virCPUx86MapInitialize.patch
@@ -0,0 +1,52 @@
+From b200b9cbb5c6c7d3d3b1bb4f745a7371cc35a429 Mon Sep 17 00:00:00 2001
+Message-Id:
+From: Jiri Denemark
+Date: Wed, 13 Dec 2017 22:30:31 +0100
+Subject: [PATCH] cpu_x86: Rename virCPUx86MapInitialize
+
+The function will be used to initialize internal data of the x86 CPU
+driver (including the CPU map).
+
+CVE-2017-5715
+
+Signed-off-by: Jiri Denemark
+---
+ src/cpu/cpu_x86.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
+index a6cbd45766..693e571a3d 100644
+--- a/src/cpu/cpu_x86.c
++++ b/src/cpu/cpu_x86.c
+@@ -153,8 +153,8 @@ struct _virCPUx86Map {
+ };
+
+ static virCPUx86MapPtr cpuMap;
+-int virCPUx86MapOnceInit(void);
+-VIR_ONCE_GLOBAL_INIT(virCPUx86Map);
++int virCPUx86DriverOnceInit(void);
++VIR_ONCE_GLOBAL_INIT(virCPUx86Driver);
+
+
+ typedef enum {
+@@ -1404,7 +1404,7 @@ virCPUx86LoadMap(void)
+
+
+ int
+-virCPUx86MapOnceInit(void)
++virCPUx86DriverOnceInit(void)
+ {
+ if (!(cpuMap = virCPUx86LoadMap()))
+ return -1;
+@@ -1416,7 +1416,7 @@ virCPUx86MapOnceInit(void)
+ static virCPUx86MapPtr
+ virCPUx86GetMap(void)
+ {
+- if (virCPUx86MapInitialize() < 0)
++ if (virCPUx86DriverInitialize() < 0)
+ return NULL;
+
+ return cpuMap;
+--
+2.15.1
+
diff --git a/SOURCES/libvirt-daemon-Don-t-initialize-SASL-context-if-not-necessary.patch b/SOURCES/libvirt-daemon-Don-t-initialize-SASL-context-if-not-necessary.patch
deleted file mode 100644
index 159fca0..0000000
--- a/SOURCES/libvirt-daemon-Don-t-initialize-SASL-context-if-not-necessary.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 8c9296cbe21657aadbc4bff88eabd617168349f6 Mon Sep 17 00:00:00 2001
-Message-Id: <8c9296cbe21657aadbc4bff88eabd617168349f6@dist-git>
-From: Peter Krempa
-Date: Fri, 2 Jun 2017 15:07:59 +0200
-Subject: [PATCH] daemon: Don't initialize SASL context if not necessary
-
-SASL context would be initialized even if the corresponding TCP or TLS
-sockets are not enabled.
-
-fe772f24a68 attempted to fix the symptom by commenting out the settings,
-but that did not fix the root cause. 3c647ee4bbb later reverted those
-changes so that the more secure algorithm is used.
-
-Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1450095
-(cherry picked from commit ed914284ba74afb7dd16dcb623073bb1a1d5cd21)
-
-Signed-off-by: Jiri Denemark
----
- daemon/libvirtd.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
-index 891238bcbe..bac4bc1b65 100644
---- a/daemon/libvirtd.c
-+++ b/daemon/libvirtd.c
-@@ -613,11 +613,11 @@ daemonSetupNetworking(virNetServerPtr srv,
-
- #if WITH_SASL
- if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
-- config->auth_unix_ro == REMOTE_AUTH_SASL ||
-+ (sock_path_ro && config->auth_unix_ro == REMOTE_AUTH_SASL) ||
- # if WITH_GNUTLS
-- config->auth_tls == REMOTE_AUTH_SASL ||
-+ (ipsock && config->listen_tls && config->auth_tls == REMOTE_AUTH_SASL) ||
- # endif
-- config->auth_tcp == REMOTE_AUTH_SASL) {
-+ (ipsock && config->listen_tcp && config->auth_tcp == REMOTE_AUTH_SASL)) {
- saslCtxt = virNetSASLContextNewServer(
- (const char *const*)config->sasl_allowed_username_list);
- if (!saslCtxt)
---
-2.13.1
-
diff --git a/SOURCES/libvirt-disk-Force-usage-of-parted-when-checking-disk-format-for-bsd.patch b/SOURCES/libvirt-disk-Force-usage-of-parted-when-checking-disk-format-for-bsd.patch
deleted file mode 100644
index e867cc5..0000000
--- a/SOURCES/libvirt-disk-Force-usage-of-parted-when-checking-disk-format-for-bsd.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 911438df6c652e377f80712c67da90aed91444b7 Mon Sep 17 00:00:00 2001
-Message-Id: <911438df6c652e377f80712c67da90aed91444b7@dist-git>
-From: John Ferlan
-Date: Wed, 26 Apr 2017 08:41:09 -0400
-Subject: [PATCH] disk: Force usage of parted when checking disk format for
- "bsd"
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1439132
-
-Add "bsd" to the list of format types to not checked during blkid
-processing even though it supposedly knows the format - for some
-(now unknown) reason it's returning partition table not found. So
-let's just let PARTED handle "bsd" too.
-
-Signed-off-by: John Ferlan
-(cherry picked from commit 98f424d5038b362d1b62549930d0b9253106bdca)
-Signed-off-by: Jiri Denemark
----
- src/storage/storage_util.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
-index 7a458b828..adec9ab6f 100644
---- a/src/storage/storage_util.c
-+++ b/src/storage/storage_util.c
-@@ -3002,10 +3002,12 @@ virStorageBackendBLKIDFindPart(blkid_probe probe,
-
- /* A blkid_known_pttype on "dvh" and "pc98" returns a failure;
- * however, the blkid_do_probe for "dvh" returns "sgi" and
-- * for "pc98" it returns "dos". So since those will cause problems
-+ * for "pc98" it returns "dos". Although "bsd" is recognized,
-+ * it seems that the parted created partition table is not being
-+ * properly recogized. Since each of these will cause problems
- * with startup comparison, let's just treat them as UNKNOWN causing
- * the caller to fallback to using PARTED */
-- if (STREQ(format, "dvh") || STREQ(format, "pc98"))
-+ if (STREQ(format, "dvh") || STREQ(format, "pc98") || STREQ(format, "bsd"))
- return VIR_STORAGE_BLKID_PROBE_UNKNOWN;
-
- /* Make sure we're doing a partitions probe from the start */
---
-2.12.2
-
diff --git a/SOURCES/libvirt-disk-Resolve-issues-with-disk-partition-build-start-checks.patch b/SOURCES/libvirt-disk-Resolve-issues-with-disk-partition-build-start-checks.patch
deleted file mode 100644
index 77b111d..0000000
--- a/SOURCES/libvirt-disk-Resolve-issues-with-disk-partition-build-start-checks.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 5c1a822cfa7993b1f55f90b75b66c86787a063d1 Mon Sep 17 00:00:00 2001
-Message-Id: <5c1a822cfa7993b1f55f90b75b66c86787a063d1@dist-git>
-From: John Ferlan
-Date: Wed, 26 Apr 2017 08:41:08 -0400
-Subject: [PATCH] disk: Resolve issues with disk partition build/start checks
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1439132
-
-Commit id 'a48c674fb' added a check for format types "dvh" and "pc98"
-to use the parted print processing instead of using blkid processing
-in order to validate the label on the disk was what is expected for
-disk pool startup. However, commit id 'a4cb4a74f' really messed things
-up by missing an else condition causing PARTEDFindLabel to always
-return DIFFERENT.
-
-Signed-off-by: John Ferlan
-(cherry picked from commit f2a123203105b4fe010aea866e87f8bcf5f31193)
-Signed-off-by: Jiri Denemark
----
- src/storage/storage_util.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
-index 0ceaab6b9..7a458b828 100644
---- a/src/storage/storage_util.c
-+++ b/src/storage/storage_util.c
-@@ -3213,8 +3213,8 @@ virStorageBackendPARTEDFindLabel(const char *device,
- /* Does the on disk match what the pool desired? */
- if (STREQ(start, format))
- ret = VIR_STORAGE_PARTED_MATCH;
--
-- ret = VIR_STORAGE_PARTED_DIFFERENT;
-+ else
-+ ret = VIR_STORAGE_PARTED_DIFFERENT;
-
- cleanup:
- virCommandFree(cmd);
---
-2.12.2
-
diff --git a/SOURCES/libvirt-disk-Use-virStorageBackendZeroPartitionTable.patch b/SOURCES/libvirt-disk-Use-virStorageBackendZeroPartitionTable.patch
deleted file mode 100644
index 705de4d..0000000
--- a/SOURCES/libvirt-disk-Use-virStorageBackendZeroPartitionTable.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 9aeaadcf7d7f33cc5208bcbc788676f27691843a Mon Sep 17 00:00:00 2001
-Message-Id: <9aeaadcf7d7f33cc5208bcbc788676f27691843a@dist-git>
-From: John Ferlan
-Date: Wed, 26 Apr 2017 08:41:14 -0400
-Subject: [PATCH] disk: Use virStorageBackendZeroPartitionTable
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1439132
-
-During 'matrix' testing of all possible combinations I found that if
-device is formated with "gpt" first, then an attempt is made to format
-using "mac", a startup will fail.
-
-Deeper analysis by Peter Krempa indicates that the "mac" table fits
-into the first block on the disk. Since the GPT disklabel is stored
-at LBA address 1 it is not overwritten at all. Thus it's apparent that
-the (blkid) detection tool then prefers GPT over a older disklabel.
-
-The GPT disklabel has also a secondary copy at the last LBA of the disk.
-
-So, follow the same logic as the logical pool in clearing a 1MB swath
-at the beginning and end of the device to avoid potential issues with
-larger sector sizes for the device.
-
-Also fixed a minor formatting nit in virStorageBackendDeviceIsEmpty call.
-
-(cherry picked from commit 3c4f2e3fb725054921f855a229afc7daca7119ae)
-Signed-off-by: John Ferlan
-Signed-off-by: Jiri Denemark
----
- src/storage/storage_backend_disk.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c
-index 39371f2d9..e8f67bb00 100644
---- a/src/storage/storage_backend_disk.c
-+++ b/src/storage/storage_backend_disk.c
-@@ -491,11 +491,15 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
- ok_to_mklabel = true;
- } else {
- if (virStorageBackendDeviceIsEmpty(pool->def->source.devices[0].path,
-- fmt, true))
-+ fmt, true))
- ok_to_mklabel = true;
- }
-
- if (ok_to_mklabel) {
-+ if (virStorageBackendZeroPartitionTable(pool->def->source.devices[0].path,
-+ 1024 * 1024) < 0)
-+ goto error;
-+
- /* eg parted /dev/sda mklabel --script msdos */
- if (format == VIR_STORAGE_POOL_DISK_UNKNOWN)
- format = pool->def->source.format = VIR_STORAGE_POOL_DISK_DOS;
---
-2.12.2
-
diff --git a/SOURCES/libvirt-docs-Document-the-mediated-devices-within-the-nodedev-driver.patch b/SOURCES/libvirt-docs-Document-the-mediated-devices-within-the-nodedev-driver.patch
deleted file mode 100644
index fa10ab2..0000000
--- a/SOURCES/libvirt-docs-Document-the-mediated-devices-within-the-nodedev-driver.patch
+++ /dev/null
@@ -1,231 +0,0 @@
-From 9a202d80f7b60fcf6caf059570bfd2d0b0cbe8a4 Mon Sep 17 00:00:00 2001
-Message-Id: <9a202d80f7b60fcf6caf059570bfd2d0b0cbe8a4@dist-git>
-From: Erik Skultety
-Date: Thu, 18 May 2017 14:02:55 +0200
-Subject: [PATCH] docs: Document the mediated devices within the nodedev driver
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1452072
-
-Signed-off-by: Erik Skultety
-(cherry picked from commit a0a0b3cf71cbee1df40dd0fdebd7bb6a84682f09)
-Signed-off-by: Erik Skultety
-Signed-off-by: Jiri Denemark
----
- docs/drvnodedev.html.in | 168 +++++++++++++++++++++++++++++++++++++++++++++++-
- tools/virsh.pod | 7 +-
- 2 files changed, 171 insertions(+), 4 deletions(-)
-
-diff --git a/docs/drvnodedev.html.in b/docs/drvnodedev.html.in
-index 0a3870343..26c52dd0d 100644
---- a/docs/drvnodedev.html.in
-+++ b/docs/drvnodedev.html.in
-@@ -9,7 +9,7 @@
- (historically also referred to as node devices) like USB, PCI, SCSI, and
- network devices. This also includes various virtualization capabilities
- which the aforementioned devices provide for utilization, for example
-- SR-IOV, NPIV, DRM, etc.
-+ SR-IOV, NPIV, MDEV, DRM, etc.
-
-
-
-@@ -75,6 +75,7 @@
- storage
(Since 1.0.4 ),
- scsi_generic
(Since 1.0.7 ),
- drm
(Since 3.1.0 ), and
-+ mdev
(Since 3.4.0 ).
- This element can be nested in which case it further specifies a
- device's capability. Refer to specific device types to see more values
- for the type
attribute which are exclusive.
-@@ -185,5 +186,170 @@
- ...
- <device>
-
-+
-+
-+ A PCI device capable of creating mediated devices will include a nested
-+ capability mdev_types
which enumerates all supported mdev
-+ types on the physical device, along with the type attributes available
-+ through sysfs:
-+
-+
-+
-+ type
-+
-+ This element describes a mediated device type which acts as an
-+ abstract template defining a resource allocation for instances of this
-+ device type. The element has one attribute id
which holds
-+ an official vendor-supplied identifier for the type.
-+ Since 3.4.0
-+
-+
-+ name
-+
-+ The name
element holds a vendor-supplied code name for
-+ the given mediated device type. This is an optional element.
-+ Since 3.4.0
-+
-+
-+ deviceAPI
-+
-+ The value of this element describes how an instance of the given type
-+ will be presented to the guest by the VFIO framework.
-+ Since 3.4.0
-+
-+
-+ availableInstances
-+
-+ This element reports the current state of resource allocation. In other
-+ words, how many instances of the given type can still be successfully
-+ created on the physical device.
-+ Since 3.4.0
-+
-+
-+
-+
-+ For a more info about mediated devices, refer to the
-+ paragraph below .
-+
-+
-+
-+<device>
-+...
-+ <driver>
-+ <name>nvidia</name>
-+ </driver>
-+ <capability type='pci'>
-+...
-+ <capability type='mdev_types'>
-+ <type id='nvidia-11'>
-+ <name>GRID M60-0B</name>
-+ <deviceAPI>vfio-pci</deviceAPI>
-+ <availableInstances>16</availableInstances>
-+ </type>
-+ <!-- Here would come the rest of the available mdev types -->
-+ </capability>
-+...
-+ </capability>
-+</device>
-+
-+
-+
-+ Mediated devices (Since 3.2.0 ) are software
-+ devices defining resource allocation on the backing physical device which
-+ in turn allows the parent physical device's resources to be divided into
-+ several mediated devices, thus sharing the physical device's performance
-+ among multiple guests. Unlike SR-IOV however, where a PCIe device appears
-+ as multiple separate PCIe devices on the host's PCI bus, mediated devices
-+ only appear on the mdev virtual bus. Therefore, no detach/reattach
-+ procedure from/to the host driver procedure is involved even though
-+ mediated devices are used in a direct device assignment manner.
-+
-+
-+
-+ The following sub-elements and attributes are exposed within the
-+ capability
element:
-+
-+
-+
-+ type
-+
-+ This element describes a mediated device type which acts as an
-+ abstract template defining a resource allocation for instances of this
-+ device type. The element has one attribute id
which holds
-+ an official vendor-supplied identifier for the type.
-+ Since 3.4.0
-+
-+
-+ iommuGroup
-+
-+ This element supports a single attribute number
which holds
-+ the IOMMU group number the mediated device belongs to.
-+ Since 3.4.0
-+
-+
-+
-+ Example of a mediated device
-+
-+<device>
-+ <name>mdev_4b20d080_1b54_4048_85b3_a6a62d165c01</name>
-+ <path>/sys/devices/pci0000:00/0000:00:02.0/4b20d080-1b54-4048-85b3-a6a62d165c01</path>
-+ <parent>pci_0000_06_00_0</parent>
-+ <driver>
-+ <name>vfio_mdev</name>
-+ </driver>
-+ <capability type='mdev'>
-+ <type id='nvidia-11'/>
-+ <iommuGroup number='12'/>
-+ <capability/>
-+<device/>
-+
-+
-+ The support of mediated device's framework in libvirt's node device driver
-+ covers the following features:
-+
-+
-+
-+
-+ list available mediated devices on the host
-+ (Since 3.4.0 )
-+
-+
-+ display device details
-+ (Since 3.4.0 )
-+
-+
-+
-+
-+ Because mediated devices are instantiated from vendor specific templates,
-+ simply called 'types', information describing these types is contained
-+ within the parent device's capabilities
-+ (see the example in PCI host devices ).
-+
-+
-+
-+ To see the supported mediated device types on a specific physical device
-+ use the following:
-+
-+
-+
-+$ ls /sys/class/mdev_bus/<device>/mdev_supported_types
-+
-+
-+ To manually instantiate a mediated device, use one of the following as a
-+ reference:
-+
-+
-+
-+$ uuidgen > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create
-+...
-+$ echo <UUID> > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create
-+
-+
-+ Manual removal of a mediated device is then performed as follows:
-+
-+
-+
-+$ echo 1 > /sys/bus/mdev/devices/<uuid>/remove
-+
-