From: Roman Bolshakov <r.bolshakov(a)yadro.com>
There's no QMP command for querying if hvf is supported, therefore we
use sysctl interface that tells if Hypervisor.framework works/available
on the host.
Signed-off-by: Roman Bolshakov <r.bolshakov(a)yadro.com>
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 6b7e295f68..56325d1762 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -56,6 +56,10 @@
#include <unistd.h>
#include <stdarg.h>
#include <sys/utsname.h>
+#ifdef __APPLE__
+# include <sys/types.h>
+# include <sys/sysctl.h>
+#endif
#define VIR_FROM_THIS VIR_FROM_QEMU
@@ -3195,6 +3199,33 @@ virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps,
return 0;
}
+#ifdef __APPLE__
+static int
+virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps)
+{
+ int hv_support;
+ size_t len = sizeof(hv_support);
+
+ if (sysctlbyname("kern.hv_support", &hv_support, &len, NULL, 0)
< 0)
+ hv_support = 0;
+
+ if (qemuCaps->version >= 2012000 &&
+ (qemuCaps->arch == VIR_ARCH_X86_64 ||
+ qemuCaps->arch == VIR_ARCH_AARCH64) &&
+ hv_support) {
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF);
+ }
+
+ return 0;
+}
+#else
+static int
+virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps G_GNUC_UNUSED)
+{
+ return 0;
+}
+#endif
+
struct virQEMUCapsCommandLineProps {
const char *option;
const char *param;
@@ -5344,6 +5375,9 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps,
if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
return -1;
+ if (virQEMUCapsProbeHVF(qemuCaps) < 0)
+ return -1;
+
type = virQEMUCapsGetVirtType(qemuCaps);
accel = virQEMUCapsGetAccel(qemuCaps, type);
--
2.31.1