The former command is only implemented in the very latest QEMU
version, but it's a proper superset of the latter and can thus
be used as a drop-in replacement when available.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 10 +-
src/qemu/qemu_monitor.c | 5 +-
src/qemu/qemu_monitor.h | 1 +
src/qemu/qemu_monitor_json.c | 13 +-
src/qemu/qemu_monitor_json.h | 3 +-
.../caps_2.12.0-gicv2.aarch64.replies | 364 +++++++++++++-
.../caps_2.12.0-gicv2.aarch64.xml | 2 +-
.../caps_2.12.0-gicv3.aarch64.replies | 364 +++++++++++++-
.../caps_2.12.0-gicv3.aarch64.xml | 2 +-
.../qemucapabilitiesdata/caps_2.12.0.ppc64.replies | 384 ++++++++++++++-
tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml | 2 +-
.../caps_2.12.0.x86_64.replies | 544 ++++++++++++++++++++-
tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml | 2 +-
13 files changed, 1625 insertions(+), 71 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 42ede1db3e..fb6b492454 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2883,6 +2883,12 @@ virQEMUCapsProbeQMPObjects(virQEMUCapsPtr qemuCaps,
int nvalues;
char **values;
size_t i;
+ const char *impl = "device-list-properties";
+
+ /* Prefer qom-list-properties if available, since it allows us to gather
+ * information about objects that device-list-properties doesn't support */
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QOM_LIST_PROPERTIES))
+ impl = "qom-list-properties";
if ((nvalues = qemuMonitorGetObjectTypes(mon, &values)) < 0)
return -1;
@@ -2899,9 +2905,7 @@ virQEMUCapsProbeQMPObjects(virQEMUCapsPtr qemuCaps,
if (cap >= 0 && !virQEMUCapsGet(qemuCaps, cap))
continue;
- if ((nvalues = qemuMonitorGetObjectProps(mon,
- type,
- &values)) < 0)
+ if ((nvalues = qemuMonitorGetObjectProps(mon, impl, type, &values)) < 0)
return -1;
virQEMUCapsProcessStringFlags(qemuCaps,
virQEMUCapsObjectProps[i].nprops,
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index ad5c572aee..56aaffc632 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3943,14 +3943,15 @@ qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
int
qemuMonitorGetObjectProps(qemuMonitorPtr mon,
+ const char *impl,
const char *type,
char ***props)
{
- VIR_DEBUG("type=%s props=%p", type, props);
+ VIR_DEBUG("impl=%s type=%s props=%p", impl, type, props);
QEMU_CHECK_MONITOR_JSON(mon);
- return qemuMonitorJSONGetObjectProps(mon, type, props);
+ return qemuMonitorJSONGetObjectProps(mon, impl, type, props);
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 954ae88e4f..45ead25b7a 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1083,6 +1083,7 @@ int qemuMonitorGetKVMState(qemuMonitorPtr mon,
int qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
char ***types);
int qemuMonitorGetObjectProps(qemuMonitorPtr mon,
+ const char *impl,
const char *type,
char ***props);
char *qemuMonitorGetTargetArch(qemuMonitorPtr mon);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index a09e93e464..ddeb27587b 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -6023,6 +6023,7 @@ int qemuMonitorJSONSetObjectProperty(qemuMonitorPtr mon,
int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
+ const char *impl,
const char *type,
char ***props)
{
@@ -6036,7 +6037,7 @@ int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
*props = NULL;
- if (!(cmd = qemuMonitorJSONMakeCommand("device-list-properties",
+ if (!(cmd = qemuMonitorJSONMakeCommand(impl,
"s:typename", type,
NULL)))
return -1;
@@ -6054,8 +6055,9 @@ int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
if (!(data = virJSONValueObjectGetArray(reply, "return")) ||
(n = virJSONValueArraySize(data)) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("device-list-properties reply data was not an
array"));
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("%s reply data was not an array"),
+ impl);
goto cleanup;
}
@@ -6068,8 +6070,9 @@ int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
const char *tmp;
if (!(tmp = virJSONValueObjectGetString(child, "name"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("device-list-properties reply data was missing
'name'"));
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("%s reply data was missing 'name'"),
+ impl);
goto cleanup;
}
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index ec243becc4..13ca49efd6 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -442,9 +442,10 @@ int qemuMonitorJSONSetObjectProperty(qemuMonitorPtr mon,
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
+ const char *impl,
const char *type,
char ***props)
- ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+ ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
char *qemuMonitorJSONGetTargetArch(qemuMonitorPtr mon);
int qemuMonitorJSONNBDServerStart(qemuMonitorPtr mon,
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.replies
b/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.replies
index 2bccdaf586..bc591b24e9 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.replies
+++ b/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.replies
@@ -3402,10 +3402,18 @@
"description": "on/off",
"type": "bool"
},
+ {
+ "name": "legacy-addr",
+ "type": "str"
+ },
{
"name": "min_io_size",
"type": "uint16"
},
+ {
+ "name": "type",
+ "type": "string"
+ },
{
"name": "event_idx",
"description": "on/off",
[...]
@@ -4075,7 +4147,7 @@
"id": "libvirt-13",
"error": {
"class": "DeviceNotFound",
- "desc": "Device 'virtio-blk-ccw' not found"
+ "desc": "Class 'virtio-blk-ccw' not found"
}
}
@@ -4083,7 +4155,7 @@
"id": "libvirt-14",
"error": {
"class": "DeviceNotFound",
- "desc": "Device 'virtio-net-ccw' not found"
+ "desc": "Class 'virtio-net-ccw' not found"
}
}
@@ -4091,7 +4163,7 @@
"id": "libvirt-15",
"error": {
"class": "DeviceNotFound",
- "desc": "Device 'virtio-scsi-ccw' not found"
+ "desc": "Class 'virtio-scsi-ccw' not found"
}
}
[...]
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.xml
b/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.xml
index b4e5d0eddf..f6cd790480 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.12.0-gicv2.aarch64.xml
@@ -190,7 +190,7 @@
<flag name='qom-list-properties'/>
<version>2011050</version>
<kvmVersion>0</kvmVersion>
- <microcodeVersion>312776</microcodeVersion>
+ <microcodeVersion>317921</microcodeVersion>
<package> (v2.11.0-1777-g2e0cc0f)</package>
<arch>aarch64</arch>
<cpu type='kvm' name='pxa262'/>
--
2.14.3