Path: blob/main/hypervisor/src/whpx/whpx_sys/WinHvPlatformDefs.h
5394 views
/*++12Copyright (c) Microsoft Corporation. All rights reserved.34Module Name:56WinHvPlatformDefs.h78Abstract:910This module contains the constant, type and structure definitions for11the Windows Hypervisor User-Mode APIs.1213--*/1415#ifndef _WINHVAPIDEFS_H_16#define _WINHVAPIDEFS_H_1718#if defined(_MSC_VER) && (_MSC_VER >= 1200)19#pragma once20#pragma warning(push)21#pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */22#pragma warning(disable:4214) /* nonstandard extension used: bit field types other than int */23#endif2425//26// Platform capabilities27//28typedef enum WHV_CAPABILITY_CODE29{30// Capabilities of the API implementation31WHvCapabilityCodeHypervisorPresent = 0x00000000,32WHvCapabilityCodeFeatures = 0x00000001,33WHvCapabilityCodeExtendedVmExits = 0x00000002,34WHvCapabilityCodeExceptionExitBitmap = 0x00000003,35WHvCapabilityCodeX64MsrExitBitmap = 0x00000004,3637// Capabilities of the system's processor38WHvCapabilityCodeProcessorVendor = 0x00001000,39WHvCapabilityCodeProcessorFeatures = 0x00001001,40WHvCapabilityCodeProcessorClFlushSize = 0x00001002,41WHvCapabilityCodeProcessorXsaveFeatures = 0x00001003,42WHvCapabilityCodeProcessorClockFrequency = 0x00001004,43WHvCapabilityCodeInterruptClockFrequency = 0x00001005,44WHvCapabilityCodeProcessorFeaturesBanks = 0x00001006,45} WHV_CAPABILITY_CODE;4647//48// Return values for WhvCapabilityCodeFeatures49//50typedef union WHV_CAPABILITY_FEATURES51{52struct53{54UINT64 PartialUnmap : 1;55UINT64 LocalApicEmulation : 1;56UINT64 Xsave : 1;57UINT64 DirtyPageTracking : 1;58UINT64 SpeculationControl : 1;59UINT64 ApicRemoteRead : 1;60UINT64 IdleSuspend : 1;61UINT64 Reserved : 57;62};6364UINT64 AsUINT64;65} WHV_CAPABILITY_FEATURES;6667C_ASSERT(sizeof(WHV_CAPABILITY_FEATURES) == sizeof(UINT64));6869//70// Return values for WhvCapabilityCodeExtendedVmExits and input buffer for71// WHvPartitionPropertyCodeExtendedVmExits72//73typedef union WHV_EXTENDED_VM_EXITS74{75struct76{77UINT64 X64CpuidExit : 1; // WHvRunVpExitReasonX64CPUID supported78UINT64 X64MsrExit : 1; // WHvRunVpExitX64ReasonMSRAccess supported79UINT64 ExceptionExit : 1; // WHvRunVpExitReasonException supported80UINT64 X64RdtscExit : 1; // WHvRunVpExitReasonX64Rdtsc supported81UINT64 X64ApicSmiExitTrap : 1; // WHvRunVpExitReasonX64ApicSmiTrap supported82UINT64 HypercallExit : 1; // WHvRunVpExitReasonHypercall supported83UINT64 X64ApicInitSipiExitTrap : 1; // WHvRunVpExitReasonX64ApicInitSipiTrap supported84UINT64 Reserved : 57;85};8687UINT64 AsUINT64;88} WHV_EXTENDED_VM_EXITS;8990C_ASSERT(sizeof(WHV_EXTENDED_VM_EXITS) == sizeof(UINT64));9192//93// Return values for WhvCapabilityCodeProcessorVendor94//95typedef enum WHV_PROCESSOR_VENDOR96{97WHvProcessorVendorAmd = 0x0000,98WHvProcessorVendorIntel = 0x0001,99WHvProcessorVendorHygon = 0x0002100101} WHV_PROCESSOR_VENDOR;102103//104// Return values for WhvCapabilityCodeProcessorFeatures and input buffer for105// WHvPartitionPropertyCodeProcessorFeatures. Additionally the value is embeded106// in WHV_PROCESSOR_FEATURES_BANKS.107//108typedef union WHV_PROCESSOR_FEATURES109{110struct111{112UINT64 Sse3Support : 1;113UINT64 LahfSahfSupport : 1;114UINT64 Ssse3Support : 1;115UINT64 Sse4_1Support : 1;116UINT64 Sse4_2Support : 1;117UINT64 Sse4aSupport : 1;118UINT64 XopSupport : 1;119UINT64 PopCntSupport : 1;120UINT64 Cmpxchg16bSupport : 1;121UINT64 Altmovcr8Support : 1;122UINT64 LzcntSupport : 1;123UINT64 MisAlignSseSupport : 1;124UINT64 MmxExtSupport : 1;125UINT64 Amd3DNowSupport : 1;126UINT64 ExtendedAmd3DNowSupport : 1;127UINT64 Page1GbSupport : 1;128UINT64 AesSupport : 1;129UINT64 PclmulqdqSupport : 1;130UINT64 PcidSupport : 1;131UINT64 Fma4Support : 1;132UINT64 F16CSupport : 1;133UINT64 RdRandSupport : 1;134UINT64 RdWrFsGsSupport : 1;135UINT64 SmepSupport : 1;136UINT64 EnhancedFastStringSupport : 1;137UINT64 Bmi1Support : 1;138UINT64 Bmi2Support : 1;139UINT64 Reserved1 : 2;140UINT64 MovbeSupport : 1;141UINT64 Npiep1Support : 1;142UINT64 DepX87FPUSaveSupport : 1;143UINT64 RdSeedSupport : 1;144UINT64 AdxSupport : 1;145UINT64 IntelPrefetchSupport : 1;146UINT64 SmapSupport : 1;147UINT64 HleSupport : 1;148UINT64 RtmSupport : 1;149UINT64 RdtscpSupport : 1;150UINT64 ClflushoptSupport : 1;151UINT64 ClwbSupport : 1;152UINT64 ShaSupport : 1;153UINT64 X87PointersSavedSupport : 1;154UINT64 InvpcidSupport : 1;155UINT64 IbrsSupport : 1;156UINT64 StibpSupport : 1;157UINT64 IbpbSupport : 1;158UINT64 Reserved2 : 1;159UINT64 SsbdSupport : 1;160UINT64 FastShortRepMovSupport : 1;161UINT64 Reserved3 : 1;162UINT64 RdclNo : 1;163UINT64 IbrsAllSupport : 1;164UINT64 Reserved4 : 1;165UINT64 SsbNo : 1;166UINT64 RsbANo : 1;167UINT64 Reserved5 : 1;168UINT64 RdPidSupport : 1;169UINT64 UmipSupport : 1;170UINT64 MdsNoSupport : 1;171UINT64 MdClearSupport : 1;172UINT64 Reserved6 : 3;173};174175UINT64 AsUINT64;176} WHV_PROCESSOR_FEATURES;177178C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES) == sizeof(UINT64));179180//181// Return values for WhvCapabilityCodeProcessorFeaturesBanks and input buffer182// for WHvPartitionPropertyCodeProcessorFeaturesBanks. BanksCount must be populated183// before calling WHP APIs.184//185typedef union WHV_PROCESSOR_FEATURES1186{187struct188{189UINT64 Reserved1 : 2;190UINT64 ClZeroSupport : 1;191UINT64 Reserved2 : 61;192};193194UINT64 AsUINT64;195} WHV_PROCESSOR_FEATURES1;196197C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES1) == sizeof(UINT64));198199#define WHV_PROCESSOR_FEATURES_BANKS_COUNT 2200201typedef struct WHV_PROCESSOR_FEATURES_BANKS202{203UINT32 BanksCount;204UINT32 Reserved0;205union206{207struct208{209WHV_PROCESSOR_FEATURES Bank0;210WHV_PROCESSOR_FEATURES1 Bank1;211};212213UINT64 AsUINT64[WHV_PROCESSOR_FEATURES_BANKS_COUNT];214};215} WHV_PROCESSOR_FEATURES_BANKS;216217C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES_BANKS) == sizeof(UINT64) * (WHV_PROCESSOR_FEATURES_BANKS_COUNT + 1));218219//220// Return values for WHvCapabilityCodeProcessorXsaveFeatures and input buffer221// for WHvPartitionPropertyCodeProcessorXsaveFeatures222//223typedef union _WHV_PROCESSOR_XSAVE_FEATURES224{225struct226{227UINT64 XsaveSupport : 1;228UINT64 XsaveoptSupport : 1;229UINT64 AvxSupport : 1;230UINT64 Avx2Support : 1;231UINT64 FmaSupport : 1;232UINT64 MpxSupport : 1;233UINT64 Avx512Support : 1;234UINT64 Avx512DQSupport : 1;235UINT64 Avx512CDSupport : 1;236UINT64 Avx512BWSupport : 1;237UINT64 Avx512VLSupport : 1;238UINT64 XsaveCompSupport : 1;239UINT64 XsaveSupervisorSupport : 1;240UINT64 Xcr1Support : 1;241UINT64 Avx512BitalgSupport : 1;242UINT64 Avx512IfmaSupport : 1;243UINT64 Avx512VBmiSupport : 1;244UINT64 Avx512VBmi2Support : 1;245UINT64 Avx512VnniSupport : 1;246UINT64 GfniSupport : 1;247UINT64 VaesSupport : 1;248UINT64 Avx512VPopcntdqSupport : 1;249UINT64 VpclmulqdqSupport : 1;250UINT64 Avx512Bf16Support:1;251UINT64 Avx512Vp2IntersectSupport:1;252UINT64 Reserved : 39;253};254255UINT64 AsUINT64;256} WHV_PROCESSOR_XSAVE_FEATURES, *PWHV_PROCESSOR_XSAVE_FEATURES;257258C_ASSERT(sizeof(WHV_PROCESSOR_XSAVE_FEATURES) == sizeof(UINT64));259260//261// Return value for WHvCapabilityCodeX64MsrExits and input buffer for262// WHvPartitionPropertyCodeX64MsrcExits263//264typedef union WHV_X64_MSR_EXIT_BITMAP265{266UINT64 AsUINT64;267struct268{269UINT64 UnhandledMsrs:1;270UINT64 TscMsrWrite:1;271UINT64 TscMsrRead:1;272UINT64 ApicBaseMsrWrite:1;273UINT64 Reserved:60;274};275276} WHV_X64_MSR_EXIT_BITMAP;277278C_ASSERT(sizeof(WHV_X64_MSR_EXIT_BITMAP) == sizeof(UINT64));279280//281// WHvGetCapability output buffer282//283typedef union WHV_CAPABILITY284{285BOOL HypervisorPresent;286WHV_CAPABILITY_FEATURES Features;287WHV_EXTENDED_VM_EXITS ExtendedVmExits;288WHV_PROCESSOR_VENDOR ProcessorVendor;289WHV_PROCESSOR_FEATURES ProcessorFeatures;290WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;291UINT8 ProcessorClFlushSize;292UINT64 ExceptionExitBitmap;293WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;294UINT64 ProcessorClockFrequency;295UINT64 InterruptClockFrequency;296WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;297} WHV_CAPABILITY;298299//300// Partitions301//302303typedef VOID* WHV_PARTITION_HANDLE;304305typedef enum WHV_PARTITION_PROPERTY_CODE306{307WHvPartitionPropertyCodeExtendedVmExits = 0x00000001,308WHvPartitionPropertyCodeExceptionExitBitmap = 0x00000002,309WHvPartitionPropertyCodeSeparateSecurityDomain = 0x00000003,310// Nested virtualization support is experimental and not supported.311WHvPartitionPropertyCodeNestedVirtualization = 0x00000004,312WHvPartitionPropertyCodeX64MsrExitBitmap = 0x00000005,313314WHvPartitionPropertyCodeProcessorFeatures = 0x00001001,315WHvPartitionPropertyCodeProcessorClFlushSize = 0x00001002,316WHvPartitionPropertyCodeCpuidExitList = 0x00001003,317WHvPartitionPropertyCodeCpuidResultList = 0x00001004,318WHvPartitionPropertyCodeLocalApicEmulationMode = 0x00001005,319WHvPartitionPropertyCodeProcessorXsaveFeatures = 0x00001006,320WHvPartitionPropertyCodeProcessorClockFrequency = 0x00001007,321WHvPartitionPropertyCodeInterruptClockFrequency = 0x00001008,322WHvPartitionPropertyCodeApicRemoteReadSupport = 0x00001009,323WHvPartitionPropertyCodeProcessorFeaturesBanks = 0x0000100A,324WHvPartitionPropertyCodeReferenceTime = 0x0000100B,325326WHvPartitionPropertyCodeProcessorCount = 0x00001fff327} WHV_PARTITION_PROPERTY_CODE;328329//330// WHvPartitionPropertyCodeCpuidResultList input buffer list element.331//332typedef struct WHV_X64_CPUID_RESULT333{334UINT32 Function;335UINT32 Reserved[3];336UINT32 Eax;337UINT32 Ebx;338UINT32 Ecx;339UINT32 Edx;340} WHV_X64_CPUID_RESULT;341342//343// WHvPartitionPropertyCodeExceptionBitmap enumeration values.344//345typedef enum WHV_EXCEPTION_TYPE346{347WHvX64ExceptionTypeDivideErrorFault = 0x0,348WHvX64ExceptionTypeDebugTrapOrFault = 0x1,349WHvX64ExceptionTypeBreakpointTrap = 0x3,350WHvX64ExceptionTypeOverflowTrap = 0x4,351WHvX64ExceptionTypeBoundRangeFault = 0x5,352WHvX64ExceptionTypeInvalidOpcodeFault = 0x6,353WHvX64ExceptionTypeDeviceNotAvailableFault = 0x7,354WHvX64ExceptionTypeDoubleFaultAbort = 0x8,355WHvX64ExceptionTypeInvalidTaskStateSegmentFault = 0x0A,356WHvX64ExceptionTypeSegmentNotPresentFault = 0x0B,357WHvX64ExceptionTypeStackFault = 0x0C,358WHvX64ExceptionTypeGeneralProtectionFault = 0x0D,359WHvX64ExceptionTypePageFault = 0x0E,360WHvX64ExceptionTypeFloatingPointErrorFault = 0x10,361WHvX64ExceptionTypeAlignmentCheckFault = 0x11,362WHvX64ExceptionTypeMachineCheckAbort = 0x12,363WHvX64ExceptionTypeSimdFloatingPointFault = 0x13,364} WHV_EXCEPTION_TYPE;365366typedef enum WHV_X64_LOCAL_APIC_EMULATION_MODE367{368WHvX64LocalApicEmulationModeNone,369WHvX64LocalApicEmulationModeXApic,370WHvX64LocalApicEmulationModeX2Apic371} WHV_X64_LOCAL_APIC_EMULATION_MODE;372373//374// WHvGetPartitionProperty output buffer / WHvSetPartitionProperty input buffer375//376typedef union WHV_PARTITION_PROPERTY377{378WHV_EXTENDED_VM_EXITS ExtendedVmExits;379WHV_PROCESSOR_FEATURES ProcessorFeatures;380WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;381UINT8 ProcessorClFlushSize;382UINT32 ProcessorCount;383UINT32 CpuidExitList[1];384WHV_X64_CPUID_RESULT CpuidResultList[1];385UINT64 ExceptionExitBitmap;386WHV_X64_LOCAL_APIC_EMULATION_MODE LocalApicEmulationMode;387BOOL SeparateSecurityDomain;388// Nested virtualization support is experimental and not supported.389BOOL NestedVirtualization;390WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;391UINT64 ProcessorClockFrequency;392UINT64 InterruptClockFrequency;393BOOL ApicRemoteRead;394WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;395UINT64 ReferenceTime;396} WHV_PARTITION_PROPERTY;397398//399// Memory Management400//401402//403// Guest physical or virtual address404//405typedef UINT64 WHV_GUEST_PHYSICAL_ADDRESS;406typedef UINT64 WHV_GUEST_VIRTUAL_ADDRESS;407408//409// Flags used by WHvMapGpaRange410//411typedef enum WHV_MAP_GPA_RANGE_FLAGS412{413WHvMapGpaRangeFlagNone = 0x00000000,414WHvMapGpaRangeFlagRead = 0x00000001,415WHvMapGpaRangeFlagWrite = 0x00000002,416WHvMapGpaRangeFlagExecute = 0x00000004,417WHvMapGpaRangeFlagTrackDirtyPages = 0x00000008,418} WHV_MAP_GPA_RANGE_FLAGS;419420DEFINE_ENUM_FLAG_OPERATORS(WHV_MAP_GPA_RANGE_FLAGS);421422//423// Flags used by WHvTranslateGva424//425typedef enum WHV_TRANSLATE_GVA_FLAGS426{427WHvTranslateGvaFlagNone = 0x00000000,428WHvTranslateGvaFlagValidateRead = 0x00000001,429WHvTranslateGvaFlagValidateWrite = 0x00000002,430WHvTranslateGvaFlagValidateExecute = 0x00000004,431WHvTranslateGvaFlagPrivilegeExempt = 0x00000008,432WHvTranslateGvaFlagSetPageTableBits = 0x00000010433} WHV_TRANSLATE_GVA_FLAGS;434435DEFINE_ENUM_FLAG_OPERATORS(WHV_TRANSLATE_GVA_FLAGS);436437//438// Result of an attempt to translate a guest virtual address439//440typedef enum WHV_TRANSLATE_GVA_RESULT_CODE441{442WHvTranslateGvaResultSuccess = 0,443444// Translation failures445WHvTranslateGvaResultPageNotPresent = 1,446WHvTranslateGvaResultPrivilegeViolation = 2,447WHvTranslateGvaResultInvalidPageTableFlags = 3,448449// GPA access failures450WHvTranslateGvaResultGpaUnmapped = 4,451WHvTranslateGvaResultGpaNoReadAccess = 5,452WHvTranslateGvaResultGpaNoWriteAccess = 6,453WHvTranslateGvaResultGpaIllegalOverlayAccess = 7,454WHvTranslateGvaResultIntercept = 8455} WHV_TRANSLATE_GVA_RESULT_CODE;456457//458// Output buffer of WHvTranslateGva459//460typedef struct WHV_TRANSLATE_GVA_RESULT461{462WHV_TRANSLATE_GVA_RESULT_CODE ResultCode;463UINT32 Reserved;464} WHV_TRANSLATE_GVA_RESULT;465466//467// Virtual Processor Register Definitions468//469typedef enum WHV_REGISTER_NAME470{471// X64 General purpose registers472WHvX64RegisterRax = 0x00000000,473WHvX64RegisterRcx = 0x00000001,474WHvX64RegisterRdx = 0x00000002,475WHvX64RegisterRbx = 0x00000003,476WHvX64RegisterRsp = 0x00000004,477WHvX64RegisterRbp = 0x00000005,478WHvX64RegisterRsi = 0x00000006,479WHvX64RegisterRdi = 0x00000007,480WHvX64RegisterR8 = 0x00000008,481WHvX64RegisterR9 = 0x00000009,482WHvX64RegisterR10 = 0x0000000A,483WHvX64RegisterR11 = 0x0000000B,484WHvX64RegisterR12 = 0x0000000C,485WHvX64RegisterR13 = 0x0000000D,486WHvX64RegisterR14 = 0x0000000E,487WHvX64RegisterR15 = 0x0000000F,488WHvX64RegisterRip = 0x00000010,489WHvX64RegisterRflags = 0x00000011,490491// X64 Segment registers492WHvX64RegisterEs = 0x00000012,493WHvX64RegisterCs = 0x00000013,494WHvX64RegisterSs = 0x00000014,495WHvX64RegisterDs = 0x00000015,496WHvX64RegisterFs = 0x00000016,497WHvX64RegisterGs = 0x00000017,498WHvX64RegisterLdtr = 0x00000018,499WHvX64RegisterTr = 0x00000019,500501// X64 Table registers502WHvX64RegisterIdtr = 0x0000001A,503WHvX64RegisterGdtr = 0x0000001B,504505// X64 Control Registers506WHvX64RegisterCr0 = 0x0000001C,507WHvX64RegisterCr2 = 0x0000001D,508WHvX64RegisterCr3 = 0x0000001E,509WHvX64RegisterCr4 = 0x0000001F,510WHvX64RegisterCr8 = 0x00000020,511512// X64 Debug Registers513WHvX64RegisterDr0 = 0x00000021,514WHvX64RegisterDr1 = 0x00000022,515WHvX64RegisterDr2 = 0x00000023,516WHvX64RegisterDr3 = 0x00000024,517WHvX64RegisterDr6 = 0x00000025,518WHvX64RegisterDr7 = 0x00000026,519520// X64 Extended Control Registers521WHvX64RegisterXCr0 = 0x00000027,522523// X64 Floating Point and Vector Registers524WHvX64RegisterXmm0 = 0x00001000,525WHvX64RegisterXmm1 = 0x00001001,526WHvX64RegisterXmm2 = 0x00001002,527WHvX64RegisterXmm3 = 0x00001003,528WHvX64RegisterXmm4 = 0x00001004,529WHvX64RegisterXmm5 = 0x00001005,530WHvX64RegisterXmm6 = 0x00001006,531WHvX64RegisterXmm7 = 0x00001007,532WHvX64RegisterXmm8 = 0x00001008,533WHvX64RegisterXmm9 = 0x00001009,534WHvX64RegisterXmm10 = 0x0000100A,535WHvX64RegisterXmm11 = 0x0000100B,536WHvX64RegisterXmm12 = 0x0000100C,537WHvX64RegisterXmm13 = 0x0000100D,538WHvX64RegisterXmm14 = 0x0000100E,539WHvX64RegisterXmm15 = 0x0000100F,540WHvX64RegisterFpMmx0 = 0x00001010,541WHvX64RegisterFpMmx1 = 0x00001011,542WHvX64RegisterFpMmx2 = 0x00001012,543WHvX64RegisterFpMmx3 = 0x00001013,544WHvX64RegisterFpMmx4 = 0x00001014,545WHvX64RegisterFpMmx5 = 0x00001015,546WHvX64RegisterFpMmx6 = 0x00001016,547WHvX64RegisterFpMmx7 = 0x00001017,548WHvX64RegisterFpControlStatus = 0x00001018,549WHvX64RegisterXmmControlStatus = 0x00001019,550551// X64 MSRs552WHvX64RegisterTsc = 0x00002000,553WHvX64RegisterEfer = 0x00002001,554WHvX64RegisterKernelGsBase = 0x00002002,555WHvX64RegisterApicBase = 0x00002003,556WHvX64RegisterPat = 0x00002004,557WHvX64RegisterSysenterCs = 0x00002005,558WHvX64RegisterSysenterEip = 0x00002006,559WHvX64RegisterSysenterEsp = 0x00002007,560WHvX64RegisterStar = 0x00002008,561WHvX64RegisterLstar = 0x00002009,562WHvX64RegisterCstar = 0x0000200A,563WHvX64RegisterSfmask = 0x0000200B,564WHvX64RegisterInitialApicId = 0x0000200C,565566WHvX64RegisterMsrMtrrCap = 0x0000200D,567WHvX64RegisterMsrMtrrDefType = 0x0000200E,568569WHvX64RegisterMsrMtrrPhysBase0 = 0x00002010,570WHvX64RegisterMsrMtrrPhysBase1 = 0x00002011,571WHvX64RegisterMsrMtrrPhysBase2 = 0x00002012,572WHvX64RegisterMsrMtrrPhysBase3 = 0x00002013,573WHvX64RegisterMsrMtrrPhysBase4 = 0x00002014,574WHvX64RegisterMsrMtrrPhysBase5 = 0x00002015,575WHvX64RegisterMsrMtrrPhysBase6 = 0x00002016,576WHvX64RegisterMsrMtrrPhysBase7 = 0x00002017,577WHvX64RegisterMsrMtrrPhysBase8 = 0x00002018,578WHvX64RegisterMsrMtrrPhysBase9 = 0x00002019,579WHvX64RegisterMsrMtrrPhysBaseA = 0x0000201A,580WHvX64RegisterMsrMtrrPhysBaseB = 0x0000201B,581WHvX64RegisterMsrMtrrPhysBaseC = 0x0000201C,582WHvX64RegisterMsrMtrrPhysBaseD = 0x0000201D,583WHvX64RegisterMsrMtrrPhysBaseE = 0x0000201E,584WHvX64RegisterMsrMtrrPhysBaseF = 0x0000201F,585586WHvX64RegisterMsrMtrrPhysMask0 = 0x00002040,587WHvX64RegisterMsrMtrrPhysMask1 = 0x00002041,588WHvX64RegisterMsrMtrrPhysMask2 = 0x00002042,589WHvX64RegisterMsrMtrrPhysMask3 = 0x00002043,590WHvX64RegisterMsrMtrrPhysMask4 = 0x00002044,591WHvX64RegisterMsrMtrrPhysMask5 = 0x00002045,592WHvX64RegisterMsrMtrrPhysMask6 = 0x00002046,593WHvX64RegisterMsrMtrrPhysMask7 = 0x00002047,594WHvX64RegisterMsrMtrrPhysMask8 = 0x00002048,595WHvX64RegisterMsrMtrrPhysMask9 = 0x00002049,596WHvX64RegisterMsrMtrrPhysMaskA = 0x0000204A,597WHvX64RegisterMsrMtrrPhysMaskB = 0x0000204B,598WHvX64RegisterMsrMtrrPhysMaskC = 0x0000204C,599WHvX64RegisterMsrMtrrPhysMaskD = 0x0000204D,600WHvX64RegisterMsrMtrrPhysMaskE = 0x0000204E,601WHvX64RegisterMsrMtrrPhysMaskF = 0x0000204F,602603WHvX64RegisterMsrMtrrFix64k00000 = 0x00002070,604WHvX64RegisterMsrMtrrFix16k80000 = 0x00002071,605WHvX64RegisterMsrMtrrFix16kA0000 = 0x00002072,606WHvX64RegisterMsrMtrrFix4kC0000 = 0x00002073,607WHvX64RegisterMsrMtrrFix4kC8000 = 0x00002074,608WHvX64RegisterMsrMtrrFix4kD0000 = 0x00002075,609WHvX64RegisterMsrMtrrFix4kD8000 = 0x00002076,610WHvX64RegisterMsrMtrrFix4kE0000 = 0x00002077,611WHvX64RegisterMsrMtrrFix4kE8000 = 0x00002078,612WHvX64RegisterMsrMtrrFix4kF0000 = 0x00002079,613WHvX64RegisterMsrMtrrFix4kF8000 = 0x0000207A,614615WHvX64RegisterTscAux = 0x0000207B,616WHvX64RegisterSpecCtrl = 0x00002084,617WHvX64RegisterPredCmd = 0x00002085,618WHvX64RegisterTscVirtualOffset = 0x00002087,619620// APIC state (also accessible via WHv(Get/Set)VirtualProcessorInterruptControllerState)621WHvX64RegisterApicId = 0x00003002,622WHvX64RegisterApicVersion = 0x00003003,623624// Interrupt / Event Registers625WHvRegisterPendingInterruption = 0x80000000,626WHvRegisterInterruptState = 0x80000001,627WHvRegisterPendingEvent = 0x80000002,628WHvX64RegisterDeliverabilityNotifications = 0x80000004,629WHvRegisterInternalActivityState = 0x80000005,630WHvX64RegisterPendingDebugException = 0x80000006,631632} WHV_REGISTER_NAME;633634typedef union DECLSPEC_ALIGN(16) WHV_UINT128635{636struct637{638UINT64 Low64;639UINT64 High64;640};641642UINT32 Dword[4];643} WHV_UINT128;644645typedef union WHV_X64_FP_REGISTER646{647struct648{649UINT64 Mantissa;650UINT64 BiasedExponent:15;651UINT64 Sign:1;652UINT64 Reserved:48;653};654655WHV_UINT128 AsUINT128;656} WHV_X64_FP_REGISTER;657658typedef union WHV_X64_FP_CONTROL_STATUS_REGISTER659{660struct661{662UINT16 FpControl;663UINT16 FpStatus;664UINT8 FpTag;665UINT8 Reserved;666UINT16 LastFpOp;667union668{669// Long Mode670UINT64 LastFpRip;671672// 32 Bit Mode673struct674{675UINT32 LastFpEip;676UINT16 LastFpCs;677UINT16 Reserved2;678};679};680};681682WHV_UINT128 AsUINT128;683} WHV_X64_FP_CONTROL_STATUS_REGISTER;684685typedef union WHV_X64_XMM_CONTROL_STATUS_REGISTER686{687struct688{689union690{691// Long Mode692UINT64 LastFpRdp;693694// 32 Bit Mode695struct696{697UINT32 LastFpDp;698UINT16 LastFpDs;699UINT16 Reserved;700};701};702UINT32 XmmStatusControl;703UINT32 XmmStatusControlMask;704};705706WHV_UINT128 AsUINT128;707} WHV_X64_XMM_CONTROL_STATUS_REGISTER;708709typedef struct WHV_X64_SEGMENT_REGISTER710{711UINT64 Base;712UINT32 Limit;713UINT16 Selector;714715union716{717struct718{719UINT16 SegmentType:4;720UINT16 NonSystemSegment:1;721UINT16 DescriptorPrivilegeLevel:2;722UINT16 Present:1;723UINT16 Reserved:4;724UINT16 Available:1;725UINT16 Long:1;726UINT16 Default:1;727UINT16 Granularity:1;728};729730UINT16 Attributes;731};732} WHV_X64_SEGMENT_REGISTER;733734typedef struct WHV_X64_TABLE_REGISTER735{736UINT16 Pad[3];737UINT16 Limit;738UINT64 Base;739} WHV_X64_TABLE_REGISTER;740741typedef union WHV_X64_INTERRUPT_STATE_REGISTER742{743struct744{745UINT64 InterruptShadow:1;746UINT64 NmiMasked:1;747UINT64 Reserved:62;748};749750UINT64 AsUINT64;751} WHV_X64_INTERRUPT_STATE_REGISTER;752753typedef union WHV_X64_PENDING_INTERRUPTION_REGISTER754{755struct756{757UINT32 InterruptionPending:1;758UINT32 InterruptionType:3; // WHV_X64_PENDING_INTERRUPTION_TYPE759UINT32 DeliverErrorCode:1;760UINT32 InstructionLength:4;761UINT32 NestedEvent:1;762UINT32 Reserved:6;763UINT32 InterruptionVector:16;764UINT32 ErrorCode;765};766767UINT64 AsUINT64;768} WHV_X64_PENDING_INTERRUPTION_REGISTER;769770C_ASSERT(sizeof(WHV_X64_PENDING_INTERRUPTION_REGISTER) == sizeof(UINT64));771772typedef union WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER773{774struct775{776UINT64 NmiNotification:1;777UINT64 InterruptNotification:1;778UINT64 InterruptPriority:4;779UINT64 Reserved:58;780};781782UINT64 AsUINT64;783} WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER;784785C_ASSERT(sizeof(WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER) == sizeof(UINT64));786787788typedef enum WHV_X64_PENDING_EVENT_TYPE789{790WHvX64PendingEventException = 0,791WHvX64PendingEventExtInt = 5,792} WHV_X64_PENDING_EVENT_TYPE;793794typedef union WHV_X64_PENDING_EXCEPTION_EVENT795{796struct797{798UINT32 EventPending : 1;799UINT32 EventType : 3; // Must be WHvX64PendingEventException800UINT32 Reserved0 : 4;801802UINT32 DeliverErrorCode : 1;803UINT32 Reserved1 : 7;804UINT32 Vector : 16;805UINT32 ErrorCode;806UINT64 ExceptionParameter;807};808809WHV_UINT128 AsUINT128;810} WHV_X64_PENDING_EXCEPTION_EVENT;811812C_ASSERT(sizeof(WHV_X64_PENDING_EXCEPTION_EVENT) == sizeof(WHV_UINT128));813814typedef union WHV_X64_PENDING_EXT_INT_EVENT815{816struct817{818UINT64 EventPending : 1;819UINT64 EventType : 3; // Must be WHvX64PendingEventExtInt820UINT64 Reserved0 : 4;821UINT64 Vector : 8;822UINT64 Reserved1 : 48;823824UINT64 Reserved2;825};826827WHV_UINT128 AsUINT128;828} WHV_X64_PENDING_EXT_INT_EVENT;829830C_ASSERT(sizeof(WHV_X64_PENDING_EXT_INT_EVENT) == sizeof(WHV_UINT128));831832typedef union WHV_INTERNAL_ACTIVITY_REGISTER833{834struct835{836UINT64 StartupSuspend : 1;837UINT64 HaltSuspend : 1;838UINT64 IdleSuspend : 1;839UINT64 Reserved:61;840};841842UINT64 AsUINT64;843} WHV_INTERNAL_ACTIVITY_REGISTER;844845C_ASSERT(sizeof(WHV_INTERNAL_ACTIVITY_REGISTER) == sizeof(UINT64));846847typedef union WHV_X64_PENDING_DEBUG_EXCEPTION848{849UINT64 AsUINT64;850851struct852{853UINT64 Breakpoint0 : 1;854UINT64 Breakpoint1 : 1;855UINT64 Breakpoint2 : 1;856UINT64 Breakpoint3 : 1;857UINT64 SingleStep : 1;858UINT64 Reserved0 : 59;859};860861} WHV_X64_PENDING_DEBUG_EXCEPTION;862863C_ASSERT(sizeof(WHV_X64_PENDING_DEBUG_EXCEPTION) == sizeof(UINT64));864865//866// Register values867//868typedef union WHV_REGISTER_VALUE869{870WHV_UINT128 Reg128;871UINT64 Reg64;872UINT32 Reg32;873UINT16 Reg16;874UINT8 Reg8;875WHV_X64_FP_REGISTER Fp;876WHV_X64_FP_CONTROL_STATUS_REGISTER FpControlStatus;877WHV_X64_XMM_CONTROL_STATUS_REGISTER XmmControlStatus;878WHV_X64_SEGMENT_REGISTER Segment;879WHV_X64_TABLE_REGISTER Table;880WHV_X64_INTERRUPT_STATE_REGISTER InterruptState;881WHV_X64_PENDING_INTERRUPTION_REGISTER PendingInterruption;882WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER DeliverabilityNotifications;883WHV_X64_PENDING_EXCEPTION_EVENT ExceptionEvent;884WHV_X64_PENDING_EXT_INT_EVENT ExtIntEvent;885WHV_INTERNAL_ACTIVITY_REGISTER InternalActivity;886WHV_X64_PENDING_DEBUG_EXCEPTION PendingDebugException;887} WHV_REGISTER_VALUE;888889//890// Virtual Processor Execution891//892893//894// Reason for a VM exit895//896typedef enum WHV_RUN_VP_EXIT_REASON897{898WHvRunVpExitReasonNone = 0x00000000,899900// Standard exits caused by operations of the virtual processor901WHvRunVpExitReasonMemoryAccess = 0x00000001,902WHvRunVpExitReasonX64IoPortAccess = 0x00000002,903WHvRunVpExitReasonUnrecoverableException = 0x00000004,904WHvRunVpExitReasonInvalidVpRegisterValue = 0x00000005,905WHvRunVpExitReasonUnsupportedFeature = 0x00000006,906WHvRunVpExitReasonX64InterruptWindow = 0x00000007,907WHvRunVpExitReasonX64Halt = 0x00000008,908WHvRunVpExitReasonX64ApicEoi = 0x00000009,909910// Additional exits that can be configured through partition properties911WHvRunVpExitReasonX64MsrAccess = 0x00001000,912WHvRunVpExitReasonX64Cpuid = 0x00001001,913WHvRunVpExitReasonException = 0x00001002,914WHvRunVpExitReasonX64Rdtsc = 0x00001003,915WHvRunVpExitReasonX64ApicSmiTrap = 0x00001004,916WHvRunVpExitReasonHypercall = 0x00001005,917WHvRunVpExitReasonX64ApicInitSipiTrap = 0x00001006,918919// Exits caused by the host920WHvRunVpExitReasonCanceled = 0x00002001,921} WHV_RUN_VP_EXIT_REASON;922923//924// Execution state of the virtual processor925//926typedef union WHV_X64_VP_EXECUTION_STATE927{928struct929{930UINT16 Cpl : 2;931UINT16 Cr0Pe : 1;932UINT16 Cr0Am : 1;933UINT16 EferLma : 1;934UINT16 DebugActive : 1;935UINT16 InterruptionPending : 1;936UINT16 Reserved0 : 5;937UINT16 InterruptShadow : 1;938UINT16 Reserved1 : 3;939};940941UINT16 AsUINT16;942} WHV_X64_VP_EXECUTION_STATE;943944C_ASSERT(sizeof(WHV_X64_VP_EXECUTION_STATE) == sizeof(UINT16));945946//947// Execution context of a virtual processor at the time of an exit948//949typedef struct WHV_VP_EXIT_CONTEXT950{951WHV_X64_VP_EXECUTION_STATE ExecutionState;952UINT8 InstructionLength : 4;953UINT8 Cr8 : 4;954UINT8 Reserved;955UINT32 Reserved2;956WHV_X64_SEGMENT_REGISTER Cs;957UINT64 Rip;958UINT64 Rflags;959} WHV_VP_EXIT_CONTEXT;960961//962// Context data for a VM exit caused by a memory access (WHvRunVpExitReasonMemoryAccess)963//964typedef enum WHV_MEMORY_ACCESS_TYPE965{966WHvMemoryAccessRead = 0,967WHvMemoryAccessWrite = 1,968WHvMemoryAccessExecute = 2969} WHV_MEMORY_ACCESS_TYPE;970971typedef union WHV_MEMORY_ACCESS_INFO972{973struct {974UINT32 AccessType : 2; // WHV_MEMORY_ACCESS_TYPE975UINT32 GpaUnmapped : 1;976UINT32 GvaValid : 1;977UINT32 Reserved : 28;978};979980UINT32 AsUINT32;981} WHV_MEMORY_ACCESS_INFO;982983typedef struct WHV_MEMORY_ACCESS_CONTEXT984{985// Context of the virtual processor986UINT8 InstructionByteCount;987UINT8 Reserved[3];988UINT8 InstructionBytes[16];989990// Memory access info991WHV_MEMORY_ACCESS_INFO AccessInfo;992WHV_GUEST_PHYSICAL_ADDRESS Gpa;993WHV_GUEST_VIRTUAL_ADDRESS Gva;994} WHV_MEMORY_ACCESS_CONTEXT;995996//997// Context data for an exit caused by an I/O port access (WHvRunVpExitReasonX64IOPortAccess)998//999typedef union WHV_X64_IO_PORT_ACCESS_INFO1000{1001struct1002{1003UINT32 IsWrite : 1;1004UINT32 AccessSize: 3;1005UINT32 StringOp : 1;1006UINT32 RepPrefix : 1;1007UINT32 Reserved : 26;1008};10091010UINT32 AsUINT32;1011} WHV_X64_IO_PORT_ACCESS_INFO;10121013C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_INFO) == sizeof(UINT32));10141015typedef struct WHV_X64_IO_PORT_ACCESS_CONTEXT1016{1017// Context of the virtual processor1018UINT8 InstructionByteCount;1019UINT8 Reserved[3];1020UINT8 InstructionBytes[16];10211022// I/O port access info1023WHV_X64_IO_PORT_ACCESS_INFO AccessInfo;1024UINT16 PortNumber;1025UINT16 Reserved2[3];1026UINT64 Rax;1027UINT64 Rcx;1028UINT64 Rsi;1029UINT64 Rdi;1030WHV_X64_SEGMENT_REGISTER Ds;1031WHV_X64_SEGMENT_REGISTER Es;1032} WHV_X64_IO_PORT_ACCESS_CONTEXT;10331034//1035// Context data for an exit caused by an MSR access (WHvRunVpExitReasonX64MSRAccess)1036//1037typedef union WHV_X64_MSR_ACCESS_INFO1038{1039struct1040{1041UINT32 IsWrite : 1;1042UINT32 Reserved : 31;1043};10441045UINT32 AsUINT32;1046} WHV_X64_MSR_ACCESS_INFO;10471048C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_INFO) == sizeof(UINT32));10491050typedef struct WHV_X64_MSR_ACCESS_CONTEXT1051{1052// MSR access info1053WHV_X64_MSR_ACCESS_INFO AccessInfo;1054UINT32 MsrNumber;1055UINT64 Rax;1056UINT64 Rdx;1057} WHV_X64_MSR_ACCESS_CONTEXT;10581059//1060// Context data for an exit caused by a CPUID call (WHvRunVpExitReasonX64CPUID)1061//1062typedef struct WHV_X64_CPUID_ACCESS_CONTEXT1063{1064// CPUID access info1065UINT64 Rax;1066UINT64 Rcx;1067UINT64 Rdx;1068UINT64 Rbx;1069UINT64 DefaultResultRax;1070UINT64 DefaultResultRcx;1071UINT64 DefaultResultRdx;1072UINT64 DefaultResultRbx;1073} WHV_X64_CPUID_ACCESS_CONTEXT;10741075//1076// Context data for an exit caused by an exception generated by the virtual processor1077// (WHvRunVpExitReasonException)1078//1079typedef union WHV_VP_EXCEPTION_INFO1080{1081struct1082{1083UINT32 ErrorCodeValid : 1;1084UINT32 SoftwareException : 1;1085UINT32 Reserved : 30;1086};10871088UINT32 AsUINT32;1089} WHV_VP_EXCEPTION_INFO;10901091C_ASSERT(sizeof(WHV_VP_EXCEPTION_INFO) == sizeof(UINT32));10921093typedef struct WHV_VP_EXCEPTION_CONTEXT1094{1095UINT8 InstructionByteCount;1096UINT8 Reserved[3];1097UINT8 InstructionBytes[16];10981099// Exception info1100WHV_VP_EXCEPTION_INFO ExceptionInfo;1101UINT8 ExceptionType; // WHV_EXCEPTION_TYPE1102UINT8 Reserved2[3];1103UINT32 ErrorCode;1104UINT64 ExceptionParameter;1105} WHV_VP_EXCEPTION_CONTEXT;11061107//1108// Context data for an exit caused by the use of an unsupported processor feature1109// (WHvRunVpExitReasonUnsupportedFeature)1110//1111typedef enum WHV_X64_UNSUPPORTED_FEATURE_CODE1112{1113WHvUnsupportedFeatureIntercept = 1,1114WHvUnsupportedFeatureTaskSwitchTss = 21115} WHV_X64_UNSUPPORTED_FEATURE_CODE;11161117typedef struct WHV_X64_UNSUPPORTED_FEATURE_CONTEXT1118{1119WHV_X64_UNSUPPORTED_FEATURE_CODE FeatureCode;1120UINT32 Reserved;1121UINT64 FeatureParameter;1122} WHV_X64_UNSUPPORTED_FEATURE_CONTEXT;11231124//1125// Context data for an exit caused by a cancellation from the host (WHvRunVpExitReasonCanceled)1126//1127typedef enum WHV_RUN_VP_CANCEL_REASON1128{1129WHvRunVpCancelReasonUser = 0 // Execution canceled by WHvCancelRunVirtualProcessor1130} WHV_RUN_VP_CANCEL_REASON;11311132//1133// Alias for non-standard capitalization found in earlier versions of the header1134//1135#define WhvRunVpCancelReasonUser WHvRunVpCancelReasonUser11361137typedef struct WHV_RUN_VP_CANCELED_CONTEXT1138{1139WHV_RUN_VP_CANCEL_REASON CancelReason;1140} WHV_RUN_VP_CANCELED_CONTEXT;11411142//1143// Context data for an exit caused by an interrupt delivery window cancellation from the host1144// (WHvRunVpExitReasonX64InterruptWindow)1145//1146typedef enum WHV_X64_PENDING_INTERRUPTION_TYPE1147{1148WHvX64PendingInterrupt = 0,1149WHvX64PendingNmi = 2,1150WHvX64PendingException = 31151} WHV_X64_PENDING_INTERRUPTION_TYPE, *PWHV_X64_PENDING_INTERRUPTION_TYPE;11521153typedef struct WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT1154{1155WHV_X64_PENDING_INTERRUPTION_TYPE DeliverableType;1156} WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT, *PWHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT;11571158//1159// Context data for an exit caused by an APIC EOI of a level-triggered1160// interrupt (WHvRunVpExitReasonX64ApicEoi)1161//1162typedef struct WHV_X64_APIC_EOI_CONTEXT1163{1164UINT32 InterruptVector;1165} WHV_X64_APIC_EOI_CONTEXT;11661167//1168// Context data for an exit caused by a rdtsc(p) instruction (WHvRunVpExitReasonX64Rdtsc)1169//1170typedef union WHV_X64_RDTSC_INFO1171{1172struct1173{1174UINT64 IsRdtscp:1;1175UINT64 Reserved:63;1176};11771178UINT64 AsUINT64;1179} WHV_X64_RDTSC_INFO;11801181typedef struct WHV_X64_RDTSC_CONTEXT1182{1183UINT64 TscAux;1184UINT64 VirtualOffset;1185UINT64 Tsc;1186UINT64 ReferenceTime;1187WHV_X64_RDTSC_INFO RdtscInfo;1188} WHV_X64_RDTSC_CONTEXT;11891190//1191// Context data for an exit caused by an APIC SMI (WHvRunVpExitReasonX64ApicSmiTrap)1192//1193typedef struct WHV_X64_APIC_SMI_CONTEXT1194{1195UINT64 ApicIcr;1196} WHV_X64_APIC_SMI_CONTEXT;11971198//1199// Context data for an exit caused by a hypercall (WHvRunVpExitReasonHypercall)1200//12011202#define WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS 612031204typedef struct _WHV_HYPERCALL_CONTEXT1205{1206UINT64 Rax;1207UINT64 Rbx;1208UINT64 Rcx;1209UINT64 Rdx;1210UINT64 R8;1211UINT64 Rsi;1212UINT64 Rdi;1213UINT64 Reserved0;1214WHV_UINT128 XmmRegisters[WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS];1215UINT64 Reserved1[2];1216} WHV_HYPERCALL_CONTEXT, *PWHV_HYPERCALL_CONTEXT;12171218//1219// Context data for an exit caused by an APIC INIT SIPI (WHvRunVpExitReasonX64ApicInitSipiTrap)1220//1221typedef struct WHV_X64_APIC_INIT_SIPI_CONTEXT1222{1223UINT64 ApicIcr;1224} WHV_X64_APIC_INIT_SIPI_CONTEXT;12251226// WHvRunVirtualProcessor output buffer1227typedef struct WHV_RUN_VP_EXIT_CONTEXT1228{1229WHV_RUN_VP_EXIT_REASON ExitReason;1230UINT32 Reserved;1231WHV_VP_EXIT_CONTEXT VpContext;12321233union1234{1235WHV_MEMORY_ACCESS_CONTEXT MemoryAccess;1236WHV_X64_IO_PORT_ACCESS_CONTEXT IoPortAccess;1237WHV_X64_MSR_ACCESS_CONTEXT MsrAccess;1238WHV_X64_CPUID_ACCESS_CONTEXT CpuidAccess;1239WHV_VP_EXCEPTION_CONTEXT VpException;1240WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT InterruptWindow;1241WHV_X64_UNSUPPORTED_FEATURE_CONTEXT UnsupportedFeature;1242WHV_RUN_VP_CANCELED_CONTEXT CancelReason;1243WHV_X64_APIC_EOI_CONTEXT ApicEoi;1244WHV_X64_RDTSC_CONTEXT ReadTsc;1245WHV_X64_APIC_SMI_CONTEXT ApicSmi;1246WHV_HYPERCALL_CONTEXT Hypercall;1247WHV_X64_APIC_INIT_SIPI_CONTEXT ApicInitSipi;1248};1249} WHV_RUN_VP_EXIT_CONTEXT;12501251typedef enum WHV_INTERRUPT_TYPE1252{1253WHvX64InterruptTypeFixed = 0,1254WHvX64InterruptTypeLowestPriority = 1,1255WHvX64InterruptTypeNmi = 4,1256WHvX64InterruptTypeInit = 5,1257WHvX64InterruptTypeSipi = 6,1258WHvX64InterruptTypeLocalInt1 = 9,1259} WHV_INTERRUPT_TYPE;12601261typedef enum WHV_INTERRUPT_DESTINATION_MODE1262{1263WHvX64InterruptDestinationModePhysical,1264WHvX64InterruptDestinationModeLogical,1265} WHV_INTERRUPT_DESTINATION_MODE;12661267typedef enum WHV_INTERRUPT_TRIGGER_MODE1268{1269WHvX64InterruptTriggerModeEdge,1270WHvX64InterruptTriggerModeLevel,1271} WHV_INTERRUPT_TRIGGER_MODE;12721273typedef struct WHV_INTERRUPT_CONTROL1274{1275UINT64 Type : 8; // WHV_INTERRUPT_TYPE1276UINT64 DestinationMode : 4; // WHV_INTERRUPT_DESTINATION_MODE1277UINT64 TriggerMode : 4; // WHV_INTERRUPT_TRIGGER_MODE1278UINT64 Reserved : 48;1279UINT32 Destination;1280UINT32 Vector;1281} WHV_INTERRUPT_CONTROL;12821283typedef struct WHV_DOORBELL_MATCH_DATA1284{1285WHV_GUEST_PHYSICAL_ADDRESS GuestAddress;1286UINT64 Value;1287UINT32 Length;1288UINT32 MatchOnValue:1;1289UINT32 MatchOnLength:1;1290UINT32 Reserved:30;1291} WHV_DOORBELL_MATCH_DATA;12921293// WHvGetPartitionCounters types1294typedef enum WHV_PARTITION_COUNTER_SET1295{1296WHvPartitionCounterSetMemory,1297} WHV_PARTITION_COUNTER_SET;12981299typedef struct WHV_PARTITION_MEMORY_COUNTERS1300{1301UINT64 Mapped4KPageCount;1302UINT64 Mapped2MPageCount;1303UINT64 Mapped1GPageCount;1304} WHV_PARTITION_MEMORY_COUNTERS;13051306// WHvGetVirtualProcessorCounters types1307typedef enum WHV_PROCESSOR_COUNTER_SET1308{1309WHvProcessorCounterSetRuntime,1310WHvProcessorCounterSetIntercepts,1311WHvProcessorCounterSetEvents,1312WHvProcessorCounterSetApic,1313} WHV_PROCESSOR_COUNTER_SET;13141315typedef struct WHV_PROCESSOR_RUNTIME_COUNTERS1316{1317UINT64 TotalRuntime100ns;1318UINT64 HypervisorRuntime100ns;1319} WHV_PROCESSOR_RUNTIME_COUNTERS;13201321typedef struct WHV_PROCESSOR_INTERCEPT_COUNTER1322{1323UINT64 Count;1324UINT64 Time100ns;1325} WHV_PROCESSOR_INTERCEPT_COUNTER;13261327typedef struct WHV_PROCESSOR_INTERCEPT_COUNTERS1328{1329WHV_PROCESSOR_INTERCEPT_COUNTER PageInvalidations;1330WHV_PROCESSOR_INTERCEPT_COUNTER ControlRegisterAccesses;1331WHV_PROCESSOR_INTERCEPT_COUNTER IoInstructions;1332WHV_PROCESSOR_INTERCEPT_COUNTER HaltInstructions;1333WHV_PROCESSOR_INTERCEPT_COUNTER CpuidInstructions;1334WHV_PROCESSOR_INTERCEPT_COUNTER MsrAccesses;1335WHV_PROCESSOR_INTERCEPT_COUNTER OtherIntercepts;1336WHV_PROCESSOR_INTERCEPT_COUNTER PendingInterrupts;1337WHV_PROCESSOR_INTERCEPT_COUNTER EmulatedInstructions;1338WHV_PROCESSOR_INTERCEPT_COUNTER DebugRegisterAccesses;1339WHV_PROCESSOR_INTERCEPT_COUNTER PageFaultIntercepts;1340} WHV_PROCESSOR_ACTIVITY_COUNTERS;13411342typedef struct WHV_PROCESSOR_EVENT_COUNTERS1343{1344UINT64 PageFaultCount;1345UINT64 ExceptionCount;1346UINT64 InterruptCount;1347} WHV_PROCESSOR_GUEST_EVENT_COUNTERS;13481349typedef struct WHV_PROCESSOR_APIC_COUNTERS1350{1351UINT64 MmioAccessCount;1352UINT64 EoiAccessCount;1353UINT64 TprAccessCount;1354UINT64 SentIpiCount;1355UINT64 SelfIpiCount;1356} WHV_PROCESSOR_APIC_COUNTERS;13571358#if defined(_MSC_VER) && (_MSC_VER >= 1200)1359#pragma warning(pop)1360#endif13611362#endif // _WINHVAPIDEFS_H_136313641365