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 | typedef enum WHV_CAPABILITY_CODE {
|
---|
10 | WHvCapabilityCodeHypervisorPresent = 0x00000000,
|
---|
11 | WHvCapabilityCodeFeatures = 0x00000001,
|
---|
12 | WHvCapabilityCodeExtendedVmExits = 0x00000002,
|
---|
13 | WHvCapabilityCodeExceptionExitBitmap = 0x00000003,
|
---|
14 | WHvCapabilityCodeX64MsrExitBitmap = 0x00000004,
|
---|
15 | WHvCapabilityCodeGpaRangePopulateFlags = 0x00000005,
|
---|
16 | WHvCapabilityCodeSchedulerFeatures = 0x00000006,
|
---|
17 | WHvCapabilityCodeProcessorVendor = 0x00001000,
|
---|
18 | WHvCapabilityCodeProcessorFeatures = 0x00001001,
|
---|
19 | WHvCapabilityCodeProcessorClFlushSize = 0x00001002,
|
---|
20 | WHvCapabilityCodeProcessorXsaveFeatures = 0x00001003,
|
---|
21 | WHvCapabilityCodeProcessorClockFrequency = 0x00001004,
|
---|
22 | WHvCapabilityCodeInterruptClockFrequency = 0x00001005,
|
---|
23 | WHvCapabilityCodeProcessorFeaturesBanks = 0x00001006,
|
---|
24 | WHvCapabilityCodeProcessorFrequencyCap = 0x00001007,
|
---|
25 | WHvCapabilityCodeSyntheticProcessorFeaturesBanks = 0x00001008,
|
---|
26 | WHvCapabilityCodeProcessorPerfmonFeatures = 0x00001009
|
---|
27 | } WHV_CAPABILITY_CODE;
|
---|
28 |
|
---|
29 | typedef union WHV_CAPABILITY_FEATURES {
|
---|
30 | __C89_NAMELESS struct {
|
---|
31 | UINT64 PartialUnmap : 1;
|
---|
32 | UINT64 LocalApicEmulation : 1;
|
---|
33 | UINT64 Xsave : 1;
|
---|
34 | UINT64 DirtyPageTracking : 1;
|
---|
35 | UINT64 SpeculationControl : 1;
|
---|
36 | UINT64 ApicRemoteRead : 1;
|
---|
37 | UINT64 IdleSuspend : 1;
|
---|
38 | UINT64 VirtualPciDeviceSupport : 1;
|
---|
39 | UINT64 IommuSupport : 1;
|
---|
40 | UINT64 VpHotAddRemove : 1;
|
---|
41 | UINT64 Reserved : 54;
|
---|
42 | };
|
---|
43 | UINT64 AsUINT64;
|
---|
44 | } WHV_CAPABILITY_FEATURES;
|
---|
45 |
|
---|
46 | C_ASSERT(sizeof(WHV_CAPABILITY_FEATURES) == sizeof(UINT64));
|
---|
47 |
|
---|
48 | typedef union WHV_EXTENDED_VM_EXITS {
|
---|
49 | __C89_NAMELESS struct {
|
---|
50 | UINT64 X64CpuidExit : 1;
|
---|
51 | UINT64 X64MsrExit : 1;
|
---|
52 | UINT64 ExceptionExit : 1;
|
---|
53 | UINT64 X64RdtscExit : 1;
|
---|
54 | UINT64 X64ApicSmiExitTrap : 1;
|
---|
55 | UINT64 HypercallExit : 1;
|
---|
56 | UINT64 X64ApicInitSipiExitTrap : 1;
|
---|
57 | UINT64 X64ApicWriteLint0ExitTrap : 1;
|
---|
58 | UINT64 X64ApicWriteLint1ExitTrap : 1;
|
---|
59 | UINT64 X64ApicWriteSvrExitTrap : 1;
|
---|
60 | UINT64 UnknownSynicConnection : 1;
|
---|
61 | UINT64 RetargetUnknownVpciDevice : 1;
|
---|
62 | UINT64 X64ApicWriteLdrExitTrap : 1;
|
---|
63 | UINT64 X64ApicWriteDfrExitTrap : 1;
|
---|
64 | UINT64 GpaAccessFaultExit : 1;
|
---|
65 | UINT64 Reserved : 49;
|
---|
66 | };
|
---|
67 | UINT64 AsUINT64;
|
---|
68 | } WHV_EXTENDED_VM_EXITS;
|
---|
69 |
|
---|
70 | C_ASSERT(sizeof(WHV_EXTENDED_VM_EXITS) == sizeof(UINT64));
|
---|
71 |
|
---|
72 | typedef enum WHV_PROCESSOR_VENDOR {
|
---|
73 | WHvProcessorVendorAmd = 0x0000,
|
---|
74 | WHvProcessorVendorIntel = 0x0001,
|
---|
75 | WHvProcessorVendorHygon = 0x0002
|
---|
76 | } WHV_PROCESSOR_VENDOR;
|
---|
77 |
|
---|
78 | typedef union WHV_PROCESSOR_FEATURES {
|
---|
79 | __C89_NAMELESS struct {
|
---|
80 | UINT64 Sse3Support : 1;
|
---|
81 | UINT64 LahfSahfSupport : 1;
|
---|
82 | UINT64 Ssse3Support : 1;
|
---|
83 | UINT64 Sse4_1Support : 1;
|
---|
84 | UINT64 Sse4_2Support : 1;
|
---|
85 | UINT64 Sse4aSupport : 1;
|
---|
86 | UINT64 XopSupport : 1;
|
---|
87 | UINT64 PopCntSupport : 1;
|
---|
88 | UINT64 Cmpxchg16bSupport : 1;
|
---|
89 | UINT64 Altmovcr8Support : 1;
|
---|
90 | UINT64 LzcntSupport : 1;
|
---|
91 | UINT64 MisAlignSseSupport : 1;
|
---|
92 | UINT64 MmxExtSupport : 1;
|
---|
93 | UINT64 Amd3DNowSupport : 1;
|
---|
94 | UINT64 ExtendedAmd3DNowSupport : 1;
|
---|
95 | UINT64 Page1GbSupport : 1;
|
---|
96 | UINT64 AesSupport : 1;
|
---|
97 | UINT64 PclmulqdqSupport : 1;
|
---|
98 | UINT64 PcidSupport : 1;
|
---|
99 | UINT64 Fma4Support : 1;
|
---|
100 | UINT64 F16CSupport : 1;
|
---|
101 | UINT64 RdRandSupport : 1;
|
---|
102 | UINT64 RdWrFsGsSupport : 1;
|
---|
103 | UINT64 SmepSupport : 1;
|
---|
104 | UINT64 EnhancedFastStringSupport : 1;
|
---|
105 | UINT64 Bmi1Support : 1;
|
---|
106 | UINT64 Bmi2Support : 1;
|
---|
107 | UINT64 Reserved1 : 2;
|
---|
108 | UINT64 MovbeSupport : 1;
|
---|
109 | UINT64 Npiep1Support : 1;
|
---|
110 | UINT64 DepX87FPUSaveSupport : 1;
|
---|
111 | UINT64 RdSeedSupport : 1;
|
---|
112 | UINT64 AdxSupport : 1;
|
---|
113 | UINT64 IntelPrefetchSupport : 1;
|
---|
114 | UINT64 SmapSupport : 1;
|
---|
115 | UINT64 HleSupport : 1;
|
---|
116 | UINT64 RtmSupport : 1;
|
---|
117 | UINT64 RdtscpSupport : 1;
|
---|
118 | UINT64 ClflushoptSupport : 1;
|
---|
119 | UINT64 ClwbSupport : 1;
|
---|
120 | UINT64 ShaSupport : 1;
|
---|
121 | UINT64 X87PointersSavedSupport : 1;
|
---|
122 | UINT64 InvpcidSupport : 1;
|
---|
123 | UINT64 IbrsSupport : 1;
|
---|
124 | UINT64 StibpSupport : 1;
|
---|
125 | UINT64 IbpbSupport : 1;
|
---|
126 | UINT64 Reserved2 : 1;
|
---|
127 | UINT64 SsbdSupport : 1;
|
---|
128 | UINT64 FastShortRepMovSupport : 1;
|
---|
129 | UINT64 Reserved3 : 1;
|
---|
130 | UINT64 RdclNo : 1;
|
---|
131 | UINT64 IbrsAllSupport : 1;
|
---|
132 | UINT64 Reserved4 : 1;
|
---|
133 | UINT64 SsbNo : 1;
|
---|
134 | UINT64 RsbANo : 1;
|
---|
135 | UINT64 Reserved5 : 1;
|
---|
136 | UINT64 RdPidSupport : 1;
|
---|
137 | UINT64 UmipSupport : 1;
|
---|
138 | UINT64 MdsNoSupport : 1;
|
---|
139 | UINT64 MdClearSupport : 1;
|
---|
140 | UINT64 TaaNoSupport : 1;
|
---|
141 | UINT64 TsxCtrlSupport : 1;
|
---|
142 | UINT64 Reserved6 : 1;
|
---|
143 | };
|
---|
144 | UINT64 AsUINT64;
|
---|
145 | } WHV_PROCESSOR_FEATURES;
|
---|
146 |
|
---|
147 | C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES) == sizeof(UINT64));
|
---|
148 |
|
---|
149 | typedef union WHV_PROCESSOR_FEATURES1 {
|
---|
150 | __C89_NAMELESS struct {
|
---|
151 | UINT64 ACountMCountSupport : 1;
|
---|
152 | UINT64 TscInvariantSupport : 1;
|
---|
153 | UINT64 ClZeroSupport : 1;
|
---|
154 | UINT64 RdpruSupport : 1;
|
---|
155 | UINT64 Reserved2 : 2;
|
---|
156 | UINT64 NestedVirtSupport : 1;
|
---|
157 | UINT64 PsfdSupport: 1;
|
---|
158 | UINT64 CetSsSupport : 1;
|
---|
159 | UINT64 CetIbtSupport : 1;
|
---|
160 | UINT64 VmxExceptionInjectSupport : 1;
|
---|
161 | UINT64 Reserved4 : 1;
|
---|
162 | UINT64 UmwaitTpauseSupport : 1;
|
---|
163 | UINT64 MovdiriSupport : 1;
|
---|
164 | UINT64 Movdir64bSupport : 1;
|
---|
165 | UINT64 CldemoteSupport : 1;
|
---|
166 | UINT64 SerializeSupport : 1;
|
---|
167 | UINT64 TscDeadlineTmrSupport : 1;
|
---|
168 | UINT64 TscAdjustSupport : 1;
|
---|
169 | UINT64 FZLRepMovsb : 1;
|
---|
170 | UINT64 FSRepStosb : 1;
|
---|
171 | UINT64 FSRepCmpsb : 1;
|
---|
172 | UINT64 Reserved5 : 42;
|
---|
173 | };
|
---|
174 | UINT64 AsUINT64;
|
---|
175 | } WHV_PROCESSOR_FEATURES1;
|
---|
176 |
|
---|
177 | C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES1) == sizeof(UINT64));
|
---|
178 |
|
---|
179 | #define WHV_PROCESSOR_FEATURES_BANKS_COUNT 2
|
---|
180 |
|
---|
181 | typedef struct WHV_PROCESSOR_FEATURES_BANKS {
|
---|
182 | UINT32 BanksCount;
|
---|
183 | UINT32 Reserved0;
|
---|
184 | __C89_NAMELESS union {
|
---|
185 | __C89_NAMELESS struct {
|
---|
186 | WHV_PROCESSOR_FEATURES Bank0;
|
---|
187 | WHV_PROCESSOR_FEATURES1 Bank1;
|
---|
188 | };
|
---|
189 | UINT64 AsUINT64[WHV_PROCESSOR_FEATURES_BANKS_COUNT];
|
---|
190 | };
|
---|
191 | } WHV_PROCESSOR_FEATURES_BANKS;
|
---|
192 |
|
---|
193 | C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES_BANKS) == sizeof(UINT64) * (WHV_PROCESSOR_FEATURES_BANKS_COUNT + 1));
|
---|
194 |
|
---|
195 | typedef union WHV_SYNTHETIC_PROCESSOR_FEATURES {
|
---|
196 | __C89_NAMELESS struct {
|
---|
197 | UINT64 HypervisorPresent:1;
|
---|
198 | UINT64 Hv1:1;
|
---|
199 | UINT64 AccessVpRunTimeReg:1;
|
---|
200 | UINT64 AccessPartitionReferenceCounter:1;
|
---|
201 | UINT64 AccessSynicRegs:1;
|
---|
202 | UINT64 AccessSyntheticTimerRegs:1;
|
---|
203 | #ifdef __x86_64__
|
---|
204 | UINT64 AccessIntrCtrlRegs:1;
|
---|
205 | #else
|
---|
206 | UINT64 ReservedZ6:1;
|
---|
207 | #endif
|
---|
208 | UINT64 AccessHypercallRegs:1;
|
---|
209 | UINT64 AccessVpIndex:1;
|
---|
210 | UINT64 AccessPartitionReferenceTsc:1;
|
---|
211 | #ifdef __x86_64__
|
---|
212 | UINT64 AccessGuestIdleReg:1;
|
---|
213 | UINT64 AccessFrequencyRegs:1;
|
---|
214 | #else
|
---|
215 | UINT64 ReservedZ10:1;
|
---|
216 | UINT64 ReservedZ11:1;
|
---|
217 | #endif
|
---|
218 | UINT64 ReservedZ12:1;
|
---|
219 | UINT64 ReservedZ13:1;
|
---|
220 | UINT64 ReservedZ14:1;
|
---|
221 | #ifdef __x86_64__
|
---|
222 | UINT64 EnableExtendedGvaRangesForFlushVirtualAddressList:1;
|
---|
223 | #else
|
---|
224 | UINT64 ReservedZ15:1;
|
---|
225 | #endif
|
---|
226 | UINT64 ReservedZ16:1;
|
---|
227 | UINT64 ReservedZ17:1;
|
---|
228 | UINT64 FastHypercallOutput:1;
|
---|
229 | UINT64 ReservedZ19:1;
|
---|
230 | UINT64 ReservedZ20:1;
|
---|
231 | UINT64 ReservedZ21:1;
|
---|
232 | UINT64 DirectSyntheticTimers:1;
|
---|
233 | UINT64 ReservedZ23:1;
|
---|
234 | UINT64 ExtendedProcessorMasks:1;
|
---|
235 | #ifdef __x86_64__
|
---|
236 | UINT64 TbFlushHypercalls:1;
|
---|
237 | #else
|
---|
238 | UINT64 ReservedZ25:1;
|
---|
239 | #endif
|
---|
240 | UINT64 SyntheticClusterIpi:1;
|
---|
241 | UINT64 NotifyLongSpinWait:1;
|
---|
242 | UINT64 QueryNumaDistance:1;
|
---|
243 | UINT64 SignalEvents:1;
|
---|
244 | UINT64 RetargetDeviceInterrupt:1;
|
---|
245 | UINT64 Reserved:33;
|
---|
246 | };
|
---|
247 | UINT64 AsUINT64;
|
---|
248 | } WHV_SYNTHETIC_PROCESSOR_FEATURES;
|
---|
249 |
|
---|
250 | C_ASSERT(sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES) == 8);
|
---|
251 |
|
---|
252 | #define WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS_COUNT 1
|
---|
253 |
|
---|
254 | typedef struct WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS {
|
---|
255 | UINT32 BanksCount;
|
---|
256 | UINT32 Reserved0;
|
---|
257 | __C89_NAMELESS union {
|
---|
258 | __C89_NAMELESS struct {
|
---|
259 | WHV_SYNTHETIC_PROCESSOR_FEATURES Bank0;
|
---|
260 | };
|
---|
261 | UINT64 AsUINT64[WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS_COUNT];
|
---|
262 | };
|
---|
263 | } WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS;
|
---|
264 |
|
---|
265 | C_ASSERT(sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS) == 16);
|
---|
266 |
|
---|
267 | typedef union _WHV_PROCESSOR_XSAVE_FEATURES {
|
---|
268 | __C89_NAMELESS struct {
|
---|
269 | UINT64 XsaveSupport : 1;
|
---|
270 | UINT64 XsaveoptSupport : 1;
|
---|
271 | UINT64 AvxSupport : 1;
|
---|
272 | UINT64 Avx2Support : 1;
|
---|
273 | UINT64 FmaSupport : 1;
|
---|
274 | UINT64 MpxSupport : 1;
|
---|
275 | UINT64 Avx512Support : 1;
|
---|
276 | UINT64 Avx512DQSupport : 1;
|
---|
277 | UINT64 Avx512CDSupport : 1;
|
---|
278 | UINT64 Avx512BWSupport : 1;
|
---|
279 | UINT64 Avx512VLSupport : 1;
|
---|
280 | UINT64 XsaveCompSupport : 1;
|
---|
281 | UINT64 XsaveSupervisorSupport : 1;
|
---|
282 | UINT64 Xcr1Support : 1;
|
---|
283 | UINT64 Avx512BitalgSupport : 1;
|
---|
284 | UINT64 Avx512IfmaSupport : 1;
|
---|
285 | UINT64 Avx512VBmiSupport : 1;
|
---|
286 | UINT64 Avx512VBmi2Support : 1;
|
---|
287 | UINT64 Avx512VnniSupport : 1;
|
---|
288 | UINT64 GfniSupport : 1;
|
---|
289 | UINT64 VaesSupport : 1;
|
---|
290 | UINT64 Avx512VPopcntdqSupport : 1;
|
---|
291 | UINT64 VpclmulqdqSupport : 1;
|
---|
292 | UINT64 Avx512Bf16Support : 1;
|
---|
293 | UINT64 Avx512Vp2IntersectSupport : 1;
|
---|
294 | UINT64 Avx512Fp16Support : 1;
|
---|
295 | UINT64 XfdSupport : 1;
|
---|
296 | UINT64 AmxTileSupport : 1;
|
---|
297 | UINT64 AmxBf16Support : 1;
|
---|
298 | UINT64 AmxInt8Support : 1;
|
---|
299 | UINT64 AvxVnniSupport : 1;
|
---|
300 | UINT64 Reserved : 33;
|
---|
301 | };
|
---|
302 | UINT64 AsUINT64;
|
---|
303 | } WHV_PROCESSOR_XSAVE_FEATURES, *PWHV_PROCESSOR_XSAVE_FEATURES;
|
---|
304 |
|
---|
305 | C_ASSERT(sizeof(WHV_PROCESSOR_XSAVE_FEATURES) == sizeof(UINT64));
|
---|
306 |
|
---|
307 | typedef union WHV_PROCESSOR_PERFMON_FEATURES {
|
---|
308 | __C89_NAMELESS struct {
|
---|
309 | UINT64 PmuSupport : 1;
|
---|
310 | UINT64 LbrSupport : 1;
|
---|
311 | UINT64 Reserved : 62;
|
---|
312 | };
|
---|
313 | UINT64 AsUINT64;
|
---|
314 | } WHV_PROCESSOR_PERFMON_FEATURES, *PWHV_PROCESSOR_PERFMON_FEATURES;
|
---|
315 |
|
---|
316 | C_ASSERT(sizeof(WHV_PROCESSOR_PERFMON_FEATURES) == 8);
|
---|
317 |
|
---|
318 | typedef union WHV_X64_MSR_EXIT_BITMAP {
|
---|
319 | UINT64 AsUINT64;
|
---|
320 | __C89_NAMELESS struct {
|
---|
321 | UINT64 UnhandledMsrs : 1;
|
---|
322 | UINT64 TscMsrWrite : 1;
|
---|
323 | UINT64 TscMsrRead : 1;
|
---|
324 | UINT64 ApicBaseMsrWrite : 1;
|
---|
325 | UINT64 MiscEnableMsrRead:1;
|
---|
326 | UINT64 McUpdatePatchLevelMsrRead:1;
|
---|
327 | UINT64 Reserved:58;
|
---|
328 | };
|
---|
329 | } WHV_X64_MSR_EXIT_BITMAP;
|
---|
330 |
|
---|
331 | C_ASSERT(sizeof(WHV_X64_MSR_EXIT_BITMAP) == sizeof(UINT64));
|
---|
332 |
|
---|
333 | typedef struct WHV_MEMORY_RANGE_ENTRY {
|
---|
334 | UINT64 GuestAddress;
|
---|
335 | UINT64 SizeInBytes;
|
---|
336 | } WHV_MEMORY_RANGE_ENTRY;
|
---|
337 |
|
---|
338 | C_ASSERT(sizeof(WHV_MEMORY_RANGE_ENTRY) == 16);
|
---|
339 |
|
---|
340 | typedef union WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS {
|
---|
341 | UINT32 AsUINT32;
|
---|
342 | __C89_NAMELESS struct {
|
---|
343 | UINT32 Prefetch:1;
|
---|
344 | UINT32 AvoidHardFaults:1;
|
---|
345 | UINT32 Reserved:30;
|
---|
346 | };
|
---|
347 | } WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS;
|
---|
348 |
|
---|
349 | C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS) == 4);
|
---|
350 |
|
---|
351 | typedef enum WHV_MEMORY_ACCESS_TYPE {
|
---|
352 | WHvMemoryAccessRead = 0,
|
---|
353 | WHvMemoryAccessWrite = 1,
|
---|
354 | WHvMemoryAccessExecute = 2
|
---|
355 | } WHV_MEMORY_ACCESS_TYPE;
|
---|
356 |
|
---|
357 | typedef struct WHV_ADVISE_GPA_RANGE_POPULATE {
|
---|
358 | WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS Flags;
|
---|
359 | WHV_MEMORY_ACCESS_TYPE AccessType;
|
---|
360 | } WHV_ADVISE_GPA_RANGE_POPULATE;
|
---|
361 |
|
---|
362 | C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE_POPULATE) == 8);
|
---|
363 |
|
---|
364 | typedef struct WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP {
|
---|
365 | UINT32 IsSupported:1;
|
---|
366 | UINT32 Reserved:31;
|
---|
367 | UINT32 HighestFrequencyMhz;
|
---|
368 | UINT32 NominalFrequencyMhz;
|
---|
369 | UINT32 LowestFrequencyMhz;
|
---|
370 | UINT32 FrequencyStepMhz;
|
---|
371 | } WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP;
|
---|
372 |
|
---|
373 | C_ASSERT(sizeof(WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP) == 20);
|
---|
374 |
|
---|
375 | typedef union WHV_SCHEDULER_FEATURES {
|
---|
376 | __C89_NAMELESS struct {
|
---|
377 | UINT64 CpuReserve: 1;
|
---|
378 | UINT64 CpuCap: 1;
|
---|
379 | UINT64 CpuWeight: 1;
|
---|
380 | UINT64 CpuGroupId: 1;
|
---|
381 | UINT64 DisableSmt: 1;
|
---|
382 | UINT64 Reserved: 59;
|
---|
383 | };
|
---|
384 | UINT64 AsUINT64;
|
---|
385 | } WHV_SCHEDULER_FEATURES;
|
---|
386 |
|
---|
387 | C_ASSERT(sizeof(WHV_SCHEDULER_FEATURES) == 8);
|
---|
388 |
|
---|
389 | typedef union WHV_CAPABILITY {
|
---|
390 | WINBOOL HypervisorPresent;
|
---|
391 | WHV_CAPABILITY_FEATURES Features;
|
---|
392 | WHV_EXTENDED_VM_EXITS ExtendedVmExits;
|
---|
393 | WHV_PROCESSOR_VENDOR ProcessorVendor;
|
---|
394 | WHV_PROCESSOR_FEATURES ProcessorFeatures;
|
---|
395 | WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS SyntheticProcessorFeaturesBanks;
|
---|
396 | WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;
|
---|
397 | UINT8 ProcessorClFlushSize;
|
---|
398 | UINT64 ExceptionExitBitmap;
|
---|
399 | WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;
|
---|
400 | UINT64 ProcessorClockFrequency;
|
---|
401 | UINT64 InterruptClockFrequency;
|
---|
402 | WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;
|
---|
403 | WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS GpaRangePopulateFlags;
|
---|
404 | WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP ProcessorFrequencyCap;
|
---|
405 | WHV_PROCESSOR_PERFMON_FEATURES ProcessorPerfmonFeatures;
|
---|
406 | WHV_SCHEDULER_FEATURES SchedulerFeatures;
|
---|
407 | } WHV_CAPABILITY;
|
---|
408 |
|
---|
409 | typedef VOID* WHV_PARTITION_HANDLE;
|
---|
410 |
|
---|
411 | typedef enum WHV_PARTITION_PROPERTY_CODE {
|
---|
412 | WHvPartitionPropertyCodeExtendedVmExits = 0x00000001,
|
---|
413 | WHvPartitionPropertyCodeExceptionExitBitmap = 0x00000002,
|
---|
414 | WHvPartitionPropertyCodeSeparateSecurityDomain = 0x00000003,
|
---|
415 | WHvPartitionPropertyCodeNestedVirtualization = 0x00000004,
|
---|
416 | WHvPartitionPropertyCodeX64MsrExitBitmap = 0x00000005,
|
---|
417 | WHvPartitionPropertyCodePrimaryNumaNode = 0x00000006,
|
---|
418 | WHvPartitionPropertyCodeCpuReserve = 0x00000007,
|
---|
419 | WHvPartitionPropertyCodeCpuCap = 0x00000008,
|
---|
420 | WHvPartitionPropertyCodeCpuWeight = 0x00000009,
|
---|
421 | WHvPartitionPropertyCodeCpuGroupId = 0x0000000A,
|
---|
422 | WHvPartitionPropertyCodeProcessorFrequencyCap = 0x0000000B,
|
---|
423 | WHvPartitionPropertyCodeAllowDeviceAssignment = 0x0000000C,
|
---|
424 | WHvPartitionPropertyCodeDisableSmt = 0x0000000D,
|
---|
425 | WHvPartitionPropertyCodeProcessorFeatures = 0x00001001,
|
---|
426 | WHvPartitionPropertyCodeProcessorClFlushSize = 0x00001002,
|
---|
427 | WHvPartitionPropertyCodeCpuidExitList = 0x00001003,
|
---|
428 | WHvPartitionPropertyCodeCpuidResultList = 0x00001004,
|
---|
429 | WHvPartitionPropertyCodeLocalApicEmulationMode = 0x00001005,
|
---|
430 | WHvPartitionPropertyCodeProcessorXsaveFeatures = 0x00001006,
|
---|
431 | WHvPartitionPropertyCodeProcessorClockFrequency = 0x00001007,
|
---|
432 | WHvPartitionPropertyCodeInterruptClockFrequency = 0x00001008,
|
---|
433 | WHvPartitionPropertyCodeApicRemoteReadSupport = 0x00001009,
|
---|
434 | WHvPartitionPropertyCodeProcessorFeaturesBanks = 0x0000100A,
|
---|
435 | WHvPartitionPropertyCodeReferenceTime = 0x0000100B,
|
---|
436 | WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks = 0x0000100C,
|
---|
437 | WHvPartitionPropertyCodeCpuidResultList2 = 0x0000100D,
|
---|
438 | WHvPartitionPropertyCodeProcessorPerfmonFeatures = 0x0000100E,
|
---|
439 | WHvPartitionPropertyCodeMsrActionList = 0x0000100F,
|
---|
440 | WHvPartitionPropertyCodeUnimplementedMsrAction = 0x00001010,
|
---|
441 | WHvPartitionPropertyCodeProcessorCount = 0x00001fff
|
---|
442 | } WHV_PARTITION_PROPERTY_CODE;
|
---|
443 |
|
---|
444 | typedef struct WHV_X64_CPUID_RESULT {
|
---|
445 | UINT32 Function;
|
---|
446 | UINT32 Reserved[3];
|
---|
447 | UINT32 Eax;
|
---|
448 | UINT32 Ebx;
|
---|
449 | UINT32 Ecx;
|
---|
450 | UINT32 Edx;
|
---|
451 | } WHV_X64_CPUID_RESULT;
|
---|
452 |
|
---|
453 | C_ASSERT(sizeof(WHV_X64_CPUID_RESULT) == 32);
|
---|
454 |
|
---|
455 | typedef enum WHV_X64_CPUID_RESULT2_FLAGS {
|
---|
456 | WHvX64CpuidResult2FlagSubleafSpecific = 0x00000001,
|
---|
457 | WHvX64CpuidResult2FlagVpSpecific = 0x00000002
|
---|
458 | } WHV_X64_CPUID_RESULT2_FLAGS;
|
---|
459 |
|
---|
460 | DEFINE_ENUM_FLAG_OPERATORS(WHV_X64_CPUID_RESULT2_FLAGS);
|
---|
461 |
|
---|
462 | typedef struct WHV_CPUID_OUTPUT {
|
---|
463 | UINT32 Eax;
|
---|
464 | UINT32 Ebx;
|
---|
465 | UINT32 Ecx;
|
---|
466 | UINT32 Edx;
|
---|
467 | } WHV_CPUID_OUTPUT;
|
---|
468 |
|
---|
469 | C_ASSERT(sizeof(WHV_CPUID_OUTPUT) == 16);
|
---|
470 |
|
---|
471 | typedef struct WHV_X64_CPUID_RESULT2 {
|
---|
472 | UINT32 Function;
|
---|
473 | UINT32 Index;
|
---|
474 | UINT32 VpIndex;
|
---|
475 | WHV_X64_CPUID_RESULT2_FLAGS Flags;
|
---|
476 | WHV_CPUID_OUTPUT Output;
|
---|
477 | WHV_CPUID_OUTPUT Mask;
|
---|
478 | } WHV_X64_CPUID_RESULT2;
|
---|
479 |
|
---|
480 | C_ASSERT(sizeof(WHV_X64_CPUID_RESULT2) == 48);
|
---|
481 |
|
---|
482 | typedef struct WHV_MSR_ACTION_ENTRY {
|
---|
483 | UINT32 Index;
|
---|
484 | UINT8 ReadAction;
|
---|
485 | UINT8 WriteAction;
|
---|
486 | UINT16 Reserved;
|
---|
487 | } WHV_MSR_ACTION_ENTRY;
|
---|
488 |
|
---|
489 | C_ASSERT(sizeof(WHV_MSR_ACTION_ENTRY) == 8);
|
---|
490 |
|
---|
491 | typedef enum WHV_MSR_ACTION {
|
---|
492 | WHvMsrActionArchitectureDefault = 0,
|
---|
493 | WHvMsrActionIgnoreWriteReadZero = 1,
|
---|
494 | WHvMsrActionExit = 2
|
---|
495 | } WHV_MSR_ACTION;
|
---|
496 |
|
---|
497 | typedef enum WHV_EXCEPTION_TYPE {
|
---|
498 | WHvX64ExceptionTypeDivideErrorFault = 0x0,
|
---|
499 | WHvX64ExceptionTypeDebugTrapOrFault = 0x1,
|
---|
500 | WHvX64ExceptionTypeBreakpointTrap = 0x3,
|
---|
501 | WHvX64ExceptionTypeOverflowTrap = 0x4,
|
---|
502 | WHvX64ExceptionTypeBoundRangeFault = 0x5,
|
---|
503 | WHvX64ExceptionTypeInvalidOpcodeFault = 0x6,
|
---|
504 | WHvX64ExceptionTypeDeviceNotAvailableFault = 0x7,
|
---|
505 | WHvX64ExceptionTypeDoubleFaultAbort = 0x8,
|
---|
506 | WHvX64ExceptionTypeInvalidTaskStateSegmentFault = 0x0A,
|
---|
507 | WHvX64ExceptionTypeSegmentNotPresentFault = 0x0B,
|
---|
508 | WHvX64ExceptionTypeStackFault = 0x0C,
|
---|
509 | WHvX64ExceptionTypeGeneralProtectionFault = 0x0D,
|
---|
510 | WHvX64ExceptionTypePageFault = 0x0E,
|
---|
511 | WHvX64ExceptionTypeFloatingPointErrorFault = 0x10,
|
---|
512 | WHvX64ExceptionTypeAlignmentCheckFault = 0x11,
|
---|
513 | WHvX64ExceptionTypeMachineCheckAbort = 0x12,
|
---|
514 | WHvX64ExceptionTypeSimdFloatingPointFault = 0x13
|
---|
515 | } WHV_EXCEPTION_TYPE;
|
---|
516 |
|
---|
517 | typedef enum WHV_X64_LOCAL_APIC_EMULATION_MODE {
|
---|
518 | WHvX64LocalApicEmulationModeNone,
|
---|
519 | WHvX64LocalApicEmulationModeXApic,
|
---|
520 | WHvX64LocalApicEmulationModeX2Apic
|
---|
521 | } WHV_X64_LOCAL_APIC_EMULATION_MODE;
|
---|
522 |
|
---|
523 | typedef union WHV_PARTITION_PROPERTY {
|
---|
524 | WHV_EXTENDED_VM_EXITS ExtendedVmExits;
|
---|
525 | WHV_PROCESSOR_FEATURES ProcessorFeatures;
|
---|
526 | WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS SyntheticProcessorFeaturesBanks;
|
---|
527 | WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;
|
---|
528 | UINT8 ProcessorClFlushSize;
|
---|
529 | UINT32 ProcessorCount;
|
---|
530 | UINT32 CpuidExitList[1];
|
---|
531 | WHV_X64_CPUID_RESULT CpuidResultList[1];
|
---|
532 | WHV_X64_CPUID_RESULT2 CpuidResultList2[1];
|
---|
533 | WHV_MSR_ACTION_ENTRY MsrActionList[1];
|
---|
534 | WHV_MSR_ACTION UnimplementedMsrAction;
|
---|
535 | UINT64 ExceptionExitBitmap;
|
---|
536 | WHV_X64_LOCAL_APIC_EMULATION_MODE LocalApicEmulationMode;
|
---|
537 | WINBOOL SeparateSecurityDomain;
|
---|
538 | WINBOOL NestedVirtualization;
|
---|
539 | WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;
|
---|
540 | UINT64 ProcessorClockFrequency;
|
---|
541 | UINT64 InterruptClockFrequency;
|
---|
542 | WINBOOL ApicRemoteRead;
|
---|
543 | WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;
|
---|
544 | UINT64 ReferenceTime;
|
---|
545 | USHORT PrimaryNumaNode;
|
---|
546 | UINT32 CpuReserve;
|
---|
547 | UINT32 CpuCap;
|
---|
548 | UINT32 CpuWeight;
|
---|
549 | UINT64 CpuGroupId;
|
---|
550 | UINT32 ProcessorFrequencyCap;
|
---|
551 | WINBOOL AllowDeviceAssignment;
|
---|
552 | WHV_PROCESSOR_PERFMON_FEATURES ProcessorPerfmonFeatures;
|
---|
553 | WINBOOL DisableSmt;
|
---|
554 | } WHV_PARTITION_PROPERTY;
|
---|
555 |
|
---|
556 | typedef UINT64 WHV_GUEST_PHYSICAL_ADDRESS;
|
---|
557 | typedef UINT64 WHV_GUEST_VIRTUAL_ADDRESS;
|
---|
558 |
|
---|
559 | typedef enum WHV_MAP_GPA_RANGE_FLAGS {
|
---|
560 | WHvMapGpaRangeFlagNone = 0x00000000,
|
---|
561 | WHvMapGpaRangeFlagRead = 0x00000001,
|
---|
562 | WHvMapGpaRangeFlagWrite = 0x00000002,
|
---|
563 | WHvMapGpaRangeFlagExecute = 0x00000004,
|
---|
564 | WHvMapGpaRangeFlagTrackDirtyPages = 0x00000008
|
---|
565 | } WHV_MAP_GPA_RANGE_FLAGS;
|
---|
566 |
|
---|
567 | DEFINE_ENUM_FLAG_OPERATORS(WHV_MAP_GPA_RANGE_FLAGS);
|
---|
568 |
|
---|
569 | typedef enum WHV_TRANSLATE_GVA_FLAGS {
|
---|
570 | WHvTranslateGvaFlagNone = 0x00000000,
|
---|
571 | WHvTranslateGvaFlagValidateRead = 0x00000001,
|
---|
572 | WHvTranslateGvaFlagValidateWrite = 0x00000002,
|
---|
573 | WHvTranslateGvaFlagValidateExecute = 0x00000004,
|
---|
574 | WHvTranslateGvaFlagPrivilegeExempt = 0x00000008,
|
---|
575 | WHvTranslateGvaFlagSetPageTableBits = 0x00000010,
|
---|
576 | WHvTranslateGvaFlagEnforceSmap = 0x00000100,
|
---|
577 | WHvTranslateGvaFlagOverrideSmap = 0x00000200
|
---|
578 | } WHV_TRANSLATE_GVA_FLAGS;
|
---|
579 |
|
---|
580 | DEFINE_ENUM_FLAG_OPERATORS(WHV_TRANSLATE_GVA_FLAGS);
|
---|
581 |
|
---|
582 | typedef enum WHV_TRANSLATE_GVA_RESULT_CODE {
|
---|
583 | WHvTranslateGvaResultSuccess = 0,
|
---|
584 | WHvTranslateGvaResultPageNotPresent = 1,
|
---|
585 | WHvTranslateGvaResultPrivilegeViolation = 2,
|
---|
586 | WHvTranslateGvaResultInvalidPageTableFlags = 3,
|
---|
587 | WHvTranslateGvaResultGpaUnmapped = 4,
|
---|
588 | WHvTranslateGvaResultGpaNoReadAccess = 5,
|
---|
589 | WHvTranslateGvaResultGpaNoWriteAccess = 6,
|
---|
590 | WHvTranslateGvaResultGpaIllegalOverlayAccess = 7,
|
---|
591 | WHvTranslateGvaResultIntercept = 8
|
---|
592 | } WHV_TRANSLATE_GVA_RESULT_CODE;
|
---|
593 |
|
---|
594 | typedef struct WHV_TRANSLATE_GVA_RESULT {
|
---|
595 | WHV_TRANSLATE_GVA_RESULT_CODE ResultCode;
|
---|
596 | UINT32 Reserved;
|
---|
597 | } WHV_TRANSLATE_GVA_RESULT;
|
---|
598 |
|
---|
599 | C_ASSERT(sizeof(WHV_TRANSLATE_GVA_RESULT) == 8);
|
---|
600 |
|
---|
601 | typedef union WHV_ADVISE_GPA_RANGE {
|
---|
602 | WHV_ADVISE_GPA_RANGE_POPULATE Populate;
|
---|
603 | } WHV_ADVISE_GPA_RANGE;
|
---|
604 |
|
---|
605 | C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE) == 8);
|
---|
606 |
|
---|
607 | typedef enum WHV_CACHE_TYPE {
|
---|
608 | WHvCacheTypeUncached = 0,
|
---|
609 | WHvCacheTypeWriteCombining = 1,
|
---|
610 | WHvCacheTypeWriteThrough = 4,
|
---|
611 | #ifdef __x86_64__
|
---|
612 | WHvCacheTypeWriteProtected = 5,
|
---|
613 | #endif
|
---|
614 | WHvCacheTypeWriteBack = 6
|
---|
615 | } WHV_CACHE_TYPE;
|
---|
616 |
|
---|
617 | typedef union WHV_ACCESS_GPA_CONTROLS {
|
---|
618 | UINT64 AsUINT64;
|
---|
619 | __C89_NAMELESS struct {
|
---|
620 | WHV_CACHE_TYPE CacheType;
|
---|
621 | UINT32 Reserved;
|
---|
622 | };
|
---|
623 | } WHV_ACCESS_GPA_CONTROLS;
|
---|
624 |
|
---|
625 | C_ASSERT(sizeof(WHV_ACCESS_GPA_CONTROLS) == 8);
|
---|
626 |
|
---|
627 | #define WHV_READ_WRITE_GPA_RANGE_MAX_SIZE 16
|
---|
628 |
|
---|
629 | typedef enum WHV_REGISTER_NAME {
|
---|
630 | WHvX64RegisterRax = 0x00000000,
|
---|
631 | WHvX64RegisterRcx = 0x00000001,
|
---|
632 | WHvX64RegisterRdx = 0x00000002,
|
---|
633 | WHvX64RegisterRbx = 0x00000003,
|
---|
634 | WHvX64RegisterRsp = 0x00000004,
|
---|
635 | WHvX64RegisterRbp = 0x00000005,
|
---|
636 | WHvX64RegisterRsi = 0x00000006,
|
---|
637 | WHvX64RegisterRdi = 0x00000007,
|
---|
638 | WHvX64RegisterR8 = 0x00000008,
|
---|
639 | WHvX64RegisterR9 = 0x00000009,
|
---|
640 | WHvX64RegisterR10 = 0x0000000A,
|
---|
641 | WHvX64RegisterR11 = 0x0000000B,
|
---|
642 | WHvX64RegisterR12 = 0x0000000C,
|
---|
643 | WHvX64RegisterR13 = 0x0000000D,
|
---|
644 | WHvX64RegisterR14 = 0x0000000E,
|
---|
645 | WHvX64RegisterR15 = 0x0000000F,
|
---|
646 | WHvX64RegisterRip = 0x00000010,
|
---|
647 | WHvX64RegisterRflags = 0x00000011,
|
---|
648 | WHvX64RegisterEs = 0x00000012,
|
---|
649 | WHvX64RegisterCs = 0x00000013,
|
---|
650 | WHvX64RegisterSs = 0x00000014,
|
---|
651 | WHvX64RegisterDs = 0x00000015,
|
---|
652 | WHvX64RegisterFs = 0x00000016,
|
---|
653 | WHvX64RegisterGs = 0x00000017,
|
---|
654 | WHvX64RegisterLdtr = 0x00000018,
|
---|
655 | WHvX64RegisterTr = 0x00000019,
|
---|
656 | WHvX64RegisterIdtr = 0x0000001A,
|
---|
657 | WHvX64RegisterGdtr = 0x0000001B,
|
---|
658 | WHvX64RegisterCr0 = 0x0000001C,
|
---|
659 | WHvX64RegisterCr2 = 0x0000001D,
|
---|
660 | WHvX64RegisterCr3 = 0x0000001E,
|
---|
661 | WHvX64RegisterCr4 = 0x0000001F,
|
---|
662 | WHvX64RegisterCr8 = 0x00000020,
|
---|
663 | WHvX64RegisterDr0 = 0x00000021,
|
---|
664 | WHvX64RegisterDr1 = 0x00000022,
|
---|
665 | WHvX64RegisterDr2 = 0x00000023,
|
---|
666 | WHvX64RegisterDr3 = 0x00000024,
|
---|
667 | WHvX64RegisterDr6 = 0x00000025,
|
---|
668 | WHvX64RegisterDr7 = 0x00000026,
|
---|
669 | WHvX64RegisterXCr0 = 0x00000027,
|
---|
670 | WHvX64RegisterVirtualCr0 = 0x00000028,
|
---|
671 | WHvX64RegisterVirtualCr3 = 0x00000029,
|
---|
672 | WHvX64RegisterVirtualCr4 = 0x0000002A,
|
---|
673 | WHvX64RegisterVirtualCr8 = 0x0000002B,
|
---|
674 | WHvX64RegisterXmm0 = 0x00001000,
|
---|
675 | WHvX64RegisterXmm1 = 0x00001001,
|
---|
676 | WHvX64RegisterXmm2 = 0x00001002,
|
---|
677 | WHvX64RegisterXmm3 = 0x00001003,
|
---|
678 | WHvX64RegisterXmm4 = 0x00001004,
|
---|
679 | WHvX64RegisterXmm5 = 0x00001005,
|
---|
680 | WHvX64RegisterXmm6 = 0x00001006,
|
---|
681 | WHvX64RegisterXmm7 = 0x00001007,
|
---|
682 | WHvX64RegisterXmm8 = 0x00001008,
|
---|
683 | WHvX64RegisterXmm9 = 0x00001009,
|
---|
684 | WHvX64RegisterXmm10 = 0x0000100A,
|
---|
685 | WHvX64RegisterXmm11 = 0x0000100B,
|
---|
686 | WHvX64RegisterXmm12 = 0x0000100C,
|
---|
687 | WHvX64RegisterXmm13 = 0x0000100D,
|
---|
688 | WHvX64RegisterXmm14 = 0x0000100E,
|
---|
689 | WHvX64RegisterXmm15 = 0x0000100F,
|
---|
690 | WHvX64RegisterFpMmx0 = 0x00001010,
|
---|
691 | WHvX64RegisterFpMmx1 = 0x00001011,
|
---|
692 | WHvX64RegisterFpMmx2 = 0x00001012,
|
---|
693 | WHvX64RegisterFpMmx3 = 0x00001013,
|
---|
694 | WHvX64RegisterFpMmx4 = 0x00001014,
|
---|
695 | WHvX64RegisterFpMmx5 = 0x00001015,
|
---|
696 | WHvX64RegisterFpMmx6 = 0x00001016,
|
---|
697 | WHvX64RegisterFpMmx7 = 0x00001017,
|
---|
698 | WHvX64RegisterFpControlStatus = 0x00001018,
|
---|
699 | WHvX64RegisterXmmControlStatus = 0x00001019,
|
---|
700 | WHvX64RegisterTsc = 0x00002000,
|
---|
701 | WHvX64RegisterEfer = 0x00002001,
|
---|
702 | WHvX64RegisterKernelGsBase = 0x00002002,
|
---|
703 | WHvX64RegisterApicBase = 0x00002003,
|
---|
704 | WHvX64RegisterPat = 0x00002004,
|
---|
705 | WHvX64RegisterSysenterCs = 0x00002005,
|
---|
706 | WHvX64RegisterSysenterEip = 0x00002006,
|
---|
707 | WHvX64RegisterSysenterEsp = 0x00002007,
|
---|
708 | WHvX64RegisterStar = 0x00002008,
|
---|
709 | WHvX64RegisterLstar = 0x00002009,
|
---|
710 | WHvX64RegisterCstar = 0x0000200A,
|
---|
711 | WHvX64RegisterSfmask = 0x0000200B,
|
---|
712 | WHvX64RegisterInitialApicId = 0x0000200C,
|
---|
713 | WHvX64RegisterMsrMtrrCap = 0x0000200D,
|
---|
714 | WHvX64RegisterMsrMtrrDefType = 0x0000200E,
|
---|
715 | WHvX64RegisterMsrMtrrPhysBase0 = 0x00002010,
|
---|
716 | WHvX64RegisterMsrMtrrPhysBase1 = 0x00002011,
|
---|
717 | WHvX64RegisterMsrMtrrPhysBase2 = 0x00002012,
|
---|
718 | WHvX64RegisterMsrMtrrPhysBase3 = 0x00002013,
|
---|
719 | WHvX64RegisterMsrMtrrPhysBase4 = 0x00002014,
|
---|
720 | WHvX64RegisterMsrMtrrPhysBase5 = 0x00002015,
|
---|
721 | WHvX64RegisterMsrMtrrPhysBase6 = 0x00002016,
|
---|
722 | WHvX64RegisterMsrMtrrPhysBase7 = 0x00002017,
|
---|
723 | WHvX64RegisterMsrMtrrPhysBase8 = 0x00002018,
|
---|
724 | WHvX64RegisterMsrMtrrPhysBase9 = 0x00002019,
|
---|
725 | WHvX64RegisterMsrMtrrPhysBaseA = 0x0000201A,
|
---|
726 | WHvX64RegisterMsrMtrrPhysBaseB = 0x0000201B,
|
---|
727 | WHvX64RegisterMsrMtrrPhysBaseC = 0x0000201C,
|
---|
728 | WHvX64RegisterMsrMtrrPhysBaseD = 0x0000201D,
|
---|
729 | WHvX64RegisterMsrMtrrPhysBaseE = 0x0000201E,
|
---|
730 | WHvX64RegisterMsrMtrrPhysBaseF = 0x0000201F,
|
---|
731 | WHvX64RegisterMsrMtrrPhysMask0 = 0x00002040,
|
---|
732 | WHvX64RegisterMsrMtrrPhysMask1 = 0x00002041,
|
---|
733 | WHvX64RegisterMsrMtrrPhysMask2 = 0x00002042,
|
---|
734 | WHvX64RegisterMsrMtrrPhysMask3 = 0x00002043,
|
---|
735 | WHvX64RegisterMsrMtrrPhysMask4 = 0x00002044,
|
---|
736 | WHvX64RegisterMsrMtrrPhysMask5 = 0x00002045,
|
---|
737 | WHvX64RegisterMsrMtrrPhysMask6 = 0x00002046,
|
---|
738 | WHvX64RegisterMsrMtrrPhysMask7 = 0x00002047,
|
---|
739 | WHvX64RegisterMsrMtrrPhysMask8 = 0x00002048,
|
---|
740 | WHvX64RegisterMsrMtrrPhysMask9 = 0x00002049,
|
---|
741 | WHvX64RegisterMsrMtrrPhysMaskA = 0x0000204A,
|
---|
742 | WHvX64RegisterMsrMtrrPhysMaskB = 0x0000204B,
|
---|
743 | WHvX64RegisterMsrMtrrPhysMaskC = 0x0000204C,
|
---|
744 | WHvX64RegisterMsrMtrrPhysMaskD = 0x0000204D,
|
---|
745 | WHvX64RegisterMsrMtrrPhysMaskE = 0x0000204E,
|
---|
746 | WHvX64RegisterMsrMtrrPhysMaskF = 0x0000204F,
|
---|
747 | WHvX64RegisterMsrMtrrFix64k00000 = 0x00002070,
|
---|
748 | WHvX64RegisterMsrMtrrFix16k80000 = 0x00002071,
|
---|
749 | WHvX64RegisterMsrMtrrFix16kA0000 = 0x00002072,
|
---|
750 | WHvX64RegisterMsrMtrrFix4kC0000 = 0x00002073,
|
---|
751 | WHvX64RegisterMsrMtrrFix4kC8000 = 0x00002074,
|
---|
752 | WHvX64RegisterMsrMtrrFix4kD0000 = 0x00002075,
|
---|
753 | WHvX64RegisterMsrMtrrFix4kD8000 = 0x00002076,
|
---|
754 | WHvX64RegisterMsrMtrrFix4kE0000 = 0x00002077,
|
---|
755 | WHvX64RegisterMsrMtrrFix4kE8000 = 0x00002078,
|
---|
756 | WHvX64RegisterMsrMtrrFix4kF0000 = 0x00002079,
|
---|
757 | WHvX64RegisterMsrMtrrFix4kF8000 = 0x0000207A,
|
---|
758 | WHvX64RegisterTscAux = 0x0000207B,
|
---|
759 | WHvX64RegisterBndcfgs = 0x0000207C,
|
---|
760 | WHvX64RegisterMCount = 0x0000207E,
|
---|
761 | WHvX64RegisterACount = 0x0000207F,
|
---|
762 | WHvX64RegisterSpecCtrl = 0x00002084,
|
---|
763 | WHvX64RegisterPredCmd = 0x00002085,
|
---|
764 | WHvX64RegisterTscVirtualOffset = 0x00002087,
|
---|
765 | WHvX64RegisterTsxCtrl = 0x00002088,
|
---|
766 | WHvX64RegisterXss = 0x0000208B,
|
---|
767 | WHvX64RegisterUCet = 0x0000208C,
|
---|
768 | WHvX64RegisterSCet = 0x0000208D,
|
---|
769 | WHvX64RegisterSsp = 0x0000208E,
|
---|
770 | WHvX64RegisterPl0Ssp = 0x0000208F,
|
---|
771 | WHvX64RegisterPl1Ssp = 0x00002090,
|
---|
772 | WHvX64RegisterPl2Ssp = 0x00002091,
|
---|
773 | WHvX64RegisterPl3Ssp = 0x00002092,
|
---|
774 | WHvX64RegisterInterruptSspTableAddr = 0x00002093,
|
---|
775 | WHvX64RegisterTscDeadline = 0x00002095,
|
---|
776 | WHvX64RegisterTscAdjust = 0x00002096,
|
---|
777 | WHvX64RegisterUmwaitControl = 0x00002098,
|
---|
778 | WHvX64RegisterXfd = 0x00002099,
|
---|
779 | WHvX64RegisterXfdErr = 0x0000209A,
|
---|
780 | WHvX64RegisterApicId = 0x00003002,
|
---|
781 | WHvX64RegisterApicVersion = 0x00003003,
|
---|
782 | WHvX64RegisterApicTpr = 0x00003008,
|
---|
783 | WHvX64RegisterApicPpr = 0x0000300A,
|
---|
784 | WHvX64RegisterApicEoi = 0x0000300B,
|
---|
785 | WHvX64RegisterApicLdr = 0x0000300D,
|
---|
786 | WHvX64RegisterApicSpurious = 0x0000300F,
|
---|
787 | WHvX64RegisterApicIsr0 = 0x00003010,
|
---|
788 | WHvX64RegisterApicIsr1 = 0x00003011,
|
---|
789 | WHvX64RegisterApicIsr2 = 0x00003012,
|
---|
790 | WHvX64RegisterApicIsr3 = 0x00003013,
|
---|
791 | WHvX64RegisterApicIsr4 = 0x00003014,
|
---|
792 | WHvX64RegisterApicIsr5 = 0x00003015,
|
---|
793 | WHvX64RegisterApicIsr6 = 0x00003016,
|
---|
794 | WHvX64RegisterApicIsr7 = 0x00003017,
|
---|
795 | WHvX64RegisterApicTmr0 = 0x00003018,
|
---|
796 | WHvX64RegisterApicTmr1 = 0x00003019,
|
---|
797 | WHvX64RegisterApicTmr2 = 0x0000301A,
|
---|
798 | WHvX64RegisterApicTmr3 = 0x0000301B,
|
---|
799 | WHvX64RegisterApicTmr4 = 0x0000301C,
|
---|
800 | WHvX64RegisterApicTmr5 = 0x0000301D,
|
---|
801 | WHvX64RegisterApicTmr6 = 0x0000301E,
|
---|
802 | WHvX64RegisterApicTmr7 = 0x0000301F,
|
---|
803 | WHvX64RegisterApicIrr0 = 0x00003020,
|
---|
804 | WHvX64RegisterApicIrr1 = 0x00003021,
|
---|
805 | WHvX64RegisterApicIrr2 = 0x00003022,
|
---|
806 | WHvX64RegisterApicIrr3 = 0x00003023,
|
---|
807 | WHvX64RegisterApicIrr4 = 0x00003024,
|
---|
808 | WHvX64RegisterApicIrr5 = 0x00003025,
|
---|
809 | WHvX64RegisterApicIrr6 = 0x00003026,
|
---|
810 | WHvX64RegisterApicIrr7 = 0x00003027,
|
---|
811 | WHvX64RegisterApicEse = 0x00003028,
|
---|
812 | WHvX64RegisterApicIcr = 0x00003030,
|
---|
813 | WHvX64RegisterApicLvtTimer = 0x00003032,
|
---|
814 | WHvX64RegisterApicLvtThermal = 0x00003033,
|
---|
815 | WHvX64RegisterApicLvtPerfmon = 0x00003034,
|
---|
816 | WHvX64RegisterApicLvtLint0 = 0x00003035,
|
---|
817 | WHvX64RegisterApicLvtLint1 = 0x00003036,
|
---|
818 | WHvX64RegisterApicLvtError = 0x00003037,
|
---|
819 | WHvX64RegisterApicInitCount = 0x00003038,
|
---|
820 | WHvX64RegisterApicCurrentCount = 0x00003039,
|
---|
821 | WHvX64RegisterApicDivide = 0x0000303E,
|
---|
822 | WHvX64RegisterApicSelfIpi = 0x0000303F,
|
---|
823 | WHvRegisterSint0 = 0x00004000,
|
---|
824 | WHvRegisterSint1 = 0x00004001,
|
---|
825 | WHvRegisterSint2 = 0x00004002,
|
---|
826 | WHvRegisterSint3 = 0x00004003,
|
---|
827 | WHvRegisterSint4 = 0x00004004,
|
---|
828 | WHvRegisterSint5 = 0x00004005,
|
---|
829 | WHvRegisterSint6 = 0x00004006,
|
---|
830 | WHvRegisterSint7 = 0x00004007,
|
---|
831 | WHvRegisterSint8 = 0x00004008,
|
---|
832 | WHvRegisterSint9 = 0x00004009,
|
---|
833 | WHvRegisterSint10 = 0x0000400A,
|
---|
834 | WHvRegisterSint11 = 0x0000400B,
|
---|
835 | WHvRegisterSint12 = 0x0000400C,
|
---|
836 | WHvRegisterSint13 = 0x0000400D,
|
---|
837 | WHvRegisterSint14 = 0x0000400E,
|
---|
838 | WHvRegisterSint15 = 0x0000400F,
|
---|
839 | WHvRegisterScontrol = 0x00004010,
|
---|
840 | WHvRegisterSversion = 0x00004011,
|
---|
841 | WHvRegisterSiefp = 0x00004012,
|
---|
842 | WHvRegisterSimp = 0x00004013,
|
---|
843 | WHvRegisterEom = 0x00004014,
|
---|
844 | WHvRegisterVpRuntime = 0x00005000,
|
---|
845 | WHvX64RegisterHypercall = 0x00005001,
|
---|
846 | WHvRegisterGuestOsId = 0x00005002,
|
---|
847 | WHvRegisterVpAssistPage = 0x00005013,
|
---|
848 | WHvRegisterReferenceTsc = 0x00005017,
|
---|
849 | WHvRegisterReferenceTscSequence = 0x0000501A,
|
---|
850 | WHvRegisterPendingInterruption = 0x80000000,
|
---|
851 | WHvRegisterInterruptState = 0x80000001,
|
---|
852 | WHvRegisterPendingEvent = 0x80000002,
|
---|
853 | WHvX64RegisterDeliverabilityNotifications = 0x80000004,
|
---|
854 | WHvRegisterInternalActivityState = 0x80000005,
|
---|
855 | WHvX64RegisterPendingDebugException = 0x80000006
|
---|
856 | } WHV_REGISTER_NAME;
|
---|
857 |
|
---|
858 | typedef union DECLSPEC_ALIGN(16) WHV_UINT128 {
|
---|
859 | __C89_NAMELESS struct {
|
---|
860 | UINT64 Low64;
|
---|
861 | UINT64 High64;
|
---|
862 | };
|
---|
863 | UINT32 Dword[4];
|
---|
864 | } WHV_UINT128;
|
---|
865 |
|
---|
866 | C_ASSERT(sizeof(WHV_UINT128) == 16);
|
---|
867 |
|
---|
868 | typedef union WHV_X64_FP_REGISTER {
|
---|
869 | __C89_NAMELESS struct {
|
---|
870 | UINT64 Mantissa;
|
---|
871 | UINT64 BiasedExponent:15;
|
---|
872 | UINT64 Sign:1;
|
---|
873 | UINT64 Reserved:48;
|
---|
874 | };
|
---|
875 | WHV_UINT128 AsUINT128;
|
---|
876 | } WHV_X64_FP_REGISTER;
|
---|
877 |
|
---|
878 | C_ASSERT(sizeof(WHV_X64_FP_REGISTER) == 16);
|
---|
879 |
|
---|
880 | typedef union WHV_X64_FP_CONTROL_STATUS_REGISTER {
|
---|
881 | __C89_NAMELESS struct {
|
---|
882 | UINT16 FpControl;
|
---|
883 | UINT16 FpStatus;
|
---|
884 | UINT8 FpTag;
|
---|
885 | UINT8 Reserved;
|
---|
886 | UINT16 LastFpOp;
|
---|
887 | __C89_NAMELESS union {
|
---|
888 | UINT64 LastFpRip;
|
---|
889 | __C89_NAMELESS struct {
|
---|
890 | UINT32 LastFpEip;
|
---|
891 | UINT16 LastFpCs;
|
---|
892 | UINT16 Reserved2;
|
---|
893 | };
|
---|
894 | };
|
---|
895 | };
|
---|
896 | WHV_UINT128 AsUINT128;
|
---|
897 | } WHV_X64_FP_CONTROL_STATUS_REGISTER;
|
---|
898 |
|
---|
899 | C_ASSERT(sizeof(WHV_X64_FP_CONTROL_STATUS_REGISTER) == 16);
|
---|
900 |
|
---|
901 | typedef union WHV_X64_XMM_CONTROL_STATUS_REGISTER {
|
---|
902 | __C89_NAMELESS struct {
|
---|
903 | __C89_NAMELESS union {
|
---|
904 | UINT64 LastFpRdp;
|
---|
905 | __C89_NAMELESS struct {
|
---|
906 | UINT32 LastFpDp;
|
---|
907 | UINT16 LastFpDs;
|
---|
908 | UINT16 Reserved;
|
---|
909 | };
|
---|
910 | };
|
---|
911 | UINT32 XmmStatusControl;
|
---|
912 | UINT32 XmmStatusControlMask;
|
---|
913 | };
|
---|
914 | WHV_UINT128 AsUINT128;
|
---|
915 | } WHV_X64_XMM_CONTROL_STATUS_REGISTER;
|
---|
916 |
|
---|
917 | C_ASSERT(sizeof(WHV_X64_FP_CONTROL_STATUS_REGISTER) == 16);
|
---|
918 |
|
---|
919 | typedef struct WHV_X64_SEGMENT_REGISTER {
|
---|
920 | UINT64 Base;
|
---|
921 | UINT32 Limit;
|
---|
922 | UINT16 Selector;
|
---|
923 | __C89_NAMELESS union {
|
---|
924 | __C89_NAMELESS struct {
|
---|
925 | UINT16 SegmentType:4;
|
---|
926 | UINT16 NonSystemSegment:1;
|
---|
927 | UINT16 DescriptorPrivilegeLevel:2;
|
---|
928 | UINT16 Present:1;
|
---|
929 | UINT16 Reserved:4;
|
---|
930 | UINT16 Available:1;
|
---|
931 | UINT16 Long:1;
|
---|
932 | UINT16 Default:1;
|
---|
933 | UINT16 Granularity:1;
|
---|
934 | };
|
---|
935 | UINT16 Attributes;
|
---|
936 | };
|
---|
937 | } WHV_X64_SEGMENT_REGISTER;
|
---|
938 |
|
---|
939 | C_ASSERT(sizeof(WHV_X64_SEGMENT_REGISTER) == 16);
|
---|
940 |
|
---|
941 | typedef struct WHV_X64_TABLE_REGISTER {
|
---|
942 | UINT16 Pad[3];
|
---|
943 | UINT16 Limit;
|
---|
944 | UINT64 Base;
|
---|
945 | } WHV_X64_TABLE_REGISTER;
|
---|
946 |
|
---|
947 | C_ASSERT(sizeof(WHV_X64_TABLE_REGISTER) == 16);
|
---|
948 |
|
---|
949 | typedef union WHV_X64_INTERRUPT_STATE_REGISTER {
|
---|
950 | __C89_NAMELESS struct {
|
---|
951 | UINT64 InterruptShadow:1;
|
---|
952 | UINT64 NmiMasked:1;
|
---|
953 | UINT64 Reserved:62;
|
---|
954 | };
|
---|
955 | UINT64 AsUINT64;
|
---|
956 | } WHV_X64_INTERRUPT_STATE_REGISTER;
|
---|
957 |
|
---|
958 | C_ASSERT(sizeof(WHV_X64_INTERRUPT_STATE_REGISTER) == 8);
|
---|
959 |
|
---|
960 | typedef union WHV_X64_PENDING_INTERRUPTION_REGISTER {
|
---|
961 | __C89_NAMELESS struct {
|
---|
962 | UINT32 InterruptionPending:1;
|
---|
963 | UINT32 InterruptionType:3;
|
---|
964 | UINT32 DeliverErrorCode:1;
|
---|
965 | UINT32 InstructionLength:4;
|
---|
966 | UINT32 NestedEvent:1;
|
---|
967 | UINT32 Reserved:6;
|
---|
968 | UINT32 InterruptionVector:16;
|
---|
969 | UINT32 ErrorCode;
|
---|
970 | };
|
---|
971 | UINT64 AsUINT64;
|
---|
972 | } WHV_X64_PENDING_INTERRUPTION_REGISTER;
|
---|
973 |
|
---|
974 | C_ASSERT(sizeof(WHV_X64_PENDING_INTERRUPTION_REGISTER) == sizeof(UINT64));
|
---|
975 |
|
---|
976 | typedef union WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER {
|
---|
977 | __C89_NAMELESS struct {
|
---|
978 | UINT64 NmiNotification:1;
|
---|
979 | UINT64 InterruptNotification:1;
|
---|
980 | UINT64 InterruptPriority:4;
|
---|
981 | UINT64 Reserved:58;
|
---|
982 | };
|
---|
983 | UINT64 AsUINT64;
|
---|
984 | } WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER;
|
---|
985 |
|
---|
986 | C_ASSERT(sizeof(WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER) == sizeof(UINT64));
|
---|
987 |
|
---|
988 | typedef enum WHV_X64_PENDING_EVENT_TYPE {
|
---|
989 | WHvX64PendingEventException = 0,
|
---|
990 | WHvX64PendingEventExtInt = 5
|
---|
991 | } WHV_X64_PENDING_EVENT_TYPE;
|
---|
992 |
|
---|
993 | typedef union WHV_X64_PENDING_EXCEPTION_EVENT {
|
---|
994 | __C89_NAMELESS struct {
|
---|
995 | UINT32 EventPending : 1;
|
---|
996 | UINT32 EventType : 3;
|
---|
997 | UINT32 Reserved0 : 4;
|
---|
998 | UINT32 DeliverErrorCode : 1;
|
---|
999 | UINT32 Reserved1 : 7;
|
---|
1000 | UINT32 Vector : 16;
|
---|
1001 | UINT32 ErrorCode;
|
---|
1002 | UINT64 ExceptionParameter;
|
---|
1003 | };
|
---|
1004 | WHV_UINT128 AsUINT128;
|
---|
1005 | } WHV_X64_PENDING_EXCEPTION_EVENT;
|
---|
1006 |
|
---|
1007 | C_ASSERT(sizeof(WHV_X64_PENDING_EXCEPTION_EVENT) == sizeof(WHV_UINT128));
|
---|
1008 |
|
---|
1009 | typedef union WHV_X64_PENDING_EXT_INT_EVENT {
|
---|
1010 | __C89_NAMELESS struct {
|
---|
1011 | UINT64 EventPending : 1;
|
---|
1012 | UINT64 EventType : 3;
|
---|
1013 | UINT64 Reserved0 : 4;
|
---|
1014 | UINT64 Vector : 8;
|
---|
1015 | UINT64 Reserved1 : 48;
|
---|
1016 | UINT64 Reserved2;
|
---|
1017 | };
|
---|
1018 | WHV_UINT128 AsUINT128;
|
---|
1019 | } WHV_X64_PENDING_EXT_INT_EVENT;
|
---|
1020 |
|
---|
1021 | C_ASSERT(sizeof(WHV_X64_PENDING_EXT_INT_EVENT) == sizeof(WHV_UINT128));
|
---|
1022 |
|
---|
1023 | typedef union WHV_INTERNAL_ACTIVITY_REGISTER {
|
---|
1024 | __C89_NAMELESS struct {
|
---|
1025 | UINT64 StartupSuspend : 1;
|
---|
1026 | UINT64 HaltSuspend : 1;
|
---|
1027 | UINT64 IdleSuspend : 1;
|
---|
1028 | UINT64 Reserved :61;
|
---|
1029 | };
|
---|
1030 | UINT64 AsUINT64;
|
---|
1031 | } WHV_INTERNAL_ACTIVITY_REGISTER;
|
---|
1032 |
|
---|
1033 | C_ASSERT(sizeof(WHV_INTERNAL_ACTIVITY_REGISTER) == sizeof(UINT64));
|
---|
1034 |
|
---|
1035 | typedef union WHV_X64_PENDING_DEBUG_EXCEPTION {
|
---|
1036 | UINT64 AsUINT64;
|
---|
1037 | __C89_NAMELESS struct {
|
---|
1038 | UINT64 Breakpoint0 : 1;
|
---|
1039 | UINT64 Breakpoint1 : 1;
|
---|
1040 | UINT64 Breakpoint2 : 1;
|
---|
1041 | UINT64 Breakpoint3 : 1;
|
---|
1042 | UINT64 SingleStep : 1;
|
---|
1043 | UINT64 Reserved0 : 59;
|
---|
1044 | };
|
---|
1045 | } WHV_X64_PENDING_DEBUG_EXCEPTION;
|
---|
1046 |
|
---|
1047 | C_ASSERT(sizeof(WHV_X64_PENDING_DEBUG_EXCEPTION) == sizeof(UINT64));
|
---|
1048 |
|
---|
1049 | typedef struct WHV_SYNIC_SINT_DELIVERABLE_CONTEXT {
|
---|
1050 | UINT16 DeliverableSints;
|
---|
1051 | UINT16 Reserved1;
|
---|
1052 | UINT32 Reserved2;
|
---|
1053 | } WHV_SYNIC_SINT_DELIVERABLE_CONTEXT;
|
---|
1054 |
|
---|
1055 | C_ASSERT(sizeof(WHV_SYNIC_SINT_DELIVERABLE_CONTEXT) == 8);
|
---|
1056 |
|
---|
1057 | typedef union WHV_REGISTER_VALUE {
|
---|
1058 | WHV_UINT128 Reg128;
|
---|
1059 | UINT64 Reg64;
|
---|
1060 | UINT32 Reg32;
|
---|
1061 | UINT16 Reg16;
|
---|
1062 | UINT8 Reg8;
|
---|
1063 | WHV_X64_FP_REGISTER Fp;
|
---|
1064 | WHV_X64_FP_CONTROL_STATUS_REGISTER FpControlStatus;
|
---|
1065 | WHV_X64_XMM_CONTROL_STATUS_REGISTER XmmControlStatus;
|
---|
1066 | WHV_X64_SEGMENT_REGISTER Segment;
|
---|
1067 | WHV_X64_TABLE_REGISTER Table;
|
---|
1068 | WHV_X64_INTERRUPT_STATE_REGISTER InterruptState;
|
---|
1069 | WHV_X64_PENDING_INTERRUPTION_REGISTER PendingInterruption;
|
---|
1070 | WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER DeliverabilityNotifications;
|
---|
1071 | WHV_X64_PENDING_EXCEPTION_EVENT ExceptionEvent;
|
---|
1072 | WHV_X64_PENDING_EXT_INT_EVENT ExtIntEvent;
|
---|
1073 | WHV_INTERNAL_ACTIVITY_REGISTER InternalActivity;
|
---|
1074 | WHV_X64_PENDING_DEBUG_EXCEPTION PendingDebugException;
|
---|
1075 | } WHV_REGISTER_VALUE;
|
---|
1076 |
|
---|
1077 | C_ASSERT(sizeof(WHV_REGISTER_VALUE) == 16);
|
---|
1078 |
|
---|
1079 | typedef enum WHV_RUN_VP_EXIT_REASON {
|
---|
1080 | WHvRunVpExitReasonNone = 0x00000000,
|
---|
1081 | WHvRunVpExitReasonMemoryAccess = 0x00000001,
|
---|
1082 | WHvRunVpExitReasonX64IoPortAccess = 0x00000002,
|
---|
1083 | WHvRunVpExitReasonUnrecoverableException = 0x00000004,
|
---|
1084 | WHvRunVpExitReasonInvalidVpRegisterValue = 0x00000005,
|
---|
1085 | WHvRunVpExitReasonUnsupportedFeature = 0x00000006,
|
---|
1086 | WHvRunVpExitReasonX64InterruptWindow = 0x00000007,
|
---|
1087 | WHvRunVpExitReasonX64Halt = 0x00000008,
|
---|
1088 | WHvRunVpExitReasonX64ApicEoi = 0x00000009,
|
---|
1089 | WHvRunVpExitReasonSynicSintDeliverable = 0x0000000A,
|
---|
1090 | WHvRunVpExitReasonX64MsrAccess = 0x00001000,
|
---|
1091 | WHvRunVpExitReasonX64Cpuid = 0x00001001,
|
---|
1092 | WHvRunVpExitReasonException = 0x00001002,
|
---|
1093 | WHvRunVpExitReasonX64Rdtsc = 0x00001003,
|
---|
1094 | WHvRunVpExitReasonX64ApicSmiTrap = 0x00001004,
|
---|
1095 | WHvRunVpExitReasonHypercall = 0x00001005,
|
---|
1096 | WHvRunVpExitReasonX64ApicInitSipiTrap = 0x00001006,
|
---|
1097 | WHvRunVpExitReasonX64ApicWriteTrap = 0x00001007,
|
---|
1098 | WHvRunVpExitReasonCanceled = 0x00002001
|
---|
1099 | } WHV_RUN_VP_EXIT_REASON;
|
---|
1100 |
|
---|
1101 | typedef union WHV_X64_VP_EXECUTION_STATE {
|
---|
1102 | __C89_NAMELESS struct {
|
---|
1103 | UINT16 Cpl : 2;
|
---|
1104 | UINT16 Cr0Pe : 1;
|
---|
1105 | UINT16 Cr0Am : 1;
|
---|
1106 | UINT16 EferLma : 1;
|
---|
1107 | UINT16 DebugActive : 1;
|
---|
1108 | UINT16 InterruptionPending : 1;
|
---|
1109 | UINT16 Reserved0 : 5;
|
---|
1110 | UINT16 InterruptShadow : 1;
|
---|
1111 | UINT16 Reserved1 : 3;
|
---|
1112 | };
|
---|
1113 | UINT16 AsUINT16;
|
---|
1114 | } WHV_X64_VP_EXECUTION_STATE;
|
---|
1115 |
|
---|
1116 | C_ASSERT(sizeof(WHV_X64_VP_EXECUTION_STATE) == sizeof(UINT16));
|
---|
1117 |
|
---|
1118 | typedef struct WHV_VP_EXIT_CONTEXT {
|
---|
1119 | WHV_X64_VP_EXECUTION_STATE ExecutionState;
|
---|
1120 | UINT8 InstructionLength : 4;
|
---|
1121 | UINT8 Cr8 : 4;
|
---|
1122 | UINT8 Reserved;
|
---|
1123 | UINT32 Reserved2;
|
---|
1124 | WHV_X64_SEGMENT_REGISTER Cs;
|
---|
1125 | UINT64 Rip;
|
---|
1126 | UINT64 Rflags;
|
---|
1127 | } WHV_VP_EXIT_CONTEXT;
|
---|
1128 |
|
---|
1129 | C_ASSERT(sizeof(WHV_VP_EXIT_CONTEXT) == 40);
|
---|
1130 |
|
---|
1131 | typedef union WHV_MEMORY_ACCESS_INFO {
|
---|
1132 | __C89_NAMELESS struct {
|
---|
1133 | UINT32 AccessType : 2;
|
---|
1134 | UINT32 GpaUnmapped : 1;
|
---|
1135 | UINT32 GvaValid : 1;
|
---|
1136 | UINT32 Reserved : 28;
|
---|
1137 | };
|
---|
1138 | UINT32 AsUINT32;
|
---|
1139 | } WHV_MEMORY_ACCESS_INFO;
|
---|
1140 |
|
---|
1141 | C_ASSERT(sizeof(WHV_MEMORY_ACCESS_INFO) == 4);
|
---|
1142 |
|
---|
1143 | typedef struct WHV_MEMORY_ACCESS_CONTEXT {
|
---|
1144 | UINT8 InstructionByteCount;
|
---|
1145 | UINT8 Reserved[3];
|
---|
1146 | UINT8 InstructionBytes[16];
|
---|
1147 | WHV_MEMORY_ACCESS_INFO AccessInfo;
|
---|
1148 | WHV_GUEST_PHYSICAL_ADDRESS Gpa;
|
---|
1149 | WHV_GUEST_VIRTUAL_ADDRESS Gva;
|
---|
1150 | } WHV_MEMORY_ACCESS_CONTEXT;
|
---|
1151 |
|
---|
1152 | C_ASSERT(sizeof(WHV_MEMORY_ACCESS_CONTEXT) == 40);
|
---|
1153 |
|
---|
1154 | typedef union WHV_X64_IO_PORT_ACCESS_INFO {
|
---|
1155 | __C89_NAMELESS struct {
|
---|
1156 | UINT32 IsWrite : 1;
|
---|
1157 | UINT32 AccessSize: 3;
|
---|
1158 | UINT32 StringOp : 1;
|
---|
1159 | UINT32 RepPrefix : 1;
|
---|
1160 | UINT32 Reserved : 26;
|
---|
1161 | };
|
---|
1162 | UINT32 AsUINT32;
|
---|
1163 | } WHV_X64_IO_PORT_ACCESS_INFO;
|
---|
1164 |
|
---|
1165 | C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_INFO) == sizeof(UINT32));
|
---|
1166 |
|
---|
1167 | typedef struct WHV_X64_IO_PORT_ACCESS_CONTEXT {
|
---|
1168 | UINT8 InstructionByteCount;
|
---|
1169 | UINT8 Reserved[3];
|
---|
1170 | UINT8 InstructionBytes[16];
|
---|
1171 | WHV_X64_IO_PORT_ACCESS_INFO AccessInfo;
|
---|
1172 | UINT16 PortNumber;
|
---|
1173 | UINT16 Reserved2[3];
|
---|
1174 | UINT64 Rax;
|
---|
1175 | UINT64 Rcx;
|
---|
1176 | UINT64 Rsi;
|
---|
1177 | UINT64 Rdi;
|
---|
1178 | WHV_X64_SEGMENT_REGISTER Ds;
|
---|
1179 | WHV_X64_SEGMENT_REGISTER Es;
|
---|
1180 | } WHV_X64_IO_PORT_ACCESS_CONTEXT;
|
---|
1181 |
|
---|
1182 | C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_CONTEXT) == 96);
|
---|
1183 |
|
---|
1184 | typedef union WHV_X64_MSR_ACCESS_INFO {
|
---|
1185 | __C89_NAMELESS struct {
|
---|
1186 | UINT32 IsWrite : 1;
|
---|
1187 | UINT32 Reserved : 31;
|
---|
1188 | };
|
---|
1189 | UINT32 AsUINT32;
|
---|
1190 | } WHV_X64_MSR_ACCESS_INFO;
|
---|
1191 |
|
---|
1192 | C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_INFO) == sizeof(UINT32));
|
---|
1193 |
|
---|
1194 | typedef struct WHV_X64_MSR_ACCESS_CONTEXT {
|
---|
1195 | WHV_X64_MSR_ACCESS_INFO AccessInfo;
|
---|
1196 | UINT32 MsrNumber;
|
---|
1197 | UINT64 Rax;
|
---|
1198 | UINT64 Rdx;
|
---|
1199 | } WHV_X64_MSR_ACCESS_CONTEXT;
|
---|
1200 |
|
---|
1201 | C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_CONTEXT) == 24);
|
---|
1202 |
|
---|
1203 | typedef struct WHV_X64_CPUID_ACCESS_CONTEXT {
|
---|
1204 | UINT64 Rax;
|
---|
1205 | UINT64 Rcx;
|
---|
1206 | UINT64 Rdx;
|
---|
1207 | UINT64 Rbx;
|
---|
1208 | UINT64 DefaultResultRax;
|
---|
1209 | UINT64 DefaultResultRcx;
|
---|
1210 | UINT64 DefaultResultRdx;
|
---|
1211 | UINT64 DefaultResultRbx;
|
---|
1212 | } WHV_X64_CPUID_ACCESS_CONTEXT;
|
---|
1213 |
|
---|
1214 | C_ASSERT(sizeof(WHV_X64_CPUID_ACCESS_CONTEXT) == 64);
|
---|
1215 |
|
---|
1216 | typedef union WHV_VP_EXCEPTION_INFO {
|
---|
1217 | __C89_NAMELESS struct {
|
---|
1218 | UINT32 ErrorCodeValid : 1;
|
---|
1219 | UINT32 SoftwareException : 1;
|
---|
1220 | UINT32 Reserved : 30;
|
---|
1221 | };
|
---|
1222 | UINT32 AsUINT32;
|
---|
1223 | } WHV_VP_EXCEPTION_INFO;
|
---|
1224 |
|
---|
1225 | C_ASSERT(sizeof(WHV_VP_EXCEPTION_INFO) == sizeof(UINT32));
|
---|
1226 |
|
---|
1227 | typedef struct WHV_VP_EXCEPTION_CONTEXT {
|
---|
1228 | UINT8 InstructionByteCount;
|
---|
1229 | UINT8 Reserved[3];
|
---|
1230 | UINT8 InstructionBytes[16];
|
---|
1231 | WHV_VP_EXCEPTION_INFO ExceptionInfo;
|
---|
1232 | UINT8 ExceptionType;
|
---|
1233 | UINT8 Reserved2[3];
|
---|
1234 | UINT32 ErrorCode;
|
---|
1235 | UINT64 ExceptionParameter;
|
---|
1236 | } WHV_VP_EXCEPTION_CONTEXT;
|
---|
1237 |
|
---|
1238 | C_ASSERT(sizeof(WHV_VP_EXCEPTION_CONTEXT) == 40);
|
---|
1239 |
|
---|
1240 | typedef enum WHV_X64_UNSUPPORTED_FEATURE_CODE {
|
---|
1241 | WHvUnsupportedFeatureIntercept = 1,
|
---|
1242 | WHvUnsupportedFeatureTaskSwitchTss = 2
|
---|
1243 | } WHV_X64_UNSUPPORTED_FEATURE_CODE;
|
---|
1244 |
|
---|
1245 | typedef struct WHV_X64_UNSUPPORTED_FEATURE_CONTEXT {
|
---|
1246 | WHV_X64_UNSUPPORTED_FEATURE_CODE FeatureCode;
|
---|
1247 | UINT32 Reserved;
|
---|
1248 | UINT64 FeatureParameter;
|
---|
1249 | } WHV_X64_UNSUPPORTED_FEATURE_CONTEXT;
|
---|
1250 |
|
---|
1251 | C_ASSERT(sizeof(WHV_X64_UNSUPPORTED_FEATURE_CONTEXT) == 16);
|
---|
1252 |
|
---|
1253 | typedef enum WHV_RUN_VP_CANCEL_REASON {
|
---|
1254 | WhvRunVpCancelReasonUser = 0
|
---|
1255 | } WHV_RUN_VP_CANCEL_REASON;
|
---|
1256 |
|
---|
1257 | typedef struct WHV_RUN_VP_CANCELED_CONTEXT {
|
---|
1258 | WHV_RUN_VP_CANCEL_REASON CancelReason;
|
---|
1259 | } WHV_RUN_VP_CANCELED_CONTEXT;
|
---|
1260 |
|
---|
1261 | C_ASSERT(sizeof(WHV_RUN_VP_CANCELED_CONTEXT) == 4);
|
---|
1262 |
|
---|
1263 | typedef enum WHV_X64_PENDING_INTERRUPTION_TYPE {
|
---|
1264 | WHvX64PendingInterrupt = 0,
|
---|
1265 | WHvX64PendingNmi = 2,
|
---|
1266 | WHvX64PendingException = 3
|
---|
1267 | } WHV_X64_PENDING_INTERRUPTION_TYPE, *PWHV_X64_PENDING_INTERRUPTION_TYPE;
|
---|
1268 |
|
---|
1269 | typedef struct WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT {
|
---|
1270 | WHV_X64_PENDING_INTERRUPTION_TYPE DeliverableType;
|
---|
1271 | } WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT, *PWHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT;
|
---|
1272 |
|
---|
1273 | C_ASSERT(sizeof(WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT) == 4);
|
---|
1274 |
|
---|
1275 | typedef struct WHV_X64_APIC_EOI_CONTEXT {
|
---|
1276 | UINT32 InterruptVector;
|
---|
1277 | } WHV_X64_APIC_EOI_CONTEXT;
|
---|
1278 |
|
---|
1279 | C_ASSERT(sizeof(WHV_X64_APIC_EOI_CONTEXT) == 4);
|
---|
1280 |
|
---|
1281 | typedef union WHV_X64_RDTSC_INFO {
|
---|
1282 | __C89_NAMELESS struct {
|
---|
1283 | UINT64 IsRdtscp : 1;
|
---|
1284 | UINT64 Reserved : 63;
|
---|
1285 | };
|
---|
1286 | UINT64 AsUINT64;
|
---|
1287 | } WHV_X64_RDTSC_INFO;
|
---|
1288 |
|
---|
1289 | C_ASSERT(sizeof(WHV_X64_RDTSC_INFO) == 8);
|
---|
1290 |
|
---|
1291 | typedef struct WHV_X64_RDTSC_CONTEXT {
|
---|
1292 | UINT64 TscAux;
|
---|
1293 | UINT64 VirtualOffset;
|
---|
1294 | UINT64 Tsc;
|
---|
1295 | UINT64 ReferenceTime;
|
---|
1296 | WHV_X64_RDTSC_INFO RdtscInfo;
|
---|
1297 | } WHV_X64_RDTSC_CONTEXT;
|
---|
1298 |
|
---|
1299 | C_ASSERT(sizeof(WHV_X64_RDTSC_CONTEXT) == 40);
|
---|
1300 |
|
---|
1301 | typedef struct WHV_X64_APIC_SMI_CONTEXT {
|
---|
1302 | UINT64 ApicIcr;
|
---|
1303 | } WHV_X64_APIC_SMI_CONTEXT;
|
---|
1304 |
|
---|
1305 | C_ASSERT(sizeof(WHV_X64_APIC_SMI_CONTEXT) == 8);
|
---|
1306 |
|
---|
1307 | #define WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS 6
|
---|
1308 |
|
---|
1309 | typedef struct _WHV_HYPERCALL_CONTEXT {
|
---|
1310 | UINT64 Rax;
|
---|
1311 | UINT64 Rbx;
|
---|
1312 | UINT64 Rcx;
|
---|
1313 | UINT64 Rdx;
|
---|
1314 | UINT64 R8;
|
---|
1315 | UINT64 Rsi;
|
---|
1316 | UINT64 Rdi;
|
---|
1317 | UINT64 Reserved0;
|
---|
1318 | WHV_UINT128 XmmRegisters[WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS];
|
---|
1319 | UINT64 Reserved1[2];
|
---|
1320 | } WHV_HYPERCALL_CONTEXT, *PWHV_HYPERCALL_CONTEXT;
|
---|
1321 |
|
---|
1322 | C_ASSERT(sizeof(WHV_HYPERCALL_CONTEXT) == 176);
|
---|
1323 |
|
---|
1324 | typedef struct WHV_X64_APIC_INIT_SIPI_CONTEXT {
|
---|
1325 | UINT64 ApicIcr;
|
---|
1326 | } WHV_X64_APIC_INIT_SIPI_CONTEXT;
|
---|
1327 |
|
---|
1328 | C_ASSERT(sizeof(WHV_X64_APIC_INIT_SIPI_CONTEXT) == 8);
|
---|
1329 |
|
---|
1330 | typedef enum WHV_X64_APIC_WRITE_TYPE {
|
---|
1331 | WHvX64ApicWriteTypeLdr = 0xD0,
|
---|
1332 | WHvX64ApicWriteTypeDfr = 0xE0,
|
---|
1333 | WHvX64ApicWriteTypeSvr = 0xF0,
|
---|
1334 | WHvX64ApicWriteTypeLint0 = 0x350,
|
---|
1335 | WHvX64ApicWriteTypeLint1 = 0x360
|
---|
1336 | } WHV_X64_APIC_WRITE_TYPE;
|
---|
1337 |
|
---|
1338 | typedef struct WHV_X64_APIC_WRITE_CONTEXT {
|
---|
1339 | WHV_X64_APIC_WRITE_TYPE Type;
|
---|
1340 | UINT32 Reserved;
|
---|
1341 | UINT64 WriteValue;
|
---|
1342 | } WHV_X64_APIC_WRITE_CONTEXT;
|
---|
1343 |
|
---|
1344 | C_ASSERT(sizeof(WHV_X64_APIC_WRITE_CONTEXT) == 16);
|
---|
1345 |
|
---|
1346 | typedef struct WHV_RUN_VP_EXIT_CONTEXT {
|
---|
1347 | WHV_RUN_VP_EXIT_REASON ExitReason;
|
---|
1348 | UINT32 Reserved;
|
---|
1349 | WHV_VP_EXIT_CONTEXT VpContext;
|
---|
1350 | __C89_NAMELESS union {
|
---|
1351 | WHV_MEMORY_ACCESS_CONTEXT MemoryAccess;
|
---|
1352 | WHV_X64_IO_PORT_ACCESS_CONTEXT IoPortAccess;
|
---|
1353 | WHV_X64_MSR_ACCESS_CONTEXT MsrAccess;
|
---|
1354 | WHV_X64_CPUID_ACCESS_CONTEXT CpuidAccess;
|
---|
1355 | WHV_VP_EXCEPTION_CONTEXT VpException;
|
---|
1356 | WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT InterruptWindow;
|
---|
1357 | WHV_X64_UNSUPPORTED_FEATURE_CONTEXT UnsupportedFeature;
|
---|
1358 | WHV_RUN_VP_CANCELED_CONTEXT CancelReason;
|
---|
1359 | WHV_X64_APIC_EOI_CONTEXT ApicEoi;
|
---|
1360 | WHV_X64_RDTSC_CONTEXT ReadTsc;
|
---|
1361 | WHV_X64_APIC_SMI_CONTEXT ApicSmi;
|
---|
1362 | WHV_HYPERCALL_CONTEXT Hypercall;
|
---|
1363 | WHV_X64_APIC_INIT_SIPI_CONTEXT ApicInitSipi;
|
---|
1364 | WHV_X64_APIC_WRITE_CONTEXT ApicWrite;
|
---|
1365 | WHV_SYNIC_SINT_DELIVERABLE_CONTEXT SynicSintDeliverable;
|
---|
1366 | };
|
---|
1367 | } WHV_RUN_VP_EXIT_CONTEXT;
|
---|
1368 |
|
---|
1369 | C_ASSERT(sizeof(WHV_RUN_VP_EXIT_CONTEXT) == 224);
|
---|
1370 |
|
---|
1371 | typedef enum WHV_INTERRUPT_TYPE {
|
---|
1372 | WHvX64InterruptTypeFixed = 0,
|
---|
1373 | WHvX64InterruptTypeLowestPriority = 1,
|
---|
1374 | WHvX64InterruptTypeNmi = 4,
|
---|
1375 | WHvX64InterruptTypeInit = 5,
|
---|
1376 | WHvX64InterruptTypeSipi = 6,
|
---|
1377 | WHvX64InterruptTypeLocalInt1 = 9
|
---|
1378 | } WHV_INTERRUPT_TYPE;
|
---|
1379 |
|
---|
1380 | typedef enum WHV_INTERRUPT_DESTINATION_MODE {
|
---|
1381 | WHvX64InterruptDestinationModePhysical,
|
---|
1382 | WHvX64InterruptDestinationModeLogical
|
---|
1383 | } WHV_INTERRUPT_DESTINATION_MODE;
|
---|
1384 |
|
---|
1385 | typedef enum WHV_INTERRUPT_TRIGGER_MODE {
|
---|
1386 | WHvX64InterruptTriggerModeEdge,
|
---|
1387 | WHvX64InterruptTriggerModeLevel
|
---|
1388 | } WHV_INTERRUPT_TRIGGER_MODE;
|
---|
1389 |
|
---|
1390 | typedef struct WHV_INTERRUPT_CONTROL {
|
---|
1391 | UINT64 Type : 8;
|
---|
1392 | UINT64 DestinationMode : 4;
|
---|
1393 | UINT64 TriggerMode : 4;
|
---|
1394 | UINT64 Reserved : 48;
|
---|
1395 | UINT32 Destination;
|
---|
1396 | UINT32 Vector;
|
---|
1397 | } WHV_INTERRUPT_CONTROL;
|
---|
1398 |
|
---|
1399 | C_ASSERT(sizeof(WHV_INTERRUPT_CONTROL) == 16);
|
---|
1400 |
|
---|
1401 | typedef struct WHV_DOORBELL_MATCH_DATA {
|
---|
1402 | WHV_GUEST_PHYSICAL_ADDRESS GuestAddress;
|
---|
1403 | UINT64 Value;
|
---|
1404 | UINT32 Length;
|
---|
1405 | UINT32 MatchOnValue : 1;
|
---|
1406 | UINT32 MatchOnLength : 1;
|
---|
1407 | UINT32 Reserved : 30;
|
---|
1408 | } WHV_DOORBELL_MATCH_DATA;
|
---|
1409 |
|
---|
1410 | C_ASSERT(sizeof(WHV_DOORBELL_MATCH_DATA) == 24);
|
---|
1411 |
|
---|
1412 | typedef enum WHV_PARTITION_COUNTER_SET {
|
---|
1413 | WHvPartitionCounterSetMemory
|
---|
1414 | } WHV_PARTITION_COUNTER_SET;
|
---|
1415 |
|
---|
1416 | typedef struct WHV_PARTITION_MEMORY_COUNTERS {
|
---|
1417 | UINT64 Mapped4KPageCount;
|
---|
1418 | UINT64 Mapped2MPageCount;
|
---|
1419 | UINT64 Mapped1GPageCount;
|
---|
1420 | } WHV_PARTITION_MEMORY_COUNTERS;
|
---|
1421 |
|
---|
1422 | C_ASSERT(sizeof(WHV_PARTITION_MEMORY_COUNTERS) == 24);
|
---|
1423 |
|
---|
1424 | typedef enum WHV_PROCESSOR_COUNTER_SET {
|
---|
1425 | WHvProcessorCounterSetRuntime,
|
---|
1426 | WHvProcessorCounterSetIntercepts,
|
---|
1427 | WHvProcessorCounterSetEvents,
|
---|
1428 | WHvProcessorCounterSetApic,
|
---|
1429 | WHvProcessorCounterSetSyntheticFeatures
|
---|
1430 | } WHV_PROCESSOR_COUNTER_SET;
|
---|
1431 |
|
---|
1432 | typedef struct WHV_PROCESSOR_RUNTIME_COUNTERS {
|
---|
1433 | UINT64 TotalRuntime100ns;
|
---|
1434 | UINT64 HypervisorRuntime100ns;
|
---|
1435 | } WHV_PROCESSOR_RUNTIME_COUNTERS;
|
---|
1436 |
|
---|
1437 | C_ASSERT(sizeof(WHV_PROCESSOR_RUNTIME_COUNTERS) == 16);
|
---|
1438 |
|
---|
1439 | typedef struct WHV_PROCESSOR_INTERCEPT_COUNTER {
|
---|
1440 | UINT64 Count;
|
---|
1441 | UINT64 Time100ns;
|
---|
1442 | } WHV_PROCESSOR_INTERCEPT_COUNTER;
|
---|
1443 |
|
---|
1444 | C_ASSERT(sizeof(WHV_PROCESSOR_INTERCEPT_COUNTER) == 16);
|
---|
1445 |
|
---|
1446 | typedef struct WHV_PROCESSOR_INTERCEPT_COUNTERS {
|
---|
1447 | WHV_PROCESSOR_INTERCEPT_COUNTER PageInvalidations;
|
---|
1448 | WHV_PROCESSOR_INTERCEPT_COUNTER ControlRegisterAccesses;
|
---|
1449 | WHV_PROCESSOR_INTERCEPT_COUNTER IoInstructions;
|
---|
1450 | WHV_PROCESSOR_INTERCEPT_COUNTER HaltInstructions;
|
---|
1451 | WHV_PROCESSOR_INTERCEPT_COUNTER CpuidInstructions;
|
---|
1452 | WHV_PROCESSOR_INTERCEPT_COUNTER MsrAccesses;
|
---|
1453 | WHV_PROCESSOR_INTERCEPT_COUNTER OtherIntercepts;
|
---|
1454 | WHV_PROCESSOR_INTERCEPT_COUNTER PendingInterrupts;
|
---|
1455 | WHV_PROCESSOR_INTERCEPT_COUNTER EmulatedInstructions;
|
---|
1456 | WHV_PROCESSOR_INTERCEPT_COUNTER DebugRegisterAccesses;
|
---|
1457 | WHV_PROCESSOR_INTERCEPT_COUNTER PageFaultIntercepts;
|
---|
1458 | WHV_PROCESSOR_INTERCEPT_COUNTER NestedPageFaultIntercepts;
|
---|
1459 | WHV_PROCESSOR_INTERCEPT_COUNTER Hypercalls;
|
---|
1460 | WHV_PROCESSOR_INTERCEPT_COUNTER RdpmcInstructions;
|
---|
1461 | } WHV_PROCESSOR_ACTIVITY_COUNTERS;
|
---|
1462 |
|
---|
1463 | C_ASSERT(sizeof(WHV_PROCESSOR_ACTIVITY_COUNTERS) == 224);
|
---|
1464 |
|
---|
1465 | typedef struct WHV_PROCESSOR_EVENT_COUNTERS {
|
---|
1466 | UINT64 PageFaultCount;
|
---|
1467 | UINT64 ExceptionCount;
|
---|
1468 | UINT64 InterruptCount;
|
---|
1469 | } WHV_PROCESSOR_GUEST_EVENT_COUNTERS;
|
---|
1470 |
|
---|
1471 | C_ASSERT(sizeof(WHV_PROCESSOR_GUEST_EVENT_COUNTERS) == 24);
|
---|
1472 |
|
---|
1473 | typedef struct WHV_PROCESSOR_APIC_COUNTERS {
|
---|
1474 | UINT64 MmioAccessCount;
|
---|
1475 | UINT64 EoiAccessCount;
|
---|
1476 | UINT64 TprAccessCount;
|
---|
1477 | UINT64 SentIpiCount;
|
---|
1478 | UINT64 SelfIpiCount;
|
---|
1479 | } WHV_PROCESSOR_APIC_COUNTERS;
|
---|
1480 |
|
---|
1481 | C_ASSERT(sizeof(WHV_PROCESSOR_APIC_COUNTERS) == 40);
|
---|
1482 |
|
---|
1483 | typedef struct WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS {
|
---|
1484 | UINT64 SyntheticInterruptsCount;
|
---|
1485 | UINT64 LongSpinWaitHypercallsCount;
|
---|
1486 | UINT64 OtherHypercallsCount;
|
---|
1487 | UINT64 SyntheticInterruptHypercallsCount;
|
---|
1488 | UINT64 VirtualInterruptHypercallsCount;
|
---|
1489 | UINT64 VirtualMmuHypercallsCount;
|
---|
1490 | } WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS;
|
---|
1491 |
|
---|
1492 | C_ASSERT(sizeof(WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS) == 48);
|
---|
1493 |
|
---|
1494 | typedef enum WHV_ADVISE_GPA_RANGE_CODE {
|
---|
1495 | WHvAdviseGpaRangeCodePopulate = 0x00000000,
|
---|
1496 | WHvAdviseGpaRangeCodePin = 0x00000001,
|
---|
1497 | WHvAdviseGpaRangeCodeUnpin = 0x00000002
|
---|
1498 | } WHV_ADVISE_GPA_RANGE_CODE;
|
---|
1499 |
|
---|
1500 | typedef enum WHV_VIRTUAL_PROCESSOR_STATE_TYPE {
|
---|
1501 | WHvVirtualProcessorStateTypeSynicMessagePage = 0x00000000,
|
---|
1502 | WHvVirtualProcessorStateTypeSynicEventFlagPage = 0x00000001,
|
---|
1503 | WHvVirtualProcessorStateTypeSynicTimerState = 0x00000002,
|
---|
1504 | WHvVirtualProcessorStateTypeInterruptControllerState2 = 0x00001000,
|
---|
1505 | WHvVirtualProcessorStateTypeXsaveState = 0x00001001
|
---|
1506 | } WHV_VIRTUAL_PROCESSOR_STATE_TYPE;
|
---|
1507 |
|
---|
1508 | typedef struct WHV_SYNIC_EVENT_PARAMETERS {
|
---|
1509 | UINT32 VpIndex;
|
---|
1510 | UINT8 TargetSint;
|
---|
1511 | UINT8 Reserved;
|
---|
1512 | UINT16 FlagNumber;
|
---|
1513 | } WHV_SYNIC_EVENT_PARAMETERS;
|
---|
1514 |
|
---|
1515 | C_ASSERT(sizeof(WHV_SYNIC_EVENT_PARAMETERS) == 8);
|
---|
1516 |
|
---|
1517 | typedef enum WHV_ALLOCATE_VPCI_RESOURCE_FLAGS {
|
---|
1518 | WHvAllocateVpciResourceFlagNone = 0x00000000,
|
---|
1519 | WHvAllocateVpciResourceFlagAllowDirectP2P = 0x00000001
|
---|
1520 | } WHV_ALLOCATE_VPCI_RESOURCE_FLAGS;
|
---|
1521 |
|
---|
1522 | DEFINE_ENUM_FLAG_OPERATORS(WHV_ALLOCATE_VPCI_RESOURCE_FLAGS);
|
---|
1523 |
|
---|
1524 | #define WHV_MAX_DEVICE_ID_SIZE_IN_CHARS 200
|
---|
1525 |
|
---|
1526 | typedef struct WHV_SRIOV_RESOURCE_DESCRIPTOR {
|
---|
1527 | WCHAR PnpInstanceId[WHV_MAX_DEVICE_ID_SIZE_IN_CHARS];
|
---|
1528 | LUID VirtualFunctionId;
|
---|
1529 | UINT16 VirtualFunctionIndex;
|
---|
1530 | UINT16 Reserved;
|
---|
1531 | } WHV_SRIOV_RESOURCE_DESCRIPTOR;
|
---|
1532 |
|
---|
1533 | C_ASSERT(sizeof(WHV_SRIOV_RESOURCE_DESCRIPTOR) == 412);
|
---|
1534 |
|
---|
1535 | typedef enum WHV_VPCI_DEVICE_NOTIFICATION_TYPE {
|
---|
1536 | WHvVpciDeviceNotificationUndefined = 0,
|
---|
1537 | WHvVpciDeviceNotificationMmioRemapping = 1,
|
---|
1538 | WHvVpciDeviceNotificationSurpriseRemoval = 2
|
---|
1539 | } WHV_VPCI_DEVICE_NOTIFICATION_TYPE;
|
---|
1540 |
|
---|
1541 | typedef struct WHV_VPCI_DEVICE_NOTIFICATION {
|
---|
1542 | WHV_VPCI_DEVICE_NOTIFICATION_TYPE NotificationType;
|
---|
1543 | UINT32 Reserved1;
|
---|
1544 | __C89_NAMELESS union {
|
---|
1545 | UINT64 Reserved2;
|
---|
1546 | };
|
---|
1547 | } WHV_VPCI_DEVICE_NOTIFICATION;
|
---|
1548 |
|
---|
1549 | C_ASSERT(sizeof(WHV_VPCI_DEVICE_NOTIFICATION) == 16);
|
---|
1550 |
|
---|
1551 | typedef enum WHV_CREATE_VPCI_DEVICE_FLAGS {
|
---|
1552 | WHvCreateVpciDeviceFlagNone = 0x00000000,
|
---|
1553 | WHvCreateVpciDeviceFlagPhysicallyBacked = 0x00000001,
|
---|
1554 | WHvCreateVpciDeviceFlagUseLogicalInterrupts = 0x00000002
|
---|
1555 | } WHV_CREATE_VPCI_DEVICE_FLAGS;
|
---|
1556 |
|
---|
1557 | DEFINE_ENUM_FLAG_OPERATORS(WHV_CREATE_VPCI_DEVICE_FLAGS);
|
---|
1558 |
|
---|
1559 | typedef enum WHV_VPCI_DEVICE_PROPERTY_CODE {
|
---|
1560 | WHvVpciDevicePropertyCodeUndefined = 0,
|
---|
1561 | WHvVpciDevicePropertyCodeHardwareIDs = 1,
|
---|
1562 | WHvVpciDevicePropertyCodeProbedBARs = 2
|
---|
1563 | } WHV_VPCI_DEVICE_PROPERTY_CODE;
|
---|
1564 |
|
---|
1565 | typedef struct WHV_VPCI_HARDWARE_IDS {
|
---|
1566 | UINT16 VendorID;
|
---|
1567 | UINT16 DeviceID;
|
---|
1568 | UINT8 RevisionID;
|
---|
1569 | UINT8 ProgIf;
|
---|
1570 | UINT8 SubClass;
|
---|
1571 | UINT8 BaseClass;
|
---|
1572 | UINT16 SubVendorID;
|
---|
1573 | UINT16 SubSystemID;
|
---|
1574 | } WHV_VPCI_HARDWARE_IDS;
|
---|
1575 |
|
---|
1576 | C_ASSERT(sizeof(WHV_VPCI_HARDWARE_IDS) == 12);
|
---|
1577 |
|
---|
1578 | #define WHV_VPCI_TYPE0_BAR_COUNT 6
|
---|
1579 |
|
---|
1580 | typedef struct WHV_VPCI_PROBED_BARS {
|
---|
1581 | UINT32 Value[WHV_VPCI_TYPE0_BAR_COUNT];
|
---|
1582 | } WHV_VPCI_PROBED_BARS;
|
---|
1583 |
|
---|
1584 | C_ASSERT(sizeof(WHV_VPCI_PROBED_BARS) == 24);
|
---|
1585 |
|
---|
1586 | typedef enum WHV_VPCI_MMIO_RANGE_FLAGS {
|
---|
1587 | WHvVpciMmioRangeFlagReadAccess = 0x00000001,
|
---|
1588 | WHvVpciMmioRangeFlagWriteAccess = 0x00000002
|
---|
1589 | } WHV_VPCI_MMIO_RANGE_FLAGS;
|
---|
1590 |
|
---|
1591 | DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_MMIO_RANGE_FLAGS);
|
---|
1592 |
|
---|
1593 | typedef enum WHV_VPCI_DEVICE_REGISTER_SPACE {
|
---|
1594 | WHvVpciConfigSpace = -1,
|
---|
1595 | WHvVpciBar0 = 0,
|
---|
1596 | WHvVpciBar1 = 1,
|
---|
1597 | WHvVpciBar2 = 2,
|
---|
1598 | WHvVpciBar3 = 3,
|
---|
1599 | WHvVpciBar4 = 4,
|
---|
1600 | WHvVpciBar5 = 5
|
---|
1601 | } WHV_VPCI_DEVICE_REGISTER_SPACE;
|
---|
1602 |
|
---|
1603 | typedef struct WHV_VPCI_MMIO_MAPPING {
|
---|
1604 | WHV_VPCI_DEVICE_REGISTER_SPACE Location;
|
---|
1605 | WHV_VPCI_MMIO_RANGE_FLAGS Flags;
|
---|
1606 | UINT64 SizeInBytes;
|
---|
1607 | UINT64 OffsetInBytes;
|
---|
1608 | PVOID VirtualAddress;
|
---|
1609 | } WHV_VPCI_MMIO_MAPPING;
|
---|
1610 |
|
---|
1611 | C_ASSERT(sizeof(WHV_VPCI_MMIO_MAPPING) == 32);
|
---|
1612 |
|
---|
1613 | typedef struct WHV_VPCI_DEVICE_REGISTER {
|
---|
1614 | WHV_VPCI_DEVICE_REGISTER_SPACE Location;
|
---|
1615 | UINT32 SizeInBytes;
|
---|
1616 | UINT64 OffsetInBytes;
|
---|
1617 | } WHV_VPCI_DEVICE_REGISTER;
|
---|
1618 |
|
---|
1619 | C_ASSERT(sizeof(WHV_VPCI_DEVICE_REGISTER) == 16);
|
---|
1620 |
|
---|
1621 | typedef enum WHV_VPCI_INTERRUPT_TARGET_FLAGS {
|
---|
1622 | WHvVpciInterruptTargetFlagNone = 0x00000000,
|
---|
1623 | WHvVpciInterruptTargetFlagMulticast = 0x00000001
|
---|
1624 | } WHV_VPCI_INTERRUPT_TARGET_FLAGS;
|
---|
1625 |
|
---|
1626 | DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_INTERRUPT_TARGET_FLAGS);
|
---|
1627 |
|
---|
1628 | typedef struct WHV_VPCI_INTERRUPT_TARGET {
|
---|
1629 | UINT32 Vector;
|
---|
1630 | WHV_VPCI_INTERRUPT_TARGET_FLAGS Flags;
|
---|
1631 | UINT32 ProcessorCount;
|
---|
1632 | UINT32 Processors[ANYSIZE_ARRAY];
|
---|
1633 | } WHV_VPCI_INTERRUPT_TARGET;
|
---|
1634 |
|
---|
1635 | C_ASSERT(sizeof(WHV_VPCI_INTERRUPT_TARGET) == 16);
|
---|
1636 |
|
---|
1637 | typedef enum WHV_TRIGGER_TYPE {
|
---|
1638 | WHvTriggerTypeInterrupt = 0,
|
---|
1639 | WHvTriggerTypeSynicEvent = 1,
|
---|
1640 | WHvTriggerTypeDeviceInterrupt = 2
|
---|
1641 | } WHV_TRIGGER_TYPE;
|
---|
1642 |
|
---|
1643 | typedef struct WHV_TRIGGER_PARAMETERS {
|
---|
1644 | WHV_TRIGGER_TYPE TriggerType;
|
---|
1645 | UINT32 Reserved;
|
---|
1646 | __C89_NAMELESS union {
|
---|
1647 | WHV_INTERRUPT_CONTROL Interrupt;
|
---|
1648 | WHV_SYNIC_EVENT_PARAMETERS SynicEvent;
|
---|
1649 | __C89_NAMELESS struct {
|
---|
1650 | UINT64 LogicalDeviceId;
|
---|
1651 | UINT64 MsiAddress;
|
---|
1652 | UINT32 MsiData;
|
---|
1653 | UINT32 Reserved;
|
---|
1654 | } DeviceInterrupt;
|
---|
1655 | };
|
---|
1656 | } WHV_TRIGGER_PARAMETERS;
|
---|
1657 |
|
---|
1658 | C_ASSERT(sizeof(WHV_TRIGGER_PARAMETERS) == 32);
|
---|
1659 |
|
---|
1660 | typedef PVOID WHV_TRIGGER_HANDLE;
|
---|
1661 |
|
---|
1662 | typedef enum WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE {
|
---|
1663 | WHvVirtualProcessorPropertyCodeNumaNode = 0x00000000
|
---|
1664 | } WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE;
|
---|
1665 |
|
---|
1666 | typedef struct WHV_VIRTUAL_PROCESSOR_PROPERTY {
|
---|
1667 | WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE PropertyCode;
|
---|
1668 | UINT32 Reserved;
|
---|
1669 | __C89_NAMELESS union {
|
---|
1670 | USHORT NumaNode;
|
---|
1671 | UINT64 Padding;
|
---|
1672 | };
|
---|
1673 | } WHV_VIRTUAL_PROCESSOR_PROPERTY;
|
---|
1674 |
|
---|
1675 | C_ASSERT(sizeof(WHV_VIRTUAL_PROCESSOR_PROPERTY) == 16);
|
---|
1676 |
|
---|
1677 | typedef enum WHV_NOTIFICATION_PORT_TYPE {
|
---|
1678 | WHvNotificationPortTypeEvent = 2,
|
---|
1679 | WHvNotificationPortTypeDoorbell = 4
|
---|
1680 | } WHV_NOTIFICATION_PORT_TYPE;
|
---|
1681 |
|
---|
1682 | typedef struct WHV_NOTIFICATION_PORT_PARAMETERS {
|
---|
1683 | WHV_NOTIFICATION_PORT_TYPE NotificationPortType;
|
---|
1684 | UINT32 Reserved;
|
---|
1685 | __C89_NAMELESS union {
|
---|
1686 | WHV_DOORBELL_MATCH_DATA Doorbell;
|
---|
1687 | __C89_NAMELESS struct {
|
---|
1688 | UINT32 ConnectionId;
|
---|
1689 | } Event;
|
---|
1690 | };
|
---|
1691 | } WHV_NOTIFICATION_PORT_PARAMETERS;
|
---|
1692 |
|
---|
1693 | C_ASSERT(sizeof(WHV_NOTIFICATION_PORT_PARAMETERS) == 32);
|
---|
1694 |
|
---|
1695 | typedef enum WHV_NOTIFICATION_PORT_PROPERTY_CODE {
|
---|
1696 | WHvNotificationPortPropertyPreferredTargetVp = 1,
|
---|
1697 | WHvNotificationPortPropertyPreferredTargetDuration = 5
|
---|
1698 | } WHV_NOTIFICATION_PORT_PROPERTY_CODE;
|
---|
1699 |
|
---|
1700 | typedef UINT64 WHV_NOTIFICATION_PORT_PROPERTY;
|
---|
1701 |
|
---|
1702 | #define WHV_ANY_VP (0xFFFFFFFF)
|
---|
1703 |
|
---|
1704 | #define WHV_NOTIFICATION_PORT_PREFERRED_DURATION_MAX (0xFFFFFFFFFFFFFFFFULL)
|
---|
1705 |
|
---|
1706 | typedef PVOID WHV_NOTIFICATION_PORT_HANDLE;
|
---|
1707 |
|
---|
1708 | #define WHV_SYNIC_MESSAGE_SIZE 256
|
---|
1709 |
|
---|
1710 | #endif /* _WINHVAPIDEFS_H_ */
|
---|