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