* qemuMonitorGetGuestCPU:
* @mon: Pointer to the monitor
* @arch: CPU architecture
+ * @qomListGet: QEMU supports getting list of features and their values using
+ * a single qom-list-get QMP command
* @cpuQOMPath: QOM path of a CPU to probe
* @translate: callback for translating CPU feature names from QEMU to libvirt
* @opaque: data for @translate callback
int
qemuMonitorGetGuestCPU(qemuMonitor *mon,
virArch arch,
+ bool qomListGet,
const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
virCPUData **enabled,
virCPUData **disabled)
{
- VIR_DEBUG("arch=%s cpuQOMPath=%s translate=%p enabled=%p disabled=%p",
- virArchToString(arch), cpuQOMPath, translate, enabled, disabled);
+ VIR_DEBUG("arch=%s qomListGet=%d cpuQOMPath=%s translate=%p "
+ "enabled=%p disabled=%p",
+ virArchToString(arch), qomListGet, cpuQOMPath, translate,
+ enabled, disabled);
QEMU_CHECK_MONITOR(mon);
if (disabled)
*disabled = NULL;
- return qemuMonitorJSONGetGuestCPU(mon, arch, cpuQOMPath, translate,
- enabled, disabled);
+ return qemuMonitorJSONGetGuestCPU(mon, arch, qomListGet, cpuQOMPath,
+ translate, enabled, disabled);
}
int qemuMonitorGetGuestCPU(qemuMonitor *mon,
virArch arch,
+ bool qomListGet,
const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
virCPUData **enabled,
struct _qemuMonitorJSONCPUPropsFilterData {
qemuMonitor *mon;
+ bool values;
const char *cpuQOMPath;
};
virJSONValue *propData,
void *opaque)
{
- qemuMonitorJSONObjectProperty prop = { .type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN };
struct _qemuMonitorJSONCPUPropsFilterData *data = opaque;
+ bool enabled = false;
if (STRNEQ_NULLABLE(virJSONValueObjectGetString(propData, "type"), "bool"))
return 1;
- if (qemuMonitorJSONGetObjectProperty(data->mon, data->cpuQOMPath,
- name, &prop) < 0)
- return -1;
+ if (data->values) {
+ if (virJSONValueObjectGetBoolean(propData, "value", &enabled) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("property '%1$s' in reply data was missing value"),
+ name);
+ return -1;
+ }
+ } else {
+ qemuMonitorJSONObjectProperty prop = {
+ .type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN
+ };
+
+ if (qemuMonitorJSONGetObjectProperty(data->mon, data->cpuQOMPath,
+ name, &prop) < 0)
+ return -1;
- if (!prop.val.b)
+ enabled = prop.val.b;
+ }
+
+ if (!enabled)
return 1;
return 0;
static int
qemuMonitorJSONGetCPUProperties(qemuMonitor *mon,
+ bool qomListGet,
const char *cpuQOMPath,
char ***props)
{
virJSONValue *array;
struct _qemuMonitorJSONCPUPropsFilterData filterData = {
.mon = mon,
+ .values = qomListGet,
.cpuQOMPath = cpuQOMPath,
};
*props = NULL;
- if (!(cmd = qemuMonitorJSONMakeCommand("qom-list",
- "s:path", cpuQOMPath,
- NULL)))
+ if (qomListGet) {
+ g_autoptr(virJSONValue) paths = virJSONValueNewArray();
+
+ if (virJSONValueArrayAppendString(paths, cpuQOMPath) < 0)
+ return -1;
+
+ cmd = qemuMonitorJSONMakeCommand("qom-list-get",
+ "a:paths", &paths,
+ NULL);
+ } else {
+ cmd = qemuMonitorJSONMakeCommand("qom-list",
+ "s:path", cpuQOMPath,
+ NULL);
+ }
+
+ if (!cmd)
return -1;
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
if (!(array = qemuMonitorJSONGetReply(cmd, reply, VIR_JSON_TYPE_ARRAY)))
return -1;
+ if (qomListGet) {
+ if (virJSONValueArraySize(array) != 1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("'qom-list-get' returned unexpected number of paths"));
+ return -1;
+ }
+
+ array = virJSONValueObjectGetArray(virJSONValueArrayGet(array, 0),
+ "properties");
+ if (!array) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("reply data was missing 'properties' array"));
+ return -1;
+ }
+ }
+
return qemuMonitorJSONParsePropsList(array, qemuMonitorJSONCPUPropsFilter,
&filterData, props);
}
static int
qemuMonitorJSONGetCPUData(qemuMonitor *mon,
+ bool qomListGet,
const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
virCPUData *data)
g_auto(GStrv) props = NULL;
char **p;
- if (qemuMonitorJSONGetCPUProperties(mon, cpuQOMPath, &props) < 0)
+ if (qemuMonitorJSONGetCPUProperties(mon, qomListGet, cpuQOMPath, &props) < 0)
return -1;
for (p = props; p && *p; p++) {
* qemuMonitorJSONGetGuestCPU:
* @mon: Pointer to the monitor
* @arch: CPU architecture
+ * @qomListGet: QEMU supports getting list of features and their values using
+ * a single qom-list-get QMP command
* @cpuQOMPath: QOM path of a CPU to probe
* @translate: callback for translating CPU feature names from QEMU to libvirt
* @opaque: data for @translate callback
int
qemuMonitorJSONGetGuestCPU(qemuMonitor *mon,
virArch arch,
+ bool qomListGet,
const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
virCPUData **enabled,
!(cpuDisabled = virCPUDataNew(arch)))
return -1;
- if (qemuMonitorJSONGetCPUData(mon, cpuQOMPath, translate, cpuEnabled) < 0)
+ if (qemuMonitorJSONGetCPUData(mon, qomListGet, cpuQOMPath,
+ translate, cpuEnabled) < 0)
return -1;
if (disabled &&
int
qemuMonitorJSONGetGuestCPU(qemuMonitor *mon,
virArch arch,
+ bool qomListGet,
const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
virCPUData **enabled,
rc = qemuMonitorGetGuestCPU(priv->mon,
vm->def->os.arch,
+ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QOM_LIST_GET),
cpuQOMPath,
virQEMUCapsCPUFeatureFromQEMU,
&dataEnabled, &dataDisabled);
struct testQemuMonitorJSONGetGuestCPUData {
const char *name;
+ bool qomListGet;
virQEMUDriver driver;
GHashTable *schema;
};
g_autofree char *enabled = NULL;
g_autofree char *disabled = NULL;
bool failed = false;
+ const char *legacy = data->qomListGet ? "" : "-legacy";
- fileJSON = g_strdup_printf("%s-%s.json", base, data->name);
+ fileJSON = g_strdup_printf("%s-%s%s.json", base, data->name, legacy);
fileEnabled = g_strdup_printf("%s-%s-enabled.xml", base, data->name);
fileDisabled = g_strdup_printf("%s-%s-disabled.xml", base, data->name);
if (qemuMonitorJSONGetGuestCPU(qemuMonitorTestGetMonitor(mon),
VIR_ARCH_X86_64,
+ data->qomListGet,
"/machine/unattached/device[0]",
virQEMUCapsCPUFeatureFromQEMU,
&dataEnabled, &dataDisabled) < 0)
ret = -1; \
} while (0)
-#define DO_TEST_GET_GUEST_CPU(name) \
+#define DO_TEST_GET_GUEST_CPU(name, qomListGet) \
do { \
struct testQemuMonitorJSONGetGuestCPUData data = { \
- name, driver, qapiData.schema }; \
- if (virTestRun("GetGuestCPU(" name ")", \
+ name, qomListGet, driver, qapiData.schema }; \
+ g_autofree char *label = NULL; \
+ label = g_strdup_printf("GetGuestCPU(%s, legacy=%d)", name, qomListGet); \
+ if (virTestRun(label, \
testQemuMonitorJSONGetGuestCPU, \
&data) < 0) \
ret = -1; \
DO_TEST_CPU_INFO("s390", 2);
- DO_TEST_GET_GUEST_CPU("SierraForest");
- DO_TEST_GET_GUEST_CPU("SkylakeClient");
+ DO_TEST_GET_GUEST_CPU("SierraForest", false);
+ DO_TEST_GET_GUEST_CPU("SkylakeClient", false);
#define DO_TEST_QAPI_QUERY(nme, qry, scc, rplobj) \