xref: /openbmc/qemu/include/sysemu/hvf_int.h (revision 28ae3179fc52d2e4d870b635c4a412aab99759e7)
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