From: Praveen K Paladugu <pra...@linux.microsoft.com> Probe mshv capabilities from qemu with QMP commands.
Signed-off-by: Praveen K Paladugu <pra...@linux.microsoft.com> Signed-off-by: Praveen K Paladugu <praveenkpalad...@gmail.com> --- src/qemu/qemu_capabilities.c | 31 ++++++++++++++++++++++++------- src/qemu/qemu_monitor.c | 9 +++++---- src/qemu/qemu_monitor.h | 8 +++++--- src/qemu/qemu_monitor_json.c | 13 +++++++------ src/qemu/qemu_monitor_json.h | 10 +++++----- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 1e069eb0e5..02dbae8e00 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3473,17 +3473,31 @@ virQEMUCapsProbeQMPTPM(virQEMUCaps *qemuCaps, static int -virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps, - qemuMonitor *mon) +virQEMUCapsProbeQMPHypervisorState(virQEMUCaps *qemuCaps, + qemuMonitor *mon, + virQEMUCapsFlags flag) { bool enabled = false; bool present = false; - if (qemuMonitorGetKVMState(mon, &enabled, &present) < 0) - return -1; + if (flag == QEMU_CAPS_KVM) { + if (qemuMonitorGetHypervisorState(mon, "query-kvm", + &enabled, &present) < 0) + return -1; + if (present && enabled) + virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM); + } else if (flag == QEMU_CAPS_MSHV) { - if (present && enabled) - virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM); + if (qemuMonitorGetHypervisorState(mon, "query-mshv", + &enabled, &present) < 0) + return -1; + if (present && enabled) + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MSHV); + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Invalid Hypervisor type specified for qemu")); + return -1; + } return 0; } @@ -5792,7 +5806,10 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps, return -1; /* Some capabilities may differ depending on KVM state */ - if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0) + if (virQEMUCapsProbeQMPHypervisorState(qemuCaps, mon, QEMU_CAPS_KVM) < 0) + return -1; + + if (virQEMUCapsProbeQMPHypervisorState(qemuCaps, mon, QEMU_CAPS_MSHV) < 0) return -1; if (virQEMUCapsProbeHVF(qemuCaps)) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index c1fef8d5de..3d01844074 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3423,15 +3423,16 @@ qemuMonitorGetCommandLineOptions(qemuMonitor *mon) int -qemuMonitorGetKVMState(qemuMonitor *mon, - bool *enabled, - bool *present) +qemuMonitorGetHypervisorState(qemuMonitor *mon, + const char *query_cmd, + bool *enabled, + bool *present) { VIR_DEBUG("enabled=%p present=%p", enabled, present); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONGetKVMState(mon, enabled, present); + return qemuMonitorJSONGetHypervisorState(mon, query_cmd, enabled, present); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 755f347e17..8bb0919a00 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1220,9 +1220,11 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig); GHashTable *qemuMonitorGetCommandLineOptions(qemuMonitor *mon); -int qemuMonitorGetKVMState(qemuMonitor *mon, - bool *enabled, - bool *present); +int +qemuMonitorGetHypervisorState(qemuMonitor *mon, + const char *query_cmd, + 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..18ca124e46 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5520,9 +5520,10 @@ qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon) } -int qemuMonitorJSONGetKVMState(qemuMonitor *mon, - bool *enabled, - bool *present) +int qemuMonitorJSONGetHypervisorState(qemuMonitor *mon, + const char *query_cmd, + bool *enabled, + bool *present) { g_autoptr(virJSONValue) cmd = NULL; g_autoptr(virJSONValue) reply = NULL; @@ -5531,7 +5532,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 +5543,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; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index bd437f7938..2de17e3d75 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -451,11 +451,11 @@ qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon, GHashTable * qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon); -int -qemuMonitorJSONGetKVMState(qemuMonitor *mon, - bool *enabled, - bool *present) - ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); +int qemuMonitorJSONGetHypervisorState(qemuMonitor *mon, + const char *query_cmd, + bool *enabled, + bool *present) + ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); int qemuMonitorJSONGetObjectTypes(qemuMonitor *mon, -- 2.50.1