VirtualBox

source: vbox/trunk/include/iprt/nt/hyperv.h@ 74517

Last change on this file since 74517 was 74508, checked in by vboxsync, 6 years ago

iprt/nt/hyperv.h: Document some new registers.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 70.5 KB
Line 
1/** @file
2 * Hyper-V related types and definitions.
3 */
4
5/*
6 * Copyright (C) 2018 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26
27#ifndef ___iprt_nt_hyperv_h
28#define ___iprt_nt_hyperv_h
29
30
31#ifndef IN_IDA_PRO
32# include <iprt/types.h>
33# include <iprt/assertcompile.h>
34#else
35# define RT_FLEXIBLE_ARRAY
36# define AssertCompile(expr)
37# define AssertCompileSize(type, size)
38# define AssertCompileMemberOffset(type, member, off)
39#endif
40
41
42/** Hyper-V partition ID. */
43typedef uint64_t HV_PARTITION_ID;
44/** Invalid Hyper-V partition ID. */
45#define HV_PARTITION_ID_INVALID UINT64_C(0)
46/** Hyper-V virtual processor index (== VMCPUID). */
47typedef uint32_t HV_VP_INDEX;
48/** Guest physical address (== RTGCPHYS). */
49typedef uint64_t HV_GPA;
50/** Guest physical page number. */
51typedef uint64_t HV_GPA_PAGE_NUMBER;
52/** System(/parent) physical page number. */
53typedef uint64_t HV_SPA_PAGE_NUMBER;
54/** Hyper-V unsigned 128-bit integer type. */
55typedef struct { uint64_t Low64, High64; } HV_UINT128;
56/** Hyper-V port ID. */
57typedef union
58{
59 uint32_t AsUINT32;
60 struct
61 {
62 uint32_t Id : 24;
63 uint32_t Reserved : 8;
64 };
65} HV_PORT_ID;
66/** Pointer to a Hyper-V port ID. */
67typedef HV_PORT_ID *PHV_PORT_ID;
68
69
70/**
71 * Hypercall IDs.
72 */
73typedef enum
74{
75 HvCallReserved0000 = 0,
76
77 HvCallSwitchVirtualAddressSpace,
78 HvCallFlushVirtualAddressSpace,
79 HvCallFlushVirtualAddressList,
80 HvCallGetLogicalProcessorRunTime,
81 /* 5, 6 & 7 are deprecated / reserved. */
82 HvCallNotifyLongSpinWait = 8,
83 HvCallParkLogicalProcessors, /**< @since v2 */
84 HvCallInvokeHypervisorDebugger, /**< @since v2 - not mentioned in TLFS v5.0b */
85 HvCallSendSyntheticClusterIpi, /**< @since v? */
86 HvCallModifyVtlProtectionMask, /**< @since v? */
87 HvCallEnablePartitionVtl, /**< @since v? */
88 HvCallDisablePartitionVtl, /**< @since v? */
89 HvCallEnableVpVtl, /**< @since v? */
90 HvCallDisableVpVtl, /**< @since v? */
91 HvCallVtlCall, /**< @since v? */
92 HvCallVtlReturn, /**< @since v? */
93 HvCallFlushVirtualAddressSpaceEx, /**< @since v? */
94 HvCallFlushVirtualAddressListEx, /**< @since v? */
95 HvCallSendSyntheticClusterIpiEx, /**< @since v? */
96 /* Reserved: 0x16..0x3f */
97
98 HvCallCreatePartition = 0x40,
99 HvCallInitializePartition,
100 HvCallFinalizePartition,
101 HvCallDeletePartition,
102 HvCallGetPartitionProperty,
103 HvCallSetPartitionProperty,
104 HvCallGetPartitionId,
105 HvCallGetNextChildPartition,
106 HvCallDepositMemory, /**< 0x48 - Repeat call. */
107 HvCallWithdrawMemory, /**< 0x49 - Repeat call. */
108 HvCallGetMemoryBalance,
109 HvCallMapGpaPages, /**< 0X4b - Repeat call. */
110 HvCallUnmapGpaPages, /**< 0X4c - Repeat call. */
111 HvCallInstallIntercept,
112 HvCallCreateVp,
113 HvCallDeleteVp, /**< 0x4f - Fast call. */
114 HvCallGetVpRegisters, /**< 0x50 - Repeat call. */
115 HvCallSetVpRegisters, /**< 0x51 - Repeat call. */
116 HvCallTranslateVirtualAddress,
117 HvCallReadGpa,
118 HvCallWriteGpa,
119 HvCallAssertVirtualInterruptV1,
120 HvCallClearVirtualInterrupt, /**< 0x56 - Fast call. */
121 HvCallCreatePortV1,
122 HvCallDeletePort, /**< 0x58 - Fast call. */
123 HvCallConnectPortV1,
124 HvCallGetPortProperty,
125 HvCallDisconnectPort,
126 HvCallPostMessage,
127 HvCallSignalEvent,
128 HvCallSavePartitionState,
129 HvCallRestorePartitionState,
130 HvCallInitializeEventLogBufferGroup,
131 HvCallFinalizeEventLogBufferGroup,
132 HvCallCreateEventLogBuffer,
133 HvCallDeleteEventLogBuffer,
134 HvCallMapEventLogBuffer,
135 HvCallUnmapEventLogBuffer,
136 HvCallSetEventLogGroupSources,
137 HvCallReleaseEventLogBuffer,
138 HvCallFlushEventLogBuffer,
139 HvCallPostDebugData,
140 HvCallRetrieveDebugData,
141 HvCallResetDebugSession,
142 HvCallMapStatsPage,
143 HvCallUnmapStatsPage,
144 HvCallMapSparseGpaPages, /**< @since v2 */
145 HvCallSetSystemProperty, /**< @since v2 */
146 HvCallSetPortProperty, /**< @since v2 */
147 /* 0x71..0x75 reserved/deprecated (was v2 test IDs). */
148 HvCallAddLogicalProcessor = 0x76,
149 HvCallRemoveLogicalProcessor,
150 HvCallQueryNumaDistance,
151 HvCallSetLogicalProcessorProperty,
152 HvCallGetLogicalProcessorProperty,
153 HvCallGetSystemProperty,
154 HvCallMapDeviceInterrupt,
155 HvCallUnmapDeviceInterrupt,
156 HvCallRetargetDeviceInterrupt,
157 /* 0x7f is reserved. */
158 HvCallMapDevicePages = 0x80,
159 HvCallUnmapDevicePages,
160 HvCallAttachDevice,
161 HvCallDetachDevice,
162 HvCallNotifyStandbyTransition,
163 HvCallPrepareForSleep,
164 HvCallPrepareForHibernate,
165 HvCallNotifyPartitionEvent,
166 HvCallGetLogicalProcessorRegisters,
167 HvCallSetLogicalProcessorRegisters,
168 HvCallQueryAssociatedLpsforMca,
169 HvCallNotifyRingEmpty,
170 HvCallInjectSyntheticMachineCheck,
171 HvCallScrubPartition,
172 HvCallCollectLivedump,
173 HvCallDisableHypervisor,
174 HvCallModifySparseGpaPages,
175 HvCallRegisterInterceptResult,
176 HvCallUnregisterInterceptResult,
177 /* 0x93 is reserved/undocumented. */
178 HvCallAssertVirtualInterrupt = 0x94,
179 HvCallCreatePort,
180 HvCallConnectPort,
181 HvCallGetSpaPageList,
182 /* 0x98 is reserved. */
183 HvCallStartVirtualProcessor = 0x99,
184 HvCallGetVpIndexFromApicId,
185 /* 0x9b..0xae are reserved/undocumented.
186 0xad: New version of HvCallGetVpRegisters? Perhaps on logical CPU or smth. */
187 HvCallFlushGuestPhysicalAddressSpace = 0xaf,
188 HvCallFlushGuestPhysicalAddressList,
189 /* 0xb1..0xb4 are unknown */
190 HvCallCreateCpuGroup = 0xb5,
191 HvCallDeleteCpuGroup,
192 HvCallGetCpuGroupProperty,
193 HvCallSetCpuGroupProperty,
194 HvCallGetCpuGroupAffinit,
195 HvCallGetNextCpuGroup = 0xba,
196 HvCallGetNextCpuGroupPartition,
197 HvCallPrecommitGpaPages = 0xbe,
198 HvCallUncommitGpaPages, /**< Happens when VidDestroyGpaRangeCheckSecure/WHvUnmapGpaRange is called. */
199 /* 0xc0..0xcb are unknown */
200 HvCallVpRunloopRelated = 0xc2, /**< Fast */
201 HvCallQueryVtlProtectionMaskRange = 0xcc,
202 HvCallModifyVtlProtectionMaskRange,
203 /* 0xce..0xd1 are unknown */
204 HvCallAcquireSparseGpaPageHostAccess = 0xd2,
205 HvCallReleaseSparseGpaPageHostAccess,
206 HvCallCheckSparseGpaPageVtlAccess,
207 HvCallAcquireSparseSpaPageHostAccess = 0xd7,
208 HvCallReleaseSparseSpaPageHostAccess,
209 HvCallAcceptGpaPages, /**< 0x18 byte input, zero rep, no output. */
210
211 /** Number of defined hypercalls (varies with version). */
212 HvCallCount
213} HV_CALL_CODE;
214AssertCompile(HvCallSendSyntheticClusterIpiEx == 0x15);
215AssertCompile(HvCallMapGpaPages == 0x4b);
216AssertCompile(HvCallSetPortProperty == 0x70);
217AssertCompile(HvCallRetargetDeviceInterrupt == 0x7e);
218AssertCompile(HvCallUnregisterInterceptResult == 0x92);
219AssertCompile(HvCallGetSpaPageList == 0x97);
220AssertCompile(HvCallFlushGuestPhysicalAddressList == 0xb0);
221AssertCompile(HvCallUncommitGpaPages == 0xbf);
222AssertCompile(HvCallCount == 0xda);
223
224/** Makes the first parameter to a hypercall (rcx). */
225#define HV_MAKE_CALL_INFO(a_enmCallCode, a_cReps) ( (uint64_t)(a_enmCallCode) | ((uint64_t)(a_cReps) << 32) )
226/** Makes the return value (success) for a rep hypercall. */
227#define HV_MAKE_CALL_REP_RET(a_cReps) ((uint64_t)(a_cReps) << 32)
228
229/** Hypercall status code. */
230typedef uint16_t HV_STATUS;
231
232/** @name Hyper-V Hypercall status codes
233 * @{ */
234#define HV_STATUS_SUCCESS (0x0000)
235#define HV_STATUS_RESERVED_1 (0x0001)
236#define HV_STATUS_INVALID_HYPERCALL_CODE (0x0002)
237#define HV_STATUS_INVALID_HYPERCALL_INPUT (0x0003)
238#define HV_STATUS_INVALID_ALIGNMENT (0x0004)
239#define HV_STATUS_INVALID_PARAMETER (0x0005)
240#define HV_STATUS_ACCESS_DENIED (0x0006)
241#define HV_STATUS_INVALID_PARTITION_STATE (0x0007)
242#define HV_STATUS_OPERATION_DENIED (0x0008)
243#define HV_STATUS_UNKNOWN_PROPERTY (0x0009)
244#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE (0x000a)
245#define HV_STATUS_INSUFFICIENT_MEMORY (0x000b)
246#define HV_STATUS_PARTITION_TOO_DEEP (0x000c)
247#define HV_STATUS_INVALID_PARTITION_ID (0x000d)
248#define HV_STATUS_INVALID_VP_INDEX (0x000e)
249#define HV_STATUS_RESERVED_F (0x000f)
250#define HV_STATUS_NOT_FOUND (0x0010)
251#define HV_STATUS_INVALID_PORT_ID (0x0011)
252#define HV_STATUS_INVALID_CONNECTION_ID (0x0012)
253#define HV_STATUS_INSUFFICIENT_BUFFERS (0x0013)
254#define HV_STATUS_NOT_ACKNOWLEDGED (0x0014)
255#define HV_STATUS_INVALID_VP_STATE (0x0015)
256#define HV_STATUS_ACKNOWLEDGED (0x0016)
257#define HV_STATUS_INVALID_SAVE_RESTORE_STATE (0x0017)
258#define HV_STATUS_INVALID_SYNIC_STATE (0x0018)
259#define HV_STATUS_OBJECT_IN_USE (0x0019)
260#define HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO (0x001a)
261#define HV_STATUS_NO_DATA (0x001b)
262#define HV_STATUS_INACTIVE (0x001c)
263#define HV_STATUS_NO_RESOURCES (0x001d)
264#define HV_STATUS_FEATURE_UNAVAILABLE (0x001e)
265#define HV_STATUS_PARTIAL_PACKET (0x001f)
266#define HV_STATUS_PROCESSOR_FEATURE_SSE3_NOT_SUPPORTED (0x0020)
267#define HV_STATUS_PROCESSOR_FEATURE_LAHFSAHF_NOT_SUPPORTED (0x0021)
268#define HV_STATUS_PROCESSOR_FEATURE_SSSE3_NOT_SUPPORTED (0x0022)
269#define HV_STATUS_PROCESSOR_FEATURE_SSE4_1_NOT_SUPPORTED (0x0023)
270#define HV_STATUS_PROCESSOR_FEATURE_SSE4_2_NOT_SUPPORTED (0x0024)
271#define HV_STATUS_PROCESSOR_FEATURE_SSE4A_NOT_SUPPORTED (0x0025)
272#define HV_STATUS_PROCESSOR_FEATURE_XOP_NOT_SUPPORTED (0x0026)
273#define HV_STATUS_PROCESSOR_FEATURE_POPCNT_NOT_SUPPORTED (0x0027)
274#define HV_STATUS_PROCESSOR_FEATURE_CMPXCHG16B_NOT_SUPPORTED (0x0028)
275#define HV_STATUS_PROCESSOR_FEATURE_ALTMOVCR8_NOT_SUPPORTED (0x0029)
276#define HV_STATUS_PROCESSOR_FEATURE_LZCNT_NOT_SUPPORTED (0x002a)
277#define HV_STATUS_PROCESSOR_FEATURE_MISALIGNED_SSE_NOT_SUPPORTED (0x002b)
278#define HV_STATUS_PROCESSOR_FEATURE_MMX_EXT_NOT_SUPPORTED (0x002c)
279#define HV_STATUS_PROCESSOR_FEATURE_3DNOW_NOT_SUPPORTED (0x002d)
280#define HV_STATUS_PROCESSOR_FEATURE_EXTENDED_3DNOW_NOT_SUPPORTED (0x002e)
281#define HV_STATUS_PROCESSOR_FEATURE_PAGE_1GB_NOT_SUPPORTED (0x002f)
282#define HV_STATUS_PROCESSOR_CACHE_LINE_FLUSH_SIZE_INCOMPATIBLE (0x0030)
283#define HV_STATUS_PROCESSOR_FEATURE_XSAVE_NOT_SUPPORTED (0x0031)
284#define HV_STATUS_PROCESSOR_FEATURE_XSAVEOPT_NOT_SUPPORTED (0x0032)
285#define HV_STATUS_INSUFFICIENT_BUFFER (0x0033)
286#define HV_STATUS_PROCESSOR_FEATURE_XSAVE_AVX_NOT_SUPPORTED (0x0034)
287#define HV_STATUS_PROCESSOR_FEATURE_XSAVE_ FEATURE_NOT_SUPPORTED (0x0035)
288#define HV_STATUS_PROCESSOR_XSAVE_SAVE_AREA_INCOMPATIBLE (0x0036)
289#define HV_STATUS_INCOMPATIBLE_PROCESSOR (0x0037)
290#define HV_STATUS_INSUFFICIENT_DEVICE_DOMAINS (0x0038)
291#define HV_STATUS_PROCESSOR_FEATURE_AES_NOT_SUPPORTED (0x0039)
292#define HV_STATUS_PROCESSOR_FEATURE_PCLMULQDQ_NOT_SUPPORTED (0x003a)
293#define HV_STATUS_PROCESSOR_FEATURE_INCOMPATIBLE_XSAVE_FEATURES (0x003b)
294#define HV_STATUS_CPUID_FEATURE_VALIDATION_ERROR (0x003c)
295#define HV_STATUS_CPUID_XSAVE_FEATURE_VALIDATION_ERROR (0x003d)
296#define HV_STATUS_PROCESSOR_STARTUP_TIMEOUT (0x003e)
297#define HV_STATUS_SMX_ENABLED (0x003f)
298#define HV_STATUS_PROCESSOR_FEATURE_PCID_NOT_SUPPORTED (0x0040)
299#define HV_STATUS_INVALID_LP_INDEX (0x0041)
300#define HV_STATUS_FEATURE_FMA4_NOT_SUPPORTED (0x0042)
301#define HV_STATUS_FEATURE_F16C_NOT_SUPPORTED (0x0043)
302#define HV_STATUS_PROCESSOR_FEATURE_RDRAND_NOT_SUPPORTED (0x0044)
303#define HV_STATUS_PROCESSOR_FEATURE_RDWRFSGS_NOT_SUPPORTED (0x0045)
304#define HV_STATUS_PROCESSOR_FEATURE_SMEP_NOT_SUPPORTED (0x0046)
305#define HV_STATUS_PROCESSOR_FEATURE_ENHANCED_FAST_STRING_NOT_SUPPORTED (0x0047)
306#define HV_STATUS_PROCESSOR_FEATURE_MOVBE_NOT_SUPPORTED (0x0048)
307#define HV_STATUS_PROCESSOR_FEATURE_BMI1_NOT_SUPPORTED (0x0049)
308#define HV_STATUS_PROCESSOR_FEATURE_BMI2_NOT_SUPPORTED (0x004a)
309#define HV_STATUS_PROCESSOR_FEATURE_HLE_NOT_SUPPORTED (0x004b)
310#define HV_STATUS_PROCESSOR_FEATURE_RTM_NOT_SUPPORTED (0x004c)
311#define HV_STATUS_PROCESSOR_FEATURE_XSAVE_FMA_NOT_SUPPORTED (0x004d)
312#define HV_STATUS_PROCESSOR_FEATURE_XSAVE_AVX2_NOT_SUPPORTED (0x004e)
313#define HV_STATUS_PROCESSOR_FEATURE_NPIEP1_NOT_SUPPORTED (0x004f)
314#define HV_STATUS_INVALID_REGISTER_VALUE (0x0050)
315#define HV_STATUS_PROCESSOR_FEATURE_RDSEED_NOT_SUPPORTED (0x0052)
316#define HV_STATUS_PROCESSOR_FEATURE_ADX_NOT_SUPPORTED (0x0053)
317#define HV_STATUS_PROCESSOR_FEATURE_SMAP_NOT_SUPPORTED (0x0054)
318#define HV_STATUS_NX_NOT_DETECTED (0x0055)
319#define HV_STATUS_PROCESSOR_FEATURE_INTEL_PREFETCH_NOT_SUPPORTED (0x0056)
320#define HV_STATUS_INVALID_DEVICE_ID (0x0057)
321#define HV_STATUS_INVALID_DEVICE_STATE (0x0058)
322#define HV_STATUS_PENDING_PAGE_REQUESTS (0x0059)
323#define HV_STATUS_PAGE_REQUEST_INVALID (0x0060)
324#define HV_STATUS_OPERATION_FAILED (0x0071)
325#define HV_STATUS_NOT_ALLOWED_WITH_NESTED_VIRT_ACTIVE (0x0072)
326/** @} */
327
328
329/** Hyper-V partition property value. */
330typedef uint64_t HV_PARTITION_PROPERTY;
331/** Pointer to a partition property value. */
332typedef HV_PARTITION_PROPERTY *PHV_PARTITION_PROPERTY;
333/**
334 * Hyper-V partition property code.
335 * This is documented in TLFS, except version 5.x.
336 */
337typedef enum
338{
339 HvPartitionPropertyPrivilegeFlags = 0x00010000,
340
341 HvPartitionPropertyCpuReserve = 0x00020001,
342 HvPartitionPropertyCpuCap,
343 HvPartitionPropertyCpuWeight,
344 HvPartitionPropertyUnknown20004, /**< On exo partition (build 17134), initial value zero. */
345
346 HvPartitionPropertyEmulatedTimerPeriod = 0x00030000, /**< @note Fails on exo partition (build 17134). */
347 HvPartitionPropertyEmulatedTimerControl, /**< @note Fails on exo partition (build 17134). */
348 HvPartitionPropertyPmTimerAssist, /**< @note Fails on exo partition (build 17134). */
349
350 HvPartitionPropertyDebugChannelId = 0x00040000, /**< @note Hangs system on exo partition hangs (build 17134). */
351
352 HvPartitionPropertyVirtualTlbPageCount = 0x00050000,
353 HvPartitionPropertyUnknown50001, /**< On exo partition (build 17134), initial value zero. */
354 HvPartitionPropertyUnknown50002, /**< On exo partition (build 17134), initial value zero. */
355 HvPartitionPropertyUnknown50003, /**< On exo partition (build 17134), initial value zero. */
356 HvPartitionPropertyUnknown50004, /**< On exo partition (build 17134), initial value zero. */
357 HvPartitionPropertyUnknown50005, /**< On exo partition (build 17134), initial value one. */
358 HvPartitionPropertyUnknown50006, /**< On exo partition (build 17134), initial value zero. */
359
360 HvPartitionPropertyProcessorVendor = 0x00060000,
361 HvPartitionPropertyProcessorFeatures, /**< On exo/17134/threadripper: 0x6cb26f39fbf */
362 HvPartitionPropertyProcessorXsaveFeatures,
363 HvPartitionPropertyProcessorCLFlushSize, /**< On exo/17134/threadripper: 8 */
364 HvPartitionPropertyUnknown60004, /**< On exo partition (build 17134), initial value zero. */
365 HvPartitionPropertyUnknown60005, /**< On exo partition (build 17134), initial value 0x603. */
366 HvPartitionPropertyUnknown60006, /**< On exo partition (build 17134), initial value 0x2c. */
367
368 HvPartitionPropertyGuestOsId = 0x00070000, /**< @since v4 */
369
370 HvPartitionPropertyUnknown800000 = 0x00080000 /**< On exo partition (build 17134), initial value zero. */
371} HV_PARTITION_PROPERTY_CODE;
372AssertCompileSize(HV_PARTITION_PROPERTY_CODE, 4);
373/** Pointer to a partition property code. */
374typedef HV_PARTITION_PROPERTY_CODE *PHV_PARTITION_PROPERTY_CODE;
375
376
377/** Input for HvCallGetPartitionProperty. */
378typedef struct
379{
380 HV_PARTITION_ID PartitionId;
381 HV_PARTITION_PROPERTY_CODE PropertyCode;
382 uint32_t uPadding;
383} HV_INPUT_GET_PARTITION_PROPERTY;
384AssertCompileSize(HV_INPUT_GET_PARTITION_PROPERTY, 16);
385/** Pointer to input for HvCallGetPartitionProperty. */
386typedef HV_INPUT_GET_PARTITION_PROPERTY *PHV_INPUT_GET_PARTITION_PROPERTY;
387
388/** Output for HvCallGetPartitionProperty. */
389typedef struct
390{
391 HV_PARTITION_PROPERTY PropertyValue;
392} HV_OUTPUT_GET_PARTITION_PROPERTY;
393/** Pointer to output for HvCallGetPartitionProperty. */
394typedef HV_OUTPUT_GET_PARTITION_PROPERTY *PHV_OUTPUT_GET_PARTITION_PROPERTY;
395
396
397/** Input for HvCallSetPartitionProperty. */
398typedef struct
399{
400 HV_PARTITION_ID PartitionId;
401 HV_PARTITION_PROPERTY_CODE PropertyCode;
402 uint32_t uPadding;
403 HV_PARTITION_PROPERTY PropertyValue;
404} HV_INPUT_SET_PARTITION_PROPERTY;
405AssertCompileSize(HV_INPUT_SET_PARTITION_PROPERTY, 24);
406/** Pointer to input for HvCallSetPartitionProperty. */
407typedef HV_INPUT_SET_PARTITION_PROPERTY *PHV_INPUT_SET_PARTITION_PROPERTY;
408
409
410/** Hyper-V NUMA node ID.
411 * On systems without NUMA, i.e. a single node, it uses 0 as identifier. */
412typedef uint32_t HV_PROXIMITY_DOMAIN_ID;
413/** Pointer to NUMA node ID. */
414typedef HV_PROXIMITY_DOMAIN_ID *PHV_PROXIMITY_DOMAIN_ID;
415
416/** Hyper-V NUMA flags. */
417typedef struct
418{
419 uint32_t ProximityPreferred : 1; /**< When set, allocations may come from other NUMA nodes. */
420 uint32_t Reserved : 30; /**< Reserved for future (as of circa v2). */
421 uint32_t ProxyimityInfoValid : 1; /**< Set if the NUMA information is valid. */
422} HV_PROXIMITY_DOMAIN_FLAGS;
423/** Pointer to Hyper-V NUMA flags. */
424typedef HV_PROXIMITY_DOMAIN_FLAGS *PHV_PROXIMITY_DOMAIN_FLAGS;
425
426/** Hyper-V NUMA information. */
427typedef struct
428{
429 HV_PROXIMITY_DOMAIN_ID Id; /**< NUMA node identifier. */
430 HV_PROXIMITY_DOMAIN_FLAGS Flags; /**< NUMA flags. */
431} HV_PROXIMITY_DOMAIN_INFO;
432/** Pointer to Hyper-V NUMA information. */
433typedef HV_PROXIMITY_DOMAIN_INFO *PHV_PROXIMITY_DOMAIN_INFO;
434
435/** Input for HvCallGetMemoryBalance. */
436typedef struct
437{
438 HV_PARTITION_ID TargetPartitionId;
439 HV_PROXIMITY_DOMAIN_INFO ProximityDomainInfo;
440} HV_INPUT_GET_MEMORY_BALANCE;
441AssertCompileSize(HV_INPUT_GET_MEMORY_BALANCE, 16);
442/** Pointer to the input for HvCallGetMemoryBalance. */
443typedef HV_INPUT_GET_MEMORY_BALANCE *PHV_INPUT_GET_MEMORY_BALANCE;
444
445/** Output for HvCallGetMemoryBalance. */
446typedef struct
447{
448 uint64_t PagesAvailable;
449 uint64_t PagesInUse;
450} HV_OUTPUT_GET_MEMORY_BALANCE;
451/** Pointer to the output for HvCallGetMemoryBalance. */
452typedef HV_OUTPUT_GET_MEMORY_BALANCE *PHV_OUTPUT_GET_MEMORY_BALANCE;
453
454
455/** @name Flags used with HvCallMapGpaPages and HvCallMapSparseGpaPages.
456 * @note There seems to be a more flags defined after v2.
457 * @{ */
458typedef uint32_t HV_MAP_GPA_FLAGS;
459#define HV_MAP_GPA_READABLE UINT32_C(0x0001)
460#define HV_MAP_GPA_WRITABLE UINT32_C(0x0002)
461#define HV_MAP_GPA_EXECUTABLE UINT32_C(0x0004)
462/** Seems this have to be set when HV_MAP_GPA_EXECUTABLE is (17101). */
463#define HV_MAP_GPA_EXECUTABLE_AGAIN UINT32_C(0x0008)
464/** Dunno what this is yet, but it requires HV_MAP_GPA_DUNNO_1000.
465 * The readable bit gets put here when both HV_MAP_GPA_DUNNO_1000 and
466 * HV_MAP_GPA_DUNNO_MASK_0700 are clear. */
467#define HV_MAP_GPA_DUNNO_ACCESS UINT32_C(0x0010)
468/** Guess work. */
469#define HV_MAP_GPA_MAYBE_ACCESS_MASK UINT32_C(0x001f)
470/** Some kind of mask. */
471#define HV_MAP_GPA_DUNNO_MASK_0700 UINT32_C(0x0700)
472/** Dunno what this is, but required for HV_MAP_GPA_DUNNO_ACCESS. */
473#define HV_MAP_GPA_DUNNO_1000 UINT32_C(0x1000)
474/** Working with large 2MB pages. */
475#define HV_MAP_GPA_LARGE UINT32_C(0x2000)
476/** Valid mask as per build 17101. */
477#define HV_MAP_GPA_VALID_MASK UINT32_C(0x7f1f)
478/** @} */
479
480/** Input for HvCallMapGpaPages. */
481typedef struct
482{
483 HV_PARTITION_ID TargetPartitionId;
484 HV_GPA_PAGE_NUMBER TargetGpaBase;
485 HV_MAP_GPA_FLAGS MapFlags;
486 uint32_t u32ExplicitPadding;
487 /* The repeating part: */
488 HV_SPA_PAGE_NUMBER PageList[RT_FLEXIBLE_ARRAY];
489} HV_INPUT_MAP_GPA_PAGES;
490AssertCompileMemberOffset(HV_INPUT_MAP_GPA_PAGES, PageList, 24);
491/** Pointer to the input for HvCallMapGpaPages. */
492typedef HV_INPUT_MAP_GPA_PAGES *PHV_INPUT_MAP_GPA_PAGES;
493
494
495/** A parent to guest mapping pair for HvCallMapSparseGpaPages. */
496typedef struct
497{
498 HV_GPA_PAGE_NUMBER TargetGpaPageNumber;
499 HV_SPA_PAGE_NUMBER SourceSpaPageNumber;
500} HV_GPA_MAPPING;
501/** Pointer to a parent->guest mapping pair for HvCallMapSparseGpaPages. */
502typedef HV_GPA_MAPPING *PHV_GPA_MAPPING;
503
504/** Input for HvCallMapSparseGpaPages. */
505typedef struct
506{
507 HV_PARTITION_ID TargetPartitionId;
508 HV_MAP_GPA_FLAGS MapFlags;
509 uint32_t u32ExplicitPadding;
510 /* The repeating part: */
511 HV_GPA_MAPPING PageList[RT_FLEXIBLE_ARRAY];
512} HV_INPUT_MAP_SPARSE_GPA_PAGES;
513AssertCompileMemberOffset(HV_INPUT_MAP_SPARSE_GPA_PAGES, PageList, 16);
514/** Pointer to the input for HvCallMapSparseGpaPages. */
515typedef HV_INPUT_MAP_SPARSE_GPA_PAGES *PHV_INPUT_MAP_SPARSE_GPA_PAGES;
516
517
518/** Input for HvCallUnmapGpaPages. */
519typedef struct
520{
521 HV_PARTITION_ID TargetPartitionId;
522 HV_GPA_PAGE_NUMBER TargetGpaBase;
523 /** This field is either an omission in the 7600 WDK or a later additions.
524 * Anyway, not quite sure what it does. Bit 2 seems to indicate 2MB pages. */
525 uint64_t fFlags;
526} HV_INPUT_UNMAP_GPA_PAGES;
527AssertCompileSize(HV_INPUT_UNMAP_GPA_PAGES, 24);
528/** Pointer to the input for HvCallUnmapGpaPages. */
529typedef HV_INPUT_UNMAP_GPA_PAGES *PHV_INPUT_UNMAP_GPA_PAGES;
530
531
532
533/** Cache types used by HvCallReadGpa and HvCallWriteGpa. */
534typedef enum
535{
536 HvCacheTypeX64Uncached = 0,
537 HvCacheTypeX64WriteCombining,
538 /* 2 & 3 are undefined. */
539 HvCacheTypeX64WriteThrough = 4,
540 HvCacheTypeX64WriteProtected,
541 HvCacheTypeX64WriteBack
542} HV_CACHE_TYPE;
543
544/** Control flags for HvCallReadGpa and HvCallWriteGpa. */
545typedef union
546{
547 uint64_t AsUINT64;
548 struct
549 {
550 uint64_t CacheType : 8; /**< HV_CACHE_TYPE */
551 uint64_t Reserved : 56;
552 };
553} HV_ACCESS_GPA_CONTROL_FLAGS;
554
555/** Results codes for HvCallReadGpa and HvCallWriteGpa. */
556typedef enum
557{
558 HvAccessGpaSuccess = 0,
559 HvAccessGpaUnmapped,
560 HvAccessGpaReadIntercept,
561 HvAccessGpaWriteIntercept,
562 HvAccessGpaIllegalOverlayAccess
563} HV_ACCESS_GPA_RESULT_CODE;
564
565/** The result of HvCallReadGpa and HvCallWriteGpa. */
566typedef union
567{
568 uint64_t AsUINT64;
569 struct
570 {
571 HV_ACCESS_GPA_RESULT_CODE ResultCode;
572 uint32_t Reserved;
573 };
574} HV_ACCESS_GPA_RESULT;
575
576
577/** Input for HvCallReadGpa. */
578typedef struct
579{
580 HV_PARTITION_ID PartitionId;
581 HV_VP_INDEX VpIndex;
582 uint32_t ByteCount;
583 HV_GPA BaseGpa;
584 HV_ACCESS_GPA_CONTROL_FLAGS ControlFlags;
585} HV_INPUT_READ_GPA;
586AssertCompileSize(HV_INPUT_READ_GPA, 32);
587/** Pointer to the input for HvCallReadGpa. */
588typedef HV_INPUT_READ_GPA *PHV_INPUT_READ_GPA;
589
590/** Output for HvCallReadGpa. */
591typedef struct
592{
593 HV_ACCESS_GPA_RESULT AccessResult;
594 uint8_t Data[16];
595} HV_OUTPUT_READ_GPA;
596AssertCompileSize(HV_OUTPUT_READ_GPA, 24);
597/** Pointer to the output for HvCallReadGpa. */
598typedef HV_OUTPUT_READ_GPA *PHV_OUTPUT_READ_GPA;
599
600
601/** Input for HvCallWriteGpa. */
602typedef struct
603{
604 HV_PARTITION_ID PartitionId;
605 HV_VP_INDEX VpIndex;
606 uint32_t ByteCount;
607 HV_GPA BaseGpa;
608 HV_ACCESS_GPA_CONTROL_FLAGS ControlFlags;
609 uint8_t Data[16];
610} HV_INPUT_WRITE_GPA;
611AssertCompileSize(HV_INPUT_READ_GPA, 32);
612/** Pointer to the input for HvCallWriteGpa. */
613typedef HV_INPUT_READ_GPA *PHV_INPUT_READ_GPA;
614
615/** Output for HvCallWriteGpa. */
616typedef struct
617{
618 HV_ACCESS_GPA_RESULT AccessResult;
619} HV_OUTPUT_WRITE_GPA;
620AssertCompileSize(HV_OUTPUT_WRITE_GPA, 8);
621/** Pointer to the output for HvCallWriteGpa. */
622typedef HV_OUTPUT_WRITE_GPA *PHV_OUTPUT_WRITE_GPA;
623
624
625/**
626 * Register names used by HvCallGetVpRegisters and HvCallSetVpRegisters.
627 */
628typedef enum _HV_REGISTER_NAME
629{
630 HvRegisterExplicitSuspend = 0x00000000,
631 HvRegisterInterceptSuspend,
632 HvRegisterUnknown02, /**< Reads as 0 initially on exo part. */
633 HvRegisterUnknown03, /**< Reads as 0 initially on exo part. */
634 HvRegisterInternalActivityState, /**< @since about build 17758 */
635
636 HvRegisterHypervisorVersion = 0x00000100, /**< @since v5 @note Not readable on exo part. */
637
638 HvRegisterPrivilegesAndFeaturesInfo = 0x00000200, /**< @since v5 @note Not readable on exo part. */
639 HvRegisterFeaturesInfo, /**< @since v5 @note Not readable on exo part. */
640 HvRegisterImplementationLimitsInfo, /**< @since v5 @note Not readable on exo part. */
641 HvRegisterHardwareFeaturesInfo, /**< @since v5 @note Not readable on exo part. */
642
643 HvRegisterGuestCrashP0 = 0x00000210, /**< @since v5 @note Not readable on exo part. */
644 HvRegisterGuestCrashP1, /**< @since v5 @note Not readable on exo part. */
645 HvRegisterGuestCrashP2, /**< @since v5 @note Not readable on exo part. */
646 HvRegisterGuestCrashP3, /**< @since v5 @note Not readable on exo part. */
647 HvRegisterGuestCrashP4, /**< @since v5 @note Not readable on exo part. */
648 HvRegisterGuestCrashCtl, /**< @since v5 @note Not readable on exo part. */
649
650 HvRegisterPowerStateConfigC1 = 0x00000220, /**< @since v5 @note Not readable on exo part. */
651 HvRegisterPowerStateTriggerC1, /**< @since v5 @note Not readable on exo part. */
652 HvRegisterPowerStateConfigC2, /**< @since v5 @note Not readable on exo part. */
653 HvRegisterPowerStateTriggerC2, /**< @since v5 @note Not readable on exo part. */
654 HvRegisterPowerStateConfigC3, /**< @since v5 @note Not readable on exo part. */
655 HvRegisterPowerStateTriggerC3, /**< @since v5 @note Not readable on exo part. */
656
657 HvRegisterSystemReset = 0x00000230, /**< @since v5 @note Not readable on exo part. */
658
659 HvRegisterProcessorClockFrequency = 0x00000240, /**< @since v5 @note Not readable on exo part. */
660 HvRegisterInterruptClockFrequency, /**< @since v5 @note Not readable on exo part. */
661
662 HvRegisterGuestIdle = 0x00000250, /**< @since v5 @note Not readable on exo part. */
663
664 HvRegisterDebugDeviceOptions = 0x00000260, /**< @since v5 @note Not readable on exo part. */
665
666 HvRegisterPendingInterruption = 0x00010002,
667 HvRegisterInterruptState,
668 HvRegisterPendingEvent0, /**< @since v5 */
669 HvRegisterPendingEvent1, /**< @since v5 */
670 HvX64RegisterDeliverabilityNotifications, /**< @since v5c? Late 2017? */
671
672 HvX64RegisterRax = 0x00020000,
673 HvX64RegisterRcx,
674 HvX64RegisterRdx,
675 HvX64RegisterRbx,
676 HvX64RegisterRsp,
677 HvX64RegisterRbp,
678 HvX64RegisterRsi,
679 HvX64RegisterRdi,
680 HvX64RegisterR8,
681 HvX64RegisterR9,
682 HvX64RegisterR10,
683 HvX64RegisterR11,
684 HvX64RegisterR12,
685 HvX64RegisterR13,
686 HvX64RegisterR14,
687 HvX64RegisterR15,
688 HvX64RegisterRip,
689 HvX64RegisterRflags,
690
691 HvX64RegisterXmm0 = 0x00030000,
692 HvX64RegisterXmm1,
693 HvX64RegisterXmm2,
694 HvX64RegisterXmm3,
695 HvX64RegisterXmm4,
696 HvX64RegisterXmm5,
697 HvX64RegisterXmm6,
698 HvX64RegisterXmm7,
699 HvX64RegisterXmm8,
700 HvX64RegisterXmm9,
701 HvX64RegisterXmm10,
702 HvX64RegisterXmm11,
703 HvX64RegisterXmm12,
704 HvX64RegisterXmm13,
705 HvX64RegisterXmm14,
706 HvX64RegisterXmm15,
707 HvX64RegisterFpMmx0,
708 HvX64RegisterFpMmx1,
709 HvX64RegisterFpMmx2,
710 HvX64RegisterFpMmx3,
711 HvX64RegisterFpMmx4,
712 HvX64RegisterFpMmx5,
713 HvX64RegisterFpMmx6,
714 HvX64RegisterFpMmx7,
715 HvX64RegisterFpControlStatus,
716 HvX64RegisterXmmControlStatus,
717
718 HvX64RegisterCr0 = 0x00040000,
719 HvX64RegisterCr2,
720 HvX64RegisterCr3,
721 HvX64RegisterCr4,
722 HvX64RegisterCr8,
723 HvX64RegisterXfem,
724
725 HvX64RegisterIntermediateCr0 = 0x00041000, /**< @since v5 */
726 HvX64RegisterIntermediateCr4 = 0x00041003, /**< @since v5 */
727 HvX64RegisterIntermediateCr8, /**< @since v5 */
728
729 HvX64RegisterDr0 = 0x00050000,
730 HvX64RegisterDr1,
731 HvX64RegisterDr2,
732 HvX64RegisterDr3,
733 HvX64RegisterDr6,
734 HvX64RegisterDr7,
735
736 HvX64RegisterEs = 0x00060000,
737 HvX64RegisterCs,
738 HvX64RegisterSs,
739 HvX64RegisterDs,
740 HvX64RegisterFs,
741 HvX64RegisterGs,
742 HvX64RegisterLdtr,
743 HvX64RegisterTr,
744
745 HvX64RegisterIdtr = 0x00070000,
746 HvX64RegisterGdtr,
747
748 HvX64RegisterTsc = 0x00080000,
749 HvX64RegisterEfer,
750 HvX64RegisterKernelGsBase,
751 HvX64RegisterApicBase,
752 HvX64RegisterPat,
753 HvX64RegisterSysenterCs,
754 HvX64RegisterSysenterEip,
755 HvX64RegisterSysenterEsp,
756 HvX64RegisterStar,
757 HvX64RegisterLstar,
758 HvX64RegisterCstar,
759 HvX64RegisterSfmask,
760 HvX64RegisterInitialApicId,
761
762 HvX64RegisterMtrrCap, /**< Not readable in exo partitions? */
763 HvX64RegisterMtrrDefType,
764
765 HvX64RegisterMtrrPhysBase0 = 0x00080010,
766 HvX64RegisterMtrrPhysBase1,
767 HvX64RegisterMtrrPhysBase2,
768 HvX64RegisterMtrrPhysBase3,
769 HvX64RegisterMtrrPhysBase4,
770 HvX64RegisterMtrrPhysBase5,
771 HvX64RegisterMtrrPhysBase6,
772 HvX64RegisterMtrrPhysBase7,
773 HvX64RegisterMtrrPhysBase8, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
774 HvX64RegisterMtrrPhysBase9, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
775 HvX64RegisterMtrrPhysBaseA, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
776 HvX64RegisterMtrrPhysBaseB, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
777 HvX64RegisterMtrrPhysBaseC, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
778 HvX64RegisterMtrrPhysBaseD, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
779 HvX64RegisterMtrrPhysBaseE, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
780 HvX64RegisterMtrrPhysBaseF, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
781
782 HvX64RegisterMtrrPhysMask0 = 0x00080040,
783 HvX64RegisterMtrrPhysMask1,
784 HvX64RegisterMtrrPhysMask2,
785 HvX64RegisterMtrrPhysMask3,
786 HvX64RegisterMtrrPhysMask4,
787 HvX64RegisterMtrrPhysMask5,
788 HvX64RegisterMtrrPhysMask6,
789 HvX64RegisterMtrrPhysMask7,
790 HvX64RegisterMtrrPhysMask8, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
791 HvX64RegisterMtrrPhysMask9, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
792 HvX64RegisterMtrrPhysMaskA, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
793 HvX64RegisterMtrrPhysMaskB, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
794 HvX64RegisterMtrrPhysMaskC, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
795 HvX64RegisterMtrrPhysMaskD, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
796 HvX64RegisterMtrrPhysMaskE, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
797 HvX64RegisterMtrrPhysMaskF, /**< @since v4 @note Appears not to be readable on exo partition (Threadripper). */
798
799 HvX64RegisterMtrrFix64k00000 = 0x00080070,
800 HvX64RegisterMtrrFix16k80000,
801 HvX64RegisterMtrrFix16kA0000,
802 HvX64RegisterMtrrFix4kC0000,
803 HvX64RegisterMtrrFix4kC8000,
804 HvX64RegisterMtrrFix4kD0000,
805 HvX64RegisterMtrrFix4kD8000,
806 HvX64RegisterMtrrFix4kE0000,
807 HvX64RegisterMtrrFix4kE8000,
808 HvX64RegisterMtrrFix4kF0000,
809 HvX64RegisterMtrrFix4kF8000,
810 HvX64RegisterTscAux, /**< @since v5c? late 2017? */
811
812 HvX64RegisterUnknown8007d = 0x0008007d, /**< Readable on exo partition (17134), initial value is zero. */
813
814 HvX64RegisterSpecCtrl = 0x00080084, /**< @since build about 17758 */
815 HvX64RegisterPredCmd, /**< @since build about 17758 */
816
817 HvX64RegisterIa32MiscEnable = 0x000800a0, /**< @since v5 @note Appears not to be readable on exo partition (Threadripper). */
818 HvX64RegisterIa32FeatureControl, /**< @since v5 @note Appears not to be readable on exo partition (Threadripper). */
819
820 HvX64RegisterApicId = 0x00084802, /**< @since build 17758 */
821 HvX64RegisterApicVersion, /**< @since build 17758 */
822
823 /** Uptime counter or some such thing. Unit is different than HvRegisterTimeRefCount or the accounting is different. */
824 HvX64RegisterVpRuntime = 0x00090000,
825 HvX64RegisterHypercall,
826 HvRegisterGuestOsId,
827 HvRegisterVpIndex,
828 HvRegisterTimeRefCount, /**< Time counter since partition creation, 100ns units. */
829
830 HvRegisterCpuManagementVersion = 0x00090007, /**< @since v5 @note Appears not to be readable on exo partition. */
831
832 HvX64RegisterEoi = 0x00090010, /**< @note Appears not to be readable on exo partition. */
833 HvX64RegisterIcr, /**< @note Appears not to be readable on exo partition. */
834 HvX64RegisterTpr, /**< @note Appears not to be readable on exo partition. */
835 HvRegisterVpAssistPage,
836 /** Readable on exo partition (17134). Some kind of counter. */
837 HvRegisterUnknown90014,
838
839 HvRegisterStatsPartitionRetail = 0x00090020,
840 HvRegisterStatsPartitionInternal,
841 HvRegisterStatsVpRetail,
842 HvRegisterStatsVpInternal,
843
844 HvRegisterSint0 = 0x000a0000,
845 HvRegisterSint1,
846 HvRegisterSint2,
847 HvRegisterSint3,
848 HvRegisterSint4,
849 HvRegisterSint5,
850 HvRegisterSint6,
851 HvRegisterSint7,
852 HvRegisterSint8,
853 HvRegisterSint9,
854 HvRegisterSint10,
855 HvRegisterSint11,
856 HvRegisterSint12,
857 HvRegisterSint13,
858 HvRegisterSint14,
859 HvRegisterSint15,
860 HvRegisterScontrol,
861 HvRegisterSversion,
862 HvRegisterSifp,
863 HvRegisterSipp,
864 HvRegisterEom,
865 HvRegisterSirbp, /**< @since v4 */
866
867 HvRegisterStimer0Config = 0x000b0000,
868 HvRegisterStimer0Count,
869 HvRegisterStimer1Config,
870 HvRegisterStimer1Count,
871 HvRegisterStimer2Config,
872 HvRegisterStimer2Count,
873 HvRegisterStimer3Config,
874 HvRegisterStimer3Count,
875
876 HvRegisterUnknown0b0100 = 0x000b0100, /**< Readable on exo partition (17134), initial value is zero. */
877 HvRegisterUnknown0b0101, /**< Readable on exo partition (17134), initial value is zero. */
878
879 HvX64RegisterYmm0Low = 0x000c0000, /**< @note Not readable on exo partition. Need something enabled? */
880 HvX64RegisterYmm1Low,
881 HvX64RegisterYmm2Low,
882 HvX64RegisterYmm3Low,
883 HvX64RegisterYmm4Low,
884 HvX64RegisterYmm5Low,
885 HvX64RegisterYmm6Low,
886 HvX64RegisterYmm7Low,
887 HvX64RegisterYmm8Low,
888 HvX64RegisterYmm9Low,
889 HvX64RegisterYmm10Low,
890 HvX64RegisterYmm11Low,
891 HvX64RegisterYmm12Low,
892 HvX64RegisterYmm13Low,
893 HvX64RegisterYmm14Low,
894 HvX64RegisterYmm15Low,
895 HvX64RegisterYmm0High,
896 HvX64RegisterYmm1High,
897 HvX64RegisterYmm2High,
898 HvX64RegisterYmm3High,
899 HvX64RegisterYmm4High,
900 HvX64RegisterYmm5High,
901 HvX64RegisterYmm6High,
902 HvX64RegisterYmm7High,
903 HvX64RegisterYmm8High,
904 HvX64RegisterYmm9High,
905 HvX64RegisterYmm10High,
906 HvX64RegisterYmm11High,
907 HvX64RegisterYmm12High,
908 HvX64RegisterYmm13High,
909 HvX64RegisterYmm14High,
910 HvX64RegisterYmm15High,
911
912 HvRegisterVsmVpVtlControl = 0x000d0000, /**< @note Not readable on exo partition. */
913
914 HvRegisterVsmCodePageOffsets = 0x000d0002,
915 HvRegisterVsmVpStatus,
916 HvRegisterVsmPartitionStatus,
917 HvRegisterVsmVina, /**< @note Not readable on exo partition. */
918 HvRegisterVsmCapabilities,
919 HvRegisterVsmPartitionConfig, /**< @note Not readable on exo partition. */
920
921 HvRegisterVsmVpSecureConfigVtl0 = 0x000d0010, /**< @since v5 */
922 HvRegisterVsmVpSecureConfigVtl1, /**< @since v5 */
923 HvRegisterVsmVpSecureConfigVtl2, /**< @since v5 */
924 HvRegisterVsmVpSecureConfigVtl3, /**< @since v5 */
925 HvRegisterVsmVpSecureConfigVtl4, /**< @since v5 */
926 HvRegisterVsmVpSecureConfigVtl5, /**< @since v5 */
927 HvRegisterVsmVpSecureConfigVtl6, /**< @since v5 */
928 HvRegisterVsmVpSecureConfigVtl7, /**< @since v5 */
929 HvRegisterVsmVpSecureConfigVtl8, /**< @since v5 */
930 HvRegisterVsmVpSecureConfigVtl9, /**< @since v5 */
931 HvRegisterVsmVpSecureConfigVtl10, /**< @since v5 */
932 HvRegisterVsmVpSecureConfigVtl11, /**< @since v5 */
933 HvRegisterVsmVpSecureConfigVtl12, /**< @since v5 */
934 HvRegisterVsmVpSecureConfigVtl13, /**< @since v5 */
935 HvRegisterVsmVpSecureConfigVtl14, /**< @since v5 */
936
937 HvRegisterUnknown0e0000 = 0x000e0000, /**< Readable on exo partition (17134), initial value zero. */
938 HvRegisterUnknown0e0001, /**< Readable on exo partition (17134), initial value zero. */
939 HvRegisterUnknown0e0002, /**< Readable on exo partition (17134), initial value zero. */
940 HvRegisterUnknown0e0003 /**< Readable on exo partition (17134), initial value zero. */
941} HV_REGISTER_NAME;
942AssertCompile(HvRegisterInterceptSuspend == 0x00000001);
943AssertCompile(HvRegisterPendingEvent1 == 0x00010005);
944AssertCompile(HvX64RegisterDeliverabilityNotifications == 0x00010006);
945AssertCompile(HvX64RegisterRflags == 0x00020011);
946AssertCompile(HvX64RegisterXmmControlStatus == 0x00030019);
947AssertCompile(HvX64RegisterXfem == 0x00040005);
948AssertCompile(HvX64RegisterIntermediateCr0 == 0x00041000);
949AssertCompile(HvX64RegisterIntermediateCr4 == 0x00041003);
950AssertCompile(HvX64RegisterDr7 == 0x00050005);
951AssertCompile(HvX64RegisterTr == 0x00060007);
952AssertCompile(HvX64RegisterGdtr == 0x00070001);
953AssertCompile(HvX64RegisterInitialApicId == 0x0008000c);
954AssertCompile(HvX64RegisterMtrrCap == 0x0008000d);
955AssertCompile(HvX64RegisterMtrrDefType == 0x0008000e);
956AssertCompile(HvX64RegisterMtrrPhysBaseF == 0x0008001f);
957AssertCompile(HvX64RegisterMtrrPhysMaskF == 0x0008004f);
958AssertCompile(HvX64RegisterMtrrFix4kF8000 == 0x0008007a);
959AssertCompile(HvRegisterTimeRefCount == 0x00090004);
960AssertCompile(HvRegisterCpuManagementVersion == 0x00090007);
961AssertCompile(HvRegisterVpAssistPage == 0x00090013);
962AssertCompile(HvRegisterStatsVpInternal == 0x00090023);
963AssertCompile(HvRegisterSirbp == 0x000a0015);
964AssertCompile(HvRegisterStimer3Count == 0x000b0007);
965AssertCompile(HvX64RegisterYmm15High == 0x000c001f);
966AssertCompile(HvRegisterVsmVpSecureConfigVtl14 == 0x000d001e);
967AssertCompileSize(HV_REGISTER_NAME, 4);
968
969
970/** Value format for HvRegisterExplicitSuspend. */
971typedef union
972{
973 uint64_t AsUINT64;
974 struct
975 {
976 uint64_t Suspended : 1;
977 uint64_t Reserved : 63;
978 };
979} HV_EXPLICIT_SUSPEND_REGISTER;
980/** Pointer to a value of HvRegisterExplicitSuspend. */
981typedef HV_EXPLICIT_SUSPEND_REGISTER *PHV_EXPLICIT_SUSPEND_REGISTER;
982
983/** Value format for HvRegisterInterceptSuspend. */
984typedef union
985{
986 uint64_t AsUINT64;
987 struct
988 {
989 uint64_t Suspended : 1;
990 uint64_t TlbLocked : 1;
991 uint64_t Reserved : 62;
992 };
993} HV_INTERCEPT_SUSPEND_REGISTER;
994/** Pointer to a value of HvRegisterInterceptSuspend. */
995typedef HV_INTERCEPT_SUSPEND_REGISTER *PHV_INTERCEPT_SUSPEND_REGISTER;
996
997/** Value format for HvRegisterInterruptState.
998 * @sa WHV_X64_INTERRUPT_STATE_REGISTER */
999typedef union
1000{
1001 uint64_t AsUINT64;
1002 struct
1003 {
1004 uint64_t InterruptShadow : 1;
1005 uint64_t NmiMasked : 1;
1006 uint64_t Reserved : 62;
1007 };
1008} HV_X64_INTERRUPT_STATE_REGISTER;
1009/** Pointer to a value of HvRegisterInterruptState. */
1010typedef HV_X64_INTERRUPT_STATE_REGISTER *PHV_X64_INTERRUPT_STATE_REGISTER;
1011
1012/** Pending exception type for HvRegisterPendingInterruption.
1013 * @sa WHV_X64_PENDING_INTERRUPTION_TYPE */
1014typedef enum
1015{
1016 HvX64PendingInterrupt = 0,
1017 /* what is/was 1? */
1018 HvX64PendingNmi = 2,
1019 HvX64PendingException
1020 /* any more? */
1021} HV_X64_PENDING_INTERRUPTION_TYPE;
1022
1023/** Value format for HvRegisterPendingInterruption.
1024 * @sa WHV_X64_PENDING_INTERRUPTION_REGISTER */
1025typedef union
1026{
1027 uint64_t AsUINT64;
1028 struct
1029 {
1030 uint32_t InterruptionPending : 1;
1031 uint32_t InterruptionType : 3; /**< HV_X64_PENDING_INTERRUPTION_TYPE */
1032 uint32_t DeliverErrorCode : 1;
1033 uint32_t InstructionLength : 4; /**< @since v5? Wasn't in 7600 WDK */
1034 uint32_t NestedEvent : 1; /**< @since v5? Wasn't in 7600 WDK */
1035 uint32_t Reserved : 6;
1036 uint32_t InterruptionVector : 16;
1037 uint32_t ErrorCode;
1038 };
1039} HV_X64_PENDING_INTERRUPTION_REGISTER;
1040/** Pointer to a value of HvRegisterPendingInterruption. */
1041typedef HV_X64_PENDING_INTERRUPTION_REGISTER *PHV_X64_PENDING_INTERRUPTION_REGISTER;
1042
1043/** Value format for HvX64RegisterDeliverabilityNotifications.
1044 * Value format for HvRegisterPendingEvent0/1.
1045 * @sa WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER */
1046typedef union
1047{
1048 uint64_t AsUINT64;
1049 struct
1050 {
1051 uint64_t NmiNotification : 1;
1052 uint64_t InterruptNotification : 1;
1053 uint64_t InterruptPriority : 4;
1054 uint64_t Reserved : 58;
1055 };
1056} HV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER;
1057/** Pointer to a value of HvRegisterPendingEvent0/1. */
1058typedef HV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER *PHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER;
1059
1060
1061/** Value format for HvX64RegisterEs..Tr.
1062 * @sa WHV_X64_SEGMENT_REGISTER */
1063typedef struct _HV_X64_SEGMENT_REGISTER
1064{
1065 uint64_t Base;
1066 uint32_t Limit;
1067 uint16_t Selector;
1068 union
1069 {
1070 struct
1071 {
1072 uint16_t SegmentType : 4;
1073 uint16_t NonSystemSegment : 1;
1074 uint16_t DescriptorPrivilegeLevel : 2;
1075 uint16_t Present : 1;
1076 uint16_t Reserved : 4;
1077 uint16_t Available : 1;
1078 uint16_t Long : 1;
1079 uint16_t Default : 1;
1080 uint16_t Granularity : 1;
1081 };
1082 uint16_t Attributes;
1083 };
1084} HV_X64_SEGMENT_REGISTER;
1085AssertCompileSize(HV_X64_SEGMENT_REGISTER, 16);
1086/** Pointer to a value of HvX64RegisterEs..Tr. */
1087typedef HV_X64_SEGMENT_REGISTER *PHV_X64_SEGMENT_REGISTER;
1088
1089/** Value format for HvX64RegisterIdtr/Gdtr.
1090 * @sa WHV_X64_TABLE_REGISTER */
1091typedef struct
1092{
1093 uint16_t Pad[3];
1094 uint16_t Limit;
1095 uint64_t Base;
1096} HV_X64_TABLE_REGISTER;
1097AssertCompileSize(HV_X64_TABLE_REGISTER, 16);
1098/** Pointer to a value of HvX64RegisterIdtr/Gdtrr. */
1099typedef HV_X64_TABLE_REGISTER *PHV_X64_TABLE_REGISTER;
1100
1101/** Value format for HvX64RegisterFpMmx0..7 in floating pointer mode.
1102 * @sa WHV_X64_FP_REGISTER, RTFLOAT80U2 */
1103typedef union
1104{
1105 HV_UINT128 AsUINT128;
1106 struct
1107 {
1108 uint64_t Mantissa;
1109 uint64_t BiasedExponent : 15;
1110 uint64_t Sign : 1;
1111 uint64_t Reserved : 48;
1112 };
1113} HV_X64_FP_REGISTER;
1114/** Pointer to a value of HvX64RegisterFpMmx0..7 in floating point mode. */
1115typedef HV_X64_FP_REGISTER *PHV_X64_FP_REGISTER;
1116
1117/** Value union for HvX64RegisterFpMmx0..7. */
1118typedef union
1119{
1120 HV_UINT128 AsUINT128;
1121 HV_X64_FP_REGISTER Fp;
1122 uint64_t Mmx;
1123} HV_X64_FP_MMX_REGISTER;
1124/** Pointer to a value of HvX64RegisterFpMmx0..7. */
1125typedef HV_X64_FP_MMX_REGISTER *PHV_X64_FP_MMX_REGISTER;
1126
1127/** Value format for HvX64RegisterFpControlStatus.
1128 * @sa WHV_X64_FP_CONTROL_STATUS_REGISTER */
1129typedef union
1130{
1131 HV_UINT128 AsUINT128;
1132 struct
1133 {
1134 uint16_t FpControl;
1135 uint16_t FpStatus;
1136 uint8_t FpTag;
1137 uint8_t IgnNe : 1;
1138 uint8_t Reserved : 7;
1139 uint16_t LastFpOp;
1140 union
1141 {
1142 uint64_t LastFpRip;
1143 struct
1144 {
1145 uint32_t LastFpEip;
1146 uint16_t LastFpCs;
1147 };
1148 };
1149 };
1150} HV_X64_FP_CONTROL_STATUS_REGISTER;
1151/** Pointer to a value of HvX64RegisterFpControlStatus. */
1152typedef HV_X64_FP_CONTROL_STATUS_REGISTER *PHV_X64_FP_CONTROL_STATUS_REGISTER;
1153
1154/** Value format for HvX64RegisterXmmControlStatus.
1155 * @sa WHV_X64_XMM_CONTROL_STATUS_REGISTER */
1156typedef union
1157{
1158 HV_UINT128 AsUINT128;
1159 struct
1160 {
1161 union
1162 {
1163 uint64_t LastFpRdp;
1164 struct
1165 {
1166 uint32_t LastFpDp;
1167 uint16_t LastFpDs;
1168 };
1169 };
1170 uint32_t XmmStatusControl;
1171 uint32_t XmmStatusControlMask;
1172 };
1173} HV_X64_XMM_CONTROL_STATUS_REGISTER;
1174/** Pointer to a value of HvX64RegisterXmmControlStatus. */
1175typedef HV_X64_XMM_CONTROL_STATUS_REGISTER *PHV_X64_XMM_CONTROL_STATUS_REGISTER;
1176
1177/** Register value union.
1178 * @sa WHV_REGISTER_VALUE */
1179typedef union
1180{
1181 HV_UINT128 Reg128;
1182 uint64_t Reg64;
1183 uint32_t Reg32;
1184 uint16_t Reg16;
1185 uint8_t Reg8;
1186 HV_EXPLICIT_SUSPEND_REGISTER ExplicitSuspend;
1187 HV_INTERCEPT_SUSPEND_REGISTER InterceptSuspend;
1188 HV_X64_INTERRUPT_STATE_REGISTER InterruptState;
1189 HV_X64_PENDING_INTERRUPTION_REGISTER PendingInterruption;
1190 HV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER DeliverabilityNotifications;
1191 HV_X64_TABLE_REGISTER Table;
1192 HV_X64_SEGMENT_REGISTER Segment;
1193 HV_X64_FP_REGISTER Fp;
1194 HV_X64_FP_CONTROL_STATUS_REGISTER FpControlStatus;
1195 HV_X64_XMM_CONTROL_STATUS_REGISTER XmmControlStatus;
1196} HV_REGISTER_VALUE;
1197AssertCompileSize(HV_REGISTER_VALUE, 16);
1198/** Pointer to a Hyper-V register value union. */
1199typedef HV_REGISTER_VALUE *PHV_REGISTER_VALUE;
1200/** Pointer to a const Hyper-V register value union. */
1201typedef HV_REGISTER_VALUE const *PCHV_REGISTER_VALUE;
1202
1203
1204/** Input for HvCallGetVpRegisters. */
1205typedef struct
1206{
1207 HV_PARTITION_ID PartitionId;
1208 HV_VP_INDEX VpIndex;
1209 /** Was this introduced after v2? Dunno what it it really is. */
1210 uint32_t fFlags;
1211 /* The repeating part: */
1212 HV_REGISTER_NAME Names[RT_FLEXIBLE_ARRAY];
1213} HV_INPUT_GET_VP_REGISTERS;
1214AssertCompileMemberOffset(HV_INPUT_GET_VP_REGISTERS, Names, 16);
1215/** Pointer to input for HvCallGetVpRegisters. */
1216typedef HV_INPUT_GET_VP_REGISTERS *PHV_INPUT_GET_VP_REGISTERS;
1217/* Output for HvCallGetVpRegisters is an array of HV_REGISTER_VALUE parallel to HV_INPUT_GET_VP_REGISTERS::Names. */
1218
1219
1220/** Register and value pair for HvCallSetVpRegisters. */
1221typedef struct
1222{
1223 HV_REGISTER_NAME Name;
1224 uint32_t Pad0;
1225 uint64_t Pad1;
1226 HV_REGISTER_VALUE Value;
1227} HV_REGISTER_ASSOC;
1228AssertCompileSize(HV_REGISTER_ASSOC, 32);
1229AssertCompileMemberOffset(HV_REGISTER_ASSOC, Value, 16);
1230/** Pointer to a register and value pair for HvCallSetVpRegisters. */
1231typedef HV_REGISTER_ASSOC *PHV_REGISTER_ASSOC;
1232/** Helper for clearing the alignment padding members. */
1233#define HV_REGISTER_ASSOC_ZERO_PADDING(a_pRegAssoc) do { (a_pRegAssoc)->Pad0 = 0; (a_pRegAssoc)->Pad1 = 0; } while (0)
1234/** Helper for clearing the alignment padding members and the high 64-bit
1235 * part of the value. */
1236#define HV_REGISTER_ASSOC_ZERO_PADDING_AND_HI64(a_pRegAssoc) \
1237 do { (a_pRegAssoc)->Pad0 = 0; (a_pRegAssoc)->Pad1 = 0; (a_pRegAssoc)->Value.Reg128.High64 = 0; } while (0)
1238
1239/** Input for HvCallSetVpRegisters. */
1240typedef struct
1241{
1242 HV_PARTITION_ID PartitionId;
1243 HV_VP_INDEX VpIndex;
1244 uint32_t RsvdZ;
1245 /* The repeating part: */
1246 HV_REGISTER_ASSOC Elements[RT_FLEXIBLE_ARRAY];
1247} HV_INPUT_SET_VP_REGISTERS;
1248AssertCompileMemberOffset(HV_INPUT_SET_VP_REGISTERS, Elements, 16);
1249/** Pointer to input for HvCallSetVpRegisters. */
1250typedef HV_INPUT_SET_VP_REGISTERS *PHV_INPUT_SET_VP_REGISTERS;
1251
1252
1253
1254/**
1255 * Hyper-V SyncIC message types.
1256 */
1257typedef enum
1258{
1259 HvMessageTypeNone = 0x00000000,
1260
1261 HvMessageTypeUnmappedGpa = 0x80000000,
1262 HvMessageTypeGpaIntercept,
1263
1264 HvMessageTimerExpired = 0x80000010,
1265
1266 HvMessageTypeInvalidVpRegisterValue = 0x80000020,
1267 HvMessageTypeUnrecoverableException,
1268 HvMessageTypeUnsupportedFeature,
1269 HvMessageTypeTlbPageSizeMismatch, /**< @since v5 */
1270
1271 /** @note Same as HvMessageTypeX64ApicEoi? Gone in 5.0. Missing from 7600 WDK
1272 * headers even if it's in the 2.0 docs. */
1273 HvMessageTypeApicEoi = 0x80000030,
1274 /** @note Same as HvMessageTypeX64LegacyFpError? Gone in 5.0, whereas 4.0b
1275 * calls it HvMessageTypeX64LegacyFpError. Missing from 7600 WDK
1276 * headers even if it's in the 2.0 docs. */
1277 HvMessageTypeFerrAsserted,
1278
1279 HvMessageTypeEventLogBufferComplete = 0x80000040,
1280
1281 HvMessageTypeX64IoPortIntercept = 0x80010000,
1282 HvMessageTypeX64MsrIntercept,
1283 HvMessageTypeX64CpuidIntercept,
1284 HvMessageTypeX64ExceptionIntercept,
1285 /** @note Appeared in 5.0 docs, but were here in 7600 WDK headers already. */
1286 HvMessageTypeX64ApicEoi,
1287 /** @note Appeared in 5.0 docs, but were here in 7600 WDK headers already. */
1288 HvMessageTypeX64LegacyFpError,
1289 /** @since v5 */
1290 HvMessageTypeX64RegisterIntercept,
1291 /** @since WinHvPlatform? */
1292 HvMessageTypeX64Halt,
1293 /** @since WinHvPlatform? */
1294 HvMessageTypeX64InterruptWindow
1295
1296} HV_MESSAGE_TYPE;
1297AssertCompileSize(HV_MESSAGE_TYPE, 4);
1298AssertCompile(HvMessageTypeX64RegisterIntercept == 0x80010006);
1299AssertCompile(HvMessageTypeX64Halt == 0x80010007);
1300AssertCompile(HvMessageTypeX64InterruptWindow == 0x80010008);
1301/** Pointer to a Hyper-V SyncIC message type. */
1302typedef HV_MESSAGE_TYPE *PHV_MESSAGE_TYPE;
1303
1304/** Flag set for hypervisor messages, guest cannot send messages with this
1305 * flag set. */
1306#define HV_MESSAGE_TYPE_HYPERVISOR_MASK UINT32_C(0x80000000)
1307
1308/** Hyper-V SynIC message size (they are fixed sized). */
1309#define HV_MESSAGE_SIZE 256
1310/** Maximum Hyper-V SynIC message payload size in bytes. */
1311#define HV_MESSAGE_MAX_PAYLOAD_BYTE_COUNT (HV_MESSAGE_SIZE - 16)
1312/** Maximum Hyper-V SynIC message payload size in QWORDs (uint64_t). */
1313#define HV_MESSAGE_MAX_PAYLOAD_QWORD_COUNT (HV_MESSAGE_MAX_PAYLOAD_BYTE_COUNT / 8)
1314
1315/** SynIC message flags. */
1316typedef union
1317{
1318 uint8_t AsUINT8;
1319 struct
1320 {
1321 /** Messages are pending in the queue. */
1322 uint8_t MessagePending : 1;
1323 uint8_t Reserved : 7;
1324 };
1325} HV_MESSAGE_FLAGS;
1326AssertCompileSize(HV_MESSAGE_FLAGS, 1);
1327
1328/** SynIC message header. */
1329typedef struct
1330{
1331 HV_MESSAGE_TYPE MessageType;
1332 /** The 2.0-5.0b docs all have this incorrectly switched with 'Reserved', WDK 7600 got it right. */
1333 uint8_t PayloadSize;
1334 HV_MESSAGE_FLAGS MessageFlags;
1335 uint16_t Reserved;
1336 union
1337 {
1338 uint64_t OriginationId;
1339 HV_PARTITION_ID Sender;
1340 HV_PORT_ID Port;
1341 };
1342} HV_MESSAGE_HEADER;
1343AssertCompileSize(HV_MESSAGE_HEADER, 16);
1344/** Pointer to a Hyper-V message header. */
1345typedef HV_MESSAGE_HEADER *PHV_MESSAGE_HEADER;
1346/** Pointer to a const Hyper-V message header. */
1347typedef HV_MESSAGE_HEADER const *PCHV_MESSAGE_HEADER;
1348
1349
1350
1351/** @name Intercept access type.
1352 * @{ */
1353typedef uint8_t HV_INTERCEPT_ACCESS_TYPE;
1354#define HV_INTERCEPT_ACCESS_READ 0
1355#define HV_INTERCEPT_ACCESS_WRITE 1
1356#define HV_INTERCEPT_ACCESS_EXECUTE 2
1357/** @} */
1358
1359/** @name Intercept access type mask.
1360 * @{ */
1361typedef uint32_t HV_INTERCEPT_ACCESS_TYPE_MASK;
1362#define HV_INTERCEPT_ACCESS_MASK_NONE 0
1363#define HV_INTERCEPT_ACCESS_MASK_READ 1
1364#define HV_INTERCEPT_ACCESS_MASK_WRITE 2
1365#define HV_INTERCEPT_ACCESS_MASK_EXECUTE 4
1366/** @} */
1367
1368/** X64 intercept execution state.
1369 * @sa WHV_X64_VP_EXECUTION_STATE */
1370typedef union
1371{
1372 uint16_t AsUINT16;
1373 struct
1374 {
1375 uint16_t Cpl : 2;
1376 uint16_t Cr0Pe : 1;
1377 uint16_t Cr0Am : 1;
1378 uint16_t EferLma : 1;
1379 uint16_t DebugActive : 1;
1380 uint16_t InterruptionPending : 1;
1381 uint16_t Reserved0 : 5;
1382 uint16_t InterruptShadow : 1;
1383 uint16_t Reserved1 : 3;
1384 };
1385} HV_X64_VP_EXECUTION_STATE;
1386AssertCompileSize(HV_X64_VP_EXECUTION_STATE, 2);
1387/** Pointer to X86 intercept execution state. */
1388typedef HV_X64_VP_EXECUTION_STATE *PHV_X64_VP_EXECUTION_STATE;
1389/** Pointer to const X86 intercept execution state. */
1390typedef HV_X64_VP_EXECUTION_STATE const *PCHV_X64_VP_EXECUTION_STATE;
1391
1392/** X64 intercept message header. */
1393typedef struct
1394{
1395 HV_VP_INDEX VpIndex; /**< 0x00 */
1396 uint8_t InstructionLength : 4; /**< 0x04[3:0]: Zero if not available, instruction fetch exit, ... */
1397 uint8_t Cr8 : 4; /**< 0x04[7:4]: Not sure since when, but after v2. */
1398 HV_INTERCEPT_ACCESS_TYPE InterceptAccessType; /**< 0x05 */
1399 HV_X64_VP_EXECUTION_STATE ExecutionState; /**< 0x06 */
1400 HV_X64_SEGMENT_REGISTER CsSegment; /**< 0x08 */
1401 uint64_t Rip; /**< 0x18 */
1402 uint64_t Rflags; /**< 0x20 */
1403} HV_X64_INTERCEPT_MESSAGE_HEADER;
1404AssertCompileSize(HV_X64_INTERCEPT_MESSAGE_HEADER, 40);
1405/** Pointer to a x86 intercept message header. */
1406typedef HV_X64_INTERCEPT_MESSAGE_HEADER *PHV_X64_INTERCEPT_MESSAGE_HEADER;
1407
1408
1409/** X64 memory access flags (HvMessageTypeGpaIntercept, HvMessageTypeUnmappedGpa).
1410 * @sa WHV_MEMORY_ACCESS_INFO */
1411typedef union
1412{
1413 uint8_t AsUINT8;
1414 struct
1415 {
1416 uint8_t GvaValid : 1;
1417 uint8_t Reserved : 7;
1418 };
1419} HV_X64_MEMORY_ACCESS_INFO;
1420AssertCompileSize(HV_X64_MEMORY_ACCESS_INFO, 1);
1421
1422/** The payload format for HvMessageTypeGpaIntercept and HvMessageTypeUnmappedGpa.
1423 * @sa WHV_MEMORY_ACCESS_CONTEXT
1424 * @note max message size. */
1425typedef struct
1426{
1427 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */
1428 HV_CACHE_TYPE CacheType; /**< 0x28 */
1429 uint8_t InstructionByteCount; /**< 0x2c */
1430 HV_X64_MEMORY_ACCESS_INFO MemoryAccessInfo; /**< 0x2d */
1431 uint16_t Reserved1; /**< 0x2e */
1432 uint64_t GuestVirtualAddress; /**< 0x30 */
1433 uint64_t GuestPhysicalAddress; /**< 0x38 */
1434 uint8_t InstructionBytes[16]; /**< 0x40 */
1435 /* We don't the following (v5 / WinHvPlatform): */
1436 HV_X64_SEGMENT_REGISTER DsSegment; /**< 0x50 */
1437 HV_X64_SEGMENT_REGISTER SsSegment; /**< 0x60 */
1438 uint64_t Rax; /**< 0x70 */
1439 uint64_t Rcx; /**< 0x78 */
1440 uint64_t Rdx; /**< 0x80 */
1441 uint64_t Rbx; /**< 0x88 */
1442 uint64_t Rsp; /**< 0x90 */
1443 uint64_t Rbp; /**< 0x98 */
1444 uint64_t Rsi; /**< 0xa0 */
1445 uint64_t Rdi; /**< 0xa8 */
1446 uint64_t R8; /**< 0xb0 */
1447 uint64_t R9; /**< 0xb8 */
1448 uint64_t R10; /**< 0xc0 */
1449 uint64_t R11; /**< 0xc8 */
1450 uint64_t R12; /**< 0xd0 */
1451 uint64_t R13; /**< 0xd8 */
1452 uint64_t R14; /**< 0xe0 */
1453 uint64_t R15; /**< 0xe8 */
1454} HV_X64_MEMORY_INTERCEPT_MESSAGE;
1455AssertCompileSize(HV_X64_MEMORY_INTERCEPT_MESSAGE, 0xf0);
1456AssertCompileMemberOffset(HV_X64_MEMORY_INTERCEPT_MESSAGE, DsSegment, 0x50);
1457/** Pointer to a HvMessageTypeGpaIntercept or HvMessageTypeUnmappedGpa payload. */
1458typedef HV_X64_MEMORY_INTERCEPT_MESSAGE *PHV_X64_MEMORY_INTERCEPT_MESSAGE;
1459/** Pointer to a const HvMessageTypeGpaIntercept or HvMessageTypeUnmappedGpa payload. */
1460typedef HV_X64_MEMORY_INTERCEPT_MESSAGE const *PCHV_X64_MEMORY_INTERCEPT_MESSAGE;
1461
1462
1463/** The payload format for HvMessageTypeX64MsrIntercept. */
1464typedef struct _HV_X64_MSR_INTERCEPT_MESSAGE
1465{
1466 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */
1467 uint32_t MsrNumber; /**< 0x28 (ecx) */
1468 uint32_t Reserved; /**< 0x2c */
1469 uint64_t Rdx; /**< 0x30 */
1470 uint64_t Rax; /**< 0x38 */
1471} HV_X64_MSR_INTERCEPT_MESSAGE;
1472AssertCompileSize(HV_X64_MSR_INTERCEPT_MESSAGE, 0x40);
1473/** Pointer to a HvMessageTypeX64MsrIntercept payload. */
1474typedef HV_X64_MSR_INTERCEPT_MESSAGE *PHV_X64_MSR_INTERCEPT_MESSAGE;
1475/** Pointer to a const HvMessageTypeX64MsrIntercept payload. */
1476typedef HV_X64_MSR_INTERCEPT_MESSAGE const *PCHV_X64_MSR_INTERCEPT_MESSAGE;
1477
1478/** Full MSR message. */
1479typedef struct
1480{
1481 HV_MESSAGE_HEADER MsgHdr;
1482 HV_X64_MSR_INTERCEPT_MESSAGE Payload;
1483} HV_X64_MSR_INTERCEPT_MESSAGE_FULL;
1484
1485
1486/** X64 I/O port access information (HvMessageTypeX64IoPortIntercept). */
1487typedef union HV_X64_IO_PORT_ACCESS_INFO
1488{
1489 uint8_t AsUINT8;
1490 struct
1491 {
1492 uint8_t AccessSize : 3;
1493 uint8_t StringOp : 1;
1494 uint8_t RepPrefix : 1;
1495 uint8_t Reserved : 3;
1496 };
1497} HV_X64_IO_PORT_ACCESS_INFO;
1498AssertCompileSize(HV_X64_IO_PORT_ACCESS_INFO, 1);
1499
1500/** The payload format for HvMessageTypeX64IoPortIntercept. */
1501typedef struct _HV_X64_IO_PORT_INTERCEPT_MESSAGE
1502{
1503 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */
1504 uint16_t PortNumber; /**< 0x28 */
1505 HV_X64_IO_PORT_ACCESS_INFO AccessInfo; /**< 0x2a */
1506 uint8_t InstructionByteCount; /**< 0x2b */
1507 uint32_t Reserved; /**< 0x2c */
1508 uint64_t Rax; /**< 0x30 */
1509 uint8_t InstructionBytes[16]; /**< 0x38 */
1510 HV_X64_SEGMENT_REGISTER DsSegment; /**< 0x48 */
1511 HV_X64_SEGMENT_REGISTER EsSegment; /**< 0x58 */
1512 uint64_t Rcx; /**< 0x68 */
1513 uint64_t Rsi; /**< 0x70 */
1514 uint64_t Rdi; /**< 0x78 */
1515} HV_X64_IO_PORT_INTERCEPT_MESSAGE;
1516AssertCompileSize(HV_X64_IO_PORT_INTERCEPT_MESSAGE, 128);
1517/** Pointer to a HvMessageTypeX64IoPortIntercept payload. */
1518typedef HV_X64_IO_PORT_INTERCEPT_MESSAGE *PHV_X64_IO_PORT_INTERCEPT_MESSAGE;
1519/** Pointer to a const HvMessageTypeX64IoPortIntercept payload. */
1520typedef HV_X64_IO_PORT_INTERCEPT_MESSAGE const *PCHV_X64_IO_PORT_INTERCEPT_MESSAGE;
1521
1522/** Full I/O port message. */
1523typedef struct
1524{
1525 HV_MESSAGE_HEADER MsgHdr;
1526 HV_X64_IO_PORT_INTERCEPT_MESSAGE Payload;
1527} HV_X64_IO_PORT_INTERCEPT_MESSAGE_FULL;
1528
1529
1530/**
1531 * The payload format for HvMessageTypeX64CpuidIntercept,
1532 *
1533 * @note This message does not include HV_X64_INTERCEPT_MESSAGE_HEADER!
1534 */
1535typedef struct
1536{
1537 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00: The usual intercept header. */
1538 uint64_t Rax; /**< 0x28: Input RAX. */
1539 uint64_t Rcx; /**< 0x30: Input RCX. */
1540 uint64_t Rdx; /**< 0x38: Input RDX. */
1541 uint64_t Rbx; /**< 0x40: Input RBX. */
1542 uint64_t DefaultResultRax; /**< 0x48: Default result RAX. */
1543 uint64_t DefaultResultRcx; /**< 0x50: Default result RCX. */
1544 uint64_t DefaultResultRdx; /**< 0x58: Default result RDX. */
1545 uint64_t DefaultResultRbx; /**< 0x60: Default result RBX. */
1546} HV_X64_CPUID_INTERCEPT_MESSAGE;
1547AssertCompileSize(HV_X64_CPUID_INTERCEPT_MESSAGE, 0x68);
1548/** Pointer to a HvMessageTypeX64CpuidIntercept payload. */
1549typedef HV_X64_CPUID_INTERCEPT_MESSAGE *PHV_X64_CPUID_INTERCEPT_MESSAGE;
1550/** Pointer to a const HvMessageTypeX64CpuidIntercept payload. */
1551typedef HV_X64_CPUID_INTERCEPT_MESSAGE const *PCHV_X64_CPUID_INTERCEPT_MESSAGE;
1552
1553/** Full HvMessageTypeX64CpuidIntercept message. */
1554typedef struct
1555{
1556 HV_MESSAGE_HEADER MsgHdr;
1557 HV_X64_CPUID_INTERCEPT_MESSAGE Payload;
1558} HV_X64_CPUID_INTERCEPT_MESSAGE_FULL;
1559
1560
1561/** X64 exception information (HvMessageTypeX64ExceptionIntercept).
1562 * @sa WHV_VP_EXCEPTION_INFO */
1563typedef union
1564{
1565 uint8_t AsUINT8;
1566 struct
1567 {
1568 uint8_t ErrorCodeValid : 1;
1569 /** @todo WHV_VP_EXCEPTION_INFO::SoftwareException */
1570 uint8_t Reserved : 7;
1571 };
1572} HV_X64_EXCEPTION_INFO;
1573AssertCompileSize(HV_X64_EXCEPTION_INFO, 1);
1574
1575/** The payload format for HvMessageTypeX64ExceptionIntercept.
1576 * @sa WHV_VP_EXCEPTION_CONTEXT
1577 * @note max message size. */
1578typedef struct
1579{
1580 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */
1581 uint16_t ExceptionVector; /**< 0x28 */
1582 HV_X64_EXCEPTION_INFO ExceptionInfo; /**< 0x2a */
1583 uint8_t InstructionByteCount; /**< 0x2b */
1584 uint32_t ErrorCode; /**< 0x2c */
1585 uint64_t ExceptionParameter; /**< 0x30 */
1586 uint64_t Reserved; /**< 0x38 */
1587 uint8_t InstructionBytes[16]; /**< 0x40 */
1588 HV_X64_SEGMENT_REGISTER DsSegment; /**< 0x50 */
1589 HV_X64_SEGMENT_REGISTER SsSegment; /**< 0x60 */
1590 uint64_t Rax; /**< 0x70 */
1591 uint64_t Rcx; /**< 0x78 */
1592 uint64_t Rdx; /**< 0x80 */
1593 uint64_t Rbx; /**< 0x88 */
1594 uint64_t Rsp; /**< 0x90 */
1595 uint64_t Rbp; /**< 0x98 */
1596 uint64_t Rsi; /**< 0xa0 */
1597 uint64_t Rdi; /**< 0xa8 */
1598 uint64_t R8; /**< 0xb0 */
1599 uint64_t R9; /**< 0xb8 */
1600 uint64_t R10; /**< 0xc0 */
1601 uint64_t R11; /**< 0xc8 */
1602 uint64_t R12; /**< 0xd0 */
1603 uint64_t R13; /**< 0xd8 */
1604 uint64_t R14; /**< 0xe0 */
1605 uint64_t R15; /**< 0xe8 */
1606} HV_X64_EXCEPTION_INTERCEPT_MESSAGE;
1607AssertCompileSize(HV_X64_EXCEPTION_INTERCEPT_MESSAGE, 0xf0);
1608/** Pointer to a HvMessageTypeX64ExceptionIntercept payload. */
1609typedef HV_X64_EXCEPTION_INTERCEPT_MESSAGE *PHV_X64_EXCEPTION_INTERCEPT_MESSAGE;
1610/** Pointer to a ocnst HvMessageTypeX64ExceptionIntercept payload. */
1611typedef HV_X64_EXCEPTION_INTERCEPT_MESSAGE const *PCHV_X64_EXCEPTION_INTERCEPT_MESSAGE;
1612
1613
1614/**
1615 * The payload format for HvMessageTypeX64Halt,
1616 *
1617 * @note This message does not include HV_X64_INTERCEPT_MESSAGE_HEADER!
1618 */
1619typedef struct
1620{
1621 /** Seems to be a zero 64-bit field here. */
1622 uint64_t u64Reserved;
1623} HV_X64_HALT_MESSAGE;
1624/** Pointer to a HvMessageTypeX64Halt payload. */
1625typedef HV_X64_HALT_MESSAGE *PHV_X64_HALT_MESSAGE;
1626/** Pointer to a const HvMessageTypeX64Halt payload. */
1627typedef HV_X64_HALT_MESSAGE const *PCHV_X64_HALT_MESSAGE;
1628
1629/** Full HvMessageTypeX64Halt message. */
1630typedef struct
1631{
1632 HV_MESSAGE_HEADER MsgHdr;
1633 HV_X64_HALT_MESSAGE Payload;
1634} HV_X64_HALT_MESSAGE_FULL;
1635
1636
1637/**
1638 * The payload format for HvMessageTypeX64InterruptWindow,
1639 *
1640 * @note This message does not include HV_X64_INTERCEPT_MESSAGE_HEADER!
1641 */
1642typedef struct
1643{
1644 /** 0x00: The usual intercept header. */
1645 HV_X64_INTERCEPT_MESSAGE_HEADER Header;
1646 /** 0x28: What's pending. */
1647 HV_X64_PENDING_INTERRUPTION_TYPE Type;
1648 /** 0x2c: Explicit structure alignment padding. */
1649 uint32_t u32ExplicitPadding;
1650} HV_X64_INTERRUPT_WINDOW_MESSAGE;
1651AssertCompileSize(HV_X64_INTERRUPT_WINDOW_MESSAGE, 0x30);
1652/** Pointer to a HvMessageTypeX64InterruptWindow payload. */
1653typedef HV_X64_INTERRUPT_WINDOW_MESSAGE *PHV_X64_INTERRUPT_WINDOW_MESSAGE;
1654/** Pointer to a const HvMessageTypeX64InterruptWindow payload. */
1655typedef HV_X64_INTERRUPT_WINDOW_MESSAGE const *PCHV_X64_INTERRUPT_WINDOW_MESSAGE;
1656
1657/** Full HvMessageTypeX64InterruptWindow message. */
1658typedef struct
1659{
1660 /** Payload size is 0x30. */
1661 HV_MESSAGE_HEADER MsgHdr;
1662 HV_X64_INTERRUPT_WINDOW_MESSAGE Payload;
1663} HV_X64_INTERRUPT_WINDOW_MESSAGE_FULL;
1664
1665
1666
1667/** Hyper-V SynIC message. */
1668typedef struct
1669{
1670 HV_MESSAGE_HEADER Header;
1671 /** 0x10 */
1672 union
1673 {
1674 uint64_t Payload[HV_MESSAGE_MAX_PAYLOAD_QWORD_COUNT];
1675
1676 /** Common header for X64 intercept messages.
1677 * The HvMessageTypeUnrecoverableException message only has this. */
1678 HV_X64_INTERCEPT_MESSAGE_HEADER X64InterceptHeader;
1679 /** HvMessageTypeGpaIntercept, HvMessageTypeUnmappedGpa. */
1680 HV_X64_MEMORY_INTERCEPT_MESSAGE X64MemoryIntercept;
1681 /** HvMessageTypeX64IoPortIntercept */
1682 HV_X64_IO_PORT_INTERCEPT_MESSAGE X64IoPortIntercept;
1683 /** HvMessageTypeX64MsrIntercept */
1684 HV_X64_MSR_INTERCEPT_MESSAGE X64MsrIntercept;
1685 /** HvMessageTypeX64CpuidIntercept */
1686 HV_X64_CPUID_INTERCEPT_MESSAGE X64CpuIdIntercept;
1687 /** HvMessageTypeX64ExceptionIntercept */
1688 HV_X64_EXCEPTION_INTERCEPT_MESSAGE X64ExceptionIntercept;
1689 /** HvMessageTypeX64Halt.
1690 * @note No intercept header? */
1691 HV_X64_HALT_MESSAGE X64Halt;
1692 /** HvMessageTypeX64InterruptWindow. */
1693 HV_X64_INTERRUPT_WINDOW_MESSAGE X64InterruptWindow;
1694 };
1695} HV_MESSAGE;
1696AssertCompileSize(HV_MESSAGE, HV_MESSAGE_SIZE);
1697/** Pointer to a Hyper-V SynIC message. */
1698typedef HV_MESSAGE *PHV_MESSAGE;
1699/** Pointer to const a Hyper-V SynIC message. */
1700typedef HV_MESSAGE const *PCHV_MESSAGE;
1701
1702#endif
1703
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette