return 0;
}
+
+static int
+virQEMUCapsProbeAccels(virQEMUCaps *qemuCaps,
+ qemuMonitor *mon)
+{
+ g_autofree char *enabled = NULL;
+
+ if (qemuMonitorGetAccelerators(mon, &enabled) < 0)
+ return -1;
+
+ if (STREQ(enabled, "tcg"))
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_TCG);
+ else if (STREQ(enabled, "hvf"))
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF);
+ else if (STREQ(enabled, "kvm"))
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
+
+ return 0;
+}
+
+
#ifdef __APPLE__
bool
virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps)
if (virQEMUCapsProbeQMPSchemaCapabilities(qemuCaps, mon) < 0)
return -1;
- /* Some capabilities may differ depending on KVM state */
- if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
- return -1;
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_ACCELERATORS)) {
+ if (virQEMUCapsProbeAccels(qemuCaps, mon) < 0)
+ return -1;
+ } else {
+ /* Some capabilities may differ depending on KVM state */
+ if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
+ return -1;
- if (virQEMUCapsProbeHVF(qemuCaps))
- virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF);
+ if (virQEMUCapsProbeHVF(qemuCaps))
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF);
+ }
type = virQEMUCapsGetVirtType(qemuCaps);
accel = virQEMUCapsGetAccel(qemuCaps, type);
}
+int
+qemuMonitorGetAccelerators(qemuMonitor *mon,
+ char **enabled)
+{
+ QEMU_CHECK_MONITOR(mon);
+
+ return qemuMonitorJSONGetAccelerators(mon, enabled);
+}
+
+
int
qemuMonitorGetObjectTypes(qemuMonitor *mon,
char ***types)
}
+int
+qemuMonitorJSONGetAccelerators(qemuMonitor *mon, char **enabled)
+{
+ g_autoptr(virJSONValue) cmd = NULL;
+ g_autoptr(virJSONValue) reply = NULL;
+ virJSONValue *data;
+ const char *str;
+
+ if (!(cmd = qemuMonitorJSONMakeCommand("query-accelerators", NULL)))
+ return -1;
+
+ if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
+ return -1;
+
+ if (!(data = qemuMonitorJSONGetReply(cmd, reply, VIR_JSON_TYPE_OBJECT)))
+ return -1;
+
+ if (!(str = virJSONValueObjectGetString(data, "enabled"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("query-accelerators was missing 'enabled'"));
+ return -1;
+ }
+
+ *enabled = g_strdup(str);
+
+ return 0;
+}
+
+
int
qemuMonitorJSONGetObjectTypes(qemuMonitor *mon,
char ***types)