master
h 957 lines 30.7 KB
Raw
1 /*
2 * Userspace interfaces for /dev/mshv* devices and derived fds
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #ifndef HW_HYPERV_HVGDK_MINI_H
8 #define HW_HYPERV_HVGDK_MINI_H
9
10 #define MSHV_IOCTL 0xB8
11
12 /* Hyper-V specific model specific registers (MSRs) */
13
14 /* HV_X64_SYNTHETIC_MSR */
15 #define HV_X64_MSR_GUEST_OS_ID 0x40000000
16 #define HV_X64_MSR_HYPERCALL 0x40000001
17 #define HV_X64_MSR_VP_INDEX 0x40000002
18 #define HV_X64_MSR_RESET 0x40000003
19 #define HV_X64_MSR_VP_RUNTIME 0x40000010
20 #define HV_X64_MSR_TIME_REF_COUNT 0x40000020
21 #define HV_X64_MSR_REFERENCE_TSC 0x40000021
22 #define HV_X64_MSR_TSC_FREQUENCY 0x40000022
23 #define HV_X64_MSR_APIC_FREQUENCY 0x40000023
24
25 typedef enum hv_register_name {
26 /* VP Management Registers */
27 HV_REGISTER_INTERNAL_ACTIVITY_STATE = 0x00000004,
28
29 /* Pending Interruption Register */
30 HV_REGISTER_PENDING_INTERRUPTION = 0x00010002,
31 HV_REGISTER_INTERRUPT_STATE = 0x00010003,
32 HV_REGISTER_PENDING_EVENT0 = 0x00010004,
33 HV_REGISTER_PENDING_EVENT1 = 0x00010005,
34
35 /* X64 User-Mode Registers */
36 HV_X64_REGISTER_RAX = 0x00020000,
37 HV_X64_REGISTER_RCX = 0x00020001,
38 HV_X64_REGISTER_RDX = 0x00020002,
39 HV_X64_REGISTER_RBX = 0x00020003,
40 HV_X64_REGISTER_RSP = 0x00020004,
41 HV_X64_REGISTER_RBP = 0x00020005,
42 HV_X64_REGISTER_RSI = 0x00020006,
43 HV_X64_REGISTER_RDI = 0x00020007,
44 HV_X64_REGISTER_R8 = 0x00020008,
45 HV_X64_REGISTER_R9 = 0x00020009,
46 HV_X64_REGISTER_R10 = 0x0002000A,
47 HV_X64_REGISTER_R11 = 0x0002000B,
48 HV_X64_REGISTER_R12 = 0x0002000C,
49 HV_X64_REGISTER_R13 = 0x0002000D,
50 HV_X64_REGISTER_R14 = 0x0002000E,
51 HV_X64_REGISTER_R15 = 0x0002000F,
52 HV_X64_REGISTER_RIP = 0x00020010,
53 HV_X64_REGISTER_RFLAGS = 0x00020011,
54
55 /* X64 Floating Point and Vector Registers */
56 HV_X64_REGISTER_XMM0 = 0x00030000,
57 HV_X64_REGISTER_XMM1 = 0x00030001,
58 HV_X64_REGISTER_XMM2 = 0x00030002,
59 HV_X64_REGISTER_XMM3 = 0x00030003,
60 HV_X64_REGISTER_XMM4 = 0x00030004,
61 HV_X64_REGISTER_XMM5 = 0x00030005,
62 HV_X64_REGISTER_XMM6 = 0x00030006,
63 HV_X64_REGISTER_XMM7 = 0x00030007,
64 HV_X64_REGISTER_XMM8 = 0x00030008,
65 HV_X64_REGISTER_XMM9 = 0x00030009,
66 HV_X64_REGISTER_XMM10 = 0x0003000A,
67 HV_X64_REGISTER_XMM11 = 0x0003000B,
68 HV_X64_REGISTER_XMM12 = 0x0003000C,
69 HV_X64_REGISTER_XMM13 = 0x0003000D,
70 HV_X64_REGISTER_XMM14 = 0x0003000E,
71 HV_X64_REGISTER_XMM15 = 0x0003000F,
72 HV_X64_REGISTER_FP_MMX0 = 0x00030010,
73 HV_X64_REGISTER_FP_MMX1 = 0x00030011,
74 HV_X64_REGISTER_FP_MMX2 = 0x00030012,
75 HV_X64_REGISTER_FP_MMX3 = 0x00030013,
76 HV_X64_REGISTER_FP_MMX4 = 0x00030014,
77 HV_X64_REGISTER_FP_MMX5 = 0x00030015,
78 HV_X64_REGISTER_FP_MMX6 = 0x00030016,
79 HV_X64_REGISTER_FP_MMX7 = 0x00030017,
80 HV_X64_REGISTER_FP_CONTROL_STATUS = 0x00030018,
81 HV_X64_REGISTER_XMM_CONTROL_STATUS = 0x00030019,
82
83 /* X64 Control Registers */
84 HV_X64_REGISTER_CR0 = 0x00040000,
85 HV_X64_REGISTER_CR2 = 0x00040001,
86 HV_X64_REGISTER_CR3 = 0x00040002,
87 HV_X64_REGISTER_CR4 = 0x00040003,
88 HV_X64_REGISTER_CR8 = 0x00040004,
89 HV_X64_REGISTER_XFEM = 0x00040005,
90
91 /* X64 Segment Registers */
92 HV_X64_REGISTER_ES = 0x00060000,
93 HV_X64_REGISTER_CS = 0x00060001,
94 HV_X64_REGISTER_SS = 0x00060002,
95 HV_X64_REGISTER_DS = 0x00060003,
96 HV_X64_REGISTER_FS = 0x00060004,
97 HV_X64_REGISTER_GS = 0x00060005,
98 HV_X64_REGISTER_LDTR = 0x00060006,
99 HV_X64_REGISTER_TR = 0x00060007,
100
101 /* X64 Table Registers */
102 HV_X64_REGISTER_IDTR = 0x00070000,
103 HV_X64_REGISTER_GDTR = 0x00070001,
104
105 /* X64 Virtualized MSRs */
106 HV_X64_REGISTER_TSC = 0x00080000,
107 HV_X64_REGISTER_EFER = 0x00080001,
108 HV_X64_REGISTER_KERNEL_GS_BASE = 0x00080002,
109 HV_X64_REGISTER_APIC_BASE = 0x00080003,
110 HV_X64_REGISTER_PAT = 0x00080004,
111 HV_X64_REGISTER_SYSENTER_CS = 0x00080005,
112 HV_X64_REGISTER_SYSENTER_EIP = 0x00080006,
113 HV_X64_REGISTER_SYSENTER_ESP = 0x00080007,
114 HV_X64_REGISTER_STAR = 0x00080008,
115 HV_X64_REGISTER_LSTAR = 0x00080009,
116 HV_X64_REGISTER_CSTAR = 0x0008000A,
117 HV_X64_REGISTER_SFMASK = 0x0008000B,
118 HV_X64_REGISTER_INITIAL_APIC_ID = 0x0008000C,
119
120 /* X64 Cache control MSRs */
121 HV_X64_REGISTER_MSR_MTRR_CAP = 0x0008000D,
122 HV_X64_REGISTER_MSR_MTRR_DEF_TYPE = 0x0008000E,
123 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE0 = 0x00080010,
124 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE1 = 0x00080011,
125 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE2 = 0x00080012,
126 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE3 = 0x00080013,
127 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE4 = 0x00080014,
128 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE5 = 0x00080015,
129 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE6 = 0x00080016,
130 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE7 = 0x00080017,
131 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE8 = 0x00080018,
132 HV_X64_REGISTER_MSR_MTRR_PHYS_BASE9 = 0x00080019,
133 HV_X64_REGISTER_MSR_MTRR_PHYS_BASEA = 0x0008001A,
134 HV_X64_REGISTER_MSR_MTRR_PHYS_BASEB = 0x0008001B,
135 HV_X64_REGISTER_MSR_MTRR_PHYS_BASEC = 0x0008001C,
136 HV_X64_REGISTER_MSR_MTRR_PHYS_BASED = 0x0008001D,
137 HV_X64_REGISTER_MSR_MTRR_PHYS_BASEE = 0x0008001E,
138 HV_X64_REGISTER_MSR_MTRR_PHYS_BASEF = 0x0008001F,
139 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK0 = 0x00080040,
140 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK1 = 0x00080041,
141 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK2 = 0x00080042,
142 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK3 = 0x00080043,
143 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK4 = 0x00080044,
144 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK5 = 0x00080045,
145 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK6 = 0x00080046,
146 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK7 = 0x00080047,
147 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK8 = 0x00080048,
148 HV_X64_REGISTER_MSR_MTRR_PHYS_MASK9 = 0x00080049,
149 HV_X64_REGISTER_MSR_MTRR_PHYS_MASKA = 0x0008004A,
150 HV_X64_REGISTER_MSR_MTRR_PHYS_MASKB = 0x0008004B,
151 HV_X64_REGISTER_MSR_MTRR_PHYS_MASKC = 0x0008004C,
152 HV_X64_REGISTER_MSR_MTRR_PHYS_MASKD = 0x0008004D,
153 HV_X64_REGISTER_MSR_MTRR_PHYS_MASKE = 0x0008004E,
154 HV_X64_REGISTER_MSR_MTRR_PHYS_MASKF = 0x0008004F,
155 HV_X64_REGISTER_MSR_MTRR_FIX64K00000 = 0x00080070,
156 HV_X64_REGISTER_MSR_MTRR_FIX16K80000 = 0x00080071,
157 HV_X64_REGISTER_MSR_MTRR_FIX16KA0000 = 0x00080072,
158 HV_X64_REGISTER_MSR_MTRR_FIX4KC0000 = 0x00080073,
159 HV_X64_REGISTER_MSR_MTRR_FIX4KC8000 = 0x00080074,
160 HV_X64_REGISTER_MSR_MTRR_FIX4KD0000 = 0x00080075,
161 HV_X64_REGISTER_MSR_MTRR_FIX4KD8000 = 0x00080076,
162 HV_X64_REGISTER_MSR_MTRR_FIX4KE0000 = 0x00080077,
163 HV_X64_REGISTER_MSR_MTRR_FIX4KE8000 = 0x00080078,
164 HV_X64_REGISTER_MSR_MTRR_FIX4KF0000 = 0x00080079,
165 HV_X64_REGISTER_MSR_MTRR_FIX4KF8000 = 0x0008007A,
166
167 HV_X64_REGISTER_TSC_AUX = 0x0008007B,
168 HV_X64_REGISTER_BNDCFGS = 0x0008007C,
169 HV_X64_REGISTER_DEBUG_CTL = 0x0008007D,
170
171 /* Available */
172
173 HV_X64_REGISTER_SPEC_CTRL = 0x00080084,
174 HV_X64_REGISTER_TSC_DEADLINE = 0x00080095,
175 HV_X64_REGISTER_TSC_ADJUST = 0x00080096,
176
177 /* CET / Shadow Stack */
178 HV_X64_REGISTER_U_XSS = 0x0008008B,
179 HV_X64_REGISTER_U_CET = 0x0008008C,
180 HV_X64_REGISTER_S_CET = 0x0008008D,
181 HV_X64_REGISTER_SSP = 0x0008008E,
182 HV_X64_REGISTER_PL0_SSP = 0x0008008F,
183 HV_X64_REGISTER_PL1_SSP = 0x00080090,
184 HV_X64_REGISTER_PL2_SSP = 0x00080091,
185 HV_X64_REGISTER_PL3_SSP = 0x00080092,
186 HV_X64_REGISTER_INTERRUPT_SSP_TABLE_ADDR = 0x00080093,
187
188 /* Other MSRs */
189 HV_X64_REGISTER_MSR_IA32_MISC_ENABLE = 0x000800A0,
190
191 /* Misc */
192 HV_X64_REGISTER_HYPERCALL = 0x00090001,
193 HV_REGISTER_GUEST_OS_ID = 0x00090002,
194 HV_REGISTER_REFERENCE_TSC = 0x00090017,
195
196 /* Hypervisor-defined Registers (Synic) */
197 HV_REGISTER_SINT0 = 0x000A0000,
198 HV_REGISTER_SINT1 = 0x000A0001,
199 HV_REGISTER_SINT2 = 0x000A0002,
200 HV_REGISTER_SINT3 = 0x000A0003,
201 HV_REGISTER_SINT4 = 0x000A0004,
202 HV_REGISTER_SINT5 = 0x000A0005,
203 HV_REGISTER_SINT6 = 0x000A0006,
204 HV_REGISTER_SINT7 = 0x000A0007,
205 HV_REGISTER_SINT8 = 0x000A0008,
206 HV_REGISTER_SINT9 = 0x000A0009,
207 HV_REGISTER_SINT10 = 0x000A000A,
208 HV_REGISTER_SINT11 = 0x000A000B,
209 HV_REGISTER_SINT12 = 0x000A000C,
210 HV_REGISTER_SINT13 = 0x000A000D,
211 HV_REGISTER_SINT14 = 0x000A000E,
212 HV_REGISTER_SINT15 = 0x000A000F,
213 HV_REGISTER_SCONTROL = 0x000A0010,
214 HV_REGISTER_SVERSION = 0x000A0011,
215 HV_REGISTER_SIEFP = 0x000A0012,
216 HV_REGISTER_SIMP = 0x000A0013,
217 HV_REGISTER_EOM = 0x000A0014,
218 HV_REGISTER_SIRBP = 0x000A0015,
219 } hv_register_name;
220
221 enum hv_intercept_type {
222 HV_INTERCEPT_TYPE_X64_IO_PORT = 0X00000000,
223 HV_INTERCEPT_TYPE_X64_MSR = 0X00000001,
224 HV_INTERCEPT_TYPE_X64_CPUID = 0X00000002,
225 HV_INTERCEPT_TYPE_EXCEPTION = 0X00000003,
226
227 /* Used to be HV_INTERCEPT_TYPE_REGISTER */
228 HV_INTERCEPT_TYPE_RESERVED0 = 0X00000004,
229 HV_INTERCEPT_TYPE_MMIO = 0X00000005,
230 HV_INTERCEPT_TYPE_X64_GLOBAL_CPUID = 0X00000006,
231 HV_INTERCEPT_TYPE_X64_APIC_SMI = 0X00000007,
232 HV_INTERCEPT_TYPE_HYPERCALL = 0X00000008,
233
234 HV_INTERCEPT_TYPE_X64_APIC_INIT_SIPI = 0X00000009,
235 HV_INTERCEPT_MC_UPDATE_PATCH_LEVEL_MSR_READ = 0X0000000A,
236
237 HV_INTERCEPT_TYPE_X64_APIC_WRITE = 0X0000000B,
238 HV_INTERCEPT_TYPE_X64_MSR_INDEX = 0X0000000C,
239 HV_INTERCEPT_TYPE_MAX,
240 HV_INTERCEPT_TYPE_INVALID = 0XFFFFFFFF,
241 };
242
243 struct hv_u128 {
244 uint64_t low_part;
245 uint64_t high_part;
246 } QEMU_PACKED;
247
248 union hv_x64_xmm_control_status_register {
249 struct hv_u128 as_uint128;
250 struct {
251 union {
252 /* long mode */
253 uint64_t last_fp_rdp;
254 /* 32 bit mode */
255 struct {
256 uint32_t last_fp_dp;
257 uint16_t last_fp_ds;
258 uint16_t padding;
259 };
260 };
261 uint32_t xmm_status_control;
262 uint32_t xmm_status_control_mask;
263 };
264 };
265
266 union hv_x64_fp_register {
267 struct hv_u128 as_uint128;
268 struct {
269 uint64_t mantissa;
270 uint64_t biased_exponent:15;
271 uint64_t sign:1;
272 uint64_t reserved:48;
273 };
274 };
275
276 union hv_x64_pending_exception_event {
277 uint64_t as_uint64[2];
278 struct {
279 uint32_t event_pending:1;
280 uint32_t event_type:3;
281 uint32_t reserved0:4;
282 uint32_t deliver_error_code:1;
283 uint32_t reserved1:7;
284 uint32_t vector:16;
285 uint32_t error_code;
286 uint64_t exception_parameter;
287 };
288 };
289
290 union hv_x64_pending_virtualization_fault_event {
291 uint64_t as_uint64[2];
292 struct {
293 uint32_t event_pending:1;
294 uint32_t event_type:3;
295 uint32_t reserved0:4;
296 uint32_t reserved1:8;
297 uint32_t parameter0:16;
298 uint32_t code;
299 uint64_t parameter1;
300 };
301 };
302
303 union hv_x64_pending_interruption_register {
304 uint64_t as_uint64;
305 struct {
306 uint32_t interruption_pending:1;
307 uint32_t interruption_type:3;
308 uint32_t deliver_error_code:1;
309 uint32_t instruction_length:4;
310 uint32_t nested_event:1;
311 uint32_t reserved:6;
312 uint32_t interruption_vector:16;
313 uint32_t error_code;
314 };
315 };
316
317 union hv_x64_register_sev_control {
318 uint64_t as_uint64;
319 struct {
320 uint64_t enable_encrypted_state:1;
321 uint64_t reserved_z:11;
322 uint64_t vmsa_gpa_page_number:52;
323 };
324 };
325
326 union hv_x64_msr_npiep_config_contents {
327 uint64_t as_uint64;
328 struct {
329 /*
330 * These bits enable instruction execution prevention for
331 * specific instructions.
332 */
333 uint64_t prevents_gdt:1;
334 uint64_t prevents_idt:1;
335 uint64_t prevents_ldt:1;
336 uint64_t prevents_tr:1;
337
338 /* The reserved bits must always be 0. */
339 uint64_t reserved:60;
340 };
341 };
342
343 typedef struct hv_x64_segment_register {
344 uint64_t base;
345 uint32_t limit;
346 uint16_t selector;
347 union {
348 struct {
349 uint16_t segment_type:4;
350 uint16_t non_system_segment:1;
351 uint16_t descriptor_privilege_level:2;
352 uint16_t present:1;
353 uint16_t reserved:4;
354 uint16_t available:1;
355 uint16_t _long:1;
356 uint16_t _default:1;
357 uint16_t granularity:1;
358 };
359 uint16_t attributes;
360 };
361 } QEMU_PACKED hv_x64_segment_register;
362
363 typedef struct hv_x64_table_register {
364 uint16_t pad[3];
365 uint16_t limit;
366 uint64_t base;
367 } QEMU_PACKED hv_x64_table_register;
368
369 union hv_x64_fp_control_status_register {
370 struct hv_u128 as_uint128;
371 struct {
372 uint16_t fp_control;
373 uint16_t fp_status;
374 uint8_t fp_tag;
375 uint8_t reserved;
376 uint16_t last_fp_op;
377 union {
378 /* long mode */
379 uint64_t last_fp_rip;
380 /* 32 bit mode */
381 struct {
382 uint32_t last_fp_eip;
383 uint16_t last_fp_cs;
384 uint16_t padding;
385 };
386 };
387 };
388 };
389
390 /* General Hypervisor Register Content Definitions */
391
392 union hv_explicit_suspend_register {
393 uint64_t as_uint64;
394 struct {
395 uint64_t suspended:1;
396 uint64_t reserved:63;
397 };
398 };
399
400 union hv_internal_activity_register {
401 uint64_t as_uint64;
402
403 struct {
404 uint64_t startup_suspend:1;
405 uint64_t halt_suspend:1;
406 uint64_t idle_suspend:1;
407 uint64_t rsvd_z:61;
408 };
409 };
410
411 union hv_x64_interrupt_state_register {
412 uint64_t as_uint64;
413 struct {
414 uint64_t interrupt_shadow:1;
415 uint64_t nmi_masked:1;
416 uint64_t reserved:62;
417 };
418 };
419
420 union hv_intercept_suspend_register {
421 uint64_t as_uint64;
422 struct {
423 uint64_t suspended:1;
424 uint64_t reserved:63;
425 };
426 };
427
428 typedef union hv_register_value {
429 struct hv_u128 reg128;
430 uint64_t reg64;
431 uint32_t reg32;
432 uint16_t reg16;
433 uint8_t reg8;
434 union hv_x64_fp_register fp;
435 union hv_x64_fp_control_status_register fp_control_status;
436 union hv_x64_xmm_control_status_register xmm_control_status;
437 struct hv_x64_segment_register segment;
438 struct hv_x64_table_register table;
439 union hv_explicit_suspend_register explicit_suspend;
440 union hv_intercept_suspend_register intercept_suspend;
441 union hv_internal_activity_register internal_activity;
442 union hv_x64_interrupt_state_register interrupt_state;
443 union hv_x64_pending_interruption_register pending_interruption;
444 union hv_x64_msr_npiep_config_contents npiep_config;
445 union hv_x64_pending_exception_event pending_exception_event;
446 union hv_x64_pending_virtualization_fault_event
447 pending_virtualization_fault_event;
448 union hv_x64_register_sev_control sev_control;
449 } hv_register_value;
450
451 /*
452 * This struct is __packed in the kernel. Since all members are naturally
453 * aligned, we can omit QEMU_PACKED to avoid address-of-packed-member warnings.
454 */
455 typedef struct hv_register_assoc {
456 uint32_t name; /* enum hv_register_name */
457 uint32_t reserved1;
458 uint64_t reserved2;
459 union hv_register_value value;
460 } hv_register_assoc;
461
462 union hv_input_vtl {
463 uint8_t as_uint8;
464 struct {
465 uint8_t target_vtl:4;
466 uint8_t use_target_vtl:1;
467 uint8_t reserved_z:3;
468 };
469 };
470
471 typedef struct hv_input_get_vp_registers {
472 uint64_t partition_id;
473 uint32_t vp_index;
474 union hv_input_vtl input_vtl;
475 uint8_t rsvd_z8;
476 uint16_t rsvd_z16;
477 uint32_t names[];
478 } QEMU_PACKED hv_input_get_vp_registers;
479
480 typedef struct hv_input_set_vp_registers {
481 uint64_t partition_id;
482 uint32_t vp_index;
483 union hv_input_vtl input_vtl;
484 uint8_t rsvd_z8;
485 uint16_t rsvd_z16;
486 struct hv_register_assoc elements[];
487 } QEMU_PACKED hv_input_set_vp_registers;
488
489 #define MSHV_VP_MAX_REGISTERS 128
490
491 union hv_interrupt_control {
492 uint64_t as_uint64;
493 struct {
494 uint32_t interrupt_type; /* enum hv_interrupt type */
495 uint32_t level_triggered:1;
496 uint32_t logical_dest_mode:1;
497 uint32_t rsvd:30;
498 };
499 };
500
501 struct hv_input_assert_virtual_interrupt {
502 uint64_t partition_id;
503 union hv_interrupt_control control;
504 uint64_t dest_addr; /* cpu's apic id */
505 uint32_t vector;
506 uint8_t target_vtl;
507 uint8_t rsvd_z0;
508 uint16_t rsvd_z1;
509 } QEMU_PACKED;
510
511 /* Flags for dirty mask of hv_vp_register_page */
512 enum hv_x64_register_class_type {
513 HV_X64_REGISTER_CLASS_GENERAL = 0,
514 HV_X64_REGISTER_CLASS_IP = 1,
515 HV_X64_REGISTER_CLASS_XMM = 2,
516 HV_X64_REGISTER_CLASS_SEGMENT = 3,
517 HV_X64_REGISTER_CLASS_FLAGS = 4,
518 };
519
520 #define HV_VP_REGISTER_PAGE_MAX_VECTOR_COUNT 7
521
522 union hv_vp_register_page_interrupt_vectors {
523 uint64_t as_uint64;
524 struct {
525 uint8_t vector_count;
526 uint8_t vector[HV_VP_REGISTER_PAGE_MAX_VECTOR_COUNT];
527 };
528 };
529
530 struct hv_vp_register_page {
531 uint16_t version;
532 uint8_t isvalid;
533 uint8_t rsvdz;
534 uint32_t dirty;
535
536 union {
537 struct {
538 /* General purpose registers (HV_X64_REGISTER_CLASS_GENERAL) */
539 union {
540 struct {
541 uint64_t rax;
542 uint64_t rcx;
543 uint64_t rdx;
544 uint64_t rbx;
545 uint64_t rsp;
546 uint64_t rbp;
547 uint64_t rsi;
548 uint64_t rdi;
549 uint64_t r8;
550 uint64_t r9;
551 uint64_t r10;
552 uint64_t r11;
553 uint64_t r12;
554 uint64_t r13;
555 uint64_t r14;
556 uint64_t r15;
557 } QEMU_PACKED;
558
559 uint64_t gp_registers[16];
560 };
561 /* Instruction pointer (HV_X64_REGISTER_CLASS_IP) */
562 uint64_t rip;
563 /* Flags (HV_X64_REGISTER_CLASS_FLAGS) */
564 uint64_t rflags;
565 } QEMU_PACKED;
566
567 uint64_t registers[18];
568 };
569 uint8_t reserved[8];
570 /* Volatile XMM registers (HV_X64_REGISTER_CLASS_XMM) */
571 union {
572 struct {
573 struct hv_u128 xmm0;
574 struct hv_u128 xmm1;
575 struct hv_u128 xmm2;
576 struct hv_u128 xmm3;
577 struct hv_u128 xmm4;
578 struct hv_u128 xmm5;
579 } QEMU_PACKED;
580
581 struct hv_u128 xmm_registers[6];
582 };
583 /* Segment registers (HV_X64_REGISTER_CLASS_SEGMENT) */
584 union {
585 struct {
586 struct hv_x64_segment_register es;
587 struct hv_x64_segment_register cs;
588 struct hv_x64_segment_register ss;
589 struct hv_x64_segment_register ds;
590 struct hv_x64_segment_register fs;
591 struct hv_x64_segment_register gs;
592 } QEMU_PACKED;
593
594 struct hv_x64_segment_register segment_registers[6];
595 };
596 /* Misc. control registers (cannot be set via this interface) */
597 uint64_t cr0;
598 uint64_t cr3;
599 uint64_t cr4;
600 uint64_t cr8;
601 uint64_t efer;
602 uint64_t dr7;
603 union hv_x64_pending_interruption_register pending_interruption;
604 union hv_x64_interrupt_state_register interrupt_state;
605 uint64_t instruction_emulation_hints;
606 uint64_t xfem;
607
608 uint8_t reserved1[0x100];
609
610 /* Interrupts injected as part of HvCallDispatchVp. */
611 union hv_vp_register_page_interrupt_vectors interrupt_vectors;
612 } QEMU_PACKED;
613
614 /* /dev/mshv */
615 #define MSHV_CREATE_PARTITION _IOW(MSHV_IOCTL, 0x00, struct mshv_create_partition)
616 #define MSHV_CREATE_VP _IOW(MSHV_IOCTL, 0x01, struct mshv_create_vp)
617
618 /* Partition fds created with MSHV_CREATE_PARTITION */
619 #define MSHV_INITIALIZE_PARTITION _IO(MSHV_IOCTL, 0x00)
620 #define MSHV_SET_GUEST_MEMORY _IOW(MSHV_IOCTL, 0x02, struct mshv_user_mem_region)
621 #define MSHV_IRQFD _IOW(MSHV_IOCTL, 0x03, struct mshv_user_irqfd)
622 #define MSHV_IOEVENTFD _IOW(MSHV_IOCTL, 0x04, struct mshv_user_ioeventfd)
623 #define MSHV_SET_MSI_ROUTING _IOW(MSHV_IOCTL, 0x05, struct mshv_user_irq_table)
624
625 /*
626 ********************************
627 * VP APIs for child partitions *
628 ********************************
629 */
630
631 /*
632 * This struct is __packed in the kernel, but since all members are naturally
633 * aligned, so we can omit QEMU_PACKED to avoid address-of-packed-member
634 * warnings.
635 */
636 struct hv_local_interrupt_controller_state {
637 /* HV_X64_INTERRUPT_CONTROLLER_STATE */
638 uint32_t apic_id;
639 uint32_t apic_version;
640 uint32_t apic_ldr;
641 uint32_t apic_dfr;
642 uint32_t apic_spurious;
643 uint32_t apic_isr[8];
644 uint32_t apic_tmr[8];
645 uint32_t apic_irr[8];
646 uint32_t apic_esr;
647 uint32_t apic_icr_high;
648 uint32_t apic_icr_low;
649 uint32_t apic_lvt_timer;
650 uint32_t apic_lvt_thermal;
651 uint32_t apic_lvt_perfmon;
652 uint32_t apic_lvt_lint0;
653 uint32_t apic_lvt_lint1;
654 uint32_t apic_lvt_error;
655 uint32_t apic_lvt_cmci;
656 uint32_t apic_error_status;
657 uint32_t apic_initial_count;
658 uint32_t apic_counter_value;
659 uint32_t apic_divide_configuration;
660 uint32_t apic_remote_read;
661 };
662
663 /* Generic hypercall */
664 #define MSHV_ROOT_HVCALL _IOWR(MSHV_IOCTL, 0x07, struct mshv_root_hvcall)
665
666 /* From hvgdk_mini.h */
667
668 #define HV_X64_MSR_GUEST_OS_ID 0x40000000
669 #define HV_X64_MSR_SINT0 0x40000090
670 #define HV_X64_MSR_SINT1 0x40000091
671 #define HV_X64_MSR_SINT2 0x40000092
672 #define HV_X64_MSR_SINT3 0x40000093
673 #define HV_X64_MSR_SINT4 0x40000094
674 #define HV_X64_MSR_SINT5 0x40000095
675 #define HV_X64_MSR_SINT6 0x40000096
676 #define HV_X64_MSR_SINT7 0x40000097
677 #define HV_X64_MSR_SINT8 0x40000098
678 #define HV_X64_MSR_SINT9 0x40000099
679 #define HV_X64_MSR_SINT10 0x4000009A
680 #define HV_X64_MSR_SINT11 0x4000009B
681 #define HV_X64_MSR_SINT12 0x4000009C
682 #define HV_X64_MSR_SINT13 0x4000009D
683 #define HV_X64_MSR_SINT14 0x4000009E
684 #define HV_X64_MSR_SINT15 0x4000009F
685 #define HV_X64_MSR_SCONTROL 0x40000080
686 #define HV_X64_MSR_SIEFP 0x40000082
687 #define HV_X64_MSR_SIMP 0x40000083
688 #define HV_X64_MSR_REFERENCE_TSC 0x40000021
689 #define HV_X64_MSR_EOM 0x40000084
690
691 /* Define port identifier type. */
692 union hv_port_id {
693 uint32_t asuint32_t;
694 struct {
695 uint32_t id:24;
696 uint32_t reserved:8;
697 };
698 };
699
700 #define HV_MESSAGE_SIZE (256)
701 #define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240)
702 #define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30)
703
704 /* Define hypervisor message types. */
705 enum hv_message_type {
706 HVMSG_NONE = 0x00000000,
707
708 /* Memory access messages. */
709 HVMSG_UNMAPPED_GPA = 0x80000000,
710 HVMSG_GPA_INTERCEPT = 0x80000001,
711 HVMSG_UNACCEPTED_GPA = 0x80000003,
712 HVMSG_GPA_ATTRIBUTE_INTERCEPT = 0x80000004,
713
714 /* Timer notification messages. */
715 HVMSG_TIMER_EXPIRED = 0x80000010,
716
717 /* Error messages. */
718 HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020,
719 HVMSG_UNRECOVERABLE_EXCEPTION = 0x80000021,
720 HVMSG_UNSUPPORTED_FEATURE = 0x80000022,
721
722 /*
723 * Opaque intercept message. The original intercept message is only
724 * accessible from the mapped intercept message page.
725 */
726 HVMSG_OPAQUE_INTERCEPT = 0x8000003F,
727
728 /* Trace buffer complete messages. */
729 HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x80000040,
730
731 /* Hypercall intercept */
732 HVMSG_HYPERCALL_INTERCEPT = 0x80000050,
733
734 /* SynIC intercepts */
735 HVMSG_SYNIC_EVENT_INTERCEPT = 0x80000060,
736 HVMSG_SYNIC_SINT_INTERCEPT = 0x80000061,
737 HVMSG_SYNIC_SINT_DELIVERABLE = 0x80000062,
738
739 /* Async call completion intercept */
740 HVMSG_ASYNC_CALL_COMPLETION = 0x80000070,
741
742 /* Root scheduler messages */
743 HVMSG_SCHEDULER_VP_SIGNAL_BITSE = 0x80000100,
744 HVMSG_SCHEDULER_VP_SIGNAL_PAIR = 0x80000101,
745
746 /* Platform-specific processor intercept messages. */
747 HVMSG_X64_IO_PORT_INTERCEPT = 0x80010000,
748 HVMSG_X64_MSR_INTERCEPT = 0x80010001,
749 HVMSG_X64_CPUID_INTERCEPT = 0x80010002,
750 HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003,
751 HVMSG_X64_APIC_EOI = 0x80010004,
752 HVMSG_X64_LEGACY_FP_ERROR = 0x80010005,
753 HVMSG_X64_IOMMU_PRQ = 0x80010006,
754 HVMSG_X64_HALT = 0x80010007,
755 HVMSG_X64_INTERRUPTION_DELIVERABLE = 0x80010008,
756 HVMSG_X64_SIPI_INTERCEPT = 0x80010009,
757 HVMSG_X64_SEV_VMGEXIT_INTERCEPT = 0x80010013,
758 };
759
760 union hv_x64_vp_execution_state {
761 uint16_t as_uint16;
762 struct {
763 uint16_t cpl:2;
764 uint16_t cr0_pe:1;
765 uint16_t cr0_am:1;
766 uint16_t efer_lma:1;
767 uint16_t debug_active:1;
768 uint16_t interruption_pending:1;
769 uint16_t vtl:4;
770 uint16_t enclave_mode:1;
771 uint16_t interrupt_shadow:1;
772 uint16_t virtualization_fault_active:1;
773 uint16_t reserved:2;
774 };
775 };
776
777 /* From openvmm::hvdef */
778 enum hv_x64_intercept_access_type {
779 HV_X64_INTERCEPT_ACCESS_TYPE_READ = 0,
780 HV_X64_INTERCEPT_ACCESS_TYPE_WRITE = 1,
781 HV_X64_INTERCEPT_ACCESS_TYPE_EXECUTE = 2,
782 };
783
784 struct hv_x64_intercept_message_header {
785 uint32_t vp_index;
786 uint8_t instruction_length:4;
787 uint8_t cr8:4; /* Only set for exo partitions */
788 uint8_t intercept_access_type;
789 union hv_x64_vp_execution_state execution_state;
790 struct hv_x64_segment_register cs_segment;
791 uint64_t rip;
792 uint64_t rflags;
793 } QEMU_PACKED;
794
795 union hv_x64_io_port_access_info {
796 uint8_t as_uint8;
797 struct {
798 uint8_t access_size:3;
799 uint8_t string_op:1;
800 uint8_t rep_prefix:1;
801 uint8_t reserved:3;
802 };
803 };
804
805 typedef struct hv_x64_io_port_intercept_message {
806 struct hv_x64_intercept_message_header header;
807 uint16_t port_number;
808 union hv_x64_io_port_access_info access_info;
809 uint8_t instruction_byte_count;
810 uint32_t reserved;
811 uint64_t rax;
812 uint8_t instruction_bytes[16];
813 struct hv_x64_segment_register ds_segment;
814 struct hv_x64_segment_register es_segment;
815 uint64_t rcx;
816 uint64_t rsi;
817 uint64_t rdi;
818 } QEMU_PACKED hv_x64_io_port_intercept_message;
819
820 union hv_x64_memory_access_info {
821 uint8_t as_uint8;
822 struct {
823 uint8_t gva_valid:1;
824 uint8_t gva_gpa_valid:1;
825 uint8_t hypercall_output_pending:1;
826 uint8_t tlb_locked_no_overlay:1;
827 uint8_t reserved:4;
828 };
829 };
830
831 struct hv_x64_memory_intercept_message {
832 struct hv_x64_intercept_message_header header;
833 uint32_t cache_type; /* enum hv_cache_type */
834 uint8_t instruction_byte_count;
835 union hv_x64_memory_access_info memory_access_info;
836 uint8_t tpr_priority;
837 uint8_t reserved1;
838 uint64_t guest_virtual_address;
839 uint64_t guest_physical_address;
840 uint8_t instruction_bytes[16];
841 } QEMU_PACKED;
842
843 union hv_message_flags {
844 uint8_t asu8;
845 struct {
846 uint8_t msg_pending:1;
847 uint8_t reserved:7;
848 };
849 };
850
851 struct hv_message_header {
852 uint32_t message_type;
853 uint8_t payload_size;
854 union hv_message_flags message_flags;
855 uint8_t reserved[2];
856 union {
857 uint64_t sender;
858 union hv_port_id port;
859 };
860 } QEMU_PACKED;
861
862 struct hv_message {
863 struct hv_message_header header;
864 union {
865 uint64_t payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
866 } u;
867 } QEMU_PACKED;
868
869 /* From github.com/rust-vmm/mshv-bindings/src/x86_64/regs.rs */
870
871 struct hv_cpuid_entry {
872 uint32_t function;
873 uint32_t index;
874 uint32_t flags;
875 uint32_t eax;
876 uint32_t ebx;
877 uint32_t ecx;
878 uint32_t edx;
879 uint32_t padding[3];
880 } QEMU_PACKED;
881
882 struct hv_cpuid {
883 uint32_t nent;
884 uint32_t padding;
885 struct hv_cpuid_entry entries[0];
886 } QEMU_PACKED;
887
888 #define IA32_MSR_TSC 0x00000010
889 #define IA32_MSR_EFER 0xC0000080
890 #define IA32_MSR_KERNEL_GS_BASE 0xC0000102
891 #define IA32_MSR_APIC_BASE 0x0000001B
892 #define IA32_MSR_PAT 0x0277
893 #define IA32_MSR_SYSENTER_CS 0x00000174
894 #define IA32_MSR_SYSENTER_ESP 0x00000175
895 #define IA32_MSR_SYSENTER_EIP 0x00000176
896 #define IA32_MSR_STAR 0xC0000081
897 #define IA32_MSR_LSTAR 0xC0000082
898 #define IA32_MSR_CSTAR 0xC0000083
899 #define IA32_MSR_SFMASK 0xC0000084
900
901 #define IA32_MSR_MTRR_CAP 0x00FE
902 #define IA32_MSR_MTRR_DEF_TYPE 0x02FF
903 #define IA32_MSR_MTRR_PHYSBASE0 0x0200
904 #define IA32_MSR_MTRR_PHYSMASK0 0x0201
905 #define IA32_MSR_MTRR_PHYSBASE1 0x0202
906 #define IA32_MSR_MTRR_PHYSMASK1 0x0203
907 #define IA32_MSR_MTRR_PHYSBASE2 0x0204
908 #define IA32_MSR_MTRR_PHYSMASK2 0x0205
909 #define IA32_MSR_MTRR_PHYSBASE3 0x0206
910 #define IA32_MSR_MTRR_PHYSMASK3 0x0207
911 #define IA32_MSR_MTRR_PHYSBASE4 0x0208
912 #define IA32_MSR_MTRR_PHYSMASK4 0x0209
913 #define IA32_MSR_MTRR_PHYSBASE5 0x020A
914 #define IA32_MSR_MTRR_PHYSMASK5 0x020B
915 #define IA32_MSR_MTRR_PHYSBASE6 0x020C
916 #define IA32_MSR_MTRR_PHYSMASK6 0x020D
917 #define IA32_MSR_MTRR_PHYSBASE7 0x020E
918 #define IA32_MSR_MTRR_PHYSMASK7 0x020F
919
920 #define IA32_MSR_MTRR_FIX64K_00000 0x0250
921 #define IA32_MSR_MTRR_FIX16K_80000 0x0258
922 #define IA32_MSR_MTRR_FIX16K_A0000 0x0259
923 #define IA32_MSR_MTRR_FIX4K_C0000 0x0268
924 #define IA32_MSR_MTRR_FIX4K_C8000 0x0269
925 #define IA32_MSR_MTRR_FIX4K_D0000 0x026A
926 #define IA32_MSR_MTRR_FIX4K_D8000 0x026B
927 #define IA32_MSR_MTRR_FIX4K_E0000 0x026C
928 #define IA32_MSR_MTRR_FIX4K_E8000 0x026D
929 #define IA32_MSR_MTRR_FIX4K_F0000 0x026E
930 #define IA32_MSR_MTRR_FIX4K_F8000 0x026F
931
932 #define IA32_MSR_TSC_AUX 0xC0000103
933 #define IA32_MSR_BNDCFGS 0x00000d90
934 #define IA32_MSR_DEBUG_CTL 0x1D9
935 #define IA32_MSR_SPEC_CTRL 0x00000048
936 #define IA32_MSR_TSC_ADJUST 0x0000003b
937 #define IA32_MSR_TSC_DEADLINE 0x000006e0
938
939 #define IA32_MSR_MISC_ENABLE 0x000001a0
940
941 #define HV_TRANSLATE_GVA_VALIDATE_READ (0x0001)
942 #define HV_TRANSLATE_GVA_VALIDATE_WRITE (0x0002)
943 #define HV_TRANSLATE_GVA_VALIDATE_EXECUTE (0x0004)
944
945 #define HV_HYP_PAGE_SHIFT 12
946 #define HV_HYP_PAGE_SIZE BIT(HV_HYP_PAGE_SHIFT)
947 #define HV_HYP_PAGE_MASK (~(HV_HYP_PAGE_SIZE - 1))
948
949 #define HVCALL_GET_PARTITION_PROPERTY 0x0044
950 #define HVCALL_SET_PARTITION_PROPERTY 0x0045
951 #define HVCALL_GET_VP_REGISTERS 0x0050
952 #define HVCALL_SET_VP_REGISTERS 0x0051
953 #define HVCALL_TRANSLATE_VIRTUAL_ADDRESS 0x0052
954 #define HVCALL_REGISTER_INTERCEPT_RESULT 0x0091
955 #define HVCALL_ASSERT_VIRTUAL_INTERRUPT 0x0094
956
957 #endif /* HW_HYPERV_HVGDK_MINI_H */