qemu: Query hvf capability on macOS

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>
This commit is contained in:
Roman Bolshakov 2018-10-19 15:07:53 +03:00 committed by Andrea Bolognani
parent 171b5ee844
commit a339c27b15

View File

@ -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
@ -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);