Probe mshv capabilities from qemu with QMP commands. Limit probing only
to x86_64 architecture with newer versions of QEMU.
Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
---
src/qemu/qemu_capabilities.c | 21 +++++++++++++++++++++
src/qemu/qemu_monitor.c | 12 ++++++++++++
src/qemu/qemu_monitor.h | 12 +++++++++---
src/qemu/qemu_monitor_json.c | 32 ++++++++++++++++++++++++++------
src/qemu/qemu_monitor_json.h | 13 +++++++++----
5 files changed, 77 insertions(+), 13 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 1e069eb0e5..cc7774a58a 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -3488,6 +3488,22 @@ virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps,
return 0;
}
+static int
+virQEMUCapsProbeQMPMSHVState(virQEMUCaps *qemuCaps,
+ qemuMonitor *mon)
+{
+ bool enabled = false;
+ bool present = false;
+
+ if (qemuMonitorGetMSHVState(mon, &enabled, &present) < 0)
+ return -1;
+
+ if (present && enabled)
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_MSHV);
+
+ return 0;
+}
+
#ifdef __APPLE__
bool
virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps)
@@ -5795,6 +5811,11 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps,
if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
return -1;
+ if (qemuCaps->arch == VIR_ARCH_X86_64 && qemuCaps->version >= 10000092) {
+ if (virQEMUCapsProbeQMPMSHVState(qemuCaps, mon) < 0)
+ return -1;
+ }
+
if (virQEMUCapsProbeHVF(qemuCaps))
virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF);
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index c1fef8d5de..5acff4125d 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3434,6 +3434,18 @@ qemuMonitorGetKVMState(qemuMonitor *mon,
return qemuMonitorJSONGetKVMState(mon, enabled, present);
}
+int
+qemuMonitorGetMSHVState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present)
+{
+ VIR_DEBUG("enabled=%p present=%p", enabled, present);
+
+ QEMU_CHECK_MONITOR(mon);
+
+ return qemuMonitorJSONGetMSHVState(mon, enabled, present);
+}
+
int
qemuMonitorGetObjectTypes(qemuMonitor *mon,
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 755f347e17..e31a00de56 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1220,9 +1220,15 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig);
GHashTable *qemuMonitorGetCommandLineOptions(qemuMonitor *mon);
-int qemuMonitorGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present);
+int
+qemuMonitorGetMSHVState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present);
+
+int
+qemuMonitorGetKVMState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present);
int qemuMonitorGetObjectTypes(qemuMonitor *mon,
char ***types);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 9f51421478..2b29399d3b 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5520,9 +5520,11 @@ qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon)
}
-int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present)
+static int
+qemuMonitorJSONGetHypervisorState(qemuMonitor *mon,
+ const char *query_cmd,
+ bool *enabled,
+ bool *present)
{
g_autoptr(virJSONValue) cmd = NULL;
g_autoptr(virJSONValue) reply = NULL;
@@ -5531,7 +5533,7 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
/* Safe defaults */
*enabled = *present = false;
- if (!(cmd = qemuMonitorJSONMakeCommand("query-kvm", NULL)))
+ if (!(cmd = qemuMonitorJSONMakeCommand(query_cmd, NULL)))
return -1;
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
@@ -5542,8 +5544,8 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
if (virJSONValueObjectGetBoolean(data, "enabled", enabled) < 0 ||
virJSONValueObjectGetBoolean(data, "present", present) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("query-kvm replied unexpected data"));
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("%1$s replied unexpected data"), query_cmd);
return -1;
}
@@ -5551,6 +5553,24 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
}
+int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present)
+{
+ return qemuMonitorJSONGetHypervisorState(mon, "query-kvm",
+ enabled, present);
+}
+
+
+int qemuMonitorJSONGetMSHVState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present)
+{
+ return qemuMonitorJSONGetHypervisorState(mon, "query-mshv",
+ enabled, present);
+}
+
+
int
qemuMonitorJSONGetObjectTypes(qemuMonitor *mon,
char ***types)
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index bd437f7938..5c1d626f97 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -451,10 +451,15 @@ qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon,
GHashTable *
qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon);
-int
-qemuMonitorJSONGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present)
+
+int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present)
+ ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+
+int qemuMonitorJSONGetMSHVState(qemuMonitor *mon,
+ bool *enabled,
+ bool *present)
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
int
--
2.50.1
© 2016 - 2025 Red Hat, Inc.