1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef HAX_INTERFACE_H
18#define HAX_INTERFACE_H
19
20
21struct fx_layout {
22 uint16_t fcw;
23 uint16_t fsw;
24 uint8_t ftw;
25 uint8_t res1;
26 uint16_t fop;
27 union {
28 struct {
29 uint32_t fip;
30 uint16_t fcs;
31 uint16_t res2;
32 };
33 uint64_t fpu_ip;
34 };
35 union {
36 struct {
37 uint32_t fdp;
38 uint16_t fds;
39 uint16_t res3;
40 };
41 uint64_t fpu_dp;
42 };
43 uint32_t mxcsr;
44 uint32_t mxcsr_mask;
45 uint8_t st_mm[8][16];
46 uint8_t mmx_1[8][16];
47 uint8_t mmx_2[8][16];
48 uint8_t pad[96];
49} __attribute__ ((aligned(8)));
50
51struct vmx_msr {
52 uint64_t entry;
53 uint64_t value;
54} __attribute__ ((__packed__));
55
56
57
58
59
60#define HAX_MAX_MSR_ARRAY 0x20
61struct hax_msr_data {
62 uint16_t nr_msr;
63 uint16_t done;
64 uint16_t pad[2];
65 struct vmx_msr entries[HAX_MAX_MSR_ARRAY];
66} __attribute__ ((__packed__));
67
68union interruptibility_state_t {
69 uint32_t raw;
70 struct {
71 uint32_t sti_blocking:1;
72 uint32_t movss_blocking:1;
73 uint32_t smi_blocking:1;
74 uint32_t nmi_blocking:1;
75 uint32_t reserved:28;
76 };
77 uint64_t pad;
78};
79
80typedef union interruptibility_state_t interruptibility_state_t;
81
82
83struct segment_desc_t {
84 uint16_t selector;
85 uint16_t _dummy;
86 uint32_t limit;
87 uint64_t base;
88 union {
89 struct {
90 uint32_t type:4;
91 uint32_t desc:1;
92 uint32_t dpl:2;
93 uint32_t present:1;
94 uint32_t:4;
95 uint32_t available:1;
96 uint32_t long_mode:1;
97 uint32_t operand_size:1;
98 uint32_t granularity:1;
99 uint32_t null:1;
100 uint32_t:15;
101 };
102 uint32_t ar;
103 };
104 uint32_t ipad;
105};
106
107typedef struct segment_desc_t segment_desc_t;
108
109struct vcpu_state_t {
110 union {
111 uint64_t _regs[16];
112 struct {
113 union {
114 struct {
115 uint8_t _al, _ah;
116 };
117 uint16_t _ax;
118 uint32_t _eax;
119 uint64_t _rax;
120 };
121 union {
122 struct {
123 uint8_t _cl, _ch;
124 };
125 uint16_t _cx;
126 uint32_t _ecx;
127 uint64_t _rcx;
128 };
129 union {
130 struct {
131 uint8_t _dl, _dh;
132 };
133 uint16_t _dx;
134 uint32_t _edx;
135 uint64_t _rdx;
136 };
137 union {
138 struct {
139 uint8_t _bl, _bh;
140 };
141 uint16_t _bx;
142 uint32_t _ebx;
143 uint64_t _rbx;
144 };
145 union {
146 uint16_t _sp;
147 uint32_t _esp;
148 uint64_t _rsp;
149 };
150 union {
151 uint16_t _bp;
152 uint32_t _ebp;
153 uint64_t _rbp;
154 };
155 union {
156 uint16_t _si;
157 uint32_t _esi;
158 uint64_t _rsi;
159 };
160 union {
161 uint16_t _di;
162 uint32_t _edi;
163 uint64_t _rdi;
164 };
165
166 uint64_t _r8;
167 uint64_t _r9;
168 uint64_t _r10;
169 uint64_t _r11;
170 uint64_t _r12;
171 uint64_t _r13;
172 uint64_t _r14;
173 uint64_t _r15;
174 };
175 };
176
177 union {
178 uint32_t _eip;
179 uint64_t _rip;
180 };
181
182 union {
183 uint32_t _eflags;
184 uint64_t _rflags;
185 };
186
187 segment_desc_t _cs;
188 segment_desc_t _ss;
189 segment_desc_t _ds;
190 segment_desc_t _es;
191 segment_desc_t _fs;
192 segment_desc_t _gs;
193 segment_desc_t _ldt;
194 segment_desc_t _tr;
195
196 segment_desc_t _gdt;
197 segment_desc_t _idt;
198
199 uint64_t _cr0;
200 uint64_t _cr2;
201 uint64_t _cr3;
202 uint64_t _cr4;
203
204 uint64_t _dr0;
205 uint64_t _dr1;
206 uint64_t _dr2;
207 uint64_t _dr3;
208 uint64_t _dr6;
209 uint64_t _dr7;
210 uint64_t _pde;
211
212 uint32_t _efer;
213
214 uint32_t _sysenter_cs;
215 uint64_t _sysenter_eip;
216 uint64_t _sysenter_esp;
217
218 uint32_t _activity_state;
219 uint32_t pad;
220 interruptibility_state_t _interruptibility_state;
221};
222
223
224enum exit_status {
225
226 HAX_EXIT_IO = 1,
227
228 HAX_EXIT_MMIO,
229
230 HAX_EXIT_REAL,
231
232
233
234
235
236 HAX_EXIT_INTERRUPT,
237
238 HAX_EXIT_UNKNOWN_VMEXIT,
239
240 HAX_EXIT_HLT,
241
242 HAX_EXIT_STATECHANGE,
243
244 HAX_EXIT_PAUSED,
245 HAX_EXIT_FAST_MMIO,
246};
247
248
249
250
251
252
253
254struct hax_tunnel {
255 uint32_t _exit_reason;
256 uint32_t _exit_flag;
257 uint32_t _exit_status;
258 uint32_t user_event_pending;
259 int ready_for_interrupt_injection;
260 int request_interrupt_window;
261 union {
262 struct {
263
264#define HAX_EXIT_IO_IN 1
265#define HAX_EXIT_IO_OUT 0
266 uint8_t _direction;
267 uint8_t _df;
268 uint16_t _size;
269 uint16_t _port;
270 uint16_t _count;
271 uint8_t _flags;
272 uint8_t _pad0;
273 uint16_t _pad1;
274 uint32_t _pad2;
275 uint64_t _vaddr;
276 } pio;
277 struct {
278 uint64_t gla;
279 } mmio;
280 struct {
281 } state;
282 };
283} __attribute__ ((__packed__));
284
285struct hax_module_version {
286 uint32_t compat_version;
287 uint32_t cur_version;
288} __attribute__ ((__packed__));
289
290
291struct hax_qemu_version {
292
293 uint32_t cur_version;
294
295 uint32_t min_version;
296} __attribute__ ((__packed__));
297
298
299struct hax_tunnel_info {
300 uint64_t va;
301 uint64_t io_va;
302 uint16_t size;
303 uint16_t pad[3];
304} __attribute__ ((__packed__));
305
306struct hax_alloc_ram_info {
307 uint32_t size;
308 uint32_t pad;
309 uint64_t va;
310} __attribute__ ((__packed__));
311
312struct hax_ramblock_info {
313 uint64_t start_va;
314 uint64_t size;
315 uint64_t reserved;
316} __attribute__ ((__packed__));
317
318#define HAX_RAM_INFO_ROM 0x01
319#define HAX_RAM_INFO_INVALID 0x80
320struct hax_set_ram_info {
321 uint64_t pa_start;
322 uint32_t size;
323 uint8_t flags;
324 uint8_t pad[3];
325 uint64_t va;
326} __attribute__ ((__packed__));
327
328#define HAX_CAP_STATUS_WORKING 0x1
329#define HAX_CAP_STATUS_NOTWORKING 0x0
330#define HAX_CAP_WORKSTATUS_MASK 0x1
331
332#define HAX_CAP_FAILREASON_VT 0x1
333#define HAX_CAP_FAILREASON_NX 0x2
334
335#define HAX_CAP_MEMQUOTA 0x2
336#define HAX_CAP_UG 0x4
337#define HAX_CAP_64BIT_RAMBLOCK 0x8
338
339struct hax_capabilityinfo {
340
341
342
343
344
345 uint16_t wstatus;
346
347
348
349 uint16_t winfo;
350 uint32_t pad;
351 uint64_t mem_quota;
352} __attribute__ ((__packed__));
353
354struct hax_fastmmio {
355 uint64_t gpa;
356 union {
357 uint64_t value;
358 uint64_t gpa2;
359 };
360 uint8_t size;
361 uint8_t direction;
362 uint16_t reg_index;
363 uint32_t pad0;
364 uint64_t _cr0;
365 uint64_t _cr2;
366 uint64_t _cr3;
367 uint64_t _cr4;
368} __attribute__ ((__packed__));
369#endif
370