1 /* 2 * QEMU Hypervisor.framework (HVF) support 3 * 4 * This work is licensed under the terms of the GNU GPL, version 2 or later. 5 * See the COPYING file in the top-level directory. 6 * 7 */ 8 9 /* header to be included in HVF-specific code */ 10 11 #ifndef HVF_INT_H 12 #define HVF_INT_H 13 14 #ifdef __aarch64__ 15 #include <Hypervisor/Hypervisor.h> 16 #else 17 #include <Hypervisor/hv.h> 18 #endif 19 20 /* hvf_slot flags */ 21 #define HVF_SLOT_LOG (1 << 0) 22 23 typedef struct hvf_slot { 24 uint64_t start; 25 uint64_t size; 26 uint8_t *mem; 27 int slot_id; 28 uint32_t flags; 29 MemoryRegion *region; 30 } hvf_slot; 31 32 typedef struct hvf_vcpu_caps { 33 uint64_t vmx_cap_pinbased; 34 uint64_t vmx_cap_procbased; 35 uint64_t vmx_cap_procbased2; 36 uint64_t vmx_cap_entry; 37 uint64_t vmx_cap_exit; 38 uint64_t vmx_cap_preemption_timer; 39 } hvf_vcpu_caps; 40 41 struct HVFState { 42 AccelState parent; 43 hvf_slot slots[32]; 44 int num_slots; 45 46 hvf_vcpu_caps *hvf_caps; 47 uint64_t vtimer_offset; 48 QTAILQ_HEAD(, hvf_sw_breakpoint) hvf_sw_breakpoints; 49 }; 50 extern HVFState *hvf_state; 51 52 struct AccelCPUState { 53 uint64_t fd; 54 void *exit; 55 bool vtimer_masked; 56 sigset_t unblock_ipi_mask; 57 bool guest_debug_enabled; 58 bool dirty; 59 }; 60 61 void assert_hvf_ok(hv_return_t ret); 62 int hvf_arch_init(void); 63 int hvf_arch_init_vcpu(CPUState *cpu); 64 void hvf_arch_vcpu_destroy(CPUState *cpu); 65 int hvf_vcpu_exec(CPUState *); 66 hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t); 67 int hvf_put_registers(CPUState *); 68 int hvf_get_registers(CPUState *); 69 void hvf_kick_vcpu_thread(CPUState *cpu); 70 71 #endif 72