VirtualBox

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

Last change on this file since 74847 was 74651, checked in by vboxsync, 6 years ago

iprt/nt/hyperv.h: updates. bugref:9044

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