1d57bc3c1SAlexander Graf /* 2d57bc3c1SAlexander Graf * QEMU Hypervisor.framework (HVF) support 3d57bc3c1SAlexander Graf * 4d57bc3c1SAlexander Graf * This work is licensed under the terms of the GNU GPL, version 2 or later. 5d57bc3c1SAlexander Graf * See the COPYING file in the top-level directory. 6d57bc3c1SAlexander Graf * 7d57bc3c1SAlexander Graf */ 8d57bc3c1SAlexander Graf 9d57bc3c1SAlexander Graf /* header to be included in HVF-specific code */ 10d57bc3c1SAlexander Graf 11d57bc3c1SAlexander Graf #ifndef HVF_INT_H 12d57bc3c1SAlexander Graf #define HVF_INT_H 13d57bc3c1SAlexander Graf 14a1477da3SAlexander Graf #ifdef __aarch64__ 15a1477da3SAlexander Graf #include <Hypervisor/Hypervisor.h> 16f21f0cbcSPhil Dennis-Jordan typedef hv_vcpu_t hvf_vcpuid; 17a1477da3SAlexander Graf #else 18d57bc3c1SAlexander Graf #include <Hypervisor/hv.h> 19f21f0cbcSPhil Dennis-Jordan typedef hv_vcpuid_t hvf_vcpuid; 20a1477da3SAlexander Graf #endif 21d57bc3c1SAlexander Graf 22861457ceSAlexander Graf /* hvf_slot flags */ 23861457ceSAlexander Graf #define HVF_SLOT_LOG (1 << 0) 24861457ceSAlexander Graf 25861457ceSAlexander Graf typedef struct hvf_slot { 26861457ceSAlexander Graf uint64_t start; 27861457ceSAlexander Graf uint64_t size; 28861457ceSAlexander Graf uint8_t *mem; 29861457ceSAlexander Graf int slot_id; 30861457ceSAlexander Graf uint32_t flags; 31861457ceSAlexander Graf MemoryRegion *region; 32861457ceSAlexander Graf } hvf_slot; 33861457ceSAlexander Graf 34861457ceSAlexander Graf typedef struct hvf_vcpu_caps { 35861457ceSAlexander Graf uint64_t vmx_cap_pinbased; 36861457ceSAlexander Graf uint64_t vmx_cap_procbased; 37861457ceSAlexander Graf uint64_t vmx_cap_procbased2; 38861457ceSAlexander Graf uint64_t vmx_cap_entry; 39861457ceSAlexander Graf uint64_t vmx_cap_exit; 40861457ceSAlexander Graf uint64_t vmx_cap_preemption_timer; 41861457ceSAlexander Graf } hvf_vcpu_caps; 42861457ceSAlexander Graf 43861457ceSAlexander Graf struct HVFState { 44861457ceSAlexander Graf AccelState parent; 45861457ceSAlexander Graf hvf_slot slots[32]; 46861457ceSAlexander Graf int num_slots; 47861457ceSAlexander Graf 48861457ceSAlexander Graf hvf_vcpu_caps *hvf_caps; 49a1477da3SAlexander Graf uint64_t vtimer_offset; 50f4152040SFrancesco Cagnin QTAILQ_HEAD(, hvf_sw_breakpoint) hvf_sw_breakpoints; 51861457ceSAlexander Graf }; 52861457ceSAlexander Graf extern HVFState *hvf_state; 53861457ceSAlexander Graf 543b295bcbSPhilippe Mathieu-Daudé struct AccelCPUState { 55f21f0cbcSPhil Dennis-Jordan hvf_vcpuid fd; 56a1477da3SAlexander Graf void *exit; 57a1477da3SAlexander Graf bool vtimer_masked; 58219c101fSPeter Collingbourne sigset_t unblock_ipi_mask; 59eb2edc42SFrancesco Cagnin bool guest_debug_enabled; 60e6203636SPhilippe Mathieu-Daudé bool dirty; 61b533450eSAlexander Graf }; 62b533450eSAlexander Graf 63a3c67dfcSPhil Dennis-Jordan void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line, 64a3c67dfcSPhil Dennis-Jordan const char *exp); 65a3c67dfcSPhil Dennis-Jordan #define assert_hvf_ok(EX) assert_hvf_ok_impl((EX), __FILE__, __LINE__, #EX) 66a3c67dfcSPhil Dennis-Jordan const char *hvf_return_string(hv_return_t ret); 67ce7f5b1cSAlexander Graf int hvf_arch_init(void); 68*2c760670SDanny Canter hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range); 69cfe58455SAlexander Graf int hvf_arch_init_vcpu(CPUState *cpu); 70cfe58455SAlexander Graf void hvf_arch_vcpu_destroy(CPUState *cpu); 71d662ede2SAlexander Graf int hvf_vcpu_exec(CPUState *); 72358e7505SAlexander Graf hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t); 73358e7505SAlexander Graf int hvf_put_registers(CPUState *); 74358e7505SAlexander Graf int hvf_get_registers(CPUState *); 75a1477da3SAlexander Graf void hvf_kick_vcpu_thread(CPUState *cpu); 76d57bc3c1SAlexander Graf 77d57bc3c1SAlexander Graf #endif 78