]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Query hvf capability on macOS
authorRoman Bolshakov <r.bolshakov@yadro.com>
Fri, 19 Oct 2018 12:07:53 +0000 (15:07 +0300)
committerAndrea Bolognani <abologna@redhat.com>
Tue, 25 Jan 2022 15:53:39 +0000 (16:53 +0100)
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@yadro.com>
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Tested-by: Brad Laue <brad@brad-x.com>
Tested-by: Christophe Fergeau <cfergeau@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_capabilities.c

index 994dc3dad2b5990bb652f87b8dc2a666634ee213..d01be3e89257e92437230b70250af628cd4dcbda 100644 (file)
 #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
 
@@ -3192,6 +3196,42 @@ virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps,
     return 0;
 }
 
+#ifdef __APPLE__
+static int
+virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps)
+{
+    int hv_support = 0;
+    size_t len = sizeof(hv_support);
+    virArch hostArch = virArchFromHost();
+
+    /* Guest and host arch need to match for hardware acceleration
+     * to be usable */
+    if (qemuCaps->arch != hostArch)
+        return 0;
+
+    /* We don't have a nice way to probe whether the QEMU binary
+     * contains HVF support, but we know that versions older than
+     * QEMU 2.12 didn't have the feature at all */
+    if (qemuCaps->version < 2012000)
+        return 0;
+
+    /* We need the OS to report Hypervisor.framework availability */
+    if (sysctlbyname("kern.hv_support", &hv_support, &len, NULL, 0) < 0)
+        return 0;
+
+    if (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;
@@ -5333,6 +5373,9 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps,
     if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
         return -1;
 
+    if (virQEMUCapsProbeHVF(qemuCaps) < 0)
+        return -1;
+
     type = virQEMUCapsGetVirtType(qemuCaps);
     accel = virQEMUCapsGetAccel(qemuCaps, type);