i386: hvf: add code base from Google's QEMU repository
This file begins tracking the files that will be the code base for HVF
support in QEMU. This code base is part of Google's QEMU version of
their Android emulator, and can be found at
https://android.googlesource.com/platform/external/qemu/+/emu-master-dev
This code is based on Veertu Inc's vdhh (Veertu Desktop Hosted
Hypervisor), found at https://github.com/veertuinc/vdhh. Everything is
appropriately licensed under GPL v2-or-later, except for the code inside
x86_task.c and x86_task.h, which, deriving from KVM (the Linux kernel),
is licensed GPL v2-only.
This code base already implements a very great deal of functionality,
although Google's version removed from Vertuu's the support for APIC
page and hyperv-related stuff. According to the Android Emulator Release
Notes, Revision 26.1.3 (August 2017), "Hypervisor.framework is now
enabled by default on macOS for 32-bit x86 images to improve performance
and macOS compatibility", although we better use with caution for, as the
same Revision warns us, "If you experience issues with it specifically,
please file a bug report...". The code hasn't seen much update in the
last 5 months, so I think that we can further develop the code with
occasional visiting Google's repository to see if there has been any
update.
On top of Google's code, the following changes were made:
- add code to the configure script to support the --enable-hvf argument.
If the OS is Darwin, it checks for presence of HVF in the system. The
patch also adds strings related to HVF in the file qemu-options.hx.
QEMU will only support the modern syntax style '-M accel=hvf' no enable
hvf; the legacy '-enable-hvf' will not be supported.
- fix styling issues
- add glue code to cpus.c
- move HVFX86EmulatorState field to CPUX86State, changing the
the emulation functions to have a parameter with signature 'CPUX86State *'
instead of 'CPUState *' so we don't have to get the 'env'.
Signed-off-by: Sergio Andres Gomez Del Real <Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-2-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-3-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-5-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-6-Sergio.G.DelReal@gmail.com>
Message-Id: <20170905035457.3753-7-Sergio.G.DelReal@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-09-13 12:05:09 +03:00
|
|
|
/*
|
|
|
|
* QEMU Hypervisor.framework (HVF) support
|
|
|
|
*
|
|
|
|
* Copyright Google Inc., 2017
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
|
|
* See the COPYING file in the top-level directory.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* header to be included in non-HVF-specific code */
|
|
|
|
#ifndef _HVF_H
|
|
|
|
#define _HVF_H
|
|
|
|
|
|
|
|
#include "config-host.h"
|
|
|
|
#include "qemu/osdep.h"
|
|
|
|
#include "qemu-common.h"
|
|
|
|
#include "qemu/bitops.h"
|
|
|
|
#include "exec/memory.h"
|
|
|
|
#include "sysemu/accel.h"
|
|
|
|
|
|
|
|
extern int hvf_disabled;
|
|
|
|
#ifdef CONFIG_HVF
|
|
|
|
#include <Hypervisor/hv.h>
|
|
|
|
#include <Hypervisor/hv_vmx.h>
|
|
|
|
#include <Hypervisor/hv_error.h>
|
|
|
|
#include "target/i386/cpu.h"
|
|
|
|
#include "hw/hw.h"
|
|
|
|
uint32_t hvf_get_supported_cpuid(uint32_t func, uint32_t idx,
|
|
|
|
int reg);
|
|
|
|
#define hvf_enabled() !hvf_disabled
|
|
|
|
#else
|
|
|
|
#define hvf_enabled() 0
|
|
|
|
#define hvf_get_supported_cpuid(func, idx, reg) 0
|
|
|
|
#endif
|
|
|
|
|
2017-09-13 12:05:20 +03:00
|
|
|
/* hvf_slot flags */
|
|
|
|
#define HVF_SLOT_LOG (1 << 0)
|
|
|
|
|
i386: hvf: add code base from Google's QEMU repository
This file begins tracking the files that will be the code base for HVF
support in QEMU. This code base is part of Google's QEMU version of
their Android emulator, and can be found at
https://android.googlesource.com/platform/external/qemu/+/emu-master-dev
This code is based on Veertu Inc's vdhh (Veertu Desktop Hosted
Hypervisor), found at https://github.com/veertuinc/vdhh. Everything is
appropriately licensed under GPL v2-or-later, except for the code inside
x86_task.c and x86_task.h, which, deriving from KVM (the Linux kernel),
is licensed GPL v2-only.
This code base already implements a very great deal of functionality,
although Google's version removed from Vertuu's the support for APIC
page and hyperv-related stuff. According to the Android Emulator Release
Notes, Revision 26.1.3 (August 2017), "Hypervisor.framework is now
enabled by default on macOS for 32-bit x86 images to improve performance
and macOS compatibility", although we better use with caution for, as the
same Revision warns us, "If you experience issues with it specifically,
please file a bug report...". The code hasn't seen much update in the
last 5 months, so I think that we can further develop the code with
occasional visiting Google's repository to see if there has been any
update.
On top of Google's code, the following changes were made:
- add code to the configure script to support the --enable-hvf argument.
If the OS is Darwin, it checks for presence of HVF in the system. The
patch also adds strings related to HVF in the file qemu-options.hx.
QEMU will only support the modern syntax style '-M accel=hvf' no enable
hvf; the legacy '-enable-hvf' will not be supported.
- fix styling issues
- add glue code to cpus.c
- move HVFX86EmulatorState field to CPUX86State, changing the
the emulation functions to have a parameter with signature 'CPUX86State *'
instead of 'CPUState *' so we don't have to get the 'env'.
Signed-off-by: Sergio Andres Gomez Del Real <Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-2-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-3-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-5-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-6-Sergio.G.DelReal@gmail.com>
Message-Id: <20170905035457.3753-7-Sergio.G.DelReal@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-09-13 12:05:09 +03:00
|
|
|
typedef struct hvf_slot {
|
|
|
|
uint64_t start;
|
|
|
|
uint64_t size;
|
|
|
|
uint8_t *mem;
|
|
|
|
int slot_id;
|
2017-09-13 12:05:20 +03:00
|
|
|
uint32_t flags;
|
|
|
|
MemoryRegion *region;
|
i386: hvf: add code base from Google's QEMU repository
This file begins tracking the files that will be the code base for HVF
support in QEMU. This code base is part of Google's QEMU version of
their Android emulator, and can be found at
https://android.googlesource.com/platform/external/qemu/+/emu-master-dev
This code is based on Veertu Inc's vdhh (Veertu Desktop Hosted
Hypervisor), found at https://github.com/veertuinc/vdhh. Everything is
appropriately licensed under GPL v2-or-later, except for the code inside
x86_task.c and x86_task.h, which, deriving from KVM (the Linux kernel),
is licensed GPL v2-only.
This code base already implements a very great deal of functionality,
although Google's version removed from Vertuu's the support for APIC
page and hyperv-related stuff. According to the Android Emulator Release
Notes, Revision 26.1.3 (August 2017), "Hypervisor.framework is now
enabled by default on macOS for 32-bit x86 images to improve performance
and macOS compatibility", although we better use with caution for, as the
same Revision warns us, "If you experience issues with it specifically,
please file a bug report...". The code hasn't seen much update in the
last 5 months, so I think that we can further develop the code with
occasional visiting Google's repository to see if there has been any
update.
On top of Google's code, the following changes were made:
- add code to the configure script to support the --enable-hvf argument.
If the OS is Darwin, it checks for presence of HVF in the system. The
patch also adds strings related to HVF in the file qemu-options.hx.
QEMU will only support the modern syntax style '-M accel=hvf' no enable
hvf; the legacy '-enable-hvf' will not be supported.
- fix styling issues
- add glue code to cpus.c
- move HVFX86EmulatorState field to CPUX86State, changing the
the emulation functions to have a parameter with signature 'CPUX86State *'
instead of 'CPUState *' so we don't have to get the 'env'.
Signed-off-by: Sergio Andres Gomez Del Real <Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-2-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-3-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-5-Sergio.G.DelReal@gmail.com>
Message-Id: <20170913090522.4022-6-Sergio.G.DelReal@gmail.com>
Message-Id: <20170905035457.3753-7-Sergio.G.DelReal@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-09-13 12:05:09 +03:00
|
|
|
} hvf_slot;
|
|
|
|
|
|
|
|
typedef struct hvf_vcpu_caps {
|
|
|
|
uint64_t vmx_cap_pinbased;
|
|
|
|
uint64_t vmx_cap_procbased;
|
|
|
|
uint64_t vmx_cap_procbased2;
|
|
|
|
uint64_t vmx_cap_entry;
|
|
|
|
uint64_t vmx_cap_exit;
|
|
|
|
uint64_t vmx_cap_preemption_timer;
|
|
|
|
} hvf_vcpu_caps;
|
|
|
|
|
|
|
|
typedef struct HVFState {
|
|
|
|
AccelState parent;
|
|
|
|
hvf_slot slots[32];
|
|
|
|
int num_slots;
|
|
|
|
|
|
|
|
hvf_vcpu_caps *hvf_caps;
|
|
|
|
} HVFState;
|
|
|
|
extern HVFState *hvf_state;
|
|
|
|
|
|
|
|
void hvf_set_phys_mem(MemoryRegionSection *, bool);
|
|
|
|
void hvf_handle_io(CPUArchState *, uint16_t, void *,
|
|
|
|
int, int, int);
|
|
|
|
hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
|
|
|
|
|
|
|
|
/* Disable HVF if |disable| is 1, otherwise, enable it iff it is supported by
|
|
|
|
* the host CPU. Use hvf_enabled() after this to get the result. */
|
|
|
|
void hvf_disable(int disable);
|
|
|
|
|
|
|
|
/* Returns non-0 if the host CPU supports the VMX "unrestricted guest" feature
|
|
|
|
* which allows the virtual CPU to directly run in "real mode". If true, this
|
|
|
|
* allows QEMU to run several vCPU threads in parallel (see cpus.c). Otherwise,
|
|
|
|
* only a a single TCG thread can run, and it will call HVF to run the current
|
|
|
|
* instructions, except in case of "real mode" (paging disabled, typically at
|
|
|
|
* boot time), or MMIO operations. */
|
|
|
|
|
|
|
|
int hvf_sync_vcpus(void);
|
|
|
|
|
|
|
|
int hvf_init_vcpu(CPUState *);
|
|
|
|
int hvf_vcpu_exec(CPUState *);
|
|
|
|
int hvf_smp_cpu_exec(CPUState *);
|
|
|
|
void hvf_cpu_synchronize_state(CPUState *);
|
|
|
|
void hvf_cpu_synchronize_post_reset(CPUState *);
|
|
|
|
void hvf_cpu_synchronize_post_init(CPUState *);
|
|
|
|
void _hvf_cpu_synchronize_post_init(CPUState *, run_on_cpu_data);
|
|
|
|
|
|
|
|
void hvf_vcpu_destroy(CPUState *);
|
|
|
|
void hvf_raise_event(CPUState *);
|
|
|
|
/* void hvf_reset_vcpu_state(void *opaque); */
|
|
|
|
void hvf_reset_vcpu(CPUState *);
|
|
|
|
void vmx_update_tpr(CPUState *);
|
|
|
|
void update_apic_tpr(CPUState *);
|
|
|
|
int hvf_put_registers(CPUState *);
|
|
|
|
void vmx_clear_int_window_exiting(CPUState *cpu);
|
|
|
|
|
|
|
|
#define TYPE_HVF_ACCEL ACCEL_CLASS_NAME("hvf")
|
|
|
|
|
|
|
|
#define HVF_STATE(obj) \
|
|
|
|
OBJECT_CHECK(HVFState, (obj), TYPE_HVF_ACCEL)
|
|
|
|
|
|
|
|
#endif
|