| /* | |
| * QEMU Hypervisor.framework (HVF) support | |
| * | |
| * 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 HVF-specific code */ | |
| #ifndef HVF_INT_H | |
| #define HVF_INT_H | |
| #include "qemu/queue.h" | |
| #include "exec/vaddr.h" | |
| #include "gdbstub/enums.h" | |
| #include "qom/object.h" | |
| #include "accel/accel-ops.h" | |
| #ifdef __aarch64__ | |
| #include <Hypervisor/Hypervisor.h> | |
| typedef hv_vcpu_t hvf_vcpuid; | |
| #else | |
| #include <Hypervisor/hv.h> | |
| typedef hv_vcpuid_t hvf_vcpuid; | |
| #endif | |
| 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; | |
| struct HVFState { | |
| AccelState parent_obj; | |
| hvf_vcpu_caps *hvf_caps; | |
| uint64_t vtimer_offset; | |
| QTAILQ_HEAD(, hvf_sw_breakpoint) hvf_sw_breakpoints; | |
| }; | |
| extern HVFState *hvf_state; | |
| struct AccelCPUState { | |
| hvf_vcpuid fd; | |
| #ifdef __aarch64__ | |
| hv_vcpu_exit_t *exit; | |
| bool vtimer_masked; | |
| bool guest_debug_enabled; | |
| struct QEMUTimer *wfi_timer; | |
| #endif | |
| }; | |
| void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line, | |
| const char *exp); | |
| #define assert_hvf_ok(EX) assert_hvf_ok_impl((EX), __FILE__, __LINE__, #EX) | |
| const char *hvf_return_string(hv_return_t ret); | |
| int hvf_arch_init(void); | |
| hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range); | |
| uint32_t hvf_arch_get_default_ipa_bit_size(void); | |
| uint32_t hvf_arch_get_max_ipa_bit_size(void); | |
| void hvf_kick_vcpu_thread(CPUState *cpu); | |
| /* Must be called by the owning thread */ | |
| int hvf_arch_init_vcpu(CPUState *cpu); | |
| /* Must be called by the owning thread */ | |
| void hvf_arch_vcpu_destroy(CPUState *cpu); | |
| /* Must be called by the owning thread */ | |
| int hvf_arch_vcpu_exec(CPUState *); | |
| /* Must be called by the owning thread */ | |
| int hvf_arch_put_registers(CPUState *); | |
| /* Must be called by the owning thread */ | |
| int hvf_arch_get_registers(CPUState *); | |
| /* Must be called by the owning thread */ | |
| void hvf_arch_update_guest_debug(CPUState *cpu); | |
| void hvf_protect_clean_range(hwaddr addr, size_t size); | |
| void hvf_unprotect_dirty_range(hwaddr addr, size_t size); | |
| struct hvf_sw_breakpoint { | |
| vaddr pc; | |
| vaddr saved_insn; | |
| int use_count; | |
| QTAILQ_ENTRY(hvf_sw_breakpoint) entry; | |
| }; | |
| struct hvf_sw_breakpoint *hvf_find_sw_breakpoint(CPUState *cpu, | |
| vaddr pc); | |
| int hvf_sw_breakpoints_active(CPUState *cpu); | |
| int hvf_arch_insert_sw_breakpoint(CPUState *cpu, struct hvf_sw_breakpoint *bp); | |
| int hvf_arch_remove_sw_breakpoint(CPUState *cpu, struct hvf_sw_breakpoint *bp); | |
| int hvf_arch_insert_gdbstub_hw_breakpoint(vaddr addr, vaddr len, | |
| GdbBreakpointType type); | |
| int hvf_arch_remove_gdbstub_hw_breakpoint(vaddr addr, vaddr len, | |
| GdbBreakpointType type); | |
| void hvf_arch_remove_all_gdbstub_hw_breakpoints(void); | |
| /* | |
| * hvf_update_guest_debug: | |
| * @cs: CPUState for the CPU to update | |
| * | |
| * Update guest to enable or disable debugging. Per-arch specifics will be | |
| * handled by calling down to hvf_arch_update_guest_debug. | |
| */ | |
| void hvf_update_guest_debug(CPUState *cpu); | |
| bool hvf_arch_cpu_realize(CPUState *cpu, Error **errp); | |
| uint32_t hvf_arch_get_default_ipa_bit_size(void); | |
| uint32_t hvf_arch_get_max_ipa_bit_size(void); | |
| #endif |