hax-interface.h (8766B)
1/* 2 * QEMU HAXM support 3 * 4 * Copyright (c) 2011 Intel Corporation 5 * Written by: 6 * Jiang Yunhong<yunhong.jiang@intel.com> 7 * Xin Xiaohui<xiaohui.xin@intel.com> 8 * Zhang Xiantao<xiantao.zhang@intel.com> 9 * 10 * This work is licensed under the terms of the GNU GPL, version 2 or later. 11 * See the COPYING file in the top-level directory. 12 * 13 */ 14 15/* Interface with HAX kernel module */ 16 17#ifndef HAX_INTERFACE_H 18#define HAX_INTERFACE_H 19 20/* fx_layout has 3 formats table 3-56, 512bytes */ 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 * Fixed array is not good, but it makes Mac support a bit easier by avoiding 58 * memory map or copyin staff. 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/* Segment descriptor */ 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/* HAX exit status */ 224enum exit_status { 225 /* IO port request */ 226 HAX_EXIT_IO = 1, 227 /* MMIO instruction emulation */ 228 HAX_EXIT_MMIO, 229 /* QEMU emulation mode request, currently means guest enter non-PG mode */ 230 HAX_EXIT_REAL, 231 /* 232 * Interrupt window open, qemu can inject interrupt now 233 * Also used when signal pending since at that time qemu usually need 234 * check interrupt 235 */ 236 HAX_EXIT_INTERRUPT, 237 /* Unknown vmexit, mostly trigger reboot */ 238 HAX_EXIT_UNKNOWN_VMEXIT, 239 /* HALT from guest */ 240 HAX_EXIT_HLT, 241 /* Reboot request, like because of tripple fault in guest */ 242 HAX_EXIT_STATECHANGE, 243 /* the vcpu is now only paused when destroy, so simply return to hax */ 244 HAX_EXIT_PAUSED, 245 HAX_EXIT_FAST_MMIO, 246}; 247 248/* 249 * The interface definition: 250 * 1. vcpu_run execute will return 0 on success, otherwise mean failed 251 * 2. exit_status return the exit reason, as stated in enum exit_status 252 * 3. exit_reason is the vmx exit reason 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 /* 0: read, 1: write */ 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/* This interface is support only after API version 2 */ 291struct hax_qemu_version { 292 /* Current API version in QEMU */ 293 uint32_t cur_version; 294 /* The minimum API version supported by QEMU */ 295 uint32_t min_version; 296} __attribute__ ((__packed__)); 297 298/* The mac specfic interface to qemu, mostly is ioctl related */ 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 /* Read-Only */ 319#define HAX_RAM_INFO_INVALID 0x80 /* Unmapped, usually used for MMIO */ 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 /* bit 0: 1 - working 341 * 0 - not working, possibly because NT/NX disabled 342 * bit 1: 1 - memory limitation working 343 * 0 - no memory limitation 344 */ 345 uint16_t wstatus; 346 /* valid when not working 347 * bit 0: VT not enabeld 348 * bit 1: NX not enabled*/ 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; /* since HAX API v4 */ 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