1e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* 2e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** Copyright (c) 2011, Intel Corporation 3e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** 4e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** This software is licensed under the terms of the GNU General Public 5e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** License version 2, as published by the Free Software Foundation, and 6e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** may be copied, distributed, and modified under those terms. 7e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** 8e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** This program is distributed in the hope that it will be useful, 9e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** but WITHOUT ANY WARRANTY; without even the implied warranty of 10e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima** GNU General Public License for more details. 12e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima*/ 13e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 14e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#ifndef _HAX_INTERFACE_H 15e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define _HAX_INTERFACE_H 16e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 17e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* 18e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Common data structure for HAX interface on both Mac and Windows 19e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * The IOCTL is defined in hax-darwin.h and hax-windows.h 20e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 21e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 22e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* fx_layout according to Intel SDM */ 23e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct fx_layout { 24e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t fcw; 25e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t fsw; 26e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 ftw; 27e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 res1; 28e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t fop; 29e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 30e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 31e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 fip; 32e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t fcs; 33e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t res2; 34e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 35e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 fpu_ip; 36e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 37e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 38e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 39e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 fdp; 40e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t fds; 41e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t res3; 42e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 43e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 fpu_dp; 44e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 45e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 mxcsr; 46e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 mxcsr_mask; 47e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 st_mm[8][16]; 48e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 mmx_1[8][16]; 49e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 mmx_2[8][16]; 50e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 pad[96]; 51e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 52e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 53e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct vmx_msr { 54e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 entry; 55e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 value; 56e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 57e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 58e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* 59e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Use fixed-size array to make Mac OS X support efficient by avoiding 60e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * use memory map or copy-in routines. 61e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 62e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_MAX_MSR_ARRAY 0x20 63e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct hax_msr_data 64e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 65e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t nr_msr; 66e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t done; 67e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t pad[2]; 68e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct vmx_msr entries[HAX_MAX_MSR_ARRAY]; 69e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 70e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 71e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimaunion interruptibility_state_t { 72e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 raw; 73e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 74e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 sti_blocking : 1; 75e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 movss_blocking : 1; 76e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 smi_blocking : 1; 77e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 nmi_blocking : 1; 78e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 reserved : 28; 79e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 80e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t pad; 81e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 82e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 83e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimatypedef union interruptibility_state_t interruptibility_state_t; 84e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 85e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima// Segment descriptor 86e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct segment_desc_t { 87e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t selector; 88e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _dummy; 89e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 limit; 90e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 base; 91e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 92e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 93e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 type : 4; 94e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 desc : 1; 95e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 dpl : 2; 96e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 present : 1; 97e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 : 4; 98e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 available : 1; 99e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 long_mode : 1; 100e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 operand_size : 1; 101e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 granularity : 1; 102e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 null : 1; 103e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 : 15; 104e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 105e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 ar; 106e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 107e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 ipad; 108e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 109e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 110e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimatypedef struct segment_desc_t segment_desc_t; 111e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 112e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct vcpu_state_t 113e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 114e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 115e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _regs[16]; 116e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 117e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 118e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 119e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 _al, 120e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima _ah; 121e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 122e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _ax; 123e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _eax; 124e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rax; 125e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 126e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 127e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 128e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 _cl, 129e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima _ch; 130e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 131e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _cx; 132e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _ecx; 133e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rcx; 134e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 135e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 136e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 137e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 _dl, 138e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima _dh; 139e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 140e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _dx; 141e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _edx; 142e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rdx; 143e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 144e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 145e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 146e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8 _bl, 147e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima _bh; 148e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 149e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _bx; 150e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _ebx; 151e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rbx; 152e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 153e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 154e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _sp; 155e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _esp; 156e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rsp; 157e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 158e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 159e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _bp; 160e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _ebp; 161e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rbp; 162e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 163e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 164e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _si; 165e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _esi; 166e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rsi; 167e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 168e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 169e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _di; 170e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _edi; 171e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rdi; 172e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 173e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 174e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r8; 175e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r9; 176e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r10; 177e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r11; 178e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r12; 179e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r13; 180e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r14; 181e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _r15; 182e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 183e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 184e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 185e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 186e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _eip; 187e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rip; 188e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 189e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 190e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 191e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _eflags; 192e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _rflags; 193e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 194e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 195e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _cs; 196e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _ss; 197e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _ds; 198e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _es; 199e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _fs; 200e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _gs; 201e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _ldt; 202e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _tr; 203e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 204e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _gdt; 205e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima segment_desc_t _idt; 206e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 207e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _cr0; 208e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _cr2; 209e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _cr3; 210e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _cr4; 211e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 212e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _dr0; 213e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _dr1; 214e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _dr2; 215e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _dr3; 216e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _dr6; 217e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _dr7; 218e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _pde; 219e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 220e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _efer; 221e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 222e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _sysenter_cs; 223e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _sysenter_eip; 224e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64 _sysenter_esp; 225e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 226e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 _activity_state; 227e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32 pad; 228e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima interruptibility_state_t _interruptibility_state; 229e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 230e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 231e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* 232e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * HAX tunnel is a per-vCPU shared memory between QEMU and HAX driver 233e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * It is used to pass information between QEMU and HAX driver, like KVM_RUN 234e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 235e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * In HAX_VCPU_IOCTL_SETUP_TUNNEL ioctl, HAX driver allocats the memory, maps 236e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * it to QEMU virtual address space and returns the virtual address and size to 237e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * QEMU through hax_tunnel_info structure 238e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 239e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct hax_tunnel 240e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 241e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t _exit_reason; 242e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t _exit_flag; 243e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t _exit_status; 244e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t user_event_pending; 245e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima int ready_for_interrupt_injection; 246e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima int request_interrupt_window; 247e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima union { 248e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 249e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* 0: read, 1: write */ 250e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_EXIT_IO_IN 1 251e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_EXIT_IO_OUT 0 252e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8_t _direction; 253e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8_t _df; 254e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _size; 255e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _port; 256e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _count; 257e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8_t _flags; 258e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8_t _pad0; 259e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t _pad1; 260e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t _pad2; 261e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t _vaddr; 262e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima } pio; 263e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 264e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t gla; 265e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima } mmio; 266e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima struct { 267e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima } state; 268e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima }; 269e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 270e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 271e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct hax_tunnel_info 272e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 273e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t va; 274e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t io_va; 275e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t size; 276e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint16_t pad[3]; 277e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 278e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 279e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* The exit reason in HAX tunnel for HAX_VCPU_IOCTL_RUN IOCTL */ 280e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimaenum exit_status { 281e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* IO port emulation request */ 282e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_IO = 1, 283e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* MMIO instruction emulation request 284e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * QEMU emulates MMIO instruction in following step: 285e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 1. When guest accesses MMIO address, it is trapped to HAX driver 286e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 2. HAX driver return back to QEMU with the instruction pointer address 287e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 3. QEMU sync the vcpu state with HAX driver 288e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 4. QEMU emulates this instruction 289e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 5. QEMU sync the vcpu state to HAX driver 290e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * 6. HAX driver continuous run the guest through HAX_VCPU_IOCTL_RUN 291e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 292e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_MMIO, 293e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* 294e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * QEMU emulation mode request 295e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * QEMU emulates guest instruction when guest is running in 296e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * real mode or protected mode 297e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 298e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_REAL, 299e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* 300e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Interrupt window open, qemu can inject an interrupt now. 301e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Also used to indicate a signal is pending to QEMU 302e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 303e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_INTERRUPT, 304e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* Unknown vmexit, mostly trigger reboot */ 305e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_UNKNOWN_VMEXIT, 306e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* 307e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Halt in guest 308e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * When guest executes HLT instruction with interrupt enabled, HAX 309e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * return back to QEMU. 310e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 311e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_HLT, 312e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* Reboot request, like because of tripple fault in guest */ 313e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_STATECHANGE, 314e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima /* 315e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * The VCPU is paused 316e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Now the vcpu is only paused when to be destroid, so simply return to hax 317e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 318e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima HAX_EXIT_PAUSED, 319fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong /* from API 2.0 */ 320fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong /* 321fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong * In API 1.0, HAXM driver utilizes QEMU to decode and emulate MMIO 322fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong * operations. 323fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong * From 2.0, HAXM driver will decode some MMIO instructions to improve 324fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong * MMIO handling performance, especially for GLES hardware acceleration 325fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong */ 326fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong HAX_EXIT_FAST_MMIO, 327e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 328e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 329e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* 330e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * The API version between QEMU and HAX driver 331e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima * Compat_version defines the oldest API version the HAX driver can support 332e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima */ 333e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct hax_module_version 334e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 335e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t compat_version; 336e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t cur_version; 337e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 338e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 3398a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong/* This interface is support only after API version 2 */ 3408a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhongstruct hax_qemu_version 3418a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong{ 3428a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong /* Current API version in QEMU*/ 3438a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong uint32_t cur_version; 3448a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong /* The least API version supported by QEMU */ 3458a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong uint32_t least_version; 3468a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong}; 3478a539eaab40dc7a8047dbf97c081467029e6c518Jiang, Yunhong 348e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* See comments for HAX_VM_IOCTL_ALLOC_RAM ioctl */ 349e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct hax_alloc_ram_info 350e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 351e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t size; 352e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t pad; 353e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t va; 354e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 355e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 356e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima/* See comments for HAX_VM_IOCTL_SET_RAM ioctl */ 357e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#define HAX_RAM_INFO_ROM 0x1 358e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajimastruct hax_set_ram_info 359e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima{ 360e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t pa_start; 361e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint32_t size; 362e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8_t flags; 363e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint8_t pad[3]; 364e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima uint64_t va; 365e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima}; 366e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima 3674a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong/* 3684a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * We need to load the HAXM (HAX Manager) to tell if the host system has the 3694a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * required capabilities to operate, and we use hax_capabilityinfo to get such 3704a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * info from HAXM. 3714a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * 3724a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * To prevent HAXM from over-consuming RAM, we set the maximum amount of RAM 3734a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * that can be used for guests at HAX installation time. Once the quota is 3744a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * reached, HAXM will no longer attempt to allocate memory for guests. 3754a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * Detect that HAXM is out of quota can take the emulator to non-HAXM model 3764a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong */ 3774a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhongstruct hax_capabilityinfo 3784a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong{ 3794a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong /* bit 0: 1 - HAXM is working 3804a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * 0 - HAXM is not working possibly because VT/NX is disabled 3814a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong NX means Non-eXecution, aks. XD (eXecution Disable) 3824a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * bit 1: 1 - HAXM has hard limit on how many RAM can be used as guest RAM 3834a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * 0 - HAXM has no memory limitation 3844a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong */ 3854a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_CAP_STATUS_WORKING 0x1 3864a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_CAP_STATUS_NOTWORKING 0x0 3874a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_CAP_WORKSTATUS_MASK 0x1 3884a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_CAP_MEMQUOTA 0x2 3894a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong uint16_t wstatus; 3904a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong /* 3914a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * valid when HAXM is not working 3924a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * bit 0: HAXM is not working because VT is not enabeld 3934a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong * bit 1: HAXM is not working because NX not enabled 3944a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong */ 3954a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_CAP_FAILREASON_VT 0x1 3964a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong#define HAX_CAP_FAILREASON_NX 0x2 3974a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong uint16_t winfo; 3984a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong uint32_t pad; 3994a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong uint64_t mem_quota; 4004a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong}; 4014a5a0efd49f100c7d53920807c83d9c74304ecd8Jiang, Yunhong 402fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong/* API 2.0 */ 403fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong 404fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhongstruct hax_fastmmio 405fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong{ 406fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint64_t gpa; 407fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint64_t value; 408fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint8_t size; 409fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint8_t direction; 410fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint16_t reg_index; 411fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint32_t pad0; 412fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint64_t _cr0; 413fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint64_t _cr2; 414fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint64_t _cr3; 415fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong uint64_t _cr4; 416fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong}; 417fba19d9f0bf94a11e87dd09e230b621025436b76Jiang, Yunhong 418e4a3c7801e0075a49674c79972394ad962b338f2Jun Nakajima#endif 419