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