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> 16a1477da3SAlexander Graf #else 17d57bc3c1SAlexander Graf #include <Hypervisor/hv.h> 18a1477da3SAlexander Graf #endif 19d57bc3c1SAlexander Graf 20861457ceSAlexander Graf /* hvf_slot flags */ 21861457ceSAlexander Graf #define HVF_SLOT_LOG (1 << 0) 22861457ceSAlexander Graf 23861457ceSAlexander Graf typedef struct hvf_slot { 24861457ceSAlexander Graf uint64_t start; 25861457ceSAlexander Graf uint64_t size; 26861457ceSAlexander Graf uint8_t *mem; 27861457ceSAlexander Graf int slot_id; 28861457ceSAlexander Graf uint32_t flags; 29861457ceSAlexander Graf MemoryRegion *region; 30861457ceSAlexander Graf } hvf_slot; 31861457ceSAlexander Graf 32861457ceSAlexander Graf typedef struct hvf_vcpu_caps { 33861457ceSAlexander Graf uint64_t vmx_cap_pinbased; 34861457ceSAlexander Graf uint64_t vmx_cap_procbased; 35861457ceSAlexander Graf uint64_t vmx_cap_procbased2; 36861457ceSAlexander Graf uint64_t vmx_cap_entry; 37861457ceSAlexander Graf uint64_t vmx_cap_exit; 38861457ceSAlexander Graf uint64_t vmx_cap_preemption_timer; 39861457ceSAlexander Graf } hvf_vcpu_caps; 40861457ceSAlexander Graf 41861457ceSAlexander Graf struct HVFState { 42861457ceSAlexander Graf AccelState parent; 43861457ceSAlexander Graf hvf_slot slots[32]; 44861457ceSAlexander Graf int num_slots; 45861457ceSAlexander Graf 46861457ceSAlexander Graf hvf_vcpu_caps *hvf_caps; 47a1477da3SAlexander Graf uint64_t vtimer_offset; 48f4152040SFrancesco Cagnin QTAILQ_HEAD(, hvf_sw_breakpoint) hvf_sw_breakpoints; 49861457ceSAlexander Graf }; 50861457ceSAlexander Graf extern HVFState *hvf_state; 51861457ceSAlexander Graf 52*3b295bcbSPhilippe Mathieu-Daudé struct AccelCPUState { 53a1477da3SAlexander Graf uint64_t fd; 54a1477da3SAlexander Graf void *exit; 55a1477da3SAlexander Graf bool vtimer_masked; 56219c101fSPeter Collingbourne sigset_t unblock_ipi_mask; 57eb2edc42SFrancesco Cagnin bool guest_debug_enabled; 58b533450eSAlexander Graf }; 59b533450eSAlexander Graf 60d57bc3c1SAlexander Graf void assert_hvf_ok(hv_return_t ret); 61ce7f5b1cSAlexander Graf int hvf_arch_init(void); 62cfe58455SAlexander Graf int hvf_arch_init_vcpu(CPUState *cpu); 63cfe58455SAlexander Graf void hvf_arch_vcpu_destroy(CPUState *cpu); 64d662ede2SAlexander Graf int hvf_vcpu_exec(CPUState *); 65358e7505SAlexander Graf hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t); 66358e7505SAlexander Graf int hvf_put_registers(CPUState *); 67358e7505SAlexander Graf int hvf_get_registers(CPUState *); 68a1477da3SAlexander Graf void hvf_kick_vcpu_thread(CPUState *cpu); 69d57bc3c1SAlexander Graf 70d57bc3c1SAlexander Graf #endif 71