master
1/**
2 * This file is part of the mingw-w64 runtime package.
3 * No warranty is given; refer to the file DISCLAIMER within this package.
4 */
5
6#ifndef _WINHVAPIDEFS_H_
7#define _WINHVAPIDEFS_H_
8
9#if defined(__x86_64__) || defined(__aarch64__)
10
11#if defined(__x86_64__)
12
13typedef enum WHV_REGISTER_NAME {
14 WHvX64RegisterRax = 0x00000000,
15 WHvX64RegisterRcx = 0x00000001,
16 WHvX64RegisterRdx = 0x00000002,
17 WHvX64RegisterRbx = 0x00000003,
18 WHvX64RegisterRsp = 0x00000004,
19 WHvX64RegisterRbp = 0x00000005,
20 WHvX64RegisterRsi = 0x00000006,
21 WHvX64RegisterRdi = 0x00000007,
22 WHvX64RegisterR8 = 0x00000008,
23 WHvX64RegisterR9 = 0x00000009,
24 WHvX64RegisterR10 = 0x0000000A,
25 WHvX64RegisterR11 = 0x0000000B,
26 WHvX64RegisterR12 = 0x0000000C,
27 WHvX64RegisterR13 = 0x0000000D,
28 WHvX64RegisterR14 = 0x0000000E,
29 WHvX64RegisterR15 = 0x0000000F,
30 WHvX64RegisterRip = 0x00000010,
31 WHvX64RegisterRflags = 0x00000011,
32 WHvX64RegisterEs = 0x00000012,
33 WHvX64RegisterCs = 0x00000013,
34 WHvX64RegisterSs = 0x00000014,
35 WHvX64RegisterDs = 0x00000015,
36 WHvX64RegisterFs = 0x00000016,
37 WHvX64RegisterGs = 0x00000017,
38 WHvX64RegisterLdtr = 0x00000018,
39 WHvX64RegisterTr = 0x00000019,
40 WHvX64RegisterIdtr = 0x0000001A,
41 WHvX64RegisterGdtr = 0x0000001B,
42 WHvX64RegisterCr0 = 0x0000001C,
43 WHvX64RegisterCr2 = 0x0000001D,
44 WHvX64RegisterCr3 = 0x0000001E,
45 WHvX64RegisterCr4 = 0x0000001F,
46 WHvX64RegisterCr8 = 0x00000020,
47 WHvX64RegisterDr0 = 0x00000021,
48 WHvX64RegisterDr1 = 0x00000022,
49 WHvX64RegisterDr2 = 0x00000023,
50 WHvX64RegisterDr3 = 0x00000024,
51 WHvX64RegisterDr6 = 0x00000025,
52 WHvX64RegisterDr7 = 0x00000026,
53 WHvX64RegisterXCr0 = 0x00000027,
54 WHvX64RegisterVirtualCr0 = 0x00000028,
55 WHvX64RegisterVirtualCr3 = 0x00000029,
56 WHvX64RegisterVirtualCr4 = 0x0000002A,
57 WHvX64RegisterVirtualCr8 = 0x0000002B,
58 WHvX64RegisterXmm0 = 0x00001000,
59 WHvX64RegisterXmm1 = 0x00001001,
60 WHvX64RegisterXmm2 = 0x00001002,
61 WHvX64RegisterXmm3 = 0x00001003,
62 WHvX64RegisterXmm4 = 0x00001004,
63 WHvX64RegisterXmm5 = 0x00001005,
64 WHvX64RegisterXmm6 = 0x00001006,
65 WHvX64RegisterXmm7 = 0x00001007,
66 WHvX64RegisterXmm8 = 0x00001008,
67 WHvX64RegisterXmm9 = 0x00001009,
68 WHvX64RegisterXmm10 = 0x0000100A,
69 WHvX64RegisterXmm11 = 0x0000100B,
70 WHvX64RegisterXmm12 = 0x0000100C,
71 WHvX64RegisterXmm13 = 0x0000100D,
72 WHvX64RegisterXmm14 = 0x0000100E,
73 WHvX64RegisterXmm15 = 0x0000100F,
74 WHvX64RegisterFpMmx0 = 0x00001010,
75 WHvX64RegisterFpMmx1 = 0x00001011,
76 WHvX64RegisterFpMmx2 = 0x00001012,
77 WHvX64RegisterFpMmx3 = 0x00001013,
78 WHvX64RegisterFpMmx4 = 0x00001014,
79 WHvX64RegisterFpMmx5 = 0x00001015,
80 WHvX64RegisterFpMmx6 = 0x00001016,
81 WHvX64RegisterFpMmx7 = 0x00001017,
82 WHvX64RegisterFpControlStatus = 0x00001018,
83 WHvX64RegisterXmmControlStatus = 0x00001019,
84 WHvX64RegisterTsc = 0x00002000,
85 WHvX64RegisterEfer = 0x00002001,
86 WHvX64RegisterKernelGsBase = 0x00002002,
87 WHvX64RegisterApicBase = 0x00002003,
88 WHvX64RegisterPat = 0x00002004,
89 WHvX64RegisterSysenterCs = 0x00002005,
90 WHvX64RegisterSysenterEip = 0x00002006,
91 WHvX64RegisterSysenterEsp = 0x00002007,
92 WHvX64RegisterStar = 0x00002008,
93 WHvX64RegisterLstar = 0x00002009,
94 WHvX64RegisterCstar = 0x0000200A,
95 WHvX64RegisterSfmask = 0x0000200B,
96 WHvX64RegisterInitialApicId = 0x0000200C,
97 WHvX64RegisterMsrMtrrCap = 0x0000200D,
98 WHvX64RegisterMsrMtrrDefType = 0x0000200E,
99 WHvX64RegisterMsrMtrrPhysBase0 = 0x00002010,
100 WHvX64RegisterMsrMtrrPhysBase1 = 0x00002011,
101 WHvX64RegisterMsrMtrrPhysBase2 = 0x00002012,
102 WHvX64RegisterMsrMtrrPhysBase3 = 0x00002013,
103 WHvX64RegisterMsrMtrrPhysBase4 = 0x00002014,
104 WHvX64RegisterMsrMtrrPhysBase5 = 0x00002015,
105 WHvX64RegisterMsrMtrrPhysBase6 = 0x00002016,
106 WHvX64RegisterMsrMtrrPhysBase7 = 0x00002017,
107 WHvX64RegisterMsrMtrrPhysBase8 = 0x00002018,
108 WHvX64RegisterMsrMtrrPhysBase9 = 0x00002019,
109 WHvX64RegisterMsrMtrrPhysBaseA = 0x0000201A,
110 WHvX64RegisterMsrMtrrPhysBaseB = 0x0000201B,
111 WHvX64RegisterMsrMtrrPhysBaseC = 0x0000201C,
112 WHvX64RegisterMsrMtrrPhysBaseD = 0x0000201D,
113 WHvX64RegisterMsrMtrrPhysBaseE = 0x0000201E,
114 WHvX64RegisterMsrMtrrPhysBaseF = 0x0000201F,
115 WHvX64RegisterMsrMtrrPhysMask0 = 0x00002040,
116 WHvX64RegisterMsrMtrrPhysMask1 = 0x00002041,
117 WHvX64RegisterMsrMtrrPhysMask2 = 0x00002042,
118 WHvX64RegisterMsrMtrrPhysMask3 = 0x00002043,
119 WHvX64RegisterMsrMtrrPhysMask4 = 0x00002044,
120 WHvX64RegisterMsrMtrrPhysMask5 = 0x00002045,
121 WHvX64RegisterMsrMtrrPhysMask6 = 0x00002046,
122 WHvX64RegisterMsrMtrrPhysMask7 = 0x00002047,
123 WHvX64RegisterMsrMtrrPhysMask8 = 0x00002048,
124 WHvX64RegisterMsrMtrrPhysMask9 = 0x00002049,
125 WHvX64RegisterMsrMtrrPhysMaskA = 0x0000204A,
126 WHvX64RegisterMsrMtrrPhysMaskB = 0x0000204B,
127 WHvX64RegisterMsrMtrrPhysMaskC = 0x0000204C,
128 WHvX64RegisterMsrMtrrPhysMaskD = 0x0000204D,
129 WHvX64RegisterMsrMtrrPhysMaskE = 0x0000204E,
130 WHvX64RegisterMsrMtrrPhysMaskF = 0x0000204F,
131 WHvX64RegisterMsrMtrrFix64k00000 = 0x00002070,
132 WHvX64RegisterMsrMtrrFix16k80000 = 0x00002071,
133 WHvX64RegisterMsrMtrrFix16kA0000 = 0x00002072,
134 WHvX64RegisterMsrMtrrFix4kC0000 = 0x00002073,
135 WHvX64RegisterMsrMtrrFix4kC8000 = 0x00002074,
136 WHvX64RegisterMsrMtrrFix4kD0000 = 0x00002075,
137 WHvX64RegisterMsrMtrrFix4kD8000 = 0x00002076,
138 WHvX64RegisterMsrMtrrFix4kE0000 = 0x00002077,
139 WHvX64RegisterMsrMtrrFix4kE8000 = 0x00002078,
140 WHvX64RegisterMsrMtrrFix4kF0000 = 0x00002079,
141 WHvX64RegisterMsrMtrrFix4kF8000 = 0x0000207A,
142 WHvX64RegisterTscAux = 0x0000207B,
143 WHvX64RegisterBndcfgs = 0x0000207C,
144 WHvX64RegisterMCount = 0x0000207E,
145 WHvX64RegisterACount = 0x0000207F,
146 WHvX64RegisterSpecCtrl = 0x00002084,
147 WHvX64RegisterPredCmd = 0x00002085,
148 WHvX64RegisterTscVirtualOffset = 0x00002087,
149 WHvX64RegisterTsxCtrl = 0x00002088,
150 WHvX64RegisterXss = 0x0000208B,
151 WHvX64RegisterUCet = 0x0000208C,
152 WHvX64RegisterSCet = 0x0000208D,
153 WHvX64RegisterSsp = 0x0000208E,
154 WHvX64RegisterPl0Ssp = 0x0000208F,
155 WHvX64RegisterPl1Ssp = 0x00002090,
156 WHvX64RegisterPl2Ssp = 0x00002091,
157 WHvX64RegisterPl3Ssp = 0x00002092,
158 WHvX64RegisterInterruptSspTableAddr = 0x00002093,
159 WHvX64RegisterTscDeadline = 0x00002095,
160 WHvX64RegisterTscAdjust = 0x00002096,
161 WHvX64RegisterUmwaitControl = 0x00002098,
162 WHvX64RegisterXfd = 0x00002099,
163 WHvX64RegisterXfdErr = 0x0000209A,
164 WHvX64RegisterMsrIa32MiscEnable = 0x000020A0,
165 WHvX64RegisterIa32FeatureControl = 0x000020A1,
166 WHvX64RegisterIa32VmxBasic = 0x000020A2,
167 WHvX64RegisterIa32VmxPinbasedCtls = 0x000020A3,
168 WHvX64RegisterIa32VmxProcbasedCtls = 0x000020A4,
169 WHvX64RegisterIa32VmxExitCtls = 0x000020A5,
170 WHvX64RegisterIa32VmxEntryCtls = 0x000020A6,
171 WHvX64RegisterIa32VmxMisc = 0x000020A7,
172 WHvX64RegisterIa32VmxCr0Fixed0 = 0x000020A8,
173 WHvX64RegisterIa32VmxCr0Fixed1 = 0x000020A9,
174 WHvX64RegisterIa32VmxCr4Fixed0 = 0x000020AA,
175 WHvX64RegisterIa32VmxCr4Fixed1 = 0x000020AB,
176 WHvX64RegisterIa32VmxVmcsEnum = 0x000020AC,
177 WHvX64RegisterIa32VmxProcbasedCtls2 = 0x000020AD,
178 WHvX64RegisterIa32VmxEptVpidCap = 0x000020AE,
179 WHvX64RegisterIa32VmxTruePinbasedCtls = 0x000020AF,
180 WHvX64RegisterIa32VmxTrueProcbasedCtls = 0x000020B0,
181 WHvX64RegisterIa32VmxTrueExitCtls = 0x000020B1,
182 WHvX64RegisterIa32VmxTrueEntryCtls = 0x000020B2,
183 WHvX64RegisterAmdVmHsavePa = 0x000020B3,
184 WHvX64RegisterAmdVmCr = 0x000020B4,
185 WHvX64RegisterApicId = 0x00003002,
186 WHvX64RegisterApicVersion = 0x00003003,
187 WHvX64RegisterApicTpr = 0x00003008,
188 WHvX64RegisterApicPpr = 0x0000300A,
189 WHvX64RegisterApicEoi = 0x0000300B,
190 WHvX64RegisterApicLdr = 0x0000300D,
191 WHvX64RegisterApicSpurious = 0x0000300F,
192 WHvX64RegisterApicIsr0 = 0x00003010,
193 WHvX64RegisterApicIsr1 = 0x00003011,
194 WHvX64RegisterApicIsr2 = 0x00003012,
195 WHvX64RegisterApicIsr3 = 0x00003013,
196 WHvX64RegisterApicIsr4 = 0x00003014,
197 WHvX64RegisterApicIsr5 = 0x00003015,
198 WHvX64RegisterApicIsr6 = 0x00003016,
199 WHvX64RegisterApicIsr7 = 0x00003017,
200 WHvX64RegisterApicTmr0 = 0x00003018,
201 WHvX64RegisterApicTmr1 = 0x00003019,
202 WHvX64RegisterApicTmr2 = 0x0000301A,
203 WHvX64RegisterApicTmr3 = 0x0000301B,
204 WHvX64RegisterApicTmr4 = 0x0000301C,
205 WHvX64RegisterApicTmr5 = 0x0000301D,
206 WHvX64RegisterApicTmr6 = 0x0000301E,
207 WHvX64RegisterApicTmr7 = 0x0000301F,
208 WHvX64RegisterApicIrr0 = 0x00003020,
209 WHvX64RegisterApicIrr1 = 0x00003021,
210 WHvX64RegisterApicIrr2 = 0x00003022,
211 WHvX64RegisterApicIrr3 = 0x00003023,
212 WHvX64RegisterApicIrr4 = 0x00003024,
213 WHvX64RegisterApicIrr5 = 0x00003025,
214 WHvX64RegisterApicIrr6 = 0x00003026,
215 WHvX64RegisterApicIrr7 = 0x00003027,
216 WHvX64RegisterApicEse = 0x00003028,
217 WHvX64RegisterApicIcr = 0x00003030,
218 WHvX64RegisterApicLvtTimer = 0x00003032,
219 WHvX64RegisterApicLvtThermal = 0x00003033,
220 WHvX64RegisterApicLvtPerfmon = 0x00003034,
221 WHvX64RegisterApicLvtLint0 = 0x00003035,
222 WHvX64RegisterApicLvtLint1 = 0x00003036,
223 WHvX64RegisterApicLvtError = 0x00003037,
224 WHvX64RegisterApicInitCount = 0x00003038,
225 WHvX64RegisterApicCurrentCount = 0x00003039,
226 WHvX64RegisterApicDivide = 0x0000303E,
227 WHvX64RegisterApicSelfIpi = 0x0000303F,
228 WHvRegisterSint0 = 0x00004000,
229 WHvRegisterSint1 = 0x00004001,
230 WHvRegisterSint2 = 0x00004002,
231 WHvRegisterSint3 = 0x00004003,
232 WHvRegisterSint4 = 0x00004004,
233 WHvRegisterSint5 = 0x00004005,
234 WHvRegisterSint6 = 0x00004006,
235 WHvRegisterSint7 = 0x00004007,
236 WHvRegisterSint8 = 0x00004008,
237 WHvRegisterSint9 = 0x00004009,
238 WHvRegisterSint10 = 0x0000400A,
239 WHvRegisterSint11 = 0x0000400B,
240 WHvRegisterSint12 = 0x0000400C,
241 WHvRegisterSint13 = 0x0000400D,
242 WHvRegisterSint14 = 0x0000400E,
243 WHvRegisterSint15 = 0x0000400F,
244 WHvRegisterScontrol = 0x00004010,
245 WHvRegisterSversion = 0x00004011,
246 WHvRegisterSiefp = 0x00004012,
247 WHvRegisterSimp = 0x00004013,
248 WHvRegisterEom = 0x00004014,
249 WHvRegisterVpRuntime = 0x00005000,
250 WHvX64RegisterHypercall = 0x00005001,
251 WHvRegisterGuestOsId = 0x00005002,
252 WHvRegisterVpAssistPage = 0x00005013,
253 WHvRegisterReferenceTsc = 0x00005017,
254 WHvRegisterReferenceTscSequence = 0x0000501A,
255 WHvX64RegisterNestedGuestState = 0x00005050,
256 WHvX64RegisterNestedCurrentVmGpa = 0x00005051,
257 WHvX64RegisterNestedVmxInvEpt = 0x00005052,
258 WHvX64RegisterNestedVmxInvVpid = 0x00005053,
259 WHvRegisterPendingInterruption = 0x80000000,
260 WHvRegisterInterruptState = 0x80000001,
261 WHvRegisterPendingEvent = 0x80000002,
262 WHvRegisterPendingEvent1 = 0x80000003,
263 WHvX64RegisterDeliverabilityNotifications = 0x80000004,
264 WHvRegisterDeliverabilityNotifications = 0x80000004,
265 WHvRegisterInternalActivityState = 0x80000005,
266 WHvX64RegisterPendingDebugException = 0x80000006,
267 WHvRegisterPendingEvent2 = 0x80000007,
268 WHvRegisterPendingEvent3 = 0x80000008
269} WHV_REGISTER_NAME;
270
271#elif defined (__aarch64__)
272
273typedef enum WHV_REGISTER_NAME {
274 WHvArm64RegisterX0 = 0x00020000,
275 WHvArm64RegisterX1 = 0x00020001,
276 WHvArm64RegisterX2 = 0x00020002,
277 WHvArm64RegisterX3 = 0x00020003,
278 WHvArm64RegisterX4 = 0x00020004,
279 WHvArm64RegisterX5 = 0x00020005,
280 WHvArm64RegisterX6 = 0x00020006,
281 WHvArm64RegisterX7 = 0x00020007,
282 WHvArm64RegisterX8 = 0x00020008,
283 WHvArm64RegisterX9 = 0x00020009,
284 WHvArm64RegisterX10 = 0x0002000A,
285 WHvArm64RegisterX11 = 0x0002000B,
286 WHvArm64RegisterX12 = 0x0002000C,
287 WHvArm64RegisterX13 = 0x0002000D,
288 WHvArm64RegisterX14 = 0x0002000E,
289 WHvArm64RegisterX15 = 0x0002000F,
290 WHvArm64RegisterX16 = 0x00020010,
291 WHvArm64RegisterX17 = 0x00020011,
292 WHvArm64RegisterX18 = 0x00020012,
293 WHvArm64RegisterX19 = 0x00020013,
294 WHvArm64RegisterX20 = 0x00020014,
295 WHvArm64RegisterX21 = 0x00020015,
296 WHvArm64RegisterX22 = 0x00020016,
297 WHvArm64RegisterX23 = 0x00020017,
298 WHvArm64RegisterX24 = 0x00020018,
299 WHvArm64RegisterX25 = 0x00020019,
300 WHvArm64RegisterX26 = 0x0002001A,
301 WHvArm64RegisterX27 = 0x0002001B,
302 WHvArm64RegisterX28 = 0x0002001C,
303 WHvArm64RegisterFp = 0x0002001D,
304 WHvArm64RegisterLr = 0x0002001E,
305 WHvArm64RegisterPc = 0x00020022,
306 WHvArm64RegisterQ0 = 0x00030000,
307 WHvArm64RegisterQ1 = 0x00030001,
308 WHvArm64RegisterQ2 = 0x00030002,
309 WHvArm64RegisterQ3 = 0x00030003,
310 WHvArm64RegisterQ4 = 0x00030004,
311 WHvArm64RegisterQ5 = 0x00030005,
312 WHvArm64RegisterQ6 = 0x00030006,
313 WHvArm64RegisterQ7 = 0x00030007,
314 WHvArm64RegisterQ8 = 0x00030008,
315 WHvArm64RegisterQ9 = 0x00030009,
316 WHvArm64RegisterQ10 = 0x0003000A,
317 WHvArm64RegisterQ11 = 0x0003000B,
318 WHvArm64RegisterQ12 = 0x0003000C,
319 WHvArm64RegisterQ13 = 0x0003000D,
320 WHvArm64RegisterQ14 = 0x0003000E,
321 WHvArm64RegisterQ15 = 0x0003000F,
322 WHvArm64RegisterQ16 = 0x00030010,
323 WHvArm64RegisterQ17 = 0x00030011,
324 WHvArm64RegisterQ18 = 0x00030012,
325 WHvArm64RegisterQ19 = 0x00030013,
326 WHvArm64RegisterQ20 = 0x00030014,
327 WHvArm64RegisterQ21 = 0x00030015,
328 WHvArm64RegisterQ22 = 0x00030016,
329 WHvArm64RegisterQ23 = 0x00030017,
330 WHvArm64RegisterQ24 = 0x00030018,
331 WHvArm64RegisterQ25 = 0x00030019,
332 WHvArm64RegisterQ26 = 0x0003001A,
333 WHvArm64RegisterQ27 = 0x0003001B,
334 WHvArm64RegisterQ28 = 0x0003001C,
335 WHvArm64RegisterQ29 = 0x0003001D,
336 WHvArm64RegisterQ30 = 0x0003001E,
337 WHvArm64RegisterQ31 = 0x0003001F,
338 WHvArm64RegisterPstate = 0x00020023,
339 WHvArm64RegisterElrEl1 = 0x00040015,
340 WHvArm64RegisterFpcr = 0x00040012,
341 WHvArm64RegisterFpsr = 0x00040013,
342 WHvArm64RegisterSp = 0x0002001F,
343 WHvArm64RegisterSpEl0 = 0x00020020,
344 WHvArm64RegisterSpEl1 = 0x00020021,
345 WHvArm64RegisterSpsrEl1 = 0x00040014,
346 WHvArm64RegisterIdMidrEl1 = 0x00022000,
347 WHvArm64RegisterIdRes01El1 = 0x00022001,
348 WHvArm64RegisterIdRes02El1 = 0x00022002,
349 WHvArm64RegisterIdRes03El1 = 0x00022003,
350 WHvArm64RegisterIdRes04El1 = 0x00022004,
351 WHvArm64RegisterIdMpidrEl1 = 0x00022005,
352 WHvArm64RegisterIdRevidrEl1 = 0x00022006,
353 WHvArm64RegisterIdRes07El1 = 0x00022007,
354 WHvArm64RegisterIdPfr0El1 = 0x00022008,
355 WHvArm64RegisterIdPfr1El1 = 0x00022009,
356 WHvArm64RegisterIdDfr0El1 = 0x0002200A,
357 WHvArm64RegisterIdRes13El1 = 0x0002200B,
358 WHvArm64RegisterIdMmfr0El1 = 0x0002200C,
359 WHvArm64RegisterIdMmfr1El1 = 0x0002200D,
360 WHvArm64RegisterIdMmfr2El1 = 0x0002200E,
361 WHvArm64RegisterIdMmfr3El1 = 0x0002200F,
362 WHvArm64RegisterIdIsar0El1 = 0x00022010,
363 WHvArm64RegisterIdIsar1El1 = 0x00022011,
364 WHvArm64RegisterIdIsar2El1 = 0x00022012,
365 WHvArm64RegisterIdIsar3El1 = 0x00022013,
366 WHvArm64RegisterIdIsar4El1 = 0x00022014,
367 WHvArm64RegisterIdIsar5El1 = 0x00022015,
368 WHvArm64RegisterIdRes26El1 = 0x00022016,
369 WHvArm64RegisterIdRes27El1 = 0x00022017,
370 WHvArm64RegisterIdMvfr0El1 = 0x00022018,
371 WHvArm64RegisterIdMvfr1El1 = 0x00022019,
372 WHvArm64RegisterIdMvfr2El1 = 0x0002201A,
373 WHvArm64RegisterIdRes33El1 = 0x0002201B,
374 WHvArm64RegisterIdPfr2El1 = 0x0002201C,
375 WHvArm64RegisterIdRes35El1 = 0x0002201D,
376 WHvArm64RegisterIdRes36El1 = 0x0002201E,
377 WHvArm64RegisterIdRes37El1 = 0x0002201F,
378 WHvArm64RegisterIdAa64Pfr0El1 = 0x00022020,
379 WHvArm64RegisterIdAa64Pfr1El1 = 0x00022021,
380 WHvArm64RegisterIdAa64Pfr2El1 = 0x00022022,
381 WHvArm64RegisterIdRes43El1 = 0x00022023,
382 WHvArm64RegisterIdAa64Zfr0El1 = 0x00022024,
383 WHvArm64RegisterIdAa64Smfr0El1 = 0x00022025,
384 WHvArm64RegisterIdRes46El1 = 0x00022026,
385 WHvArm64RegisterIdRes47El1 = 0x00022027,
386 WHvArm64RegisterIdAa64Dfr0El1 = 0x00022028,
387 WHvArm64RegisterIdAa64Dfr1El1 = 0x00022029,
388 WHvArm64RegisterIdRes52El1 = 0x0002202A,
389 WHvArm64RegisterIdRes53El1 = 0x0002202B,
390 WHvArm64RegisterIdRes54El1 = 0x0002202C,
391 WHvArm64RegisterIdRes55El1 = 0x0002202D,
392 WHvArm64RegisterIdRes56El1 = 0x0002202E,
393 WHvArm64RegisterIdRes57El1 = 0x0002202F,
394 WHvArm64RegisterIdAa64Isar0El1 = 0x00022030,
395 WHvArm64RegisterIdAa64Isar1El1 = 0x00022031,
396 WHvArm64RegisterIdAa64Isar2El1 = 0x00022032,
397 WHvArm64RegisterIdRes63El1 = 0x00022033,
398 WHvArm64RegisterIdRes64El1 = 0x00022034,
399 WHvArm64RegisterIdRes65El1 = 0x00022035,
400 WHvArm64RegisterIdRes66El1 = 0x00022036,
401 WHvArm64RegisterIdRes67El1 = 0x00022037,
402 WHvArm64RegisterIdAa64Mmfr0El1 = 0x00022038,
403 WHvArm64RegisterIdAa64Mmfr1El1 = 0x00022039,
404 WHvArm64RegisterIdAa64Mmfr2El1 = 0x0002203A,
405 WHvArm64RegisterIdAa64Mmfr3El1 = 0x0002203B,
406 WHvArm64RegisterIdAa64Mmfr4El1 = 0x0002203C,
407 WHvArm64RegisterIdRes75El1 = 0x0002203D,
408 WHvArm64RegisterIdRes76El1 = 0x0002203E,
409 WHvArm64RegisterIdRes77El1 = 0x0002203F,
410 WHvArm64RegisterIdRes80El1 = 0x00022040,
411 WHvArm64RegisterIdRes81El1 = 0x00022041,
412 WHvArm64RegisterIdRes82El1 = 0x00022042,
413 WHvArm64RegisterIdRes83El1 = 0x00022043,
414 WHvArm64RegisterIdRes84El1 = 0x00022044,
415 WHvArm64RegisterIdRes85El1 = 0x00022045,
416 WHvArm64RegisterIdRes86El1 = 0x00022046,
417 WHvArm64RegisterIdRes87El1 = 0x00022047,
418 WHvArm64RegisterIdRes90El1 = 0x00022048,
419 WHvArm64RegisterIdRes91El1 = 0x00022049,
420 WHvArm64RegisterIdRes92El1 = 0x0002204A,
421 WHvArm64RegisterIdRes93El1 = 0x0002204B,
422 WHvArm64RegisterIdRes94El1 = 0x0002204C,
423 WHvArm64RegisterIdRes95El1 = 0x0002204D,
424 WHvArm64RegisterIdRes96El1 = 0x0002204E,
425 WHvArm64RegisterIdRes97El1 = 0x0002204F,
426 WHvArm64RegisterIdRes100El1 = 0x00022050,
427 WHvArm64RegisterIdRes101El1 = 0x00022051,
428 WHvArm64RegisterIdRes102El1 = 0x00022052,
429 WHvArm64RegisterIdRes103El1 = 0x00022053,
430 WHvArm64RegisterIdRes104El1 = 0x00022054,
431 WHvArm64RegisterIdRes105El1 = 0x00022055,
432 WHvArm64RegisterIdRes106El1 = 0x00022056,
433 WHvArm64RegisterIdRes107El1 = 0x00022057,
434 WHvArm64RegisterIdRes110El1 = 0x00022058,
435 WHvArm64RegisterIdRes111El1 = 0x00022059,
436 WHvArm64RegisterIdRes112El1 = 0x0002205A,
437 WHvArm64RegisterIdRes113El1 = 0x0002205B,
438 WHvArm64RegisterIdRes114El1 = 0x0002205C,
439 WHvArm64RegisterIdRes115El1 = 0x0002205D,
440 WHvArm64RegisterIdRes116El1 = 0x0002205E,
441 WHvArm64RegisterIdRes117El1 = 0x0002205F,
442 WHvArm64RegisterIdRes120El1 = 0x00022060,
443 WHvArm64RegisterIdRes121El1 = 0x00022061,
444 WHvArm64RegisterIdRes122El1 = 0x00022062,
445 WHvArm64RegisterIdRes123El1 = 0x00022063,
446 WHvArm64RegisterIdRes124El1 = 0x00022064,
447 WHvArm64RegisterIdRes125El1 = 0x00022065,
448 WHvArm64RegisterIdRes126El1 = 0x00022066,
449 WHvArm64RegisterIdRes127El1 = 0x00022067,
450 WHvArm64RegisterIdRes130El1 = 0x00022068,
451 WHvArm64RegisterIdRes131El1 = 0x00022069,
452 WHvArm64RegisterIdRes132El1 = 0x0002206A,
453 WHvArm64RegisterIdRes133El1 = 0x0002206B,
454 WHvArm64RegisterIdRes134El1 = 0x0002206C,
455 WHvArm64RegisterIdRes135El1 = 0x0002206D,
456 WHvArm64RegisterIdRes136El1 = 0x0002206E,
457 WHvArm64RegisterIdRes137El1 = 0x0002206F,
458 WHvArm64RegisterIdRes140El1 = 0x00022070,
459 WHvArm64RegisterIdRes141El1 = 0x00022071,
460 WHvArm64RegisterIdRes142El1 = 0x00022072,
461 WHvArm64RegisterIdRes143El1 = 0x00022073,
462 WHvArm64RegisterIdRes144El1 = 0x00022074,
463 WHvArm64RegisterIdRes145El1 = 0x00022075,
464 WHvArm64RegisterIdRes146El1 = 0x00022076,
465 WHvArm64RegisterIdRes147El1 = 0x00022077,
466 WHvArm64RegisterIdRes150El1 = 0x00022078,
467 WHvArm64RegisterIdRes151El1 = 0x00022079,
468 WHvArm64RegisterIdRes152El1 = 0x0002207A,
469 WHvArm64RegisterIdRes153El1 = 0x0002207B,
470 WHvArm64RegisterIdRes154El1 = 0x0002207C,
471 WHvArm64RegisterIdRes155El1 = 0x0002207D,
472 WHvArm64RegisterIdRes156El1 = 0x0002207E,
473 WHvArm64RegisterIdRes157El1 = 0x0002207F,
474 WHvArm64RegisterActlrEl1 = 0x00040003,
475 WHvArm64RegisterApdAKeyHiEl1 = 0x00040026,
476 WHvArm64RegisterApdAKeyLoEl1 = 0x00040027,
477 WHvArm64RegisterApdBKeyHiEl1 = 0x00040028,
478 WHvArm64RegisterApdBKeyLoEl1 = 0x00040029,
479 WHvArm64RegisterApgAKeyHiEl1 = 0x0004002A,
480 WHvArm64RegisterApgAKeyLoEl1 = 0x0004002B,
481 WHvArm64RegisterApiAKeyHiEl1 = 0x0004002C,
482 WHvArm64RegisterApiAKeyLoEl1 = 0x0004002D,
483 WHvArm64RegisterApiBKeyHiEl1 = 0x0004002E,
484 WHvArm64RegisterApiBKeyLoEl1 = 0x0004002F,
485 WHvArm64RegisterContextidrEl1 = 0x0004000D,
486 WHvArm64RegisterCpacrEl1 = 0x00040004,
487 WHvArm64RegisterCsselrEl1 = 0x00040035,
488 WHvArm64RegisterEsrEl1 = 0x00040008,
489 WHvArm64RegisterFarEl1 = 0x00040009,
490 WHvArm64RegisterMairEl1 = 0x0004000B,
491 WHvArm64RegisterMidrEl1 = 0x00040051,
492 WHvArm64RegisterMpidrEl1 = 0x00040001,
493 WHvArm64RegisterParEl1 = 0x0004000A,
494 WHvArm64RegisterSctlrEl1 = 0x00040002,
495 WHvArm64RegisterTcrEl1 = 0x00040007,
496 WHvArm64RegisterTpidrEl0 = 0x00040011,
497 WHvArm64RegisterTpidrEl1 = 0x0004000E,
498 WHvArm64RegisterTpidrroEl0 = 0x00040010,
499 WHvArm64RegisterTtbr0El1 = 0x00040005,
500 WHvArm64RegisterTtbr1El1 = 0x00040006,
501 WHvArm64RegisterVbarEl1 = 0x0004000C,
502 WHvArm64RegisterZcrEl1 = 0x00040071,
503 WHvArm64RegisterDbgbcr0El1 = 0x00050000,
504 WHvArm64RegisterDbgbcr1El1 = 0x00050001,
505 WHvArm64RegisterDbgbcr2El1 = 0x00050002,
506 WHvArm64RegisterDbgbcr3El1 = 0x00050003,
507 WHvArm64RegisterDbgbcr4El1 = 0x00050004,
508 WHvArm64RegisterDbgbcr5El1 = 0x00050005,
509 WHvArm64RegisterDbgbcr6El1 = 0x00050006,
510 WHvArm64RegisterDbgbcr7El1 = 0x00050007,
511 WHvArm64RegisterDbgbcr8El1 = 0x00050008,
512 WHvArm64RegisterDbgbcr9El1 = 0x00050009,
513 WHvArm64RegisterDbgbcr10El1 = 0x0005000A,
514 WHvArm64RegisterDbgbcr11El1 = 0x0005000B,
515 WHvArm64RegisterDbgbcr12El1 = 0x0005000C,
516 WHvArm64RegisterDbgbcr13El1 = 0x0005000D,
517 WHvArm64RegisterDbgbcr14El1 = 0x0005000E,
518 WHvArm64RegisterDbgbcr15El1 = 0x0005000F,
519 WHvArm64RegisterDbgbvr0El1 = 0x00050020,
520 WHvArm64RegisterDbgbvr1El1 = 0x00050021,
521 WHvArm64RegisterDbgbvr2El1 = 0x00050022,
522 WHvArm64RegisterDbgbvr3El1 = 0x00050023,
523 WHvArm64RegisterDbgbvr4El1 = 0x00050024,
524 WHvArm64RegisterDbgbvr5El1 = 0x00050025,
525 WHvArm64RegisterDbgbvr6El1 = 0x00050026,
526 WHvArm64RegisterDbgbvr7El1 = 0x00050027,
527 WHvArm64RegisterDbgbvr8El1 = 0x00050028,
528 WHvArm64RegisterDbgbvr9El1 = 0x00050029,
529 WHvArm64RegisterDbgbvr10El1 = 0x0005002A,
530 WHvArm64RegisterDbgbvr11El1 = 0x0005002B,
531 WHvArm64RegisterDbgbvr12El1 = 0x0005002C,
532 WHvArm64RegisterDbgbvr13El1 = 0x0005002D,
533 WHvArm64RegisterDbgbvr14El1 = 0x0005002E,
534 WHvArm64RegisterDbgbvr15El1 = 0x0005002F,
535 WHvArm64RegisterDbgprcrEl1 = 0x00050045,
536 WHvArm64RegisterDbgwcr0El1 = 0x00050010,
537 WHvArm64RegisterDbgwcr1El1 = 0x00050011,
538 WHvArm64RegisterDbgwcr2El1 = 0x00050012,
539 WHvArm64RegisterDbgwcr3El1 = 0x00050013,
540 WHvArm64RegisterDbgwcr4El1 = 0x00050014,
541 WHvArm64RegisterDbgwcr5El1 = 0x00050015,
542 WHvArm64RegisterDbgwcr6El1 = 0x00050016,
543 WHvArm64RegisterDbgwcr7El1 = 0x00050017,
544 WHvArm64RegisterDbgwcr8El1 = 0x00050018,
545 WHvArm64RegisterDbgwcr9El1 = 0x00050019,
546 WHvArm64RegisterDbgwcr10El1 = 0x0005001A,
547 WHvArm64RegisterDbgwcr11El1 = 0x0005001B,
548 WHvArm64RegisterDbgwcr12El1 = 0x0005001C,
549 WHvArm64RegisterDbgwcr13El1 = 0x0005001D,
550 WHvArm64RegisterDbgwcr14El1 = 0x0005001E,
551 WHvArm64RegisterDbgwcr15El1 = 0x0005001F,
552 WHvArm64RegisterDbgwvr0El1 = 0x00050030,
553 WHvArm64RegisterDbgwvr1El1 = 0x00050031,
554 WHvArm64RegisterDbgwvr2El1 = 0x00050032,
555 WHvArm64RegisterDbgwvr3El1 = 0x00050033,
556 WHvArm64RegisterDbgwvr4El1 = 0x00050034,
557 WHvArm64RegisterDbgwvr5El1 = 0x00050035,
558 WHvArm64RegisterDbgwvr6El1 = 0x00050036,
559 WHvArm64RegisterDbgwvr7El1 = 0x00050037,
560 WHvArm64RegisterDbgwvr8El1 = 0x00050038,
561 WHvArm64RegisterDbgwvr9El1 = 0x00050039,
562 WHvArm64RegisterDbgwvr10El1 = 0x0005003A,
563 WHvArm64RegisterDbgwvr11El1 = 0x0005003B,
564 WHvArm64RegisterDbgwvr12El1 = 0x0005003C,
565 WHvArm64RegisterDbgwvr13El1 = 0x0005003D,
566 WHvArm64RegisterDbgwvr14El1 = 0x0005003E,
567 WHvArm64RegisterDbgwvr15El1 = 0x0005003F,
568 WHvArm64RegisterMdrarEl1 = 0x0005004C,
569 WHvArm64RegisterMdscrEl1 = 0x0005004D,
570 WHvArm64RegisterOsdlrEl1 = 0x0005004E,
571 WHvArm64RegisterOslarEl1 = 0x00050052,
572 WHvArm64RegisterOslsrEl1 = 0x00050053,
573 WHvArm64RegisterPmccfiltrEl0 = 0x00052000,
574 WHvArm64RegisterPmccntrEl0 = 0x00052001,
575 WHvArm64RegisterPmceid0El0 = 0x00052002,
576 WHvArm64RegisterPmceid1El0 = 0x00052003,
577 WHvArm64RegisterPmcntenclrEl0 = 0x00052004,
578 WHvArm64RegisterPmcntensetEl0 = 0x00052005,
579 WHvArm64RegisterPmcrEl0 = 0x00052006,
580 WHvArm64RegisterPmevcntr0El0 = 0x00052007,
581 WHvArm64RegisterPmevcntr1El0 = 0x00052008,
582 WHvArm64RegisterPmevcntr2El0 = 0x00052009,
583 WHvArm64RegisterPmevcntr3El0 = 0x0005200A,
584 WHvArm64RegisterPmevcntr4El0 = 0x0005200B,
585 WHvArm64RegisterPmevcntr5El0 = 0x0005200C,
586 WHvArm64RegisterPmevcntr6El0 = 0x0005200D,
587 WHvArm64RegisterPmevcntr7El0 = 0x0005200E,
588 WHvArm64RegisterPmevcntr8El0 = 0x0005200F,
589 WHvArm64RegisterPmevcntr9El0 = 0x00052010,
590 WHvArm64RegisterPmevcntr10El0 = 0x00052011,
591 WHvArm64RegisterPmevcntr11El0 = 0x00052012,
592 WHvArm64RegisterPmevcntr12El0 = 0x00052013,
593 WHvArm64RegisterPmevcntr13El0 = 0x00052014,
594 WHvArm64RegisterPmevcntr14El0 = 0x00052015,
595 WHvArm64RegisterPmevcntr15El0 = 0x00052016,
596 WHvArm64RegisterPmevcntr16El0 = 0x00052017,
597 WHvArm64RegisterPmevcntr17El0 = 0x00052018,
598 WHvArm64RegisterPmevcntr18El0 = 0x00052019,
599 WHvArm64RegisterPmevcntr19El0 = 0x0005201A,
600 WHvArm64RegisterPmevcntr20El0 = 0x0005201B,
601 WHvArm64RegisterPmevcntr21El0 = 0x0005201C,
602 WHvArm64RegisterPmevcntr22El0 = 0x0005201D,
603 WHvArm64RegisterPmevcntr23El0 = 0x0005201E,
604 WHvArm64RegisterPmevcntr24El0 = 0x0005201F,
605 WHvArm64RegisterPmevcntr25El0 = 0x00052020,
606 WHvArm64RegisterPmevcntr26El0 = 0x00052021,
607 WHvArm64RegisterPmevcntr27El0 = 0x00052022,
608 WHvArm64RegisterPmevcntr28El0 = 0x00052023,
609 WHvArm64RegisterPmevcntr29El0 = 0x00052024,
610 WHvArm64RegisterPmevcntr30El0 = 0x00052025,
611 WHvArm64RegisterPmevtyper0El0 = 0x00052026,
612 WHvArm64RegisterPmevtyper1El0 = 0x00052027,
613 WHvArm64RegisterPmevtyper2El0 = 0x00052028,
614 WHvArm64RegisterPmevtyper3El0 = 0x00052029,
615 WHvArm64RegisterPmevtyper4El0 = 0x0005202A,
616 WHvArm64RegisterPmevtyper5El0 = 0x0005202B,
617 WHvArm64RegisterPmevtyper6El0 = 0x0005202C,
618 WHvArm64RegisterPmevtyper7El0 = 0x0005202D,
619 WHvArm64RegisterPmevtyper8El0 = 0x0005202E,
620 WHvArm64RegisterPmevtyper9El0 = 0x0005202F,
621 WHvArm64RegisterPmevtyper10El0 = 0x00052030,
622 WHvArm64RegisterPmevtyper11El0 = 0x00052031,
623 WHvArm64RegisterPmevtyper12El0 = 0x00052032,
624 WHvArm64RegisterPmevtyper13El0 = 0x00052033,
625 WHvArm64RegisterPmevtyper14El0 = 0x00052034,
626 WHvArm64RegisterPmevtyper15El0 = 0x00052035,
627 WHvArm64RegisterPmevtyper16El0 = 0x00052036,
628 WHvArm64RegisterPmevtyper17El0 = 0x00052037,
629 WHvArm64RegisterPmevtyper18El0 = 0x00052038,
630 WHvArm64RegisterPmevtyper19El0 = 0x00052039,
631 WHvArm64RegisterPmevtyper20El0 = 0x0005203A,
632 WHvArm64RegisterPmevtyper21El0 = 0x0005203B,
633 WHvArm64RegisterPmevtyper22El0 = 0x0005203C,
634 WHvArm64RegisterPmevtyper23El0 = 0x0005203D,
635 WHvArm64RegisterPmevtyper24El0 = 0x0005203E,
636 WHvArm64RegisterPmevtyper25El0 = 0x0005203F,
637 WHvArm64RegisterPmevtyper26El0 = 0x00052040,
638 WHvArm64RegisterPmevtyper27El0 = 0x00052041,
639 WHvArm64RegisterPmevtyper28El0 = 0x00052042,
640 WHvArm64RegisterPmevtyper29El0 = 0x00052043,
641 WHvArm64RegisterPmevtyper30El0 = 0x00052044,
642 WHvArm64RegisterPmintenclrEl1 = 0x00052045,
643 WHvArm64RegisterPmintensetEl1 = 0x00052046,
644 WHvArm64RegisterPmovsclrEl0 = 0x00052048,
645 WHvArm64RegisterPmovssetEl0 = 0x00052049,
646 WHvArm64RegisterPmselrEl0 = 0x0005204A,
647 WHvArm64RegisterPmuserenrEl0 = 0x0005204C,
648 WHvArm64RegisterCntkctlEl1 = 0x00058008,
649 WHvArm64RegisterCntvCtlEl0 = 0x0005800E,
650 WHvArm64RegisterCntvCvalEl0 = 0x0005800F,
651 WHvArm64RegisterCntvctEl0 = 0x00058011,
652 WHvArm64RegisterGicrBaseGpa = 0x00063000,
653 WHvRegisterSint0 = 0x000A0000,
654 WHvRegisterSint1 = 0x000A0001,
655 WHvRegisterSint2 = 0x000A0002,
656 WHvRegisterSint3 = 0x000A0003,
657 WHvRegisterSint4 = 0x000A0004,
658 WHvRegisterSint5 = 0x000A0005,
659 WHvRegisterSint6 = 0x000A0006,
660 WHvRegisterSint7 = 0x000A0007,
661 WHvRegisterSint8 = 0x000A0008,
662 WHvRegisterSint9 = 0x000A0009,
663 WHvRegisterSint10 = 0x000A000A,
664 WHvRegisterSint11 = 0x000A000B,
665 WHvRegisterSint12 = 0x000A000C,
666 WHvRegisterSint13 = 0x000A000D,
667 WHvRegisterSint14 = 0x000A000E,
668 WHvRegisterSint15 = 0x000A000F,
669 WHvRegisterScontrol = 0x000A0010,
670 WHvRegisterSversion = 0x000A0011,
671 WHvRegisterSifp = 0x000A0012,
672 WHvRegisterSipp = 0x000A0013,
673 WHvRegisterEom = 0x000A0014,
674 WHvRegisterHypervisorVersion = 0x00000100,
675 WHvRegisterPrivilegesAndFeaturesInfo = 0x00000200,
676 WHvRegisterFeaturesInfo = 0x00000201,
677 WHvRegisterImplementationLimitsInfo = 0x00000202,
678 WHvRegisterHardwareFeaturesInfo = 0x00000203,
679 WHvRegisterCpuManagementFeaturesInfo = 0x00000204,
680 WHvRegisterPasidFeaturesInfo = 0x00000205,
681 WHvRegisterGuestCrashP0 = 0x00000210,
682 WHvRegisterGuestCrashP1 = 0x00000211,
683 WHvRegisterGuestCrashP2 = 0x00000212,
684 WHvRegisterGuestCrashP3 = 0x00000213,
685 WHvRegisterGuestCrashP4 = 0x00000214,
686 WHvRegisterGuestCrashCtl = 0x00000215,
687 WHvRegisterVpRuntime = 0x00090000,
688 WHvRegisterGuestOsId = 0x00090002,
689 WHvRegisterVpAssistPage = 0x00090013,
690 WHvArm64RegisterPartitionInfoPage = 0x00090015,
691 WHvRegisterReferenceTsc = 0x00090017,
692 WHvRegisterReferenceTscSequence = 0x0009001A,
693 WHvRegisterPendingEvent0 = 0x00010004,
694 WHvRegisterPendingEvent1 = 0x00010005,
695 WHvRegisterDeliverabilityNotifications = 0x00010006,
696 WHvRegisterInternalActivityState = 0x00000004,
697 WHvRegisterPendingEvent2 = 0x00010008,
698 WHvRegisterPendingEvent3 = 0x00010009
699} WHV_REGISTER_NAME;
700
701#define WHvRegisterSiefp WHvRegisterSifp
702#define WHvRegisterSimp WHvRegisterSipp
703#define WHvRegisterPendingEvent WHvRegisterPendingEvent0
704
705#endif /* __x86_64__ || __aarch64__ */
706
707typedef UINT64 WHV_GUEST_PHYSICAL_ADDRESS;
708typedef UINT64 WHV_GUEST_VIRTUAL_ADDRESS;
709
710typedef union DECLSPEC_ALIGN(16) WHV_UINT128 {
711 __C89_NAMELESS struct {
712 UINT64 Low64;
713 UINT64 High64;
714 };
715 UINT32 Dword[4];
716} WHV_UINT128;
717
718C_ASSERT(sizeof(WHV_UINT128) == 16);
719
720#if defined(__x86_64__)
721
722typedef union WHV_X64_FP_REGISTER {
723 __C89_NAMELESS struct {
724 UINT64 Mantissa;
725 UINT64 BiasedExponent:15;
726 UINT64 Sign:1;
727 UINT64 Reserved:48;
728 };
729 WHV_UINT128 AsUINT128;
730} WHV_X64_FP_REGISTER;
731
732C_ASSERT(sizeof(WHV_X64_FP_REGISTER) == 16);
733
734typedef union WHV_X64_FP_CONTROL_STATUS_REGISTER {
735 __C89_NAMELESS struct {
736 UINT16 FpControl;
737 UINT16 FpStatus;
738 UINT8 FpTag;
739 UINT8 Reserved;
740 UINT16 LastFpOp;
741 __C89_NAMELESS union {
742 UINT64 LastFpRip;
743 __C89_NAMELESS struct {
744 UINT32 LastFpEip;
745 UINT16 LastFpCs;
746 UINT16 Reserved2;
747 };
748 };
749 };
750 WHV_UINT128 AsUINT128;
751} WHV_X64_FP_CONTROL_STATUS_REGISTER;
752
753C_ASSERT(sizeof(WHV_X64_FP_CONTROL_STATUS_REGISTER) == 16);
754
755typedef union WHV_X64_XMM_CONTROL_STATUS_REGISTER {
756 __C89_NAMELESS struct {
757 __C89_NAMELESS union {
758 UINT64 LastFpRdp;
759 __C89_NAMELESS struct {
760 UINT32 LastFpDp;
761 UINT16 LastFpDs;
762 UINT16 Reserved;
763 };
764 };
765 UINT32 XmmStatusControl;
766 UINT32 XmmStatusControlMask;
767 };
768 WHV_UINT128 AsUINT128;
769} WHV_X64_XMM_CONTROL_STATUS_REGISTER;
770
771C_ASSERT(sizeof(WHV_X64_XMM_CONTROL_STATUS_REGISTER) == 16);
772
773typedef struct WHV_X64_SEGMENT_REGISTER {
774 UINT64 Base;
775 UINT32 Limit;
776 UINT16 Selector;
777 __C89_NAMELESS union {
778 __C89_NAMELESS struct {
779 UINT16 SegmentType:4;
780 UINT16 NonSystemSegment:1;
781 UINT16 DescriptorPrivilegeLevel:2;
782 UINT16 Present:1;
783 UINT16 Reserved:4;
784 UINT16 Available:1;
785 UINT16 Long:1;
786 UINT16 Default:1;
787 UINT16 Granularity:1;
788 };
789 UINT16 Attributes;
790 };
791} WHV_X64_SEGMENT_REGISTER;
792
793C_ASSERT(sizeof(WHV_X64_SEGMENT_REGISTER) == 16);
794
795typedef struct WHV_X64_TABLE_REGISTER {
796 UINT16 Pad[3];
797 UINT16 Limit;
798 UINT64 Base;
799} WHV_X64_TABLE_REGISTER;
800
801C_ASSERT(sizeof(WHV_X64_TABLE_REGISTER) == 16);
802
803typedef union WHV_X64_INTERRUPT_STATE_REGISTER {
804 __C89_NAMELESS struct {
805 UINT64 InterruptShadow:1;
806 UINT64 NmiMasked:1;
807 UINT64 Reserved:62;
808 };
809 UINT64 AsUINT64;
810} WHV_X64_INTERRUPT_STATE_REGISTER;
811
812C_ASSERT(sizeof(WHV_X64_INTERRUPT_STATE_REGISTER) == 8);
813
814typedef union WHV_X64_PENDING_INTERRUPTION_REGISTER {
815 __C89_NAMELESS struct {
816 UINT32 InterruptionPending:1;
817 UINT32 InterruptionType:3;
818 UINT32 DeliverErrorCode:1;
819 UINT32 InstructionLength:4;
820 UINT32 NestedEvent:1;
821 UINT32 Reserved:6;
822 UINT32 InterruptionVector:16;
823 UINT32 ErrorCode;
824 };
825 UINT64 AsUINT64;
826} WHV_X64_PENDING_INTERRUPTION_REGISTER;
827
828C_ASSERT(sizeof(WHV_X64_PENDING_INTERRUPTION_REGISTER) == sizeof(UINT64));
829
830typedef enum WHV_X64_PENDING_EVENT_TYPE {
831 WHvX64PendingEventException = 0,
832 WHvX64PendingEventExtInt = 5,
833 WHvX64PendingEventSvmNestedExit = 7,
834 WHvX64PendingEventVmxNestedExit = 8
835} WHV_X64_PENDING_EVENT_TYPE;
836
837typedef union WHV_X64_PENDING_EXCEPTION_EVENT {
838 __C89_NAMELESS struct {
839 UINT32 EventPending : 1;
840 UINT32 EventType : 3;
841 UINT32 Reserved0 : 4;
842 UINT32 DeliverErrorCode : 1;
843 UINT32 Reserved1 : 7;
844 UINT32 Vector : 16;
845 UINT32 ErrorCode;
846 UINT64 ExceptionParameter;
847 };
848 WHV_UINT128 AsUINT128;
849} WHV_X64_PENDING_EXCEPTION_EVENT;
850
851C_ASSERT(sizeof(WHV_X64_PENDING_EXCEPTION_EVENT) == sizeof(WHV_UINT128));
852
853typedef union WHV_X64_PENDING_EXT_INT_EVENT {
854 __C89_NAMELESS struct {
855 UINT64 EventPending : 1;
856 UINT64 EventType : 3;
857 UINT64 Reserved0 : 4;
858 UINT64 Vector : 8;
859 UINT64 Reserved1 : 48;
860 UINT64 Reserved2;
861 };
862 WHV_UINT128 AsUINT128;
863} WHV_X64_PENDING_EXT_INT_EVENT;
864
865C_ASSERT(sizeof(WHV_X64_PENDING_EXT_INT_EVENT) == sizeof(WHV_UINT128));
866
867typedef union WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT0 {
868 __C89_NAMELESS struct {
869 UINT64 EventPending : 1;
870 UINT64 EventType : 4;
871 UINT64 Reserved0 : 3;
872 UINT64 InstructionBytesValid : 1;
873 UINT64 Reserved1 : 55;
874 UINT64 ExitCode;
875 };
876 WHV_UINT128 AsUINT128;
877} WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT0;
878
879typedef union WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT1 {
880 __C89_NAMELESS struct {
881 UINT64 ExitInfo1;
882 UINT64 ExitInfo2;
883 };
884 WHV_UINT128 AsUINT128;
885} WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT1;
886
887typedef union WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT2 {
888 __C89_NAMELESS struct {
889 UINT64 NextRip;
890 UINT8 InstructionBytesFetchedCount;
891 UINT8 InstructionBytes[7];
892 };
893 WHV_UINT128 AsUINT128;
894} WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT2;
895
896typedef union WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT3 {
897 __C89_NAMELESS struct {
898 UINT8 InstructionBytes[8];
899 UINT64 Reserved2;
900 };
901 WHV_UINT128 AsUINT128;
902} WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT3;
903
904C_ASSERT(sizeof(WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT0) == 16);
905C_ASSERT(sizeof(WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT1) == 16);
906C_ASSERT(sizeof(WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT2) == 16);
907C_ASSERT(sizeof(WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT3) == 16);
908
909typedef union WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT0 {
910 __C89_NAMELESS struct {
911 UINT32 EventPending : 1;
912 UINT32 EventType : 4;
913 UINT32 Reserved0 : 27;
914 UINT32 ExitReason;
915 UINT64 ExitQualification;
916 };
917 WHV_UINT128 AsUINT128;
918} WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT0;
919
920typedef union WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT1 {
921 __C89_NAMELESS struct {
922 UINT32 InstructionLength;
923 UINT32 InstructionInfo;
924 UINT32 ExitInterruptionInfo;
925 UINT32 ExitExceptionErrorCode;
926 };
927 WHV_UINT128 AsUINT128;
928} WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT1;
929
930typedef union WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT2 {
931 __C89_NAMELESS struct {
932 UINT64 GuestLinearAddress;
933 UINT64 GuestPhysicalAddress;
934 };
935 WHV_UINT128 AsUINT128;
936} WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT2;
937
938C_ASSERT(sizeof(WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT0) == 16);
939C_ASSERT(sizeof(WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT1) == 16);
940C_ASSERT(sizeof(WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT2) == 16);
941
942typedef union WHV_X64_NESTED_INVEPT_REGISTER {
943 __C89_NAMELESS struct {
944 UINT8 Type;
945 UINT8 Reserved[7];
946 UINT64 Eptp;
947 };
948 WHV_UINT128 AsUINT128;
949} WHV_X64_NESTED_INVEPT_REGISTER;
950
951C_ASSERT(sizeof(WHV_X64_NESTED_INVEPT_REGISTER) == 16);
952
953typedef union WHV_X64_NESTED_INVVPID_REGISTER {
954 __C89_NAMELESS struct {
955 UINT8 Type;
956 UINT8 Reserved[3];
957 UINT32 Vpid;
958 UINT64 LinearAddress;
959 };
960 WHV_UINT128 AsUINT128;
961} WHV_X64_NESTED_INVVPID_REGISTER;
962
963C_ASSERT(sizeof(WHV_X64_NESTED_INVVPID_REGISTER) == 16);
964
965typedef union WHV_X64_NESTED_GUEST_STATE {
966 __C89_NAMELESS struct {
967 UINT64 NestedVirtActive : 1;
968 UINT64 NestedGuestMode : 1;
969 UINT64 VmEntryPending : 1;
970 UINT64 Reserved0 : 61;
971 UINT64 Reserved1;
972 };
973 WHV_UINT128 AsUINT128;
974} WHV_X64_NESTED_GUEST_STATE;
975
976C_ASSERT(sizeof(WHV_X64_NESTED_GUEST_STATE) == 16);
977
978#endif /* defined(__x86_64__) */
979
980typedef union WHV_DELIVERABILITY_NOTIFICATIONS_REGISTER {
981 __C89_NAMELESS struct {
982#if defined(__x86_64__)
983 UINT64 NmiNotification:1;
984 UINT64 InterruptNotification:1;
985 UINT64 InterruptPriority:4;
986 UINT64 Reserved:42;
987#elif defined(__aarch64__)
988 UINT64 Reserved:48;
989#endif
990 UINT64 Sint:16;
991 };
992 UINT64 AsUINT64;
993} WHV_DELIVERABILITY_NOTIFICATIONS_REGISTER, WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER;
994
995C_ASSERT(sizeof(WHV_DELIVERABILITY_NOTIFICATIONS_REGISTER) == 8);
996
997typedef union WHV_INTERNAL_ACTIVITY_REGISTER {
998 __C89_NAMELESS struct {
999 UINT64 StartupSuspend : 1;
1000 UINT64 HaltSuspend : 1;
1001 UINT64 IdleSuspend : 1;
1002 UINT64 Reserved :61;
1003 };
1004 UINT64 AsUINT64;
1005} WHV_INTERNAL_ACTIVITY_REGISTER;
1006
1007C_ASSERT(sizeof(WHV_INTERNAL_ACTIVITY_REGISTER) == 8);
1008
1009#if defined(__x86_64__)
1010
1011typedef union WHV_X64_PENDING_DEBUG_EXCEPTION {
1012 UINT64 AsUINT64;
1013 __C89_NAMELESS struct {
1014 UINT64 Breakpoint0 : 1;
1015 UINT64 Breakpoint1 : 1;
1016 UINT64 Breakpoint2 : 1;
1017 UINT64 Breakpoint3 : 1;
1018 UINT64 SingleStep : 1;
1019 UINT64 Reserved0 : 59;
1020 };
1021} WHV_X64_PENDING_DEBUG_EXCEPTION;
1022
1023C_ASSERT(sizeof(WHV_X64_PENDING_DEBUG_EXCEPTION) == 8);
1024
1025#elif defined(__aarch64__)
1026
1027typedef enum WHV_ARM64_PENDING_EVENT_TYPE {
1028 WHvArm64PendingEventException = 0,
1029 WHvArm64PendingEventSyntheticException = 1
1030} WHV_ARM64_PENDING_EVENT_TYPE;
1031
1032#define WHV_ARM64_PENDING_EVENT_HEADER \
1033 UINT8 EventPending : 1; \
1034 UINT8 EventType : 3; \
1035 UINT8 Reserved : 4
1036
1037typedef union WHV_ARM64_PENDING_EXCEPTION_EVENT {
1038 UINT64 AsUINT64[3];
1039 __C89_NAMELESS struct {
1040 WHV_ARM64_PENDING_EVENT_HEADER;
1041 UINT8 Reserved1;
1042 UINT16 Reserved2;
1043 UINT32 Reserved3;
1044 UINT64 EsrElx;
1045 UINT64 FarElx;
1046 };
1047} WHV_ARM64_PENDING_EXCEPTION_EVENT;
1048
1049typedef enum WHV_ARM64_SYNTHETIC_EXCEPTION_TYPE {
1050 WHvArm64SyntheticExceptionTypeSmc = 0x0,
1051 WHvArm64SyntheticExceptionTypeSecure = 0x1,
1052 WHvArm64SyntheticExceptionTypeCrashdump = 0x2,
1053 WHvArm64SyntheticExceptionTypeVirtualizationFault = 0x3,
1054 WHvArm64SyntheticExceptionTypeMax = 0x3F + 1
1055} WHV_ARM64_SYNTHETIC_EXCEPTION_TYPE;
1056
1057typedef union WHV_ARM64_PENDING_SYNTHETIC_EXCEPTION_EVENT {
1058 UINT64 AsUINT64[2];
1059 __C89_NAMELESS struct {
1060 WHV_ARM64_PENDING_EVENT_HEADER;
1061 UINT8 Reserved1;
1062 UINT16 Reserved2;
1063 UINT32 ExceptionType;
1064 UINT64 Context;
1065 };
1066} WHV_ARM64_PENDING_SYNTHETIC_EXCEPTION_EVENT;
1067
1068typedef union WHV_ARM64_PENDING_EVENT {
1069 __C89_NAMELESS struct {
1070 WHV_UINT128 Reg0;
1071 WHV_UINT128 Reg1;
1072 };
1073 __C89_NAMELESS struct {
1074 WHV_ARM64_PENDING_EVENT_HEADER;
1075 UINT8 EventData[15];
1076 };
1077 WHV_ARM64_PENDING_EXCEPTION_EVENT Exception;
1078 WHV_ARM64_PENDING_SYNTHETIC_EXCEPTION_EVENT SyntheticException;
1079} WHV_ARM64_PENDING_EVENT;
1080
1081#endif /* defined(__x86_64__) || defined(__aarch64__) */
1082
1083typedef union WHV_REGISTER_VALUE {
1084 WHV_UINT128 Reg128;
1085 UINT64 Reg64;
1086 UINT32 Reg32;
1087 UINT16 Reg16;
1088 UINT8 Reg8;
1089 WHV_INTERNAL_ACTIVITY_REGISTER InternalActivity;
1090 WHV_DELIVERABILITY_NOTIFICATIONS_REGISTER DeliverabilityNotifications;
1091#if defined(__x86_64__)
1092 WHV_X64_FP_REGISTER Fp;
1093 WHV_X64_FP_CONTROL_STATUS_REGISTER FpControlStatus;
1094 WHV_X64_XMM_CONTROL_STATUS_REGISTER XmmControlStatus;
1095 WHV_X64_SEGMENT_REGISTER Segment;
1096 WHV_X64_TABLE_REGISTER Table;
1097 WHV_X64_INTERRUPT_STATE_REGISTER InterruptState;
1098 WHV_X64_PENDING_INTERRUPTION_REGISTER PendingInterruption;
1099 WHV_X64_PENDING_EXCEPTION_EVENT ExceptionEvent;
1100 WHV_X64_PENDING_EXT_INT_EVENT ExtIntEvent;
1101 WHV_X64_PENDING_DEBUG_EXCEPTION PendingDebugException;
1102 WHV_X64_NESTED_GUEST_STATE NestedState;
1103 WHV_X64_NESTED_INVEPT_REGISTER InvEpt;
1104 WHV_X64_NESTED_INVVPID_REGISTER InvVpid;
1105 WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT0 SvmNestedExit0;
1106 WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT1 SvmNestedExit1;
1107 WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT2 SvmNestedExit2;
1108 WHV_X64_PENDING_SVM_NESTED_EXIT_EVENT3 SvmNestedExit3;
1109 WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT0 VmxNestedExit0;
1110 WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT1 VmxNestedExit1;
1111 WHV_X64_PENDING_VMX_NESTED_EXIT_EVENT2 VmxNestedExit2;
1112#endif
1113} WHV_REGISTER_VALUE;
1114
1115C_ASSERT(sizeof(WHV_REGISTER_VALUE) == 16);
1116
1117typedef enum WHV_CAPABILITY_CODE {
1118 WHvCapabilityCodeHypervisorPresent = 0x00000000
1119 ,WHvCapabilityCodeFeatures = 0x00000001
1120 ,WHvCapabilityCodeExtendedVmExits = 0x00000002
1121#if defined(__x86_64__)
1122 ,WHvCapabilityCodeExceptionExitBitmap = 0x00000003
1123 ,WHvCapabilityCodeX64MsrExitBitmap = 0x00000004
1124#endif
1125 ,WHvCapabilityCodeGpaRangePopulateFlags = 0x00000005
1126 ,WHvCapabilityCodeSchedulerFeatures = 0x00000006
1127 ,WHvCapabilityCodeProcessorVendor = 0x00001000
1128 ,WHvCapabilityCodeProcessorFeatures = 0x00001001
1129 ,WHvCapabilityCodeProcessorClFlushSize = 0x00001002
1130#if defined(__x86_64__)
1131 ,WHvCapabilityCodeProcessorXsaveFeatures = 0x00001003
1132#endif
1133 ,WHvCapabilityCodeProcessorClockFrequency = 0x00001004
1134#if defined(__x86_64__)
1135 ,WHvCapabilityCodeInterruptClockFrequency = 0x00001005
1136#endif
1137 ,WHvCapabilityCodeProcessorFeaturesBanks = 0x00001006
1138 ,WHvCapabilityCodeProcessorFrequencyCap = 0x00001007
1139 ,WHvCapabilityCodeSyntheticProcessorFeaturesBanks = 0x00001008
1140#if defined(__x86_64__)
1141 ,WHvCapabilityCodeProcessorPerfmonFeatures = 0x00001009
1142#endif
1143 ,WHvCapabilityCodePhysicalAddressWidth = 0x0000100A
1144#if defined(__x86_64__)
1145 ,WHvCapabilityCodeVmxBasic = 0x00002000
1146 ,WHvCapabilityCodeVmxPinbasedCtls = 0x00002001
1147 ,WHvCapabilityCodeVmxProcbasedCtls = 0x00002002
1148 ,WHvCapabilityCodeVmxExitCtls = 0x00002003
1149 ,WHvCapabilityCodeVmxEntryCtls = 0x00002004
1150 ,WHvCapabilityCodeVmxMisc = 0x00002005
1151 ,WHvCapabilityCodeVmxCr0Fixed0 = 0x00002006
1152 ,WHvCapabilityCodeVmxCr0Fixed1 = 0x00002007
1153 ,WHvCapabilityCodeVmxCr4Fixed0 = 0x00002008
1154 ,WHvCapabilityCodeVmxCr4Fixed1 = 0x00002009
1155 ,WHvCapabilityCodeVmxVmcsEnum = 0x0000200A
1156 ,WHvCapabilityCodeVmxProcbasedCtls2 = 0x0000200B
1157 ,WHvCapabilityCodeVmxEptVpidCap = 0x0000200C
1158 ,WHvCapabilityCodeVmxTruePinbasedCtls = 0x0000200D
1159 ,WHvCapabilityCodeVmxTrueProcbasedCtls = 0x0000200E
1160 ,WHvCapabilityCodeVmxTrueExitCtls = 0x0000200F
1161 ,WHvCapabilityCodeVmxTrueEntryCtls = 0x00002010
1162#elif defined (__aarch64__)
1163 ,WHvCapabilityCodeGicLpiIntIdBits = 0x00002011
1164 ,WHvCapabilityCodeMaxSveVectorLength = 0x00002012
1165#endif
1166} WHV_CAPABILITY_CODE;
1167
1168typedef union WHV_CAPABILITY_FEATURES {
1169 __C89_NAMELESS struct {
1170 UINT64 PartialUnmap : 1;
1171#if defined(__x86_64__)
1172 UINT64 LocalApicEmulation : 1;
1173 UINT64 Xsave : 1;
1174#else
1175 UINT64 ReservedArm0 : 2;
1176#endif
1177 UINT64 DirtyPageTracking : 1;
1178 UINT64 SpeculationControl : 1;
1179#if defined(__x86_64__)
1180 UINT64 ApicRemoteRead : 1;
1181#else
1182 UINT64 ReservedArm1 : 1;
1183#endif
1184 UINT64 IdleSuspend : 1;
1185 UINT64 VirtualPciDeviceSupport : 1;
1186 UINT64 IommuSupport : 1;
1187 UINT64 VpHotAddRemove : 1;
1188 UINT64 DeviceAccessTracking : 1;
1189#if defined(__x86_64__)
1190 UINT64 ReservedX640 : 1;
1191#else
1192 UINT64 Arm64Support : 1;
1193#endif
1194 UINT64 Reserved : 52;
1195 };
1196 UINT64 AsUINT64;
1197} WHV_CAPABILITY_FEATURES;
1198
1199C_ASSERT(sizeof(WHV_CAPABILITY_FEATURES) == sizeof(UINT64));
1200
1201typedef union WHV_EXTENDED_VM_EXITS {
1202 __C89_NAMELESS struct {
1203#if defined(__x86_64__)
1204 UINT64 X64CpuidExit : 1;
1205 UINT64 X64MsrExit : 1;
1206 UINT64 ExceptionExit : 1;
1207 UINT64 X64RdtscExit : 1;
1208 UINT64 X64ApicSmiExitTrap : 1;
1209#else
1210 UINT64 ReservedArm0 : 5;
1211#endif
1212 UINT64 HypercallExit : 1;
1213#if defined(__x86_64__)
1214 UINT64 X64ApicInitSipiExitTrap : 1;
1215 UINT64 X64ApicWriteLint0ExitTrap : 1;
1216 UINT64 X64ApicWriteLint1ExitTrap : 1;
1217 UINT64 X64ApicWriteSvrExitTrap : 1;
1218#else
1219 UINT64 ReservedArm1 : 4;
1220#endif
1221 UINT64 UnknownSynicConnection : 1;
1222 UINT64 RetargetUnknownVpciDevice : 1;
1223#if defined(__x86_64__)
1224 UINT64 X64ApicWriteLdrExitTrap : 1;
1225 UINT64 X64ApicWriteDfrExitTrap : 1;
1226#else
1227 UINT64 ReservedArm2 : 2;
1228#endif
1229 UINT64 GpaAccessFaultExit : 1;
1230 UINT64 Reserved : 49;
1231 };
1232 UINT64 AsUINT64;
1233} WHV_EXTENDED_VM_EXITS;
1234
1235C_ASSERT(sizeof(WHV_EXTENDED_VM_EXITS) == sizeof(UINT64));
1236
1237typedef enum WHV_PROCESSOR_VENDOR {
1238 WHvProcessorVendorAmd = 0x0000,
1239 WHvProcessorVendorIntel = 0x0001,
1240 WHvProcessorVendorHygon = 0x0002,
1241 WHvProcessorVendorArm = 0x0010
1242} WHV_PROCESSOR_VENDOR;
1243
1244#if defined(__x86_64__)
1245
1246typedef union WHV_X64_PROCESSOR_FEATURES {
1247 __C89_NAMELESS struct {
1248 UINT64 Sse3Support : 1;
1249 UINT64 LahfSahfSupport : 1;
1250 UINT64 Ssse3Support : 1;
1251 UINT64 Sse4_1Support : 1;
1252 UINT64 Sse4_2Support : 1;
1253 UINT64 Sse4aSupport : 1;
1254 UINT64 XopSupport : 1;
1255 UINT64 PopCntSupport : 1;
1256 UINT64 Cmpxchg16bSupport : 1;
1257 UINT64 Altmovcr8Support : 1;
1258 UINT64 LzcntSupport : 1;
1259 UINT64 MisAlignSseSupport : 1;
1260 UINT64 MmxExtSupport : 1;
1261 UINT64 Amd3DNowSupport : 1;
1262 UINT64 ExtendedAmd3DNowSupport : 1;
1263 UINT64 Page1GbSupport : 1;
1264 UINT64 AesSupport : 1;
1265 UINT64 PclmulqdqSupport : 1;
1266 UINT64 PcidSupport : 1;
1267 UINT64 Fma4Support : 1;
1268 UINT64 F16CSupport : 1;
1269 UINT64 RdRandSupport : 1;
1270 UINT64 RdWrFsGsSupport : 1;
1271 UINT64 SmepSupport : 1;
1272 UINT64 EnhancedFastStringSupport : 1;
1273 UINT64 Bmi1Support : 1;
1274 UINT64 Bmi2Support : 1;
1275 UINT64 Reserved1 : 2;
1276 UINT64 MovbeSupport : 1;
1277 UINT64 Npiep1Support : 1;
1278 UINT64 DepX87FPUSaveSupport : 1;
1279 UINT64 RdSeedSupport : 1;
1280 UINT64 AdxSupport : 1;
1281 UINT64 IntelPrefetchSupport : 1;
1282 UINT64 SmapSupport : 1;
1283 UINT64 HleSupport : 1;
1284 UINT64 RtmSupport : 1;
1285 UINT64 RdtscpSupport : 1;
1286 UINT64 ClflushoptSupport : 1;
1287 UINT64 ClwbSupport : 1;
1288 UINT64 ShaSupport : 1;
1289 UINT64 X87PointersSavedSupport : 1;
1290 UINT64 InvpcidSupport : 1;
1291 UINT64 IbrsSupport : 1;
1292 UINT64 StibpSupport : 1;
1293 UINT64 IbpbSupport : 1;
1294 UINT64 UnrestrictedGuestSupport : 1;
1295 UINT64 SsbdSupport : 1;
1296 UINT64 FastShortRepMovSupport : 1;
1297 UINT64 Reserved3 : 1;
1298 UINT64 RdclNo : 1;
1299 UINT64 IbrsAllSupport : 1;
1300 UINT64 Reserved4 : 1;
1301 UINT64 SsbNo : 1;
1302 UINT64 RsbANo : 1;
1303 UINT64 Reserved5 : 1;
1304 UINT64 RdPidSupport : 1;
1305 UINT64 UmipSupport : 1;
1306 UINT64 MdsNoSupport : 1;
1307 UINT64 MdClearSupport : 1;
1308 UINT64 TaaNoSupport : 1;
1309 UINT64 TsxCtrlSupport : 1;
1310 UINT64 Reserved6 : 1;
1311 };
1312 UINT64 AsUINT64;
1313} WHV_X64_PROCESSOR_FEATURES, WHV_PROCESSOR_FEATURES;
1314
1315C_ASSERT(sizeof(WHV_X64_PROCESSOR_FEATURES) == sizeof(UINT64));
1316
1317typedef union WHV_X64_PROCESSOR_FEATURES1 {
1318 __C89_NAMELESS struct {
1319 UINT64 ACountMCountSupport : 1;
1320 UINT64 TscInvariantSupport : 1;
1321 UINT64 ClZeroSupport : 1;
1322 UINT64 RdpruSupport : 1;
1323 UINT64 La57Support : 1;
1324 UINT64 MbecSupport : 1;
1325 UINT64 NestedVirtSupport : 1;
1326 UINT64 PsfdSupport: 1;
1327 UINT64 CetSsSupport : 1;
1328 UINT64 CetIbtSupport : 1;
1329 UINT64 VmxExceptionInjectSupport : 1;
1330 UINT64 Reserved2 : 1;
1331 UINT64 UmwaitTpauseSupport : 1;
1332 UINT64 MovdiriSupport : 1;
1333 UINT64 Movdir64bSupport : 1;
1334 UINT64 CldemoteSupport : 1;
1335 UINT64 SerializeSupport : 1;
1336 UINT64 TscDeadlineTmrSupport : 1;
1337 UINT64 TscAdjustSupport : 1;
1338 UINT64 FZLRepMovsb : 1;
1339 UINT64 FSRepStosb : 1;
1340 UINT64 FSRepCmpsb : 1;
1341 UINT64 TsxLdTrkSupport : 1;
1342 UINT64 VmxInsOutsExitInfoSupport : 1;
1343 UINT64 Reserved3 : 1;
1344 UINT64 SbdrSsdpNoSupport : 1;
1345 UINT64 FbsdpNoSupport : 1;
1346 UINT64 PsdpNoSupport : 1;
1347 UINT64 FbClearSupport : 1;
1348 UINT64 BtcNoSupport : 1;
1349 UINT64 IbpbRsbFlushSupport : 1;
1350 UINT64 StibpAlwaysOnSupport : 1;
1351 UINT64 PerfGlobalCtrlSupport : 1;
1352 UINT64 NptExecuteOnlySupport : 1;
1353 UINT64 NptADFlagsSupport : 1;
1354 UINT64 Npt1GbPageSupport : 1;
1355 UINT64 Reserved4 : 1;
1356 UINT64 Reserved5 : 1;
1357 UINT64 Reserved6 : 1;
1358 UINT64 Reserved7 : 1;
1359 UINT64 CmpccxaddSupport : 1;
1360 UINT64 Reserved8 : 1;
1361 UINT64 Reserved9 : 1;
1362 UINT64 Reserved10 : 1;
1363 UINT64 Reserved11 : 1;
1364 UINT64 PrefetchISupport : 1;
1365 UINT64 Sha512Support : 1;
1366 UINT64 Reserved12 : 1;
1367 UINT64 Reserved13 : 1;
1368 UINT64 Reserved14 : 1;
1369 UINT64 SM3Support : 1;
1370 UINT64 SM4Support : 1;
1371 UINT64 Reserved15 : 1;
1372 UINT64 Reserved16 : 1;
1373 UINT64 SbpbSupported : 1;
1374 UINT64 IbpbBrTypeSupported : 1;
1375 UINT64 SrsoNoSupported : 1;
1376 UINT64 SrsoUserKernelNoSupported : 1;
1377 UINT64 Reserved17 : 1;
1378 UINT64 Reserved18 : 1;
1379 UINT64 Reserved19 : 1;
1380 UINT64 Reserved20 : 3;
1381 };
1382 UINT64 AsUINT64;
1383} WHV_X64_PROCESSOR_FEATURES1, WHV_PROCESSOR_FEATURES1;
1384
1385C_ASSERT(sizeof(WHV_X64_PROCESSOR_FEATURES1) == sizeof(UINT64));
1386
1387#elif defined(__aarch64__)
1388
1389typedef union WHV_ARM64_PROCESSOR_FEATURES {
1390 __C89_NAMELESS struct {
1391 UINT64 Asid16 : 1;
1392 UINT64 TGran16 : 1;
1393 UINT64 TGran64 : 1;
1394 UINT64 Haf : 1;
1395 UINT64 Hdbs : 1;
1396 UINT64 Pan : 1;
1397 UINT64 AtS1E1 : 1;
1398 UINT64 Uao : 1;
1399 UINT64 El0Aarch32 : 1;
1400 UINT64 Fp : 1;
1401 UINT64 FpHp : 1;
1402 UINT64 AdvSimd : 1;
1403 UINT64 AdvSimdHp : 1;
1404 UINT64 GicV3V4 : 1;
1405 UINT64 GicV41 : 1;
1406 UINT64 Ras : 1;
1407 UINT64 PmuV3 : 1;
1408 UINT64 PmuV3ArmV81 : 1;
1409 UINT64 PmuV3ArmV84 : 1;
1410 UINT64 PmuV3ArmV85 : 1;
1411 UINT64 Aes : 1;
1412 UINT64 PolyMul : 1;
1413 UINT64 Sha1 : 1;
1414 UINT64 Sha256 : 1;
1415 UINT64 Sha512 : 1;
1416 UINT64 Crc32 : 1;
1417 UINT64 Atomic : 1;
1418 UINT64 Rdm : 1;
1419 UINT64 Sha3 : 1;
1420 UINT64 Sm3 : 1;
1421 UINT64 Sm4 : 1;
1422 UINT64 Dp : 1;
1423 UINT64 Fhm : 1;
1424 UINT64 DcCvap : 1;
1425 UINT64 DcCvadp : 1;
1426 UINT64 ApaBase : 1;
1427 UINT64 ApaEp : 1;
1428 UINT64 ApaEp2 : 1;
1429 UINT64 ApaEp2Fp : 1;
1430 UINT64 ApaEp2Fpc : 1;
1431 UINT64 Jscvt : 1;
1432 UINT64 Fcma : 1;
1433 UINT64 RcpcV83 : 1;
1434 UINT64 RcpcV84 : 1;
1435 UINT64 Gpa : 1;
1436 UINT64 L1ipPipt : 1;
1437 UINT64 DzPermitted : 1;
1438 UINT64 Ssbs : 1;
1439 UINT64 SsbsRw : 1;
1440 UINT64 Reserved49 : 1;
1441 UINT64 Reserved50 : 1;
1442 UINT64 Reserved51 : 1;
1443 UINT64 Reserved52 : 1;
1444 UINT64 Csv2 : 1;
1445 UINT64 Csv3 : 1;
1446 UINT64 Sb : 1;
1447 UINT64 Idc : 1;
1448 UINT64 Dic : 1;
1449 UINT64 TlbiOs : 1;
1450 UINT64 TlbiOsRange : 1;
1451 UINT64 FlagsM : 1;
1452 UINT64 FlagsM2 : 1;
1453 UINT64 Bf16 : 1;
1454 UINT64 Ebf16 : 1;
1455 };
1456 UINT64 AsUINT64;
1457} WHV_ARM64_PROCESSOR_FEATURES, WHV_PROCESSOR_FEATURES;
1458
1459typedef union WHV_ARM64_PROCESSOR_FEATURES1 {
1460 __C89_NAMELESS struct {
1461 UINT64 SveBf16 : 1;
1462 UINT64 SveEbf16 : 1;
1463 UINT64 I8mm : 1;
1464 UINT64 SveI8mm : 1;
1465 UINT64 Frintts : 1;
1466 UINT64 Specres : 1;
1467 UINT64 Reserved6 : 1;
1468 UINT64 Rpres : 1;
1469 UINT64 Exs : 1;
1470 UINT64 SpecSei : 1;
1471 UINT64 Ets : 1;
1472 UINT64 Afp : 1;
1473 UINT64 Iesb : 1;
1474 UINT64 Rng : 1;
1475 UINT64 Lse2 : 1;
1476 UINT64 Idst : 1;
1477 UINT64 Reserved16 : 1;
1478 UINT64 Reserved17 : 1;
1479 UINT64 Reserved18 : 1;
1480 UINT64 Reserved19 : 1;
1481 UINT64 Reserved20 : 1;
1482 UINT64 Reserved21 : 1;
1483 UINT64 Ccidx : 1;
1484 UINT64 Reserved23 : 1;
1485 UINT64 Reserved24 : 1;
1486 UINT64 Reserved25 : 1;
1487 UINT64 Reserved26 : 1;
1488 UINT64 Reserved27 : 1;
1489 UINT64 Reserved28 : 1;
1490 UINT64 Reserved29 : 1;
1491 UINT64 Reserved30 : 1;
1492 UINT64 Reserved31 : 1;
1493 UINT64 Reserved32 : 1;
1494 UINT64 Reserved33 : 1;
1495 UINT64 Reserved34 : 1;
1496 UINT64 TtCnp : 1;
1497 UINT64 Hpds : 1;
1498 UINT64 Sve : 1;
1499 UINT64 SveV2 : 1;
1500 UINT64 SveV2P1 : 1;
1501 UINT64 SpecFpacc : 1;
1502 UINT64 SveAes : 1;
1503 UINT64 SveBitPerm : 1;
1504 UINT64 SveSha3 : 1;
1505 UINT64 SveSm4 : 1;
1506 UINT64 E0PD : 1;
1507 UINT64 Reserved : 8;
1508 };
1509 UINT64 AsUINT64;
1510} WHV_ARM64_PROCESSOR_FEATURES1, WHV_PROCESSOR_FEATURES1;
1511
1512#endif /* __x86_64__ || __aarch64__ */
1513
1514#define WHV_PROCESSOR_FEATURES_BANKS_COUNT 2
1515
1516typedef struct WHV_PROCESSOR_FEATURES_BANKS {
1517 UINT32 BanksCount;
1518 UINT32 Reserved0;
1519 __C89_NAMELESS union {
1520 __C89_NAMELESS struct {
1521 WHV_PROCESSOR_FEATURES Bank0;
1522 WHV_PROCESSOR_FEATURES1 Bank1;
1523 };
1524 UINT64 AsUINT64[WHV_PROCESSOR_FEATURES_BANKS_COUNT];
1525 };
1526} WHV_PROCESSOR_FEATURES_BANKS;
1527
1528C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES_BANKS) == sizeof(UINT64) * (WHV_PROCESSOR_FEATURES_BANKS_COUNT + 1));
1529
1530typedef union WHV_SYNTHETIC_PROCESSOR_FEATURES {
1531 __C89_NAMELESS struct {
1532 UINT64 HypervisorPresent : 1;
1533 UINT64 Hv1 : 1;
1534 UINT64 AccessVpRunTimeReg : 1;
1535 UINT64 AccessPartitionReferenceCounter : 1;
1536 UINT64 AccessSynicRegs : 1;
1537 UINT64 AccessSyntheticTimerRegs : 1;
1538 UINT64 AccessIntrCtrlRegs : 1;
1539 UINT64 AccessHypercallRegs : 1;
1540 UINT64 AccessVpIndex : 1;
1541 UINT64 AccessPartitionReferenceTsc : 1;
1542#ifdef __x86_64__
1543 UINT64 AccessGuestIdleReg : 1;
1544 UINT64 AccessFrequencyRegs : 1;
1545#else
1546 UINT64 ReservedZ10 : 1;
1547 UINT64 ReservedZ11 : 1;
1548#endif
1549 UINT64 ReservedZ12 : 1;
1550 UINT64 ReservedZ13 : 1;
1551 UINT64 ReservedZ14 : 1;
1552#ifdef __x86_64__
1553 UINT64 EnableExtendedGvaRangesForFlushVirtualAddressList : 1;
1554#else
1555 UINT64 ReservedZ15 : 1;
1556#endif
1557 UINT64 ReservedZ16 : 1;
1558 UINT64 ReservedZ17 : 1;
1559 UINT64 FastHypercallOutput : 1;
1560 UINT64 ReservedZ19 : 1;
1561 UINT64 ReservedZ20 : 1;
1562 UINT64 ReservedZ21 : 1;
1563 UINT64 DirectSyntheticTimers : 1;
1564 UINT64 ReservedZ23 : 1;
1565 UINT64 ExtendedProcessorMasks : 1;
1566 UINT64 TbFlushHypercalls : 1;
1567 UINT64 SyntheticClusterIpi : 1;
1568 UINT64 NotifyLongSpinWait : 1;
1569 UINT64 QueryNumaDistance : 1;
1570 UINT64 SignalEvents : 1;
1571 UINT64 RetargetDeviceInterrupt : 1;
1572#ifdef __x86_64__
1573 UINT64 RestoreTime : 1;
1574 UINT64 EnlightenedVmcs : 1;
1575 UINT64 NestedDebugCtl : 1;
1576 UINT64 SyntheticTimeUnhaltedTimer : 1;
1577 UINT64 IdleSpecCtrl : 1;
1578#else
1579 UINT64 ReservedZ31 : 1;
1580 UINT64 ReservedZ32 : 1;
1581 UINT64 ReservedZ33 : 1;
1582 UINT64 ReservedZ34 : 1;
1583 UINT64 ReservedZ35 : 1;
1584#endif
1585 UINT64 ReservedZ36 : 1;
1586 UINT64 WakeVps : 1;
1587 UINT64 AccessVpRegs : 1;
1588#ifdef __aarch64__
1589 UINT64 SyncContext : 1;
1590#else
1591 UINT64 ReservedZ39 : 1;
1592#endif
1593 UINT64 ReservedZ40 : 1;
1594 UINT64 ReservedZ41 : 1;
1595 UINT64 ReservedZ42 : 1;
1596 UINT64 ReservedZ43 : 1;
1597 UINT64 ReservedZ44 : 1;
1598 UINT64 Reserved : 19;
1599 };
1600 UINT64 AsUINT64;
1601} WHV_SYNTHETIC_PROCESSOR_FEATURES;
1602
1603C_ASSERT(sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES) == 8);
1604
1605#define WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS_COUNT 1
1606
1607typedef struct WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS {
1608 UINT32 BanksCount;
1609 UINT32 Reserved0;
1610 __C89_NAMELESS union {
1611 __C89_NAMELESS struct {
1612 WHV_SYNTHETIC_PROCESSOR_FEATURES Bank0;
1613 };
1614 UINT64 AsUINT64[WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS_COUNT];
1615 };
1616} WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS;
1617
1618C_ASSERT(sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS) == 16);
1619
1620typedef UINT8 WHV_VTL;
1621
1622#define WHV_VTL_ALL 0xF
1623
1624typedef union WHV_INPUT_VTL {
1625 UINT8 AsUINT8;
1626 __C89_NAMELESS struct {
1627 UINT8 TargetVtl : 4;
1628 UINT8 UseTargetVtl : 1;
1629 UINT8 Reserved : 3;
1630 };
1631} WHV_INPUT_VTL;
1632
1633typedef union WHV_ENABLE_PARTITION_VTL_FLAGS {
1634 UINT8 AsUINT8;
1635 __C89_NAMELESS struct {
1636 UINT8 EnableMbec : 1;
1637 UINT8 EnableSupervisorShadowStack : 1;
1638 UINT8 EnableHardwareHvpt : 1;
1639 UINT8 Reserved : 5;
1640 };
1641} WHV_ENABLE_PARTITION_VTL_FLAGS;
1642
1643typedef union WHV_DISABLE_PARTITION_VTL_FLAGS {
1644 UINT8 AsUINT8;
1645 __C89_NAMELESS struct {
1646 UINT8 ScrubOnly : 1;
1647 UINT8 Reserved : 7;
1648 };
1649} WHV_DISABLE_PARTITION_VTL_FLAGS;
1650
1651typedef struct WHV_INITIAL_VP_CONTEXT {
1652#if defined(__aarch64__)
1653 UINT64 Pc;
1654 UINT64 Sp_ELh;
1655 UINT64 SCTLR_EL1;
1656 UINT64 MAIR_EL1;
1657 UINT64 TCR_EL1;
1658 UINT64 VBAR_EL1;
1659 UINT64 TTBR0_EL1;
1660 UINT64 TTBR1_EL1;
1661 UINT64 X18;
1662#else
1663 UINT64 Rip;
1664 UINT64 Rsp;
1665 UINT64 Rflags;
1666 WHV_X64_SEGMENT_REGISTER Cs;
1667 WHV_X64_SEGMENT_REGISTER Ds;
1668 WHV_X64_SEGMENT_REGISTER Es;
1669 WHV_X64_SEGMENT_REGISTER Fs;
1670 WHV_X64_SEGMENT_REGISTER Gs;
1671 WHV_X64_SEGMENT_REGISTER Ss;
1672 WHV_X64_SEGMENT_REGISTER Tr;
1673 WHV_X64_SEGMENT_REGISTER Ldtr;
1674 WHV_X64_TABLE_REGISTER Idtr;
1675 WHV_X64_TABLE_REGISTER Gdtr;
1676 UINT64 Efer;
1677 UINT64 Cr0;
1678 UINT64 Cr3;
1679 UINT64 Cr4;
1680 UINT64 MsrCrPat;
1681#endif
1682} WHV_INITIAL_VP_CONTEXT;
1683
1684typedef union WHV_DISABLE_VP_VTL_FLAGS {
1685 UINT8 AsUINT8;
1686 __C89_NAMELESS struct {
1687 UINT8 ScrubOnly : 1;
1688 UINT8 Reserved : 7;
1689 };
1690} WHV_DISABLE_VP_VTL_FLAGS;
1691
1692typedef VOID* WHV_PARTITION_HANDLE;
1693
1694typedef enum WHV_PARTITION_PROPERTY_CODE {
1695 WHvPartitionPropertyCodeExtendedVmExits = 0x00000001,
1696#if defined(__x86_64__)
1697 WHvPartitionPropertyCodeExceptionExitBitmap = 0x00000002,
1698#endif
1699 WHvPartitionPropertyCodeSeparateSecurityDomain = 0x00000003,
1700 WHvPartitionPropertyCodeNestedVirtualization = 0x00000004,
1701#if defined(__x86_64__)
1702 WHvPartitionPropertyCodeX64MsrExitBitmap = 0x00000005,
1703#endif
1704 WHvPartitionPropertyCodePrimaryNumaNode = 0x00000006,
1705 WHvPartitionPropertyCodeCpuReserve = 0x00000007,
1706 WHvPartitionPropertyCodeCpuCap = 0x00000008,
1707 WHvPartitionPropertyCodeCpuWeight = 0x00000009,
1708 WHvPartitionPropertyCodeCpuGroupId = 0x0000000A,
1709 WHvPartitionPropertyCodeProcessorFrequencyCap = 0x0000000B,
1710 WHvPartitionPropertyCodeAllowDeviceAssignment = 0x0000000C,
1711 WHvPartitionPropertyCodeDisableSmt = 0x0000000D,
1712 WHvPartitionPropertyCodeProcessorFeatures = 0x00001001,
1713 WHvPartitionPropertyCodeProcessorClFlushSize = 0x00001002,
1714#if defined(__x86_64__)
1715 WHvPartitionPropertyCodeCpuidExitList = 0x00001003,
1716 WHvPartitionPropertyCodeCpuidResultList = 0x00001004,
1717 WHvPartitionPropertyCodeLocalApicEmulationMode = 0x00001005,
1718 WHvPartitionPropertyCodeProcessorXsaveFeatures = 0x00001006,
1719#endif
1720 WHvPartitionPropertyCodeProcessorClockFrequency = 0x00001007,
1721#if defined(__x86_64__)
1722 WHvPartitionPropertyCodeInterruptClockFrequency = 0x00001008,
1723 WHvPartitionPropertyCodeApicRemoteReadSupport = 0x00001009,
1724#endif
1725 WHvPartitionPropertyCodeProcessorFeaturesBanks = 0x0000100A,
1726 WHvPartitionPropertyCodeReferenceTime = 0x0000100B,
1727 WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks = 0x0000100C,
1728#if defined(__x86_64__)
1729 WHvPartitionPropertyCodeCpuidResultList2 = 0x0000100D,
1730 WHvPartitionPropertyCodeProcessorPerfmonFeatures = 0x0000100E,
1731 WHvPartitionPropertyCodeMsrActionList = 0x0000100F,
1732 WHvPartitionPropertyCodeUnimplementedMsrAction = 0x00001010,
1733#endif
1734 WHvPartitionPropertyCodePhysicalAddressWidth = 0x00001011,
1735#if defined(__aarch64__)
1736 WHvPartitionPropertyCodeArm64IcParameters = 0x00001012,
1737#endif
1738 WHvPartitionPropertyCodeProcessorCount = 0x00001fff
1739} WHV_PARTITION_PROPERTY_CODE;
1740
1741#if defined(__x86_64__)
1742
1743typedef union WHV_PROCESSOR_XSAVE_FEATURES {
1744 __C89_NAMELESS struct {
1745 UINT64 XsaveSupport : 1;
1746 UINT64 XsaveoptSupport : 1;
1747 UINT64 AvxSupport : 1;
1748 UINT64 Avx2Support : 1;
1749 UINT64 FmaSupport : 1;
1750 UINT64 MpxSupport : 1;
1751 UINT64 Avx512Support : 1;
1752 UINT64 Avx512DQSupport : 1;
1753 UINT64 Avx512CDSupport : 1;
1754 UINT64 Avx512BWSupport : 1;
1755 UINT64 Avx512VLSupport : 1;
1756 UINT64 XsaveCompSupport : 1;
1757 UINT64 XsaveSupervisorSupport : 1;
1758 UINT64 Xcr1Support : 1;
1759 UINT64 Avx512BitalgSupport : 1;
1760 UINT64 Avx512IfmaSupport : 1;
1761 UINT64 Avx512VBmiSupport : 1;
1762 UINT64 Avx512VBmi2Support : 1;
1763 UINT64 Avx512VnniSupport : 1;
1764 UINT64 GfniSupport : 1;
1765 UINT64 VaesSupport : 1;
1766 UINT64 Avx512VPopcntdqSupport : 1;
1767 UINT64 VpclmulqdqSupport : 1;
1768 UINT64 Avx512Bf16Support : 1;
1769 UINT64 Avx512Vp2IntersectSupport : 1;
1770 UINT64 Avx512Fp16Support : 1;
1771 UINT64 XfdSupport : 1;
1772 UINT64 AmxTileSupport : 1;
1773 UINT64 AmxBf16Support : 1;
1774 UINT64 AmxInt8Support : 1;
1775 UINT64 AvxVnniSupport : 1;
1776 UINT64 AvxIfmaSupport : 1;
1777 UINT64 AvxNeConvertSupport : 1;
1778 UINT64 AvxVnniInt8Support : 1;
1779 UINT64 AvxVnniInt16Support : 1;
1780 UINT64 Avx10_1_256Support : 1;
1781 UINT64 Avx10_1_512Support : 1;
1782 UINT64 AmxFp16Support : 1;
1783 UINT64 Reserved : 26;
1784 };
1785 UINT64 AsUINT64;
1786} WHV_PROCESSOR_XSAVE_FEATURES, *PWHV_PROCESSOR_XSAVE_FEATURES;
1787
1788C_ASSERT(sizeof(WHV_PROCESSOR_XSAVE_FEATURES) == sizeof(UINT64));
1789
1790typedef union WHV_PROCESSOR_PERFMON_FEATURES {
1791 __C89_NAMELESS struct {
1792 UINT64 PmuSupport : 1;
1793 UINT64 LbrSupport : 1;
1794 UINT64 Reserved : 62;
1795 };
1796 UINT64 AsUINT64;
1797} WHV_PROCESSOR_PERFMON_FEATURES, *PWHV_PROCESSOR_PERFMON_FEATURES;
1798
1799C_ASSERT(sizeof(WHV_PROCESSOR_PERFMON_FEATURES) == 8);
1800
1801typedef union WHV_X64_MSR_EXIT_BITMAP {
1802 UINT64 AsUINT64;
1803 __C89_NAMELESS struct {
1804 UINT64 UnhandledMsrs : 1;
1805 UINT64 TscMsrWrite : 1;
1806 UINT64 TscMsrRead : 1;
1807 UINT64 ApicBaseMsrWrite : 1;
1808 UINT64 MiscEnableMsrRead : 1;
1809 UINT64 McUpdatePatchLevelMsrRead : 1;
1810 UINT64 Reserved : 58;
1811 };
1812} WHV_X64_MSR_EXIT_BITMAP;
1813
1814C_ASSERT(sizeof(WHV_X64_MSR_EXIT_BITMAP) == sizeof(UINT64));
1815
1816#endif /* defined(__x86_64__) */
1817
1818typedef enum WHV_MAP_GPA_RANGE_FLAGS {
1819 WHvMapGpaRangeFlagNone = 0x00000000,
1820 WHvMapGpaRangeFlagRead = 0x00000001,
1821 WHvMapGpaRangeFlagWrite = 0x00000002,
1822 WHvMapGpaRangeFlagExecute = 0x00000004,
1823 WHvMapGpaRangeFlagTrackDirtyPages = 0x00000008
1824} WHV_MAP_GPA_RANGE_FLAGS;
1825
1826DEFINE_ENUM_FLAG_OPERATORS(WHV_MAP_GPA_RANGE_FLAGS);
1827
1828typedef enum WHV_TRANSLATE_GVA_FLAGS {
1829 WHvTranslateGvaFlagNone = 0x00000000,
1830 WHvTranslateGvaFlagValidateRead = 0x00000001,
1831 WHvTranslateGvaFlagValidateWrite = 0x00000002,
1832 WHvTranslateGvaFlagValidateExecute = 0x00000004
1833#if defined(__x86_64__)
1834 ,WHvTranslateGvaFlagPrivilegeExempt = 0x00000008
1835#endif
1836 ,WHvTranslateGvaFlagSetPageTableBits = 0x00000010
1837#if defined(__x86_64__)
1838 ,WHvTranslateGvaFlagEnforceSmap = 0x00000100
1839 ,WHvTranslateGvaFlagOverrideSmap = 0x00000200
1840#endif
1841} WHV_TRANSLATE_GVA_FLAGS;
1842
1843DEFINE_ENUM_FLAG_OPERATORS(WHV_TRANSLATE_GVA_FLAGS);
1844
1845typedef union WHV_TRANSLATE_GVA_2_FLAGS {
1846 __C89_NAMELESS struct {
1847 UINT64 ValidateRead : 1;
1848 UINT64 ValidateWrite : 1;
1849 UINT64 ValidateExecute : 1;
1850#if defined(__x86_64__)
1851 UINT64 PrivilegeExempt : 1;
1852#else
1853 UINT64 Reserved0 : 1;
1854#endif
1855 UINT64 SetPageTableBits : 1;
1856 UINT64 Reserved1 : 3;
1857#if defined(__x86_64__)
1858 UINT64 EnforceSmap : 1;
1859 UINT64 OverrideSmap : 1;
1860#else
1861 UINT64 Reserved2 : 1;
1862 UINT64 Reserved3 : 1;
1863#endif
1864 UINT64 Reserved4 : 46;
1865 UINT64 InputVtl : 8;
1866 };
1867 UINT64 AsUINT64;
1868} WHV_TRANSLATE_GVA_2_FLAGS;
1869
1870C_ASSERT(sizeof(WHV_TRANSLATE_GVA_2_FLAGS) == 8);
1871
1872typedef enum WHV_TRANSLATE_GVA_RESULT_CODE {
1873 WHvTranslateGvaResultSuccess = 0,
1874 WHvTranslateGvaResultPageNotPresent = 1,
1875 WHvTranslateGvaResultPrivilegeViolation = 2,
1876 WHvTranslateGvaResultInvalidPageTableFlags = 3,
1877 WHvTranslateGvaResultGpaUnmapped = 4,
1878 WHvTranslateGvaResultGpaNoReadAccess = 5,
1879 WHvTranslateGvaResultGpaNoWriteAccess = 6,
1880 WHvTranslateGvaResultGpaIllegalOverlayAccess = 7,
1881 WHvTranslateGvaResultIntercept = 8
1882} WHV_TRANSLATE_GVA_RESULT_CODE;
1883
1884typedef struct WHV_TRANSLATE_GVA_RESULT {
1885 WHV_TRANSLATE_GVA_RESULT_CODE ResultCode;
1886 UINT32 Reserved;
1887} WHV_TRANSLATE_GVA_RESULT;
1888
1889C_ASSERT(sizeof(WHV_TRANSLATE_GVA_RESULT) == 8);
1890
1891#define WHV_READ_WRITE_GPA_RANGE_MAX_SIZE 16
1892
1893typedef struct WHV_MEMORY_RANGE_ENTRY {
1894 UINT64 GuestAddress;
1895 UINT64 SizeInBytes;
1896} WHV_MEMORY_RANGE_ENTRY;
1897
1898C_ASSERT(sizeof(WHV_MEMORY_RANGE_ENTRY) == 16);
1899
1900typedef union WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS {
1901 UINT32 AsUINT32;
1902 __C89_NAMELESS struct {
1903 UINT32 Prefetch:1;
1904 UINT32 AvoidHardFaults:1;
1905 UINT32 Reserved:30;
1906 };
1907} WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS;
1908
1909C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS) == 4);
1910
1911typedef enum WHV_MEMORY_ACCESS_TYPE {
1912 WHvMemoryAccessRead = 0,
1913 WHvMemoryAccessWrite = 1,
1914 WHvMemoryAccessExecute = 2
1915} WHV_MEMORY_ACCESS_TYPE;
1916
1917typedef struct WHV_ADVISE_GPA_RANGE_POPULATE {
1918 WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS Flags;
1919 WHV_MEMORY_ACCESS_TYPE AccessType;
1920} WHV_ADVISE_GPA_RANGE_POPULATE;
1921
1922C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE_POPULATE) == 8);
1923
1924typedef union WHV_ADVISE_GPA_RANGE {
1925 WHV_ADVISE_GPA_RANGE_POPULATE Populate;
1926} WHV_ADVISE_GPA_RANGE;
1927
1928C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE) == 8);
1929
1930typedef enum WHV_CACHE_TYPE {
1931 WHvCacheTypeUncached = 0,
1932 WHvCacheTypeWriteCombining = 1,
1933 WHvCacheTypeWriteThrough = 4,
1934#ifdef __x86_64__
1935 WHvCacheTypeWriteProtected = 5,
1936#endif
1937 WHvCacheTypeWriteBack = 6
1938} WHV_CACHE_TYPE;
1939
1940typedef union WHV_ACCESS_GPA_CONTROLS {
1941 UINT64 AsUINT64;
1942 __C89_NAMELESS struct {
1943 WHV_CACHE_TYPE CacheType;
1944 WHV_INPUT_VTL InputVtl;
1945 UINT8 Reserved;
1946 UINT16 Reserved1;
1947 };
1948} WHV_ACCESS_GPA_CONTROLS;
1949
1950C_ASSERT(sizeof(WHV_ACCESS_GPA_CONTROLS) == 8);
1951
1952typedef struct WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP {
1953 UINT32 IsSupported:1;
1954 UINT32 Reserved:31;
1955 UINT32 HighestFrequencyMhz;
1956 UINT32 NominalFrequencyMhz;
1957 UINT32 LowestFrequencyMhz;
1958 UINT32 FrequencyStepMhz;
1959} WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP;
1960
1961C_ASSERT(sizeof(WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP) == 20);
1962
1963typedef union WHV_SCHEDULER_FEATURES {
1964 __C89_NAMELESS struct {
1965 UINT64 CpuReserve: 1;
1966 UINT64 CpuCap: 1;
1967 UINT64 CpuWeight: 1;
1968 UINT64 CpuGroupId: 1;
1969 UINT64 DisableSmt: 1;
1970 UINT64 Reserved: 59;
1971 };
1972 UINT64 AsUINT64;
1973} WHV_SCHEDULER_FEATURES;
1974
1975C_ASSERT(sizeof(WHV_SCHEDULER_FEATURES) == 8);
1976
1977typedef union WHV_CAPABILITY {
1978 WINBOOL HypervisorPresent;
1979 WHV_CAPABILITY_FEATURES Features;
1980 WHV_EXTENDED_VM_EXITS ExtendedVmExits;
1981 WHV_PROCESSOR_VENDOR ProcessorVendor;
1982 WHV_PROCESSOR_FEATURES ProcessorFeatures;
1983 WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS SyntheticProcessorFeaturesBanks;
1984 UINT8 ProcessorClFlushSize;
1985 UINT64 ProcessorClockFrequency;
1986 WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;
1987 WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS GpaRangePopulateFlags;
1988 WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP ProcessorFrequencyCap;
1989 WHV_SCHEDULER_FEATURES SchedulerFeatures;
1990 UINT32 PhysicalAddressWidth;
1991 UINT64 NestedFeatureRegister;
1992#if defined(__x86_64__)
1993 WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;
1994 UINT64 InterruptClockFrequency;
1995 WHV_PROCESSOR_PERFMON_FEATURES ProcessorPerfmonFeatures;
1996 WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;
1997 UINT64 ExceptionExitBitmap;
1998#elif defined (__aarch64__)
1999 UINT32 GicLpiIntIdBits;
2000 UINT32 MaxSveVectorLength;
2001#endif
2002} WHV_CAPABILITY;
2003
2004#if defined(__x86_64__)
2005
2006typedef struct WHV_X64_CPUID_RESULT {
2007 UINT32 Function;
2008 UINT32 Reserved[3];
2009 UINT32 Eax;
2010 UINT32 Ebx;
2011 UINT32 Ecx;
2012 UINT32 Edx;
2013} WHV_X64_CPUID_RESULT;
2014
2015C_ASSERT(sizeof(WHV_X64_CPUID_RESULT) == 32);
2016
2017typedef enum WHV_X64_CPUID_RESULT2_FLAGS {
2018 WHvX64CpuidResult2FlagSubleafSpecific = 0x00000001,
2019 WHvX64CpuidResult2FlagVpSpecific = 0x00000002
2020} WHV_X64_CPUID_RESULT2_FLAGS;
2021
2022DEFINE_ENUM_FLAG_OPERATORS(WHV_X64_CPUID_RESULT2_FLAGS);
2023
2024typedef struct WHV_CPUID_OUTPUT {
2025 UINT32 Eax;
2026 UINT32 Ebx;
2027 UINT32 Ecx;
2028 UINT32 Edx;
2029} WHV_CPUID_OUTPUT;
2030
2031C_ASSERT(sizeof(WHV_CPUID_OUTPUT) == 16);
2032
2033typedef struct WHV_X64_CPUID_RESULT2 {
2034 UINT32 Function;
2035 UINT32 Index;
2036 UINT32 VpIndex;
2037 WHV_X64_CPUID_RESULT2_FLAGS Flags;
2038 WHV_CPUID_OUTPUT Output;
2039 WHV_CPUID_OUTPUT Mask;
2040} WHV_X64_CPUID_RESULT2;
2041
2042C_ASSERT(sizeof(WHV_X64_CPUID_RESULT2) == 48);
2043
2044typedef struct WHV_MSR_ACTION_ENTRY {
2045 UINT32 Index;
2046 UINT8 ReadAction;
2047 UINT8 WriteAction;
2048 UINT16 Reserved;
2049} WHV_MSR_ACTION_ENTRY;
2050
2051C_ASSERT(sizeof(WHV_MSR_ACTION_ENTRY) == 8);
2052
2053typedef enum WHV_MSR_ACTION {
2054 WHvMsrActionArchitectureDefault = 0,
2055 WHvMsrActionIgnoreWriteReadZero = 1,
2056 WHvMsrActionExit = 2
2057} WHV_MSR_ACTION;
2058
2059typedef enum WHV_EXCEPTION_TYPE {
2060 WHvX64ExceptionTypeDivideErrorFault = 0x0,
2061 WHvX64ExceptionTypeDebugTrapOrFault = 0x1,
2062 WHvX64ExceptionTypeBreakpointTrap = 0x3,
2063 WHvX64ExceptionTypeOverflowTrap = 0x4,
2064 WHvX64ExceptionTypeBoundRangeFault = 0x5,
2065 WHvX64ExceptionTypeInvalidOpcodeFault = 0x6,
2066 WHvX64ExceptionTypeDeviceNotAvailableFault = 0x7,
2067 WHvX64ExceptionTypeDoubleFaultAbort = 0x8,
2068 WHvX64ExceptionTypeInvalidTaskStateSegmentFault = 0x0A,
2069 WHvX64ExceptionTypeSegmentNotPresentFault = 0x0B,
2070 WHvX64ExceptionTypeStackFault = 0x0C,
2071 WHvX64ExceptionTypeGeneralProtectionFault = 0x0D,
2072 WHvX64ExceptionTypePageFault = 0x0E,
2073 WHvX64ExceptionTypeFloatingPointErrorFault = 0x10,
2074 WHvX64ExceptionTypeAlignmentCheckFault = 0x11,
2075 WHvX64ExceptionTypeMachineCheckAbort = 0x12,
2076 WHvX64ExceptionTypeSimdFloatingPointFault = 0x13,
2077 WHvX64ExceptionTypeControlProtectionFault = 0x15
2078} WHV_EXCEPTION_TYPE;
2079
2080typedef enum WHV_X64_LOCAL_APIC_EMULATION_MODE {
2081 WHvX64LocalApicEmulationModeNone,
2082 WHvX64LocalApicEmulationModeXApic,
2083 WHvX64LocalApicEmulationModeX2Apic
2084} WHV_X64_LOCAL_APIC_EMULATION_MODE;
2085
2086#elif defined(__aarch64__)
2087
2088typedef enum WHV_ARM64_IC_EMULATION_MODE {
2089 WHvArm64IcEmulationModeNone = 0,
2090 WHvArm64IcEmulationModeGicV3
2091} WHV_ARM64_IC_EMULATION_MODE;
2092
2093typedef UINT32 WHV_ARM64_INTERRUPT_VECTOR;
2094
2095typedef struct WHV_ARM64_IC_GIC_V3_PARAMETERS {
2096 WHV_GUEST_PHYSICAL_ADDRESS GicdBaseAddress;
2097 WHV_GUEST_PHYSICAL_ADDRESS GitsTranslaterBaseAddress;
2098 UINT32 Reserved;
2099 UINT32 GicLpiIntIdBits;
2100 WHV_ARM64_INTERRUPT_VECTOR GicPpiOverflowInterruptFromCntv;
2101 WHV_ARM64_INTERRUPT_VECTOR GicPpiPerformanceMonitorsInterrupt;
2102 UINT32 Reserved1[6];
2103} WHV_ARM64_IC_GIC_V3_PARAMETERS;
2104
2105C_ASSERT(sizeof(WHV_ARM64_IC_GIC_V3_PARAMETERS) == 56);
2106
2107typedef struct WHV_ARM64_IC_PARAMETERS {
2108 WHV_ARM64_IC_EMULATION_MODE EmulationMode;
2109 UINT32 Reserved;
2110 __C89_NAMELESS union {
2111 WHV_ARM64_IC_GIC_V3_PARAMETERS GicV3Parameters;
2112 };
2113} WHV_ARM64_IC_PARAMETERS;
2114
2115C_ASSERT(sizeof(WHV_ARM64_IC_PARAMETERS) == 64);
2116
2117#endif /* defined(__x86_64__) || defined(__aarch64__) */
2118
2119typedef union WHV_PARTITION_PROPERTY {
2120 WHV_EXTENDED_VM_EXITS ExtendedVmExits;
2121 WHV_PROCESSOR_FEATURES ProcessorFeatures;
2122 WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS SyntheticProcessorFeaturesBanks;
2123 UINT8 ProcessorClFlushSize;
2124 UINT32 ProcessorCount;
2125 WINBOOL SeparateSecurityDomain;
2126 WINBOOL NestedVirtualization;
2127 UINT64 ProcessorClockFrequency;
2128 WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;
2129 UINT64 ReferenceTime;
2130 USHORT PrimaryNumaNode;
2131 UINT32 CpuReserve;
2132 UINT32 CpuCap;
2133 UINT32 CpuWeight;
2134 UINT64 CpuGroupId;
2135 UINT32 ProcessorFrequencyCap;
2136 WINBOOL AllowDeviceAssignment;
2137 WINBOOL DisableSmt;
2138 UINT32 PhysicalAddressWidth;
2139#if defined(__x86_64__)
2140 WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;
2141 UINT32 CpuidExitList[1];
2142 UINT64 ExceptionExitBitmap;
2143 WINBOOL ApicRemoteRead;
2144 WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;
2145 WHV_PROCESSOR_PERFMON_FEATURES ProcessorPerfmonFeatures;
2146 UINT64 InterruptClockFrequency;
2147 WHV_X64_CPUID_RESULT CpuidResultList[1];
2148 WHV_X64_CPUID_RESULT2 CpuidResultList2[1];
2149 WHV_MSR_ACTION_ENTRY MsrActionList[1];
2150 WHV_MSR_ACTION UnimplementedMsrAction;
2151 WHV_X64_LOCAL_APIC_EMULATION_MODE LocalApicEmulationMode;
2152#elif defined(__aarch64__)
2153 WHV_ARM64_IC_PARAMETERS Arm64IcParameters;
2154#endif
2155} WHV_PARTITION_PROPERTY;
2156
2157#if defined(__x86_64__)
2158
2159typedef enum WHV_RUN_VP_EXIT_REASON {
2160 WHvRunVpExitReasonNone = 0x00000000,
2161 WHvRunVpExitReasonMemoryAccess = 0x00000001,
2162 WHvRunVpExitReasonX64IoPortAccess = 0x00000002,
2163 WHvRunVpExitReasonUnrecoverableException = 0x00000004,
2164 WHvRunVpExitReasonInvalidVpRegisterValue = 0x00000005,
2165 WHvRunVpExitReasonUnsupportedFeature = 0x00000006,
2166 WHvRunVpExitReasonX64InterruptWindow = 0x00000007,
2167 WHvRunVpExitReasonX64Halt = 0x00000008,
2168 WHvRunVpExitReasonX64ApicEoi = 0x00000009,
2169 WHvRunVpExitReasonSynicSintDeliverable = 0x0000000A,
2170 WHvRunVpExitReasonX64MsrAccess = 0x00001000,
2171 WHvRunVpExitReasonX64Cpuid = 0x00001001,
2172 WHvRunVpExitReasonException = 0x00001002,
2173 WHvRunVpExitReasonX64Rdtsc = 0x00001003,
2174 WHvRunVpExitReasonX64ApicSmiTrap = 0x00001004,
2175 WHvRunVpExitReasonHypercall = 0x00001005,
2176 WHvRunVpExitReasonX64ApicInitSipiTrap = 0x00001006,
2177 WHvRunVpExitReasonX64ApicWriteTrap = 0x00001007,
2178 WHvRunVpExitReasonCanceled = 0x00002001
2179} WHV_RUN_VP_EXIT_REASON;
2180
2181#elif defined(__aarch64__)
2182
2183typedef enum WHV_RUN_VP_EXIT_REASON {
2184 WHvRunVpExitReasonNone = 0x00000000,
2185 WHvRunVpExitReasonUnmappedGpa = 0x80000000,
2186 WHvRunVpExitReasonGpaIntercept = 0x80000001,
2187 WHvRunVpExitReasonUnrecoverableException = 0x80000021,
2188 WHvRunVpExitReasonInvalidVpRegisterValue = 0x80000020,
2189 WHvRunVpExitReasonUnsupportedFeature = 0x80000022,
2190 WHvRunVpExitReasonSynicSintDeliverable = 0x80000062,
2191 WHvMessageTypeRegisterIntercept = 0x80010006,
2192 WHvRunVpExitReasonArm64Reset = 0x8001000c,
2193 WHvRunVpExitReasonHypercall = 0x80000050,
2194 WHvRunVpExitReasonCanceled = 0xFFFFFFFF
2195} WHV_RUN_VP_EXIT_REASON;
2196
2197#endif /* defined(__x86_64__) || defined(__aarch64__) */
2198
2199#if defined(__x86_64__)
2200
2201typedef union WHV_X64_VP_EXECUTION_STATE {
2202 __C89_NAMELESS struct {
2203 UINT16 Cpl : 2;
2204 UINT16 Cr0Pe : 1;
2205 UINT16 Cr0Am : 1;
2206 UINT16 EferLma : 1;
2207 UINT16 DebugActive : 1;
2208 UINT16 InterruptionPending : 1;
2209 UINT16 Reserved0 : 5;
2210 UINT16 InterruptShadow : 1;
2211 UINT16 Reserved1 : 3;
2212 };
2213 UINT16 AsUINT16;
2214} WHV_X64_VP_EXECUTION_STATE;
2215
2216C_ASSERT(sizeof(WHV_X64_VP_EXECUTION_STATE) == sizeof(UINT16));
2217
2218typedef struct WHV_X64_VP_EXIT_CONTEXT {
2219 WHV_X64_VP_EXECUTION_STATE ExecutionState;
2220 UINT8 InstructionLength : 4;
2221 UINT8 Cr8 : 4;
2222 UINT8 Reserved;
2223 UINT32 Reserved2;
2224 WHV_X64_SEGMENT_REGISTER Cs;
2225 UINT64 Rip;
2226 UINT64 Rflags;
2227} WHV_X64_VP_EXIT_CONTEXT, WHV_VP_EXIT_CONTEXT;
2228
2229C_ASSERT(sizeof(WHV_X64_VP_EXIT_CONTEXT) == 40);
2230
2231typedef struct WHV_SYNIC_SINT_DELIVERABLE_CONTEXT {
2232 UINT16 DeliverableSints;
2233 UINT16 Reserved1;
2234 UINT32 Reserved2;
2235} WHV_SYNIC_SINT_DELIVERABLE_CONTEXT;
2236
2237C_ASSERT(sizeof(WHV_SYNIC_SINT_DELIVERABLE_CONTEXT) == 8);
2238
2239typedef union WHV_MEMORY_ACCESS_INFO {
2240 __C89_NAMELESS struct {
2241 UINT32 AccessType : 2;
2242 UINT32 GpaUnmapped : 1;
2243 UINT32 GvaValid : 1;
2244 UINT32 Reserved : 28;
2245 };
2246 UINT32 AsUINT32;
2247} WHV_MEMORY_ACCESS_INFO;
2248
2249C_ASSERT(sizeof(WHV_MEMORY_ACCESS_INFO) == 4);
2250
2251typedef struct WHV_MEMORY_ACCESS_CONTEXT {
2252 UINT8 InstructionByteCount;
2253 UINT8 Reserved[3];
2254 UINT8 InstructionBytes[16];
2255 WHV_MEMORY_ACCESS_INFO AccessInfo;
2256 WHV_GUEST_PHYSICAL_ADDRESS Gpa;
2257 WHV_GUEST_VIRTUAL_ADDRESS Gva;
2258} WHV_MEMORY_ACCESS_CONTEXT;
2259
2260C_ASSERT(sizeof(WHV_MEMORY_ACCESS_CONTEXT) == 40);
2261
2262typedef union WHV_X64_IO_PORT_ACCESS_INFO {
2263 __C89_NAMELESS struct {
2264 UINT32 IsWrite : 1;
2265 UINT32 AccessSize: 3;
2266 UINT32 StringOp : 1;
2267 UINT32 RepPrefix : 1;
2268 UINT32 Reserved : 26;
2269 };
2270 UINT32 AsUINT32;
2271} WHV_X64_IO_PORT_ACCESS_INFO;
2272
2273C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_INFO) == 4);
2274
2275typedef struct WHV_X64_IO_PORT_ACCESS_CONTEXT {
2276 UINT8 InstructionByteCount;
2277 UINT8 Reserved[3];
2278 UINT8 InstructionBytes[16];
2279 WHV_X64_IO_PORT_ACCESS_INFO AccessInfo;
2280 UINT16 PortNumber;
2281 UINT16 Reserved2[3];
2282 UINT64 Rax;
2283 UINT64 Rcx;
2284 UINT64 Rsi;
2285 UINT64 Rdi;
2286 WHV_X64_SEGMENT_REGISTER Ds;
2287 WHV_X64_SEGMENT_REGISTER Es;
2288} WHV_X64_IO_PORT_ACCESS_CONTEXT;
2289
2290C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_CONTEXT) == 96);
2291
2292typedef union WHV_X64_MSR_ACCESS_INFO {
2293 __C89_NAMELESS struct {
2294 UINT32 IsWrite : 1;
2295 UINT32 Reserved : 31;
2296 };
2297 UINT32 AsUINT32;
2298} WHV_X64_MSR_ACCESS_INFO;
2299
2300C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_INFO) == sizeof(UINT32));
2301
2302typedef struct WHV_X64_MSR_ACCESS_CONTEXT {
2303 WHV_X64_MSR_ACCESS_INFO AccessInfo;
2304 UINT32 MsrNumber;
2305 UINT64 Rax;
2306 UINT64 Rdx;
2307} WHV_X64_MSR_ACCESS_CONTEXT;
2308
2309C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_CONTEXT) == 24);
2310
2311typedef struct WHV_X64_CPUID_ACCESS_CONTEXT {
2312 UINT64 Rax;
2313 UINT64 Rcx;
2314 UINT64 Rdx;
2315 UINT64 Rbx;
2316 UINT64 DefaultResultRax;
2317 UINT64 DefaultResultRcx;
2318 UINT64 DefaultResultRdx;
2319 UINT64 DefaultResultRbx;
2320} WHV_X64_CPUID_ACCESS_CONTEXT;
2321
2322C_ASSERT(sizeof(WHV_X64_CPUID_ACCESS_CONTEXT) == 64);
2323
2324typedef union WHV_VP_EXCEPTION_INFO {
2325 __C89_NAMELESS struct {
2326 UINT32 ErrorCodeValid : 1;
2327 UINT32 SoftwareException : 1;
2328 UINT32 Reserved : 30;
2329 };
2330 UINT32 AsUINT32;
2331} WHV_VP_EXCEPTION_INFO;
2332
2333C_ASSERT(sizeof(WHV_VP_EXCEPTION_INFO) == 4);
2334
2335typedef struct WHV_VP_EXCEPTION_CONTEXT {
2336 UINT8 InstructionByteCount;
2337 UINT8 Reserved[3];
2338 UINT8 InstructionBytes[16];
2339 WHV_VP_EXCEPTION_INFO ExceptionInfo;
2340 UINT8 ExceptionType;
2341 UINT8 Reserved2[3];
2342 UINT32 ErrorCode;
2343 UINT64 ExceptionParameter;
2344} WHV_VP_EXCEPTION_CONTEXT;
2345
2346C_ASSERT(sizeof(WHV_VP_EXCEPTION_CONTEXT) == 40);
2347
2348typedef enum WHV_X64_UNSUPPORTED_FEATURE_CODE {
2349 WHvUnsupportedFeatureIntercept = 1,
2350 WHvUnsupportedFeatureTaskSwitchTss = 2
2351} WHV_X64_UNSUPPORTED_FEATURE_CODE;
2352
2353typedef struct WHV_X64_UNSUPPORTED_FEATURE_CONTEXT {
2354 WHV_X64_UNSUPPORTED_FEATURE_CODE FeatureCode;
2355 UINT32 Reserved;
2356 UINT64 FeatureParameter;
2357} WHV_X64_UNSUPPORTED_FEATURE_CONTEXT;
2358
2359C_ASSERT(sizeof(WHV_X64_UNSUPPORTED_FEATURE_CONTEXT) == 16);
2360
2361#elif defined(__aarch64__)
2362
2363typedef union WHV_VP_EXECUTION_STATE {
2364 UINT16 AsUINT16;
2365 __C89_NAMELESS struct {
2366 UINT16 Cpl : 2;
2367 UINT16 DebugActive : 1;
2368 UINT16 InterruptionPending : 1;
2369 UINT16 Vtl : 4;
2370 UINT16 VirtualizationFaultActive : 1;
2371 UINT16 Reserved : 7;
2372 };
2373} WHV_VP_EXECUTION_STATE;
2374
2375C_ASSERT(sizeof(WHV_VP_EXECUTION_STATE) == 2);
2376
2377typedef struct WHV_INTERCEPT_MESSAGE_HEADER {
2378 UINT32 VpIndex;
2379 UINT8 InstructionLength;
2380 UINT8 InterceptAccessType;
2381 WHV_VP_EXECUTION_STATE ExecutionState;
2382 UINT64 Pc;
2383 UINT64 Cpsr;
2384} WHV_INTERCEPT_MESSAGE_HEADER;
2385
2386C_ASSERT(sizeof(WHV_INTERCEPT_MESSAGE_HEADER) == 24);
2387
2388typedef union WHV_MEMORY_ACCESS_INFO {
2389 UINT8 AsUINT8;
2390 __C89_NAMELESS struct {
2391 UINT8 GvaValid : 1;
2392 UINT8 GvaGpaValid : 1;
2393 UINT8 HypercallOutputPending : 1;
2394 UINT8 Reserved : 5;
2395 };
2396} WHV_MEMORY_ACCESS_INFO;
2397
2398typedef struct WHV_MEMORY_ACCESS_CONTEXT {
2399 WHV_INTERCEPT_MESSAGE_HEADER Header;
2400 UINT32 Reserved0;
2401 UINT8 InstructionByteCount;
2402 WHV_MEMORY_ACCESS_INFO AccessInfo;
2403 UINT16 Reserved1;
2404 UINT8 InstructionBytes[4];
2405 UINT32 Reserved2;
2406 UINT64 Gva;
2407 UINT64 Gpa;
2408 UINT64 Syndrome;
2409} WHV_MEMORY_ACCESS_CONTEXT;
2410
2411C_ASSERT(sizeof(WHV_MEMORY_ACCESS_CONTEXT) == 64);
2412
2413typedef struct WHV_UNRECOVERABLE_EXCEPTION_CONTEXT {
2414 WHV_INTERCEPT_MESSAGE_HEADER Header;
2415} WHV_UNRECOVERABLE_EXCEPTION_CONTEXT;
2416
2417C_ASSERT(sizeof(WHV_UNRECOVERABLE_EXCEPTION_CONTEXT) == 24);
2418
2419typedef struct WHV_INVALID_VP_REGISTER_CONTEXT {
2420 UINT32 VpIndex;
2421 UINT32 Reserved;
2422} WHV_INVALID_VP_REGISTER_CONTEXT;
2423
2424C_ASSERT(sizeof(WHV_INVALID_VP_REGISTER_CONTEXT) == 8);
2425
2426typedef struct WHV_SYNIC_SINT_DELIVERABLE_CONTEXT {
2427 WHV_INTERCEPT_MESSAGE_HEADER Header;
2428 UINT16 DeliverableSints;
2429 UINT16 Reserved1;
2430 UINT32 Reserved2;
2431} WHV_SYNIC_SINT_DELIVERABLE_CONTEXT;
2432
2433C_ASSERT(sizeof(WHV_SYNIC_SINT_DELIVERABLE_CONTEXT) == 32);
2434
2435typedef union WHV_REGISTER_ACCESS_INFO {
2436 WHV_REGISTER_VALUE SourceValue;
2437 WHV_REGISTER_NAME DestinationRegister;
2438} WHV_REGISTER_ACCESS_INFO;
2439
2440typedef struct WHV_REGISTER_CONTEXT {
2441 WHV_INTERCEPT_MESSAGE_HEADER Header;
2442 __C89_NAMELESS struct {
2443 UINT8 IsMemoryOp:1;
2444 UINT8 Reserved:7;
2445 };
2446 UINT8 Reserved8;
2447 UINT16 Reserved16;
2448 WHV_REGISTER_NAME RegisterName;
2449 WHV_REGISTER_ACCESS_INFO AccessInfo;
2450} WHV_REGISTER_CONTEXT;
2451
2452C_ASSERT(sizeof(WHV_REGISTER_CONTEXT) == 48);
2453
2454typedef enum WHV_ARM64_RESET_TYPE {
2455 WHvArm64ResetTypePowerOff = 0,
2456 WHvArm64ResetTypeReboot
2457} WHV_ARM64_RESET_TYPE;
2458
2459typedef struct WHV_ARM64_RESET_CONTEXT {
2460 WHV_INTERCEPT_MESSAGE_HEADER Header;
2461 WHV_ARM64_RESET_TYPE ResetType;
2462 UINT32 Reserved;
2463} WHV_ARM64_RESET_CONTEXT;
2464
2465C_ASSERT(sizeof(WHV_ARM64_RESET_CONTEXT) == 32);
2466
2467#endif /* defined(__x86_64__) || defined(__aarch64__) */
2468
2469typedef enum WHV_RUN_VP_CANCEL_REASON {
2470 WHvRunVpCancelReasonUser = 0
2471} WHV_RUN_VP_CANCEL_REASON;
2472
2473#define WhvRunVpCancelReasonUser WHvRunVpCancelReasonUser
2474
2475typedef struct WHV_RUN_VP_CANCELED_CONTEXT {
2476 WHV_RUN_VP_CANCEL_REASON CancelReason;
2477} WHV_RUN_VP_CANCELED_CONTEXT;
2478
2479C_ASSERT(sizeof(WHV_RUN_VP_CANCELED_CONTEXT) == 4);
2480
2481#if defined(__x86_64__)
2482
2483typedef enum WHV_X64_PENDING_INTERRUPTION_TYPE {
2484 WHvX64PendingInterrupt = 0,
2485 WHvX64PendingNmi = 2,
2486 WHvX64PendingException = 3
2487} WHV_X64_PENDING_INTERRUPTION_TYPE, *PWHV_X64_PENDING_INTERRUPTION_TYPE;
2488
2489typedef struct WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT {
2490 WHV_X64_PENDING_INTERRUPTION_TYPE DeliverableType;
2491} WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT, *PWHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT;
2492
2493C_ASSERT(sizeof(WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT) == 4);
2494
2495typedef struct WHV_X64_APIC_EOI_CONTEXT {
2496 UINT32 InterruptVector;
2497} WHV_X64_APIC_EOI_CONTEXT;
2498
2499C_ASSERT(sizeof(WHV_X64_APIC_EOI_CONTEXT) == 4);
2500
2501typedef union WHV_X64_RDTSC_INFO {
2502 __C89_NAMELESS struct {
2503 UINT64 IsRdtscp : 1;
2504 UINT64 Reserved : 63;
2505 };
2506 UINT64 AsUINT64;
2507} WHV_X64_RDTSC_INFO;
2508
2509C_ASSERT(sizeof(WHV_X64_RDTSC_INFO) == 8);
2510
2511typedef struct WHV_X64_RDTSC_CONTEXT {
2512 UINT64 TscAux;
2513 UINT64 VirtualOffset;
2514 UINT64 Tsc;
2515 UINT64 ReferenceTime;
2516 WHV_X64_RDTSC_INFO RdtscInfo;
2517} WHV_X64_RDTSC_CONTEXT;
2518
2519C_ASSERT(sizeof(WHV_X64_RDTSC_CONTEXT) == 40);
2520
2521typedef struct WHV_X64_APIC_SMI_CONTEXT {
2522 UINT64 ApicIcr;
2523} WHV_X64_APIC_SMI_CONTEXT;
2524
2525C_ASSERT(sizeof(WHV_X64_APIC_SMI_CONTEXT) == 8);
2526
2527#endif /* defined(__x86_64__) */
2528
2529#if defined(__x86_64__)
2530
2531#define WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS 6
2532
2533typedef struct WHV_X64_HYPERCALL_CONTEXT {
2534 UINT64 Rax;
2535 UINT64 Rbx;
2536 UINT64 Rcx;
2537 UINT64 Rdx;
2538 UINT64 R8;
2539 UINT64 Rsi;
2540 UINT64 Rdi;
2541 UINT64 Reserved0;
2542 WHV_UINT128 XmmRegisters[WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS];
2543 UINT64 Reserved1[2];
2544} WHV_X64_HYPERCALL_CONTEXT, WHV_HYPERCALL_CONTEXT, *PWHV_HYPERCALL_CONTEXT;
2545
2546C_ASSERT(sizeof(WHV_HYPERCALL_CONTEXT) == 176);
2547
2548#elif defined(__aarch64__)
2549
2550typedef struct WHV_ARM64_HYPERCALL_CONTEXT {
2551 WHV_INTERCEPT_MESSAGE_HEADER Header;
2552 UINT16 Immediate;
2553 UINT16 Reserved1;
2554 UINT32 Reserved2;
2555 UINT64 X[18];
2556} WHV_ARM64_HYPERCALL_CONTEXT, WHV_HYPERCALL_CONTEXT, *PWHV_HYPERCALL_CONTEXT;
2557
2558#endif /* defined(__x86_64__) || defined(__aarch64__) */
2559
2560#if defined(__x86_64__)
2561
2562typedef struct WHV_X64_APIC_INIT_SIPI_CONTEXT {
2563 UINT64 ApicIcr;
2564} WHV_X64_APIC_INIT_SIPI_CONTEXT;
2565
2566C_ASSERT(sizeof(WHV_X64_APIC_INIT_SIPI_CONTEXT) == 8);
2567
2568typedef enum WHV_X64_APIC_WRITE_TYPE {
2569 WHvX64ApicWriteTypeLdr = 0xD0,
2570 WHvX64ApicWriteTypeDfr = 0xE0,
2571 WHvX64ApicWriteTypeSvr = 0xF0,
2572 WHvX64ApicWriteTypeLint0 = 0x350,
2573 WHvX64ApicWriteTypeLint1 = 0x360
2574} WHV_X64_APIC_WRITE_TYPE;
2575
2576typedef struct WHV_X64_APIC_WRITE_CONTEXT {
2577 WHV_X64_APIC_WRITE_TYPE Type;
2578 UINT32 Reserved;
2579 UINT64 WriteValue;
2580} WHV_X64_APIC_WRITE_CONTEXT;
2581
2582C_ASSERT(sizeof(WHV_X64_APIC_WRITE_CONTEXT) == 16);
2583
2584#endif /* defined(__x86_64__) */
2585
2586typedef struct WHV_RUN_VP_EXIT_CONTEXT {
2587 WHV_RUN_VP_EXIT_REASON ExitReason;
2588 UINT32 Reserved;
2589#if defined(__x86_64__)
2590 WHV_VP_EXIT_CONTEXT VpContext;
2591#elif defined(__aarch64__)
2592 UINT64 Reserved1;
2593#endif
2594 __C89_NAMELESS union {
2595 WHV_MEMORY_ACCESS_CONTEXT MemoryAccess;
2596 WHV_RUN_VP_CANCELED_CONTEXT CancelReason;
2597 WHV_HYPERCALL_CONTEXT Hypercall;
2598 WHV_SYNIC_SINT_DELIVERABLE_CONTEXT SynicSintDeliverable;
2599#if defined(__x86_64__)
2600 WHV_X64_IO_PORT_ACCESS_CONTEXT IoPortAccess;
2601 WHV_X64_MSR_ACCESS_CONTEXT MsrAccess;
2602 WHV_X64_CPUID_ACCESS_CONTEXT CpuidAccess;
2603 WHV_VP_EXCEPTION_CONTEXT VpException;
2604 WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT InterruptWindow;
2605 WHV_X64_UNSUPPORTED_FEATURE_CONTEXT UnsupportedFeature;
2606 WHV_X64_APIC_EOI_CONTEXT ApicEoi;
2607 WHV_X64_RDTSC_CONTEXT ReadTsc;
2608 WHV_X64_APIC_SMI_CONTEXT ApicSmi;
2609 WHV_X64_APIC_INIT_SIPI_CONTEXT ApicInitSipi;
2610 WHV_X64_APIC_WRITE_CONTEXT ApicWrite;
2611 UINT64 AsUINT64[22];
2612#elif defined(__aarch64__)
2613 WHV_UNRECOVERABLE_EXCEPTION_CONTEXT UnrecoverableException;
2614 WHV_INVALID_VP_REGISTER_CONTEXT InvalidVpRegister;
2615 WHV_REGISTER_CONTEXT Register;
2616 WHV_ARM64_RESET_CONTEXT Arm64Reset;
2617 UINT64 AsUINT64[32];
2618#endif
2619 };
2620} WHV_RUN_VP_EXIT_CONTEXT;
2621
2622#if defined(__x86_64__)
2623C_ASSERT(sizeof(WHV_RUN_VP_EXIT_CONTEXT) == 224);
2624#elif defined(__aarch64__)
2625C_ASSERT(sizeof(WHV_RUN_VP_EXIT_CONTEXT) == 272);
2626#endif
2627
2628#if defined(__x86_64__)
2629
2630typedef enum WHV_INTERRUPT_TYPE {
2631 WHvX64InterruptTypeFixed = 0,
2632 WHvX64InterruptTypeLowestPriority = 1,
2633 WHvX64InterruptTypeNmi = 4,
2634 WHvX64InterruptTypeInit = 5,
2635 WHvX64InterruptTypeSipi = 6,
2636 WHvX64InterruptTypeLocalInt1 = 9
2637} WHV_INTERRUPT_TYPE;
2638
2639typedef enum WHV_INTERRUPT_DESTINATION_MODE {
2640 WHvX64InterruptDestinationModePhysical,
2641 WHvX64InterruptDestinationModeLogical
2642} WHV_INTERRUPT_DESTINATION_MODE;
2643
2644typedef enum WHV_INTERRUPT_TRIGGER_MODE {
2645 WHvX64InterruptTriggerModeEdge,
2646 WHvX64InterruptTriggerModeLevel
2647} WHV_INTERRUPT_TRIGGER_MODE;
2648
2649typedef struct WHV_INTERRUPT_CONTROL {
2650 UINT64 Type : 8;
2651 UINT64 DestinationMode : 4;
2652 UINT64 TriggerMode : 4;
2653 UINT64 TargetVtl : 8;
2654 UINT64 Reserved : 40;
2655 UINT32 Destination;
2656 UINT32 Vector;
2657} WHV_INTERRUPT_CONTROL;
2658
2659C_ASSERT(sizeof(WHV_INTERRUPT_CONTROL) == 16);
2660
2661#elif defined(__aarch64__)
2662
2663typedef enum WHV_INTERRUPT_TYPE {
2664 WHvArm64InterruptTypeFixed = 0x0000,
2665 WHvArm64InterruptTypeMaximum = 0x0008
2666} WHV_INTERRUPT_TYPE;
2667
2668typedef union WHV_INTERRUPT_CONTROL2 {
2669 UINT64 AsUINT64;
2670 __C89_NAMELESS struct {
2671 WHV_INTERRUPT_TYPE InterruptType;
2672 UINT32 Reserved1 : 2;
2673 UINT32 Asserted : 1;
2674 UINT32 Retarget : 1;
2675 UINT32 Reserved2 : 28;
2676 };
2677} WHV_INTERRUPT_CONTROL2;
2678
2679C_ASSERT(sizeof(WHV_INTERRUPT_CONTROL2) == 8);
2680
2681typedef struct WHV_INTERRUPT_CONTROL {
2682 UINT64 TargetPartition;
2683 WHV_INTERRUPT_CONTROL2 InterruptControl;
2684 UINT64 DestinationAddress;
2685 UINT32 RequestedVector;
2686 UINT8 TargetVtl;
2687 UINT8 ReservedZ0;
2688 UINT16 ReservedZ1;
2689} WHV_INTERRUPT_CONTROL;
2690
2691C_ASSERT(sizeof(WHV_INTERRUPT_CONTROL) == 32);
2692
2693#endif /* defined(__x86_64__) || defined(__aarch64__) */
2694
2695typedef struct WHV_DOORBELL_MATCH_DATA {
2696 WHV_GUEST_PHYSICAL_ADDRESS GuestAddress;
2697 UINT64 Value;
2698 UINT32 Length;
2699 UINT32 MatchOnValue : 1;
2700 UINT32 MatchOnLength : 1;
2701 UINT32 Reserved : 30;
2702} WHV_DOORBELL_MATCH_DATA;
2703
2704C_ASSERT(sizeof(WHV_DOORBELL_MATCH_DATA) == 24);
2705
2706typedef enum WHV_PARTITION_COUNTER_SET {
2707 WHvPartitionCounterSetMemory
2708} WHV_PARTITION_COUNTER_SET;
2709
2710typedef struct WHV_PARTITION_MEMORY_COUNTERS {
2711 UINT64 Mapped4KPageCount;
2712 UINT64 Mapped2MPageCount;
2713 UINT64 Mapped1GPageCount;
2714} WHV_PARTITION_MEMORY_COUNTERS;
2715
2716C_ASSERT(sizeof(WHV_PARTITION_MEMORY_COUNTERS) == 24);
2717
2718typedef enum WHV_PROCESSOR_COUNTER_SET {
2719 WHvProcessorCounterSetRuntime = 0,
2720 WHvProcessorCounterSetIntercepts = 1,
2721 WHvProcessorCounterSetEvents = 2,
2722#if defined(__x86_64__)
2723 WHvProcessorCounterSetApic = 3,
2724#endif
2725 WHvProcessorCounterSetSyntheticFeatures = 4
2726} WHV_PROCESSOR_COUNTER_SET;
2727
2728typedef struct WHV_PROCESSOR_RUNTIME_COUNTERS {
2729 UINT64 TotalRuntime100ns;
2730 UINT64 HypervisorRuntime100ns;
2731} WHV_PROCESSOR_RUNTIME_COUNTERS;
2732
2733C_ASSERT(sizeof(WHV_PROCESSOR_RUNTIME_COUNTERS) == 16);
2734
2735typedef struct WHV_PROCESSOR_INTERCEPT_COUNTER {
2736 UINT64 Count;
2737 UINT64 Time100ns;
2738} WHV_PROCESSOR_INTERCEPT_COUNTER;
2739
2740C_ASSERT(sizeof(WHV_PROCESSOR_INTERCEPT_COUNTER) == 16);
2741
2742typedef struct WHV_PROCESSOR_INTERCEPT_COUNTERS {
2743#if defined(__x86_64__)
2744 WHV_PROCESSOR_INTERCEPT_COUNTER PageInvalidations;
2745 WHV_PROCESSOR_INTERCEPT_COUNTER ControlRegisterAccesses;
2746 WHV_PROCESSOR_INTERCEPT_COUNTER IoInstructions;
2747 WHV_PROCESSOR_INTERCEPT_COUNTER HaltInstructions;
2748 WHV_PROCESSOR_INTERCEPT_COUNTER CpuidInstructions;
2749 WHV_PROCESSOR_INTERCEPT_COUNTER MsrAccesses;
2750 WHV_PROCESSOR_INTERCEPT_COUNTER OtherIntercepts;
2751 WHV_PROCESSOR_INTERCEPT_COUNTER PendingInterrupts;
2752 WHV_PROCESSOR_INTERCEPT_COUNTER EmulatedInstructions;
2753 WHV_PROCESSOR_INTERCEPT_COUNTER DebugRegisterAccesses;
2754 WHV_PROCESSOR_INTERCEPT_COUNTER PageFaultIntercepts;
2755 WHV_PROCESSOR_INTERCEPT_COUNTER NestedPageFaultIntercepts;
2756 WHV_PROCESSOR_INTERCEPT_COUNTER Hypercalls;
2757 WHV_PROCESSOR_INTERCEPT_COUNTER RdpmcInstructions;
2758#elif defined(__aarch64__)
2759 WHV_PROCESSOR_INTERCEPT_COUNTER OtherIntercepts;
2760 WHV_PROCESSOR_INTERCEPT_COUNTER PendingInterrupts;
2761 WHV_PROCESSOR_INTERCEPT_COUNTER NestedPageFaultIntercepts;
2762 WHV_PROCESSOR_INTERCEPT_COUNTER Hypercalls;
2763 WHV_PROCESSOR_INTERCEPT_COUNTER Reserved[10];
2764#endif /* defined(__x86_64__) || defined(__aarch64__) */
2765} WHV_PROCESSOR_ACTIVITY_COUNTERS;
2766
2767C_ASSERT(sizeof(WHV_PROCESSOR_ACTIVITY_COUNTERS) == 224);
2768
2769typedef struct WHV_PROCESSOR_EVENT_COUNTERS {
2770 UINT64 PageFaultCount;
2771 UINT64 ExceptionCount;
2772 UINT64 InterruptCount;
2773} WHV_PROCESSOR_GUEST_EVENT_COUNTERS;
2774
2775C_ASSERT(sizeof(WHV_PROCESSOR_GUEST_EVENT_COUNTERS) == 24);
2776
2777#if defined(__x86_64__)
2778
2779typedef struct WHV_PROCESSOR_APIC_COUNTERS {
2780 UINT64 MmioAccessCount;
2781 UINT64 EoiAccessCount;
2782 UINT64 TprAccessCount;
2783 UINT64 SentIpiCount;
2784 UINT64 SelfIpiCount;
2785} WHV_PROCESSOR_APIC_COUNTERS;
2786
2787C_ASSERT(sizeof(WHV_PROCESSOR_APIC_COUNTERS) == 40);
2788
2789#endif /* defined(__x86_64__) */
2790
2791typedef struct WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS {
2792 UINT64 SyntheticInterruptsCount;
2793 UINT64 LongSpinWaitHypercallsCount;
2794 UINT64 OtherHypercallsCount;
2795 UINT64 SyntheticInterruptHypercallsCount;
2796 UINT64 VirtualInterruptHypercallsCount;
2797 UINT64 VirtualMmuHypercallsCount;
2798} WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS;
2799
2800C_ASSERT(sizeof(WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS) == 48);
2801
2802typedef union WHV_VTL_PERMISSION_SET {
2803 UINT32 AsUINT32;
2804 __C89_NAMELESS struct {
2805 UINT16 VtlPermissionFrom1[2];
2806 };
2807} WHV_VTL_PERMISSION_SET;
2808
2809typedef enum WHV_ADVISE_GPA_RANGE_CODE {
2810 WHvAdviseGpaRangeCodePopulate = 0x00000000,
2811 WHvAdviseGpaRangeCodePin = 0x00000001,
2812 WHvAdviseGpaRangeCodeUnpin = 0x00000002
2813} WHV_ADVISE_GPA_RANGE_CODE;
2814
2815#if defined(__x86_64__)
2816
2817typedef enum WHV_VIRTUAL_PROCESSOR_STATE_TYPE {
2818 WHvVirtualProcessorStateTypeSynicMessagePage = 0x00000000,
2819 WHvVirtualProcessorStateTypeSynicEventFlagPage = 0x00000001,
2820 WHvVirtualProcessorStateTypeSynicTimerState = 0x00000002,
2821 WHvVirtualProcessorStateTypeInterruptControllerState2 = 0x00001000,
2822 WHvVirtualProcessorStateTypeXsaveState = 0x00001001,
2823 WHvVirtualProcessorStateTypeNestedState = 0x00001002
2824} WHV_VIRTUAL_PROCESSOR_STATE_TYPE;
2825
2826#elif defined(__aarch64__)
2827
2828#define WHV_VIRTUAL_PROCESSOR_STATE_TYPE_PFN (1U << 31)
2829#define WHV_VIRTUAL_PROCESSOR_STATE_TYPE_ANY_VP (1U << 30)
2830
2831typedef enum WHV_VIRTUAL_PROCESSOR_STATE_TYPE {
2832 WHvVirtualProcessorStateTypeInterruptControllerState = 0x00000000 | WHV_VIRTUAL_PROCESSOR_STATE_TYPE_PFN,
2833 WHvVirtualProcessorStateTypeSynicMessagePage = 0x00000002 | WHV_VIRTUAL_PROCESSOR_STATE_TYPE_PFN,
2834 WHvVirtualProcessorStateTypeSynicEventFlagPage = 0x00000003 | WHV_VIRTUAL_PROCESSOR_STATE_TYPE_PFN,
2835 WHvVirtualProcessorStateTypeSynicTimerState = 0x00000004,
2836 WHvVirtualProcessorStateTypeGlobalInterruptState = 0x00000006 | WHV_VIRTUAL_PROCESSOR_STATE_TYPE_PFN | WHV_VIRTUAL_PROCESSOR_STATE_TYPE_ANY_VP,
2837 WHvVirtualProcessorStateTypeSveState = 0x00000007 | WHV_VIRTUAL_PROCESSOR_STATE_TYPE_PFN
2838} WHV_VIRTUAL_PROCESSOR_STATE_TYPE;
2839
2840#endif /* defined(__x86_64__) || defined(__aarch64__) */
2841
2842typedef enum WHV_NESTED_STATE_TYPE {
2843 WHvNestedStateTypeVmx,
2844 WHvNestedStateTypeSvm
2845} WHV_NESTED_STATE_TYPE;
2846
2847typedef struct WHV_NESTED_ENLIGHTENMENTS_CONTROL {
2848 __C89_NAMELESS union {
2849 UINT32 AsUINT32;
2850 __C89_NAMELESS struct {
2851 UINT32 DirectHypercall:1;
2852 UINT32 VirtualizationException:1;
2853 UINT32 Reserved:30;
2854 };
2855 } Features;
2856 __C89_NAMELESS union {
2857 UINT32 AsUINT32;
2858 __C89_NAMELESS struct {
2859 UINT32 InterPartitionCommunication:1;
2860 UINT32 Reserved:31;
2861 };
2862 } HypercallControls;
2863} WHV_NESTED_ENLIGHTENMENTS_CONTROL;
2864
2865typedef struct WHV_X64_VMX_NESTED_STATE {
2866 WHV_NESTED_STATE_TYPE Vendor;
2867 __C89_NAMELESS struct {
2868 UINT32 GuestMode : 1;
2869 UINT32 Vmxon : 1;
2870 UINT32 CurrentVmcsValid : 1;
2871 UINT32 VmEntryPending : 1;
2872 UINT32 VmcsEnlightened : 1;
2873 UINT32 EnlightenedVmEntry : 1;
2874 UINT32 Reserved : 26;
2875 } Flags;
2876 WHV_NESTED_ENLIGHTENMENTS_CONTROL NestedEnlightenmentsControl;
2877 UINT64 Pdpt[4];
2878 UINT64 VmxonRegionGpa;
2879 UINT64 VmcsGpa;
2880 UINT64 CurrentEnlightenedVmcs;
2881 __C89_NAMELESS struct {
2882 UINT32 Tpr;
2883 UINT32 Ppr;
2884 UINT32 Isr[8];
2885 UINT32 Irr[8];
2886 UINT32 IcrLow;
2887 UINT32 IcrHigh;
2888 } VirtualApicRegs;
2889 UINT8 Reserved[3944];
2890 DECLSPEC_ALIGN(4096) UINT8 VmcsBytes[4096];
2891} WHV_X64_VMX_NESTED_STATE;
2892
2893typedef struct WHV_SVM_VMCB_SELECTOR {
2894 UINT16 Selector;
2895 UINT16 Attrib;
2896 UINT32 Limit;
2897 UINT64 Base;
2898} WHV_SVM_VMCB_SELECTOR;
2899
2900typedef struct WHV_SVM_NESTED_HOST_STATE {
2901 UINT64 Rip;
2902 UINT64 Rsp;
2903 UINT64 Rflags;
2904 UINT64 Rax;
2905 WHV_SVM_VMCB_SELECTOR Es;
2906 WHV_SVM_VMCB_SELECTOR Cs;
2907 WHV_SVM_VMCB_SELECTOR Ss;
2908 WHV_SVM_VMCB_SELECTOR Ds;
2909 WHV_SVM_VMCB_SELECTOR Gdtr;
2910 WHV_SVM_VMCB_SELECTOR Idtr;
2911 UINT64 Efer;
2912 UINT64 Cr0;
2913 UINT64 Cr3;
2914 UINT64 Cr4;
2915 UINT64 VirtualTpr;
2916 UINT64 Reserved[6];
2917} WHV_SVM_NESTED_HOST_STATE;
2918
2919typedef struct WHV_X64_SVM_NESTED_STATE {
2920 WHV_NESTED_STATE_TYPE Vendor;
2921 __C89_NAMELESS struct {
2922 UINT32 GuestMode : 1;
2923 UINT32 VmEntryPending : 1;
2924 UINT32 HostSaveGpaValid : 1;
2925 UINT32 CurrentVmcbValid : 1;
2926 UINT32 Reserved : 28;
2927 } Flags;
2928 WHV_NESTED_ENLIGHTENMENTS_CONTROL NestedEnlightenmentsControl;
2929 UINT64 HostSaveGpa;
2930 UINT64 VmControlMsr;
2931 UINT64 VirtualTscRatioMsr;
2932 UINT64 VmcbGpa;
2933 WHV_SVM_NESTED_HOST_STATE HostState;
2934 UINT8 Reserved[3832];
2935 DECLSPEC_ALIGN(4096) UINT8 VmcbBytes[4096];
2936} WHV_X64_SVM_NESTED_STATE;
2937
2938typedef union WHV_X64_NESTED_STATE {
2939 WHV_X64_VMX_NESTED_STATE Vmx;
2940 WHV_X64_SVM_NESTED_STATE Svm;
2941} WHV_X64_NESTED_STATE;
2942
2943C_ASSERT(sizeof(WHV_X64_NESTED_STATE) == (2 * 4096));
2944
2945#if defined (__aarch64__)
2946
2947typedef struct WHV_ARM64_INTERRUPT_STATE {
2948 __C89_NAMELESS struct {
2949 UINT8 Enabled : 1;
2950 UINT8 EdgeTriggered : 1;
2951 UINT8 Asserted : 1;
2952 UINT8 SetPending : 1;
2953 UINT8 Active : 1;
2954 UINT8 Direct : 1;
2955 UINT8 Reserved0 : 2;
2956 };
2957 UINT8 GicrIpriorityrConfigured;
2958 UINT8 GicrIpriorityrActive;
2959 UINT8 Reserved1;
2960} WHV_ARM64_INTERRUPT_STATE;
2961
2962typedef struct WHV_ARM64_GLOBAL_INTERRUPT_STATE {
2963 UINT32 InterruptId;
2964 UINT32 ActiveVpIndex;
2965 __C89_NAMELESS union {
2966 UINT32 TargetMpidr;
2967 UINT32 TargetVpIndex;
2968 };
2969 WHV_ARM64_INTERRUPT_STATE InterruptState;
2970} WHV_ARM64_GLOBAL_INTERRUPT_STATE;
2971
2972#define WHV_ARM64_GLOBAL_INTERRUPT_CONTROLLER_STATE_VERSION_CURRENT (1)
2973
2974typedef struct WHV_ARM64_GLOBAL_INTERRUPT_CONTROLLER_STATE {
2975 UINT8 Version;
2976 UINT8 GicVersion;
2977 UINT8 Reserved0[2];
2978 UINT32 NumInterrupts;
2979 UINT64 GicdCtlrEnableGrp1A;
2980 WHV_ARM64_GLOBAL_INTERRUPT_STATE Interrupts[ANYSIZE_ARRAY];
2981} WHV_ARM64_GLOBAL_INTERRUPT_CONTROLLER_STATE;
2982
2983#define WHV_ARM64_INTERRUPT_CONTROLLER_STATE_VERSION_CURRENT (1)
2984
2985typedef struct WHV_ARM64_LOCAL_INTERRUPT_CONTROLLER_STATE {
2986 UINT8 Version;
2987 UINT8 GicVersion;
2988 UINT8 Reserved0[6];
2989 UINT64 IccIgrpen1El1;
2990 UINT64 GicrCtlrEnableLpis;
2991 UINT64 IccBpr1El1;
2992 UINT64 IccPmrEl1;
2993 UINT64 GicrPropbaser;
2994 UINT64 GicrPendbaser;
2995 UINT32 IchAp1REl2[4];
2996 WHV_ARM64_INTERRUPT_STATE BankedInterruptState[32];
2997} WHV_ARM64_LOCAL_INTERRUPT_CONTROLLER_STATE;
2998
2999typedef struct WHV_ARM64_VP_STATE_SVE {
3000 USHORT Version;
3001 USHORT RegisterDataOffset;
3002 UINT32 VectorLength;
3003 UINT64 Reserved0;
3004} WHV_ARM64_VP_STATE_SVE;
3005
3006#endif /* defined(__aarch64__) */
3007
3008typedef struct WHV_SYNIC_EVENT_PARAMETERS {
3009 UINT32 VpIndex;
3010 UINT8 TargetSint;
3011 WHV_VTL TargetVtl;
3012 UINT16 FlagNumber;
3013} WHV_SYNIC_EVENT_PARAMETERS;
3014
3015C_ASSERT(sizeof(WHV_SYNIC_EVENT_PARAMETERS) == 8);
3016
3017typedef enum WHV_ALLOCATE_VPCI_RESOURCE_FLAGS {
3018 WHvAllocateVpciResourceFlagNone = 0x00000000,
3019 WHvAllocateVpciResourceFlagAllowDirectP2P = 0x00000001
3020} WHV_ALLOCATE_VPCI_RESOURCE_FLAGS;
3021
3022DEFINE_ENUM_FLAG_OPERATORS(WHV_ALLOCATE_VPCI_RESOURCE_FLAGS);
3023
3024#define WHV_MAX_DEVICE_ID_SIZE_IN_CHARS 200
3025
3026typedef struct WHV_SRIOV_RESOURCE_DESCRIPTOR {
3027 WCHAR PnpInstanceId[WHV_MAX_DEVICE_ID_SIZE_IN_CHARS];
3028 LUID VirtualFunctionId;
3029 UINT16 VirtualFunctionIndex;
3030 UINT16 Reserved;
3031} WHV_SRIOV_RESOURCE_DESCRIPTOR;
3032
3033C_ASSERT(sizeof(WHV_SRIOV_RESOURCE_DESCRIPTOR) == 412);
3034
3035typedef enum WHV_VPCI_DEVICE_NOTIFICATION_TYPE {
3036 WHvVpciDeviceNotificationUndefined = 0,
3037 WHvVpciDeviceNotificationMmioRemapping = 1,
3038 WHvVpciDeviceNotificationSurpriseRemoval = 2
3039} WHV_VPCI_DEVICE_NOTIFICATION_TYPE;
3040
3041typedef struct WHV_VPCI_DEVICE_NOTIFICATION {
3042 WHV_VPCI_DEVICE_NOTIFICATION_TYPE NotificationType;
3043 UINT32 Reserved1;
3044 __C89_NAMELESS union {
3045 UINT64 Reserved2;
3046 };
3047} WHV_VPCI_DEVICE_NOTIFICATION;
3048
3049C_ASSERT(sizeof(WHV_VPCI_DEVICE_NOTIFICATION) == 16);
3050
3051typedef enum WHV_CREATE_VPCI_DEVICE_FLAGS {
3052 WHvCreateVpciDeviceFlagNone = 0x00000000,
3053 WHvCreateVpciDeviceFlagPhysicallyBacked = 0x00000001,
3054 WHvCreateVpciDeviceFlagUseLogicalInterrupts = 0x00000002
3055} WHV_CREATE_VPCI_DEVICE_FLAGS;
3056
3057DEFINE_ENUM_FLAG_OPERATORS(WHV_CREATE_VPCI_DEVICE_FLAGS);
3058
3059typedef enum WHV_VPCI_DEVICE_PROPERTY_CODE {
3060 WHvVpciDevicePropertyCodeUndefined = 0,
3061 WHvVpciDevicePropertyCodeHardwareIDs = 1,
3062 WHvVpciDevicePropertyCodeProbedBARs = 2
3063} WHV_VPCI_DEVICE_PROPERTY_CODE;
3064
3065typedef struct WHV_VPCI_HARDWARE_IDS {
3066 UINT16 VendorID;
3067 UINT16 DeviceID;
3068 UINT8 RevisionID;
3069 UINT8 ProgIf;
3070 UINT8 SubClass;
3071 UINT8 BaseClass;
3072 UINT16 SubVendorID;
3073 UINT16 SubSystemID;
3074} WHV_VPCI_HARDWARE_IDS;
3075
3076C_ASSERT(sizeof(WHV_VPCI_HARDWARE_IDS) == 12);
3077
3078#define WHV_VPCI_TYPE0_BAR_COUNT 6
3079
3080typedef struct WHV_VPCI_PROBED_BARS {
3081 UINT32 Value[WHV_VPCI_TYPE0_BAR_COUNT];
3082} WHV_VPCI_PROBED_BARS;
3083
3084C_ASSERT(sizeof(WHV_VPCI_PROBED_BARS) == 24);
3085
3086typedef enum WHV_VPCI_MMIO_RANGE_FLAGS {
3087 WHvVpciMmioRangeFlagReadAccess = 0x00000001,
3088 WHvVpciMmioRangeFlagWriteAccess = 0x00000002
3089} WHV_VPCI_MMIO_RANGE_FLAGS;
3090
3091DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_MMIO_RANGE_FLAGS);
3092
3093typedef enum WHV_VPCI_DEVICE_REGISTER_SPACE {
3094 WHvVpciConfigSpace = -1,
3095 WHvVpciBar0 = 0,
3096 WHvVpciBar1 = 1,
3097 WHvVpciBar2 = 2,
3098 WHvVpciBar3 = 3,
3099 WHvVpciBar4 = 4,
3100 WHvVpciBar5 = 5
3101} WHV_VPCI_DEVICE_REGISTER_SPACE;
3102
3103typedef struct WHV_VPCI_MMIO_MAPPING {
3104 WHV_VPCI_DEVICE_REGISTER_SPACE Location;
3105 WHV_VPCI_MMIO_RANGE_FLAGS Flags;
3106 UINT64 SizeInBytes;
3107 UINT64 OffsetInBytes;
3108 PVOID VirtualAddress;
3109} WHV_VPCI_MMIO_MAPPING;
3110
3111C_ASSERT(sizeof(WHV_VPCI_MMIO_MAPPING) == 32);
3112
3113typedef struct WHV_VPCI_DEVICE_REGISTER {
3114 WHV_VPCI_DEVICE_REGISTER_SPACE Location;
3115 UINT32 SizeInBytes;
3116 UINT64 OffsetInBytes;
3117} WHV_VPCI_DEVICE_REGISTER;
3118
3119C_ASSERT(sizeof(WHV_VPCI_DEVICE_REGISTER) == 16);
3120
3121typedef enum WHV_VPCI_INTERRUPT_TARGET_FLAGS {
3122 WHvVpciInterruptTargetFlagNone = 0x00000000,
3123 WHvVpciInterruptTargetFlagMulticast = 0x00000001
3124} WHV_VPCI_INTERRUPT_TARGET_FLAGS;
3125
3126DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_INTERRUPT_TARGET_FLAGS);
3127
3128typedef struct WHV_VPCI_INTERRUPT_TARGET {
3129 UINT32 Vector;
3130 WHV_VPCI_INTERRUPT_TARGET_FLAGS Flags;
3131 UINT32 ProcessorCount;
3132 UINT32 Processors[ANYSIZE_ARRAY];
3133} WHV_VPCI_INTERRUPT_TARGET;
3134
3135C_ASSERT(sizeof(WHV_VPCI_INTERRUPT_TARGET) == 16);
3136
3137typedef enum WHV_TRIGGER_TYPE {
3138#if defined(__x86_64__)
3139 WHvTriggerTypeInterrupt = 0,
3140#endif
3141 WHvTriggerTypeSynicEvent = 1,
3142 WHvTriggerTypeDeviceInterrupt = 2
3143} WHV_TRIGGER_TYPE;
3144
3145typedef struct WHV_TRIGGER_PARAMETERS {
3146 WHV_TRIGGER_TYPE TriggerType;
3147 UINT32 Reserved;
3148 __C89_NAMELESS union {
3149#if defined(__x86_64__)
3150 WHV_INTERRUPT_CONTROL Interrupt;
3151#endif
3152 WHV_SYNIC_EVENT_PARAMETERS SynicEvent;
3153 __C89_NAMELESS struct {
3154 UINT64 LogicalDeviceId;
3155 UINT64 MsiAddress;
3156 UINT32 MsiData;
3157 UINT32 Reserved;
3158 } DeviceInterrupt;
3159 };
3160} WHV_TRIGGER_PARAMETERS;
3161
3162C_ASSERT(sizeof(WHV_TRIGGER_PARAMETERS) == 32);
3163
3164typedef PVOID WHV_TRIGGER_HANDLE;
3165
3166typedef enum WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE {
3167 WHvVirtualProcessorPropertyCodeNumaNode = 0x00000000
3168} WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE;
3169
3170typedef struct WHV_VIRTUAL_PROCESSOR_PROPERTY {
3171 WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE PropertyCode;
3172 UINT32 Reserved;
3173 __C89_NAMELESS union {
3174 USHORT NumaNode;
3175 UINT64 Padding;
3176 };
3177} WHV_VIRTUAL_PROCESSOR_PROPERTY;
3178
3179C_ASSERT(sizeof(WHV_VIRTUAL_PROCESSOR_PROPERTY) == 16);
3180
3181typedef enum WHV_NOTIFICATION_PORT_TYPE {
3182 WHvNotificationPortTypeEvent = 2,
3183 WHvNotificationPortTypeDoorbell = 4
3184} WHV_NOTIFICATION_PORT_TYPE;
3185
3186typedef struct WHV_NOTIFICATION_PORT_PARAMETERS {
3187 WHV_NOTIFICATION_PORT_TYPE NotificationPortType;
3188 UINT16 Reserved;
3189 UINT8 Reserved1;
3190 UINT8 ConnectionVtl;
3191 __C89_NAMELESS union {
3192 WHV_DOORBELL_MATCH_DATA Doorbell;
3193 __C89_NAMELESS struct {
3194 UINT32 ConnectionId;
3195 } Event;
3196 };
3197} WHV_NOTIFICATION_PORT_PARAMETERS;
3198
3199C_ASSERT(sizeof(WHV_NOTIFICATION_PORT_PARAMETERS) == 32);
3200
3201typedef enum WHV_NOTIFICATION_PORT_PROPERTY_CODE {
3202 WHvNotificationPortPropertyPreferredTargetVp = 1,
3203 WHvNotificationPortPropertyPreferredTargetDuration = 5
3204} WHV_NOTIFICATION_PORT_PROPERTY_CODE;
3205
3206typedef UINT64 WHV_NOTIFICATION_PORT_PROPERTY;
3207
3208#define WHV_ANY_VP (0xFFFFFFFF)
3209
3210#define WHV_NOTIFICATION_PORT_PREFERRED_DURATION_MAX (0xFFFFFFFFFFFFFFFFULL)
3211
3212typedef PVOID WHV_NOTIFICATION_PORT_HANDLE;
3213
3214#define WHV_SYNIC_MESSAGE_SIZE 256
3215
3216#endif /* defined(__x86_64__) || defined(__aarch64__) */
3217
3218#endif /* _WINHVAPIDEFS_H_ */