1713 lines
54 KiB
C
1713 lines
54 KiB
C
/**
|
|
* This file is part of the mingw-w64 runtime package.
|
|
* No warranty is given; refer to the file DISCLAIMER within this package.
|
|
*/
|
|
|
|
#ifndef _WINHVAPIDEFS_H_
|
|
#define _WINHVAPIDEFS_H_
|
|
|
|
typedef enum WHV_CAPABILITY_CODE {
|
|
WHvCapabilityCodeHypervisorPresent = 0x00000000,
|
|
WHvCapabilityCodeFeatures = 0x00000001,
|
|
WHvCapabilityCodeExtendedVmExits = 0x00000002,
|
|
WHvCapabilityCodeExceptionExitBitmap = 0x00000003,
|
|
WHvCapabilityCodeX64MsrExitBitmap = 0x00000004,
|
|
WHvCapabilityCodeGpaRangePopulateFlags = 0x00000005,
|
|
WHvCapabilityCodeSchedulerFeatures = 0x00000006,
|
|
WHvCapabilityCodeProcessorVendor = 0x00001000,
|
|
WHvCapabilityCodeProcessorFeatures = 0x00001001,
|
|
WHvCapabilityCodeProcessorClFlushSize = 0x00001002,
|
|
WHvCapabilityCodeProcessorXsaveFeatures = 0x00001003,
|
|
WHvCapabilityCodeProcessorClockFrequency = 0x00001004,
|
|
WHvCapabilityCodeInterruptClockFrequency = 0x00001005,
|
|
WHvCapabilityCodeProcessorFeaturesBanks = 0x00001006,
|
|
WHvCapabilityCodeProcessorFrequencyCap = 0x00001007,
|
|
WHvCapabilityCodeSyntheticProcessorFeaturesBanks = 0x00001008,
|
|
WHvCapabilityCodeProcessorPerfmonFeatures = 0x00001009
|
|
} WHV_CAPABILITY_CODE;
|
|
|
|
typedef union WHV_CAPABILITY_FEATURES {
|
|
__C89_NAMELESS struct {
|
|
UINT64 PartialUnmap : 1;
|
|
UINT64 LocalApicEmulation : 1;
|
|
UINT64 Xsave : 1;
|
|
UINT64 DirtyPageTracking : 1;
|
|
UINT64 SpeculationControl : 1;
|
|
UINT64 ApicRemoteRead : 1;
|
|
UINT64 IdleSuspend : 1;
|
|
UINT64 VirtualPciDeviceSupport : 1;
|
|
UINT64 IommuSupport : 1;
|
|
UINT64 VpHotAddRemove : 1;
|
|
UINT64 Reserved : 54;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_CAPABILITY_FEATURES;
|
|
|
|
C_ASSERT(sizeof(WHV_CAPABILITY_FEATURES) == sizeof(UINT64));
|
|
|
|
typedef union WHV_EXTENDED_VM_EXITS {
|
|
__C89_NAMELESS struct {
|
|
UINT64 X64CpuidExit : 1;
|
|
UINT64 X64MsrExit : 1;
|
|
UINT64 ExceptionExit : 1;
|
|
UINT64 X64RdtscExit : 1;
|
|
UINT64 X64ApicSmiExitTrap : 1;
|
|
UINT64 HypercallExit : 1;
|
|
UINT64 X64ApicInitSipiExitTrap : 1;
|
|
UINT64 X64ApicWriteLint0ExitTrap : 1;
|
|
UINT64 X64ApicWriteLint1ExitTrap : 1;
|
|
UINT64 X64ApicWriteSvrExitTrap : 1;
|
|
UINT64 UnknownSynicConnection : 1;
|
|
UINT64 RetargetUnknownVpciDevice : 1;
|
|
UINT64 X64ApicWriteLdrExitTrap : 1;
|
|
UINT64 X64ApicWriteDfrExitTrap : 1;
|
|
UINT64 GpaAccessFaultExit : 1;
|
|
UINT64 Reserved : 49;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_EXTENDED_VM_EXITS;
|
|
|
|
C_ASSERT(sizeof(WHV_EXTENDED_VM_EXITS) == sizeof(UINT64));
|
|
|
|
typedef enum WHV_PROCESSOR_VENDOR {
|
|
WHvProcessorVendorAmd = 0x0000,
|
|
WHvProcessorVendorIntel = 0x0001,
|
|
WHvProcessorVendorHygon = 0x0002
|
|
} WHV_PROCESSOR_VENDOR;
|
|
|
|
typedef union WHV_PROCESSOR_FEATURES {
|
|
__C89_NAMELESS struct {
|
|
UINT64 Sse3Support : 1;
|
|
UINT64 LahfSahfSupport : 1;
|
|
UINT64 Ssse3Support : 1;
|
|
UINT64 Sse4_1Support : 1;
|
|
UINT64 Sse4_2Support : 1;
|
|
UINT64 Sse4aSupport : 1;
|
|
UINT64 XopSupport : 1;
|
|
UINT64 PopCntSupport : 1;
|
|
UINT64 Cmpxchg16bSupport : 1;
|
|
UINT64 Altmovcr8Support : 1;
|
|
UINT64 LzcntSupport : 1;
|
|
UINT64 MisAlignSseSupport : 1;
|
|
UINT64 MmxExtSupport : 1;
|
|
UINT64 Amd3DNowSupport : 1;
|
|
UINT64 ExtendedAmd3DNowSupport : 1;
|
|
UINT64 Page1GbSupport : 1;
|
|
UINT64 AesSupport : 1;
|
|
UINT64 PclmulqdqSupport : 1;
|
|
UINT64 PcidSupport : 1;
|
|
UINT64 Fma4Support : 1;
|
|
UINT64 F16CSupport : 1;
|
|
UINT64 RdRandSupport : 1;
|
|
UINT64 RdWrFsGsSupport : 1;
|
|
UINT64 SmepSupport : 1;
|
|
UINT64 EnhancedFastStringSupport : 1;
|
|
UINT64 Bmi1Support : 1;
|
|
UINT64 Bmi2Support : 1;
|
|
UINT64 Reserved1 : 2;
|
|
UINT64 MovbeSupport : 1;
|
|
UINT64 Npiep1Support : 1;
|
|
UINT64 DepX87FPUSaveSupport : 1;
|
|
UINT64 RdSeedSupport : 1;
|
|
UINT64 AdxSupport : 1;
|
|
UINT64 IntelPrefetchSupport : 1;
|
|
UINT64 SmapSupport : 1;
|
|
UINT64 HleSupport : 1;
|
|
UINT64 RtmSupport : 1;
|
|
UINT64 RdtscpSupport : 1;
|
|
UINT64 ClflushoptSupport : 1;
|
|
UINT64 ClwbSupport : 1;
|
|
UINT64 ShaSupport : 1;
|
|
UINT64 X87PointersSavedSupport : 1;
|
|
UINT64 InvpcidSupport : 1;
|
|
UINT64 IbrsSupport : 1;
|
|
UINT64 StibpSupport : 1;
|
|
UINT64 IbpbSupport : 1;
|
|
UINT64 Reserved2 : 1;
|
|
UINT64 SsbdSupport : 1;
|
|
UINT64 FastShortRepMovSupport : 1;
|
|
UINT64 Reserved3 : 1;
|
|
UINT64 RdclNo : 1;
|
|
UINT64 IbrsAllSupport : 1;
|
|
UINT64 Reserved4 : 1;
|
|
UINT64 SsbNo : 1;
|
|
UINT64 RsbANo : 1;
|
|
UINT64 Reserved5 : 1;
|
|
UINT64 RdPidSupport : 1;
|
|
UINT64 UmipSupport : 1;
|
|
UINT64 MdsNoSupport : 1;
|
|
UINT64 MdClearSupport : 1;
|
|
UINT64 TaaNoSupport : 1;
|
|
UINT64 TsxCtrlSupport : 1;
|
|
UINT64 Reserved6 : 1;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_PROCESSOR_FEATURES;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES) == sizeof(UINT64));
|
|
|
|
typedef union WHV_PROCESSOR_FEATURES1 {
|
|
__C89_NAMELESS struct {
|
|
UINT64 ACountMCountSupport : 1;
|
|
UINT64 TscInvariantSupport : 1;
|
|
UINT64 ClZeroSupport : 1;
|
|
UINT64 RdpruSupport : 1;
|
|
UINT64 Reserved2 : 2;
|
|
UINT64 NestedVirtSupport : 1;
|
|
UINT64 PsfdSupport: 1;
|
|
UINT64 CetSsSupport : 1;
|
|
UINT64 CetIbtSupport : 1;
|
|
UINT64 VmxExceptionInjectSupport : 1;
|
|
UINT64 Reserved4 : 1;
|
|
UINT64 UmwaitTpauseSupport : 1;
|
|
UINT64 MovdiriSupport : 1;
|
|
UINT64 Movdir64bSupport : 1;
|
|
UINT64 CldemoteSupport : 1;
|
|
UINT64 SerializeSupport : 1;
|
|
UINT64 TscDeadlineTmrSupport : 1;
|
|
UINT64 TscAdjustSupport : 1;
|
|
UINT64 FZLRepMovsb : 1;
|
|
UINT64 FSRepStosb : 1;
|
|
UINT64 FSRepCmpsb : 1;
|
|
UINT64 TsxLdTrkSupport : 1;
|
|
UINT64 Reserved5 : 41;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_PROCESSOR_FEATURES1;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES1) == sizeof(UINT64));
|
|
|
|
#define WHV_PROCESSOR_FEATURES_BANKS_COUNT 2
|
|
|
|
typedef struct WHV_PROCESSOR_FEATURES_BANKS {
|
|
UINT32 BanksCount;
|
|
UINT32 Reserved0;
|
|
__C89_NAMELESS union {
|
|
__C89_NAMELESS struct {
|
|
WHV_PROCESSOR_FEATURES Bank0;
|
|
WHV_PROCESSOR_FEATURES1 Bank1;
|
|
};
|
|
UINT64 AsUINT64[WHV_PROCESSOR_FEATURES_BANKS_COUNT];
|
|
};
|
|
} WHV_PROCESSOR_FEATURES_BANKS;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_FEATURES_BANKS) == sizeof(UINT64) * (WHV_PROCESSOR_FEATURES_BANKS_COUNT + 1));
|
|
|
|
typedef union WHV_SYNTHETIC_PROCESSOR_FEATURES {
|
|
__C89_NAMELESS struct {
|
|
UINT64 HypervisorPresent:1;
|
|
UINT64 Hv1:1;
|
|
UINT64 AccessVpRunTimeReg:1;
|
|
UINT64 AccessPartitionReferenceCounter:1;
|
|
UINT64 AccessSynicRegs:1;
|
|
UINT64 AccessSyntheticTimerRegs:1;
|
|
#ifdef __x86_64__
|
|
UINT64 AccessIntrCtrlRegs:1;
|
|
#else
|
|
UINT64 ReservedZ6:1;
|
|
#endif
|
|
UINT64 AccessHypercallRegs:1;
|
|
UINT64 AccessVpIndex:1;
|
|
UINT64 AccessPartitionReferenceTsc:1;
|
|
#ifdef __x86_64__
|
|
UINT64 AccessGuestIdleReg:1;
|
|
UINT64 AccessFrequencyRegs:1;
|
|
#else
|
|
UINT64 ReservedZ10:1;
|
|
UINT64 ReservedZ11:1;
|
|
#endif
|
|
UINT64 ReservedZ12:1;
|
|
UINT64 ReservedZ13:1;
|
|
UINT64 ReservedZ14:1;
|
|
#ifdef __x86_64__
|
|
UINT64 EnableExtendedGvaRangesForFlushVirtualAddressList:1;
|
|
#else
|
|
UINT64 ReservedZ15:1;
|
|
#endif
|
|
UINT64 ReservedZ16:1;
|
|
UINT64 ReservedZ17:1;
|
|
UINT64 FastHypercallOutput:1;
|
|
UINT64 ReservedZ19:1;
|
|
UINT64 ReservedZ20:1;
|
|
UINT64 ReservedZ21:1;
|
|
UINT64 DirectSyntheticTimers:1;
|
|
UINT64 ReservedZ23:1;
|
|
UINT64 ExtendedProcessorMasks:1;
|
|
#ifdef __x86_64__
|
|
UINT64 TbFlushHypercalls:1;
|
|
#else
|
|
UINT64 ReservedZ25:1;
|
|
#endif
|
|
UINT64 SyntheticClusterIpi:1;
|
|
UINT64 NotifyLongSpinWait:1;
|
|
UINT64 QueryNumaDistance:1;
|
|
UINT64 SignalEvents:1;
|
|
UINT64 RetargetDeviceInterrupt:1;
|
|
UINT64 Reserved:33;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_SYNTHETIC_PROCESSOR_FEATURES;
|
|
|
|
C_ASSERT(sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES) == 8);
|
|
|
|
#define WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS_COUNT 1
|
|
|
|
typedef struct WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS {
|
|
UINT32 BanksCount;
|
|
UINT32 Reserved0;
|
|
__C89_NAMELESS union {
|
|
__C89_NAMELESS struct {
|
|
WHV_SYNTHETIC_PROCESSOR_FEATURES Bank0;
|
|
};
|
|
UINT64 AsUINT64[WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS_COUNT];
|
|
};
|
|
} WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS;
|
|
|
|
C_ASSERT(sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS) == 16);
|
|
|
|
typedef union _WHV_PROCESSOR_XSAVE_FEATURES {
|
|
__C89_NAMELESS struct {
|
|
UINT64 XsaveSupport : 1;
|
|
UINT64 XsaveoptSupport : 1;
|
|
UINT64 AvxSupport : 1;
|
|
UINT64 Avx2Support : 1;
|
|
UINT64 FmaSupport : 1;
|
|
UINT64 MpxSupport : 1;
|
|
UINT64 Avx512Support : 1;
|
|
UINT64 Avx512DQSupport : 1;
|
|
UINT64 Avx512CDSupport : 1;
|
|
UINT64 Avx512BWSupport : 1;
|
|
UINT64 Avx512VLSupport : 1;
|
|
UINT64 XsaveCompSupport : 1;
|
|
UINT64 XsaveSupervisorSupport : 1;
|
|
UINT64 Xcr1Support : 1;
|
|
UINT64 Avx512BitalgSupport : 1;
|
|
UINT64 Avx512IfmaSupport : 1;
|
|
UINT64 Avx512VBmiSupport : 1;
|
|
UINT64 Avx512VBmi2Support : 1;
|
|
UINT64 Avx512VnniSupport : 1;
|
|
UINT64 GfniSupport : 1;
|
|
UINT64 VaesSupport : 1;
|
|
UINT64 Avx512VPopcntdqSupport : 1;
|
|
UINT64 VpclmulqdqSupport : 1;
|
|
UINT64 Avx512Bf16Support : 1;
|
|
UINT64 Avx512Vp2IntersectSupport : 1;
|
|
UINT64 Avx512Fp16Support : 1;
|
|
UINT64 XfdSupport : 1;
|
|
UINT64 AmxTileSupport : 1;
|
|
UINT64 AmxBf16Support : 1;
|
|
UINT64 AmxInt8Support : 1;
|
|
UINT64 AvxVnniSupport : 1;
|
|
UINT64 Reserved : 33;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_PROCESSOR_XSAVE_FEATURES, *PWHV_PROCESSOR_XSAVE_FEATURES;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_XSAVE_FEATURES) == sizeof(UINT64));
|
|
|
|
typedef union WHV_PROCESSOR_PERFMON_FEATURES {
|
|
__C89_NAMELESS struct {
|
|
UINT64 PmuSupport : 1;
|
|
UINT64 LbrSupport : 1;
|
|
UINT64 Reserved : 62;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_PROCESSOR_PERFMON_FEATURES, *PWHV_PROCESSOR_PERFMON_FEATURES;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_PERFMON_FEATURES) == 8);
|
|
|
|
typedef union WHV_X64_MSR_EXIT_BITMAP {
|
|
UINT64 AsUINT64;
|
|
__C89_NAMELESS struct {
|
|
UINT64 UnhandledMsrs : 1;
|
|
UINT64 TscMsrWrite : 1;
|
|
UINT64 TscMsrRead : 1;
|
|
UINT64 ApicBaseMsrWrite : 1;
|
|
UINT64 MiscEnableMsrRead:1;
|
|
UINT64 McUpdatePatchLevelMsrRead:1;
|
|
UINT64 Reserved:58;
|
|
};
|
|
} WHV_X64_MSR_EXIT_BITMAP;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_MSR_EXIT_BITMAP) == sizeof(UINT64));
|
|
|
|
typedef struct WHV_MEMORY_RANGE_ENTRY {
|
|
UINT64 GuestAddress;
|
|
UINT64 SizeInBytes;
|
|
} WHV_MEMORY_RANGE_ENTRY;
|
|
|
|
C_ASSERT(sizeof(WHV_MEMORY_RANGE_ENTRY) == 16);
|
|
|
|
typedef union WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS {
|
|
UINT32 AsUINT32;
|
|
__C89_NAMELESS struct {
|
|
UINT32 Prefetch:1;
|
|
UINT32 AvoidHardFaults:1;
|
|
UINT32 Reserved:30;
|
|
};
|
|
} WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS;
|
|
|
|
C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS) == 4);
|
|
|
|
typedef enum WHV_MEMORY_ACCESS_TYPE {
|
|
WHvMemoryAccessRead = 0,
|
|
WHvMemoryAccessWrite = 1,
|
|
WHvMemoryAccessExecute = 2
|
|
} WHV_MEMORY_ACCESS_TYPE;
|
|
|
|
typedef struct WHV_ADVISE_GPA_RANGE_POPULATE {
|
|
WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS Flags;
|
|
WHV_MEMORY_ACCESS_TYPE AccessType;
|
|
} WHV_ADVISE_GPA_RANGE_POPULATE;
|
|
|
|
C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE_POPULATE) == 8);
|
|
|
|
typedef struct WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP {
|
|
UINT32 IsSupported:1;
|
|
UINT32 Reserved:31;
|
|
UINT32 HighestFrequencyMhz;
|
|
UINT32 NominalFrequencyMhz;
|
|
UINT32 LowestFrequencyMhz;
|
|
UINT32 FrequencyStepMhz;
|
|
} WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP;
|
|
|
|
C_ASSERT(sizeof(WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP) == 20);
|
|
|
|
typedef union WHV_SCHEDULER_FEATURES {
|
|
__C89_NAMELESS struct {
|
|
UINT64 CpuReserve: 1;
|
|
UINT64 CpuCap: 1;
|
|
UINT64 CpuWeight: 1;
|
|
UINT64 CpuGroupId: 1;
|
|
UINT64 DisableSmt: 1;
|
|
UINT64 Reserved: 59;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_SCHEDULER_FEATURES;
|
|
|
|
C_ASSERT(sizeof(WHV_SCHEDULER_FEATURES) == 8);
|
|
|
|
typedef union WHV_CAPABILITY {
|
|
WINBOOL HypervisorPresent;
|
|
WHV_CAPABILITY_FEATURES Features;
|
|
WHV_EXTENDED_VM_EXITS ExtendedVmExits;
|
|
WHV_PROCESSOR_VENDOR ProcessorVendor;
|
|
WHV_PROCESSOR_FEATURES ProcessorFeatures;
|
|
WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS SyntheticProcessorFeaturesBanks;
|
|
WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;
|
|
UINT8 ProcessorClFlushSize;
|
|
UINT64 ExceptionExitBitmap;
|
|
WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;
|
|
UINT64 ProcessorClockFrequency;
|
|
UINT64 InterruptClockFrequency;
|
|
WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;
|
|
WHV_ADVISE_GPA_RANGE_POPULATE_FLAGS GpaRangePopulateFlags;
|
|
WHV_CAPABILITY_PROCESSOR_FREQUENCY_CAP ProcessorFrequencyCap;
|
|
WHV_PROCESSOR_PERFMON_FEATURES ProcessorPerfmonFeatures;
|
|
WHV_SCHEDULER_FEATURES SchedulerFeatures;
|
|
} WHV_CAPABILITY;
|
|
|
|
typedef VOID* WHV_PARTITION_HANDLE;
|
|
|
|
typedef enum WHV_PARTITION_PROPERTY_CODE {
|
|
WHvPartitionPropertyCodeExtendedVmExits = 0x00000001,
|
|
WHvPartitionPropertyCodeExceptionExitBitmap = 0x00000002,
|
|
WHvPartitionPropertyCodeSeparateSecurityDomain = 0x00000003,
|
|
WHvPartitionPropertyCodeNestedVirtualization = 0x00000004,
|
|
WHvPartitionPropertyCodeX64MsrExitBitmap = 0x00000005,
|
|
WHvPartitionPropertyCodePrimaryNumaNode = 0x00000006,
|
|
WHvPartitionPropertyCodeCpuReserve = 0x00000007,
|
|
WHvPartitionPropertyCodeCpuCap = 0x00000008,
|
|
WHvPartitionPropertyCodeCpuWeight = 0x00000009,
|
|
WHvPartitionPropertyCodeCpuGroupId = 0x0000000A,
|
|
WHvPartitionPropertyCodeProcessorFrequencyCap = 0x0000000B,
|
|
WHvPartitionPropertyCodeAllowDeviceAssignment = 0x0000000C,
|
|
WHvPartitionPropertyCodeDisableSmt = 0x0000000D,
|
|
WHvPartitionPropertyCodeProcessorFeatures = 0x00001001,
|
|
WHvPartitionPropertyCodeProcessorClFlushSize = 0x00001002,
|
|
WHvPartitionPropertyCodeCpuidExitList = 0x00001003,
|
|
WHvPartitionPropertyCodeCpuidResultList = 0x00001004,
|
|
WHvPartitionPropertyCodeLocalApicEmulationMode = 0x00001005,
|
|
WHvPartitionPropertyCodeProcessorXsaveFeatures = 0x00001006,
|
|
WHvPartitionPropertyCodeProcessorClockFrequency = 0x00001007,
|
|
WHvPartitionPropertyCodeInterruptClockFrequency = 0x00001008,
|
|
WHvPartitionPropertyCodeApicRemoteReadSupport = 0x00001009,
|
|
WHvPartitionPropertyCodeProcessorFeaturesBanks = 0x0000100A,
|
|
WHvPartitionPropertyCodeReferenceTime = 0x0000100B,
|
|
WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks = 0x0000100C,
|
|
WHvPartitionPropertyCodeCpuidResultList2 = 0x0000100D,
|
|
WHvPartitionPropertyCodeProcessorPerfmonFeatures = 0x0000100E,
|
|
WHvPartitionPropertyCodeMsrActionList = 0x0000100F,
|
|
WHvPartitionPropertyCodeUnimplementedMsrAction = 0x00001010,
|
|
WHvPartitionPropertyCodeProcessorCount = 0x00001fff
|
|
} WHV_PARTITION_PROPERTY_CODE;
|
|
|
|
typedef struct WHV_X64_CPUID_RESULT {
|
|
UINT32 Function;
|
|
UINT32 Reserved[3];
|
|
UINT32 Eax;
|
|
UINT32 Ebx;
|
|
UINT32 Ecx;
|
|
UINT32 Edx;
|
|
} WHV_X64_CPUID_RESULT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_CPUID_RESULT) == 32);
|
|
|
|
typedef enum WHV_X64_CPUID_RESULT2_FLAGS {
|
|
WHvX64CpuidResult2FlagSubleafSpecific = 0x00000001,
|
|
WHvX64CpuidResult2FlagVpSpecific = 0x00000002
|
|
} WHV_X64_CPUID_RESULT2_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_X64_CPUID_RESULT2_FLAGS);
|
|
|
|
typedef struct WHV_CPUID_OUTPUT {
|
|
UINT32 Eax;
|
|
UINT32 Ebx;
|
|
UINT32 Ecx;
|
|
UINT32 Edx;
|
|
} WHV_CPUID_OUTPUT;
|
|
|
|
C_ASSERT(sizeof(WHV_CPUID_OUTPUT) == 16);
|
|
|
|
typedef struct WHV_X64_CPUID_RESULT2 {
|
|
UINT32 Function;
|
|
UINT32 Index;
|
|
UINT32 VpIndex;
|
|
WHV_X64_CPUID_RESULT2_FLAGS Flags;
|
|
WHV_CPUID_OUTPUT Output;
|
|
WHV_CPUID_OUTPUT Mask;
|
|
} WHV_X64_CPUID_RESULT2;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_CPUID_RESULT2) == 48);
|
|
|
|
typedef struct WHV_MSR_ACTION_ENTRY {
|
|
UINT32 Index;
|
|
UINT8 ReadAction;
|
|
UINT8 WriteAction;
|
|
UINT16 Reserved;
|
|
} WHV_MSR_ACTION_ENTRY;
|
|
|
|
C_ASSERT(sizeof(WHV_MSR_ACTION_ENTRY) == 8);
|
|
|
|
typedef enum WHV_MSR_ACTION {
|
|
WHvMsrActionArchitectureDefault = 0,
|
|
WHvMsrActionIgnoreWriteReadZero = 1,
|
|
WHvMsrActionExit = 2
|
|
} WHV_MSR_ACTION;
|
|
|
|
typedef enum WHV_EXCEPTION_TYPE {
|
|
WHvX64ExceptionTypeDivideErrorFault = 0x0,
|
|
WHvX64ExceptionTypeDebugTrapOrFault = 0x1,
|
|
WHvX64ExceptionTypeBreakpointTrap = 0x3,
|
|
WHvX64ExceptionTypeOverflowTrap = 0x4,
|
|
WHvX64ExceptionTypeBoundRangeFault = 0x5,
|
|
WHvX64ExceptionTypeInvalidOpcodeFault = 0x6,
|
|
WHvX64ExceptionTypeDeviceNotAvailableFault = 0x7,
|
|
WHvX64ExceptionTypeDoubleFaultAbort = 0x8,
|
|
WHvX64ExceptionTypeInvalidTaskStateSegmentFault = 0x0A,
|
|
WHvX64ExceptionTypeSegmentNotPresentFault = 0x0B,
|
|
WHvX64ExceptionTypeStackFault = 0x0C,
|
|
WHvX64ExceptionTypeGeneralProtectionFault = 0x0D,
|
|
WHvX64ExceptionTypePageFault = 0x0E,
|
|
WHvX64ExceptionTypeFloatingPointErrorFault = 0x10,
|
|
WHvX64ExceptionTypeAlignmentCheckFault = 0x11,
|
|
WHvX64ExceptionTypeMachineCheckAbort = 0x12,
|
|
WHvX64ExceptionTypeSimdFloatingPointFault = 0x13
|
|
} WHV_EXCEPTION_TYPE;
|
|
|
|
typedef enum WHV_X64_LOCAL_APIC_EMULATION_MODE {
|
|
WHvX64LocalApicEmulationModeNone,
|
|
WHvX64LocalApicEmulationModeXApic,
|
|
WHvX64LocalApicEmulationModeX2Apic
|
|
} WHV_X64_LOCAL_APIC_EMULATION_MODE;
|
|
|
|
typedef union WHV_PARTITION_PROPERTY {
|
|
WHV_EXTENDED_VM_EXITS ExtendedVmExits;
|
|
WHV_PROCESSOR_FEATURES ProcessorFeatures;
|
|
WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS SyntheticProcessorFeaturesBanks;
|
|
WHV_PROCESSOR_XSAVE_FEATURES ProcessorXsaveFeatures;
|
|
UINT8 ProcessorClFlushSize;
|
|
UINT32 ProcessorCount;
|
|
UINT32 CpuidExitList[1];
|
|
WHV_X64_CPUID_RESULT CpuidResultList[1];
|
|
WHV_X64_CPUID_RESULT2 CpuidResultList2[1];
|
|
WHV_MSR_ACTION_ENTRY MsrActionList[1];
|
|
WHV_MSR_ACTION UnimplementedMsrAction;
|
|
UINT64 ExceptionExitBitmap;
|
|
WHV_X64_LOCAL_APIC_EMULATION_MODE LocalApicEmulationMode;
|
|
WINBOOL SeparateSecurityDomain;
|
|
WINBOOL NestedVirtualization;
|
|
WHV_X64_MSR_EXIT_BITMAP X64MsrExitBitmap;
|
|
UINT64 ProcessorClockFrequency;
|
|
UINT64 InterruptClockFrequency;
|
|
WINBOOL ApicRemoteRead;
|
|
WHV_PROCESSOR_FEATURES_BANKS ProcessorFeaturesBanks;
|
|
UINT64 ReferenceTime;
|
|
USHORT PrimaryNumaNode;
|
|
UINT32 CpuReserve;
|
|
UINT32 CpuCap;
|
|
UINT32 CpuWeight;
|
|
UINT64 CpuGroupId;
|
|
UINT32 ProcessorFrequencyCap;
|
|
WINBOOL AllowDeviceAssignment;
|
|
WHV_PROCESSOR_PERFMON_FEATURES ProcessorPerfmonFeatures;
|
|
WINBOOL DisableSmt;
|
|
} WHV_PARTITION_PROPERTY;
|
|
|
|
typedef UINT64 WHV_GUEST_PHYSICAL_ADDRESS;
|
|
typedef UINT64 WHV_GUEST_VIRTUAL_ADDRESS;
|
|
|
|
typedef enum WHV_MAP_GPA_RANGE_FLAGS {
|
|
WHvMapGpaRangeFlagNone = 0x00000000,
|
|
WHvMapGpaRangeFlagRead = 0x00000001,
|
|
WHvMapGpaRangeFlagWrite = 0x00000002,
|
|
WHvMapGpaRangeFlagExecute = 0x00000004,
|
|
WHvMapGpaRangeFlagTrackDirtyPages = 0x00000008
|
|
} WHV_MAP_GPA_RANGE_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_MAP_GPA_RANGE_FLAGS);
|
|
|
|
typedef enum WHV_TRANSLATE_GVA_FLAGS {
|
|
WHvTranslateGvaFlagNone = 0x00000000,
|
|
WHvTranslateGvaFlagValidateRead = 0x00000001,
|
|
WHvTranslateGvaFlagValidateWrite = 0x00000002,
|
|
WHvTranslateGvaFlagValidateExecute = 0x00000004,
|
|
WHvTranslateGvaFlagPrivilegeExempt = 0x00000008,
|
|
WHvTranslateGvaFlagSetPageTableBits = 0x00000010,
|
|
WHvTranslateGvaFlagEnforceSmap = 0x00000100,
|
|
WHvTranslateGvaFlagOverrideSmap = 0x00000200
|
|
} WHV_TRANSLATE_GVA_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_TRANSLATE_GVA_FLAGS);
|
|
|
|
typedef enum WHV_TRANSLATE_GVA_RESULT_CODE {
|
|
WHvTranslateGvaResultSuccess = 0,
|
|
WHvTranslateGvaResultPageNotPresent = 1,
|
|
WHvTranslateGvaResultPrivilegeViolation = 2,
|
|
WHvTranslateGvaResultInvalidPageTableFlags = 3,
|
|
WHvTranslateGvaResultGpaUnmapped = 4,
|
|
WHvTranslateGvaResultGpaNoReadAccess = 5,
|
|
WHvTranslateGvaResultGpaNoWriteAccess = 6,
|
|
WHvTranslateGvaResultGpaIllegalOverlayAccess = 7,
|
|
WHvTranslateGvaResultIntercept = 8
|
|
} WHV_TRANSLATE_GVA_RESULT_CODE;
|
|
|
|
typedef struct WHV_TRANSLATE_GVA_RESULT {
|
|
WHV_TRANSLATE_GVA_RESULT_CODE ResultCode;
|
|
UINT32 Reserved;
|
|
} WHV_TRANSLATE_GVA_RESULT;
|
|
|
|
C_ASSERT(sizeof(WHV_TRANSLATE_GVA_RESULT) == 8);
|
|
|
|
typedef union WHV_ADVISE_GPA_RANGE {
|
|
WHV_ADVISE_GPA_RANGE_POPULATE Populate;
|
|
} WHV_ADVISE_GPA_RANGE;
|
|
|
|
C_ASSERT(sizeof(WHV_ADVISE_GPA_RANGE) == 8);
|
|
|
|
typedef enum WHV_CACHE_TYPE {
|
|
WHvCacheTypeUncached = 0,
|
|
WHvCacheTypeWriteCombining = 1,
|
|
WHvCacheTypeWriteThrough = 4,
|
|
#ifdef __x86_64__
|
|
WHvCacheTypeWriteProtected = 5,
|
|
#endif
|
|
WHvCacheTypeWriteBack = 6
|
|
} WHV_CACHE_TYPE;
|
|
|
|
typedef union WHV_ACCESS_GPA_CONTROLS {
|
|
UINT64 AsUINT64;
|
|
__C89_NAMELESS struct {
|
|
WHV_CACHE_TYPE CacheType;
|
|
UINT32 Reserved;
|
|
};
|
|
} WHV_ACCESS_GPA_CONTROLS;
|
|
|
|
C_ASSERT(sizeof(WHV_ACCESS_GPA_CONTROLS) == 8);
|
|
|
|
#define WHV_READ_WRITE_GPA_RANGE_MAX_SIZE 16
|
|
|
|
typedef enum WHV_REGISTER_NAME {
|
|
WHvX64RegisterRax = 0x00000000,
|
|
WHvX64RegisterRcx = 0x00000001,
|
|
WHvX64RegisterRdx = 0x00000002,
|
|
WHvX64RegisterRbx = 0x00000003,
|
|
WHvX64RegisterRsp = 0x00000004,
|
|
WHvX64RegisterRbp = 0x00000005,
|
|
WHvX64RegisterRsi = 0x00000006,
|
|
WHvX64RegisterRdi = 0x00000007,
|
|
WHvX64RegisterR8 = 0x00000008,
|
|
WHvX64RegisterR9 = 0x00000009,
|
|
WHvX64RegisterR10 = 0x0000000A,
|
|
WHvX64RegisterR11 = 0x0000000B,
|
|
WHvX64RegisterR12 = 0x0000000C,
|
|
WHvX64RegisterR13 = 0x0000000D,
|
|
WHvX64RegisterR14 = 0x0000000E,
|
|
WHvX64RegisterR15 = 0x0000000F,
|
|
WHvX64RegisterRip = 0x00000010,
|
|
WHvX64RegisterRflags = 0x00000011,
|
|
WHvX64RegisterEs = 0x00000012,
|
|
WHvX64RegisterCs = 0x00000013,
|
|
WHvX64RegisterSs = 0x00000014,
|
|
WHvX64RegisterDs = 0x00000015,
|
|
WHvX64RegisterFs = 0x00000016,
|
|
WHvX64RegisterGs = 0x00000017,
|
|
WHvX64RegisterLdtr = 0x00000018,
|
|
WHvX64RegisterTr = 0x00000019,
|
|
WHvX64RegisterIdtr = 0x0000001A,
|
|
WHvX64RegisterGdtr = 0x0000001B,
|
|
WHvX64RegisterCr0 = 0x0000001C,
|
|
WHvX64RegisterCr2 = 0x0000001D,
|
|
WHvX64RegisterCr3 = 0x0000001E,
|
|
WHvX64RegisterCr4 = 0x0000001F,
|
|
WHvX64RegisterCr8 = 0x00000020,
|
|
WHvX64RegisterDr0 = 0x00000021,
|
|
WHvX64RegisterDr1 = 0x00000022,
|
|
WHvX64RegisterDr2 = 0x00000023,
|
|
WHvX64RegisterDr3 = 0x00000024,
|
|
WHvX64RegisterDr6 = 0x00000025,
|
|
WHvX64RegisterDr7 = 0x00000026,
|
|
WHvX64RegisterXCr0 = 0x00000027,
|
|
WHvX64RegisterVirtualCr0 = 0x00000028,
|
|
WHvX64RegisterVirtualCr3 = 0x00000029,
|
|
WHvX64RegisterVirtualCr4 = 0x0000002A,
|
|
WHvX64RegisterVirtualCr8 = 0x0000002B,
|
|
WHvX64RegisterXmm0 = 0x00001000,
|
|
WHvX64RegisterXmm1 = 0x00001001,
|
|
WHvX64RegisterXmm2 = 0x00001002,
|
|
WHvX64RegisterXmm3 = 0x00001003,
|
|
WHvX64RegisterXmm4 = 0x00001004,
|
|
WHvX64RegisterXmm5 = 0x00001005,
|
|
WHvX64RegisterXmm6 = 0x00001006,
|
|
WHvX64RegisterXmm7 = 0x00001007,
|
|
WHvX64RegisterXmm8 = 0x00001008,
|
|
WHvX64RegisterXmm9 = 0x00001009,
|
|
WHvX64RegisterXmm10 = 0x0000100A,
|
|
WHvX64RegisterXmm11 = 0x0000100B,
|
|
WHvX64RegisterXmm12 = 0x0000100C,
|
|
WHvX64RegisterXmm13 = 0x0000100D,
|
|
WHvX64RegisterXmm14 = 0x0000100E,
|
|
WHvX64RegisterXmm15 = 0x0000100F,
|
|
WHvX64RegisterFpMmx0 = 0x00001010,
|
|
WHvX64RegisterFpMmx1 = 0x00001011,
|
|
WHvX64RegisterFpMmx2 = 0x00001012,
|
|
WHvX64RegisterFpMmx3 = 0x00001013,
|
|
WHvX64RegisterFpMmx4 = 0x00001014,
|
|
WHvX64RegisterFpMmx5 = 0x00001015,
|
|
WHvX64RegisterFpMmx6 = 0x00001016,
|
|
WHvX64RegisterFpMmx7 = 0x00001017,
|
|
WHvX64RegisterFpControlStatus = 0x00001018,
|
|
WHvX64RegisterXmmControlStatus = 0x00001019,
|
|
WHvX64RegisterTsc = 0x00002000,
|
|
WHvX64RegisterEfer = 0x00002001,
|
|
WHvX64RegisterKernelGsBase = 0x00002002,
|
|
WHvX64RegisterApicBase = 0x00002003,
|
|
WHvX64RegisterPat = 0x00002004,
|
|
WHvX64RegisterSysenterCs = 0x00002005,
|
|
WHvX64RegisterSysenterEip = 0x00002006,
|
|
WHvX64RegisterSysenterEsp = 0x00002007,
|
|
WHvX64RegisterStar = 0x00002008,
|
|
WHvX64RegisterLstar = 0x00002009,
|
|
WHvX64RegisterCstar = 0x0000200A,
|
|
WHvX64RegisterSfmask = 0x0000200B,
|
|
WHvX64RegisterInitialApicId = 0x0000200C,
|
|
WHvX64RegisterMsrMtrrCap = 0x0000200D,
|
|
WHvX64RegisterMsrMtrrDefType = 0x0000200E,
|
|
WHvX64RegisterMsrMtrrPhysBase0 = 0x00002010,
|
|
WHvX64RegisterMsrMtrrPhysBase1 = 0x00002011,
|
|
WHvX64RegisterMsrMtrrPhysBase2 = 0x00002012,
|
|
WHvX64RegisterMsrMtrrPhysBase3 = 0x00002013,
|
|
WHvX64RegisterMsrMtrrPhysBase4 = 0x00002014,
|
|
WHvX64RegisterMsrMtrrPhysBase5 = 0x00002015,
|
|
WHvX64RegisterMsrMtrrPhysBase6 = 0x00002016,
|
|
WHvX64RegisterMsrMtrrPhysBase7 = 0x00002017,
|
|
WHvX64RegisterMsrMtrrPhysBase8 = 0x00002018,
|
|
WHvX64RegisterMsrMtrrPhysBase9 = 0x00002019,
|
|
WHvX64RegisterMsrMtrrPhysBaseA = 0x0000201A,
|
|
WHvX64RegisterMsrMtrrPhysBaseB = 0x0000201B,
|
|
WHvX64RegisterMsrMtrrPhysBaseC = 0x0000201C,
|
|
WHvX64RegisterMsrMtrrPhysBaseD = 0x0000201D,
|
|
WHvX64RegisterMsrMtrrPhysBaseE = 0x0000201E,
|
|
WHvX64RegisterMsrMtrrPhysBaseF = 0x0000201F,
|
|
WHvX64RegisterMsrMtrrPhysMask0 = 0x00002040,
|
|
WHvX64RegisterMsrMtrrPhysMask1 = 0x00002041,
|
|
WHvX64RegisterMsrMtrrPhysMask2 = 0x00002042,
|
|
WHvX64RegisterMsrMtrrPhysMask3 = 0x00002043,
|
|
WHvX64RegisterMsrMtrrPhysMask4 = 0x00002044,
|
|
WHvX64RegisterMsrMtrrPhysMask5 = 0x00002045,
|
|
WHvX64RegisterMsrMtrrPhysMask6 = 0x00002046,
|
|
WHvX64RegisterMsrMtrrPhysMask7 = 0x00002047,
|
|
WHvX64RegisterMsrMtrrPhysMask8 = 0x00002048,
|
|
WHvX64RegisterMsrMtrrPhysMask9 = 0x00002049,
|
|
WHvX64RegisterMsrMtrrPhysMaskA = 0x0000204A,
|
|
WHvX64RegisterMsrMtrrPhysMaskB = 0x0000204B,
|
|
WHvX64RegisterMsrMtrrPhysMaskC = 0x0000204C,
|
|
WHvX64RegisterMsrMtrrPhysMaskD = 0x0000204D,
|
|
WHvX64RegisterMsrMtrrPhysMaskE = 0x0000204E,
|
|
WHvX64RegisterMsrMtrrPhysMaskF = 0x0000204F,
|
|
WHvX64RegisterMsrMtrrFix64k00000 = 0x00002070,
|
|
WHvX64RegisterMsrMtrrFix16k80000 = 0x00002071,
|
|
WHvX64RegisterMsrMtrrFix16kA0000 = 0x00002072,
|
|
WHvX64RegisterMsrMtrrFix4kC0000 = 0x00002073,
|
|
WHvX64RegisterMsrMtrrFix4kC8000 = 0x00002074,
|
|
WHvX64RegisterMsrMtrrFix4kD0000 = 0x00002075,
|
|
WHvX64RegisterMsrMtrrFix4kD8000 = 0x00002076,
|
|
WHvX64RegisterMsrMtrrFix4kE0000 = 0x00002077,
|
|
WHvX64RegisterMsrMtrrFix4kE8000 = 0x00002078,
|
|
WHvX64RegisterMsrMtrrFix4kF0000 = 0x00002079,
|
|
WHvX64RegisterMsrMtrrFix4kF8000 = 0x0000207A,
|
|
WHvX64RegisterTscAux = 0x0000207B,
|
|
WHvX64RegisterBndcfgs = 0x0000207C,
|
|
WHvX64RegisterMCount = 0x0000207E,
|
|
WHvX64RegisterACount = 0x0000207F,
|
|
WHvX64RegisterSpecCtrl = 0x00002084,
|
|
WHvX64RegisterPredCmd = 0x00002085,
|
|
WHvX64RegisterTscVirtualOffset = 0x00002087,
|
|
WHvX64RegisterTsxCtrl = 0x00002088,
|
|
WHvX64RegisterXss = 0x0000208B,
|
|
WHvX64RegisterUCet = 0x0000208C,
|
|
WHvX64RegisterSCet = 0x0000208D,
|
|
WHvX64RegisterSsp = 0x0000208E,
|
|
WHvX64RegisterPl0Ssp = 0x0000208F,
|
|
WHvX64RegisterPl1Ssp = 0x00002090,
|
|
WHvX64RegisterPl2Ssp = 0x00002091,
|
|
WHvX64RegisterPl3Ssp = 0x00002092,
|
|
WHvX64RegisterInterruptSspTableAddr = 0x00002093,
|
|
WHvX64RegisterTscDeadline = 0x00002095,
|
|
WHvX64RegisterTscAdjust = 0x00002096,
|
|
WHvX64RegisterUmwaitControl = 0x00002098,
|
|
WHvX64RegisterXfd = 0x00002099,
|
|
WHvX64RegisterXfdErr = 0x0000209A,
|
|
WHvX64RegisterApicId = 0x00003002,
|
|
WHvX64RegisterApicVersion = 0x00003003,
|
|
WHvX64RegisterApicTpr = 0x00003008,
|
|
WHvX64RegisterApicPpr = 0x0000300A,
|
|
WHvX64RegisterApicEoi = 0x0000300B,
|
|
WHvX64RegisterApicLdr = 0x0000300D,
|
|
WHvX64RegisterApicSpurious = 0x0000300F,
|
|
WHvX64RegisterApicIsr0 = 0x00003010,
|
|
WHvX64RegisterApicIsr1 = 0x00003011,
|
|
WHvX64RegisterApicIsr2 = 0x00003012,
|
|
WHvX64RegisterApicIsr3 = 0x00003013,
|
|
WHvX64RegisterApicIsr4 = 0x00003014,
|
|
WHvX64RegisterApicIsr5 = 0x00003015,
|
|
WHvX64RegisterApicIsr6 = 0x00003016,
|
|
WHvX64RegisterApicIsr7 = 0x00003017,
|
|
WHvX64RegisterApicTmr0 = 0x00003018,
|
|
WHvX64RegisterApicTmr1 = 0x00003019,
|
|
WHvX64RegisterApicTmr2 = 0x0000301A,
|
|
WHvX64RegisterApicTmr3 = 0x0000301B,
|
|
WHvX64RegisterApicTmr4 = 0x0000301C,
|
|
WHvX64RegisterApicTmr5 = 0x0000301D,
|
|
WHvX64RegisterApicTmr6 = 0x0000301E,
|
|
WHvX64RegisterApicTmr7 = 0x0000301F,
|
|
WHvX64RegisterApicIrr0 = 0x00003020,
|
|
WHvX64RegisterApicIrr1 = 0x00003021,
|
|
WHvX64RegisterApicIrr2 = 0x00003022,
|
|
WHvX64RegisterApicIrr3 = 0x00003023,
|
|
WHvX64RegisterApicIrr4 = 0x00003024,
|
|
WHvX64RegisterApicIrr5 = 0x00003025,
|
|
WHvX64RegisterApicIrr6 = 0x00003026,
|
|
WHvX64RegisterApicIrr7 = 0x00003027,
|
|
WHvX64RegisterApicEse = 0x00003028,
|
|
WHvX64RegisterApicIcr = 0x00003030,
|
|
WHvX64RegisterApicLvtTimer = 0x00003032,
|
|
WHvX64RegisterApicLvtThermal = 0x00003033,
|
|
WHvX64RegisterApicLvtPerfmon = 0x00003034,
|
|
WHvX64RegisterApicLvtLint0 = 0x00003035,
|
|
WHvX64RegisterApicLvtLint1 = 0x00003036,
|
|
WHvX64RegisterApicLvtError = 0x00003037,
|
|
WHvX64RegisterApicInitCount = 0x00003038,
|
|
WHvX64RegisterApicCurrentCount = 0x00003039,
|
|
WHvX64RegisterApicDivide = 0x0000303E,
|
|
WHvX64RegisterApicSelfIpi = 0x0000303F,
|
|
WHvRegisterSint0 = 0x00004000,
|
|
WHvRegisterSint1 = 0x00004001,
|
|
WHvRegisterSint2 = 0x00004002,
|
|
WHvRegisterSint3 = 0x00004003,
|
|
WHvRegisterSint4 = 0x00004004,
|
|
WHvRegisterSint5 = 0x00004005,
|
|
WHvRegisterSint6 = 0x00004006,
|
|
WHvRegisterSint7 = 0x00004007,
|
|
WHvRegisterSint8 = 0x00004008,
|
|
WHvRegisterSint9 = 0x00004009,
|
|
WHvRegisterSint10 = 0x0000400A,
|
|
WHvRegisterSint11 = 0x0000400B,
|
|
WHvRegisterSint12 = 0x0000400C,
|
|
WHvRegisterSint13 = 0x0000400D,
|
|
WHvRegisterSint14 = 0x0000400E,
|
|
WHvRegisterSint15 = 0x0000400F,
|
|
WHvRegisterScontrol = 0x00004010,
|
|
WHvRegisterSversion = 0x00004011,
|
|
WHvRegisterSiefp = 0x00004012,
|
|
WHvRegisterSimp = 0x00004013,
|
|
WHvRegisterEom = 0x00004014,
|
|
WHvRegisterVpRuntime = 0x00005000,
|
|
WHvX64RegisterHypercall = 0x00005001,
|
|
WHvRegisterGuestOsId = 0x00005002,
|
|
WHvRegisterVpAssistPage = 0x00005013,
|
|
WHvRegisterReferenceTsc = 0x00005017,
|
|
WHvRegisterReferenceTscSequence = 0x0000501A,
|
|
WHvRegisterPendingInterruption = 0x80000000,
|
|
WHvRegisterInterruptState = 0x80000001,
|
|
WHvRegisterPendingEvent = 0x80000002,
|
|
WHvX64RegisterDeliverabilityNotifications = 0x80000004,
|
|
WHvRegisterInternalActivityState = 0x80000005,
|
|
WHvX64RegisterPendingDebugException = 0x80000006
|
|
} WHV_REGISTER_NAME;
|
|
|
|
typedef union DECLSPEC_ALIGN(16) WHV_UINT128 {
|
|
__C89_NAMELESS struct {
|
|
UINT64 Low64;
|
|
UINT64 High64;
|
|
};
|
|
UINT32 Dword[4];
|
|
} WHV_UINT128;
|
|
|
|
C_ASSERT(sizeof(WHV_UINT128) == 16);
|
|
|
|
typedef union WHV_X64_FP_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
UINT64 Mantissa;
|
|
UINT64 BiasedExponent:15;
|
|
UINT64 Sign:1;
|
|
UINT64 Reserved:48;
|
|
};
|
|
WHV_UINT128 AsUINT128;
|
|
} WHV_X64_FP_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_FP_REGISTER) == 16);
|
|
|
|
typedef union WHV_X64_FP_CONTROL_STATUS_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
UINT16 FpControl;
|
|
UINT16 FpStatus;
|
|
UINT8 FpTag;
|
|
UINT8 Reserved;
|
|
UINT16 LastFpOp;
|
|
__C89_NAMELESS union {
|
|
UINT64 LastFpRip;
|
|
__C89_NAMELESS struct {
|
|
UINT32 LastFpEip;
|
|
UINT16 LastFpCs;
|
|
UINT16 Reserved2;
|
|
};
|
|
};
|
|
};
|
|
WHV_UINT128 AsUINT128;
|
|
} WHV_X64_FP_CONTROL_STATUS_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_FP_CONTROL_STATUS_REGISTER) == 16);
|
|
|
|
typedef union WHV_X64_XMM_CONTROL_STATUS_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
__C89_NAMELESS union {
|
|
UINT64 LastFpRdp;
|
|
__C89_NAMELESS struct {
|
|
UINT32 LastFpDp;
|
|
UINT16 LastFpDs;
|
|
UINT16 Reserved;
|
|
};
|
|
};
|
|
UINT32 XmmStatusControl;
|
|
UINT32 XmmStatusControlMask;
|
|
};
|
|
WHV_UINT128 AsUINT128;
|
|
} WHV_X64_XMM_CONTROL_STATUS_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_FP_CONTROL_STATUS_REGISTER) == 16);
|
|
|
|
typedef struct WHV_X64_SEGMENT_REGISTER {
|
|
UINT64 Base;
|
|
UINT32 Limit;
|
|
UINT16 Selector;
|
|
__C89_NAMELESS union {
|
|
__C89_NAMELESS struct {
|
|
UINT16 SegmentType:4;
|
|
UINT16 NonSystemSegment:1;
|
|
UINT16 DescriptorPrivilegeLevel:2;
|
|
UINT16 Present:1;
|
|
UINT16 Reserved:4;
|
|
UINT16 Available:1;
|
|
UINT16 Long:1;
|
|
UINT16 Default:1;
|
|
UINT16 Granularity:1;
|
|
};
|
|
UINT16 Attributes;
|
|
};
|
|
} WHV_X64_SEGMENT_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_SEGMENT_REGISTER) == 16);
|
|
|
|
typedef struct WHV_X64_TABLE_REGISTER {
|
|
UINT16 Pad[3];
|
|
UINT16 Limit;
|
|
UINT64 Base;
|
|
} WHV_X64_TABLE_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_TABLE_REGISTER) == 16);
|
|
|
|
typedef union WHV_X64_INTERRUPT_STATE_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
UINT64 InterruptShadow:1;
|
|
UINT64 NmiMasked:1;
|
|
UINT64 Reserved:62;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_X64_INTERRUPT_STATE_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_INTERRUPT_STATE_REGISTER) == 8);
|
|
|
|
typedef union WHV_X64_PENDING_INTERRUPTION_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
UINT32 InterruptionPending:1;
|
|
UINT32 InterruptionType:3;
|
|
UINT32 DeliverErrorCode:1;
|
|
UINT32 InstructionLength:4;
|
|
UINT32 NestedEvent:1;
|
|
UINT32 Reserved:6;
|
|
UINT32 InterruptionVector:16;
|
|
UINT32 ErrorCode;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_X64_PENDING_INTERRUPTION_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_PENDING_INTERRUPTION_REGISTER) == sizeof(UINT64));
|
|
|
|
typedef union WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
UINT64 NmiNotification:1;
|
|
UINT64 InterruptNotification:1;
|
|
UINT64 InterruptPriority:4;
|
|
UINT64 Reserved:42;
|
|
UINT64 Sint:16;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER) == sizeof(UINT64));
|
|
|
|
typedef enum WHV_X64_PENDING_EVENT_TYPE {
|
|
WHvX64PendingEventException = 0,
|
|
WHvX64PendingEventExtInt = 5
|
|
} WHV_X64_PENDING_EVENT_TYPE;
|
|
|
|
typedef union WHV_X64_PENDING_EXCEPTION_EVENT {
|
|
__C89_NAMELESS struct {
|
|
UINT32 EventPending : 1;
|
|
UINT32 EventType : 3;
|
|
UINT32 Reserved0 : 4;
|
|
UINT32 DeliverErrorCode : 1;
|
|
UINT32 Reserved1 : 7;
|
|
UINT32 Vector : 16;
|
|
UINT32 ErrorCode;
|
|
UINT64 ExceptionParameter;
|
|
};
|
|
WHV_UINT128 AsUINT128;
|
|
} WHV_X64_PENDING_EXCEPTION_EVENT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_PENDING_EXCEPTION_EVENT) == sizeof(WHV_UINT128));
|
|
|
|
typedef union WHV_X64_PENDING_EXT_INT_EVENT {
|
|
__C89_NAMELESS struct {
|
|
UINT64 EventPending : 1;
|
|
UINT64 EventType : 3;
|
|
UINT64 Reserved0 : 4;
|
|
UINT64 Vector : 8;
|
|
UINT64 Reserved1 : 48;
|
|
UINT64 Reserved2;
|
|
};
|
|
WHV_UINT128 AsUINT128;
|
|
} WHV_X64_PENDING_EXT_INT_EVENT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_PENDING_EXT_INT_EVENT) == sizeof(WHV_UINT128));
|
|
|
|
typedef union WHV_INTERNAL_ACTIVITY_REGISTER {
|
|
__C89_NAMELESS struct {
|
|
UINT64 StartupSuspend : 1;
|
|
UINT64 HaltSuspend : 1;
|
|
UINT64 IdleSuspend : 1;
|
|
UINT64 Reserved :61;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_INTERNAL_ACTIVITY_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_INTERNAL_ACTIVITY_REGISTER) == sizeof(UINT64));
|
|
|
|
typedef union WHV_X64_PENDING_DEBUG_EXCEPTION {
|
|
UINT64 AsUINT64;
|
|
__C89_NAMELESS struct {
|
|
UINT64 Breakpoint0 : 1;
|
|
UINT64 Breakpoint1 : 1;
|
|
UINT64 Breakpoint2 : 1;
|
|
UINT64 Breakpoint3 : 1;
|
|
UINT64 SingleStep : 1;
|
|
UINT64 Reserved0 : 59;
|
|
};
|
|
} WHV_X64_PENDING_DEBUG_EXCEPTION;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_PENDING_DEBUG_EXCEPTION) == sizeof(UINT64));
|
|
|
|
typedef struct WHV_SYNIC_SINT_DELIVERABLE_CONTEXT {
|
|
UINT16 DeliverableSints;
|
|
UINT16 Reserved1;
|
|
UINT32 Reserved2;
|
|
} WHV_SYNIC_SINT_DELIVERABLE_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_SYNIC_SINT_DELIVERABLE_CONTEXT) == 8);
|
|
|
|
typedef union WHV_REGISTER_VALUE {
|
|
WHV_UINT128 Reg128;
|
|
UINT64 Reg64;
|
|
UINT32 Reg32;
|
|
UINT16 Reg16;
|
|
UINT8 Reg8;
|
|
WHV_X64_FP_REGISTER Fp;
|
|
WHV_X64_FP_CONTROL_STATUS_REGISTER FpControlStatus;
|
|
WHV_X64_XMM_CONTROL_STATUS_REGISTER XmmControlStatus;
|
|
WHV_X64_SEGMENT_REGISTER Segment;
|
|
WHV_X64_TABLE_REGISTER Table;
|
|
WHV_X64_INTERRUPT_STATE_REGISTER InterruptState;
|
|
WHV_X64_PENDING_INTERRUPTION_REGISTER PendingInterruption;
|
|
WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER DeliverabilityNotifications;
|
|
WHV_X64_PENDING_EXCEPTION_EVENT ExceptionEvent;
|
|
WHV_X64_PENDING_EXT_INT_EVENT ExtIntEvent;
|
|
WHV_INTERNAL_ACTIVITY_REGISTER InternalActivity;
|
|
WHV_X64_PENDING_DEBUG_EXCEPTION PendingDebugException;
|
|
} WHV_REGISTER_VALUE;
|
|
|
|
C_ASSERT(sizeof(WHV_REGISTER_VALUE) == 16);
|
|
|
|
typedef enum WHV_RUN_VP_EXIT_REASON {
|
|
WHvRunVpExitReasonNone = 0x00000000,
|
|
WHvRunVpExitReasonMemoryAccess = 0x00000001,
|
|
WHvRunVpExitReasonX64IoPortAccess = 0x00000002,
|
|
WHvRunVpExitReasonUnrecoverableException = 0x00000004,
|
|
WHvRunVpExitReasonInvalidVpRegisterValue = 0x00000005,
|
|
WHvRunVpExitReasonUnsupportedFeature = 0x00000006,
|
|
WHvRunVpExitReasonX64InterruptWindow = 0x00000007,
|
|
WHvRunVpExitReasonX64Halt = 0x00000008,
|
|
WHvRunVpExitReasonX64ApicEoi = 0x00000009,
|
|
WHvRunVpExitReasonSynicSintDeliverable = 0x0000000A,
|
|
WHvRunVpExitReasonX64MsrAccess = 0x00001000,
|
|
WHvRunVpExitReasonX64Cpuid = 0x00001001,
|
|
WHvRunVpExitReasonException = 0x00001002,
|
|
WHvRunVpExitReasonX64Rdtsc = 0x00001003,
|
|
WHvRunVpExitReasonX64ApicSmiTrap = 0x00001004,
|
|
WHvRunVpExitReasonHypercall = 0x00001005,
|
|
WHvRunVpExitReasonX64ApicInitSipiTrap = 0x00001006,
|
|
WHvRunVpExitReasonX64ApicWriteTrap = 0x00001007,
|
|
WHvRunVpExitReasonCanceled = 0x00002001
|
|
} WHV_RUN_VP_EXIT_REASON;
|
|
|
|
typedef union WHV_X64_VP_EXECUTION_STATE {
|
|
__C89_NAMELESS struct {
|
|
UINT16 Cpl : 2;
|
|
UINT16 Cr0Pe : 1;
|
|
UINT16 Cr0Am : 1;
|
|
UINT16 EferLma : 1;
|
|
UINT16 DebugActive : 1;
|
|
UINT16 InterruptionPending : 1;
|
|
UINT16 Reserved0 : 5;
|
|
UINT16 InterruptShadow : 1;
|
|
UINT16 Reserved1 : 3;
|
|
};
|
|
UINT16 AsUINT16;
|
|
} WHV_X64_VP_EXECUTION_STATE;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_VP_EXECUTION_STATE) == sizeof(UINT16));
|
|
|
|
typedef struct WHV_VP_EXIT_CONTEXT {
|
|
WHV_X64_VP_EXECUTION_STATE ExecutionState;
|
|
UINT8 InstructionLength : 4;
|
|
UINT8 Cr8 : 4;
|
|
UINT8 Reserved;
|
|
UINT32 Reserved2;
|
|
WHV_X64_SEGMENT_REGISTER Cs;
|
|
UINT64 Rip;
|
|
UINT64 Rflags;
|
|
} WHV_VP_EXIT_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_VP_EXIT_CONTEXT) == 40);
|
|
|
|
typedef union WHV_MEMORY_ACCESS_INFO {
|
|
__C89_NAMELESS struct {
|
|
UINT32 AccessType : 2;
|
|
UINT32 GpaUnmapped : 1;
|
|
UINT32 GvaValid : 1;
|
|
UINT32 Reserved : 28;
|
|
};
|
|
UINT32 AsUINT32;
|
|
} WHV_MEMORY_ACCESS_INFO;
|
|
|
|
C_ASSERT(sizeof(WHV_MEMORY_ACCESS_INFO) == 4);
|
|
|
|
typedef struct WHV_MEMORY_ACCESS_CONTEXT {
|
|
UINT8 InstructionByteCount;
|
|
UINT8 Reserved[3];
|
|
UINT8 InstructionBytes[16];
|
|
WHV_MEMORY_ACCESS_INFO AccessInfo;
|
|
WHV_GUEST_PHYSICAL_ADDRESS Gpa;
|
|
WHV_GUEST_VIRTUAL_ADDRESS Gva;
|
|
} WHV_MEMORY_ACCESS_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_MEMORY_ACCESS_CONTEXT) == 40);
|
|
|
|
typedef union WHV_X64_IO_PORT_ACCESS_INFO {
|
|
__C89_NAMELESS struct {
|
|
UINT32 IsWrite : 1;
|
|
UINT32 AccessSize: 3;
|
|
UINT32 StringOp : 1;
|
|
UINT32 RepPrefix : 1;
|
|
UINT32 Reserved : 26;
|
|
};
|
|
UINT32 AsUINT32;
|
|
} WHV_X64_IO_PORT_ACCESS_INFO;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_INFO) == sizeof(UINT32));
|
|
|
|
typedef struct WHV_X64_IO_PORT_ACCESS_CONTEXT {
|
|
UINT8 InstructionByteCount;
|
|
UINT8 Reserved[3];
|
|
UINT8 InstructionBytes[16];
|
|
WHV_X64_IO_PORT_ACCESS_INFO AccessInfo;
|
|
UINT16 PortNumber;
|
|
UINT16 Reserved2[3];
|
|
UINT64 Rax;
|
|
UINT64 Rcx;
|
|
UINT64 Rsi;
|
|
UINT64 Rdi;
|
|
WHV_X64_SEGMENT_REGISTER Ds;
|
|
WHV_X64_SEGMENT_REGISTER Es;
|
|
} WHV_X64_IO_PORT_ACCESS_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_IO_PORT_ACCESS_CONTEXT) == 96);
|
|
|
|
typedef union WHV_X64_MSR_ACCESS_INFO {
|
|
__C89_NAMELESS struct {
|
|
UINT32 IsWrite : 1;
|
|
UINT32 Reserved : 31;
|
|
};
|
|
UINT32 AsUINT32;
|
|
} WHV_X64_MSR_ACCESS_INFO;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_INFO) == sizeof(UINT32));
|
|
|
|
typedef struct WHV_X64_MSR_ACCESS_CONTEXT {
|
|
WHV_X64_MSR_ACCESS_INFO AccessInfo;
|
|
UINT32 MsrNumber;
|
|
UINT64 Rax;
|
|
UINT64 Rdx;
|
|
} WHV_X64_MSR_ACCESS_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_MSR_ACCESS_CONTEXT) == 24);
|
|
|
|
typedef struct WHV_X64_CPUID_ACCESS_CONTEXT {
|
|
UINT64 Rax;
|
|
UINT64 Rcx;
|
|
UINT64 Rdx;
|
|
UINT64 Rbx;
|
|
UINT64 DefaultResultRax;
|
|
UINT64 DefaultResultRcx;
|
|
UINT64 DefaultResultRdx;
|
|
UINT64 DefaultResultRbx;
|
|
} WHV_X64_CPUID_ACCESS_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_CPUID_ACCESS_CONTEXT) == 64);
|
|
|
|
typedef union WHV_VP_EXCEPTION_INFO {
|
|
__C89_NAMELESS struct {
|
|
UINT32 ErrorCodeValid : 1;
|
|
UINT32 SoftwareException : 1;
|
|
UINT32 Reserved : 30;
|
|
};
|
|
UINT32 AsUINT32;
|
|
} WHV_VP_EXCEPTION_INFO;
|
|
|
|
C_ASSERT(sizeof(WHV_VP_EXCEPTION_INFO) == sizeof(UINT32));
|
|
|
|
typedef struct WHV_VP_EXCEPTION_CONTEXT {
|
|
UINT8 InstructionByteCount;
|
|
UINT8 Reserved[3];
|
|
UINT8 InstructionBytes[16];
|
|
WHV_VP_EXCEPTION_INFO ExceptionInfo;
|
|
UINT8 ExceptionType;
|
|
UINT8 Reserved2[3];
|
|
UINT32 ErrorCode;
|
|
UINT64 ExceptionParameter;
|
|
} WHV_VP_EXCEPTION_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_VP_EXCEPTION_CONTEXT) == 40);
|
|
|
|
typedef enum WHV_X64_UNSUPPORTED_FEATURE_CODE {
|
|
WHvUnsupportedFeatureIntercept = 1,
|
|
WHvUnsupportedFeatureTaskSwitchTss = 2
|
|
} WHV_X64_UNSUPPORTED_FEATURE_CODE;
|
|
|
|
typedef struct WHV_X64_UNSUPPORTED_FEATURE_CONTEXT {
|
|
WHV_X64_UNSUPPORTED_FEATURE_CODE FeatureCode;
|
|
UINT32 Reserved;
|
|
UINT64 FeatureParameter;
|
|
} WHV_X64_UNSUPPORTED_FEATURE_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_UNSUPPORTED_FEATURE_CONTEXT) == 16);
|
|
|
|
typedef enum WHV_RUN_VP_CANCEL_REASON {
|
|
WhvRunVpCancelReasonUser = 0
|
|
} WHV_RUN_VP_CANCEL_REASON;
|
|
|
|
typedef struct WHV_RUN_VP_CANCELED_CONTEXT {
|
|
WHV_RUN_VP_CANCEL_REASON CancelReason;
|
|
} WHV_RUN_VP_CANCELED_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_RUN_VP_CANCELED_CONTEXT) == 4);
|
|
|
|
typedef enum WHV_X64_PENDING_INTERRUPTION_TYPE {
|
|
WHvX64PendingInterrupt = 0,
|
|
WHvX64PendingNmi = 2,
|
|
WHvX64PendingException = 3
|
|
} WHV_X64_PENDING_INTERRUPTION_TYPE, *PWHV_X64_PENDING_INTERRUPTION_TYPE;
|
|
|
|
typedef struct WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT {
|
|
WHV_X64_PENDING_INTERRUPTION_TYPE DeliverableType;
|
|
} WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT, *PWHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT) == 4);
|
|
|
|
typedef struct WHV_X64_APIC_EOI_CONTEXT {
|
|
UINT32 InterruptVector;
|
|
} WHV_X64_APIC_EOI_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_APIC_EOI_CONTEXT) == 4);
|
|
|
|
typedef union WHV_X64_RDTSC_INFO {
|
|
__C89_NAMELESS struct {
|
|
UINT64 IsRdtscp : 1;
|
|
UINT64 Reserved : 63;
|
|
};
|
|
UINT64 AsUINT64;
|
|
} WHV_X64_RDTSC_INFO;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_RDTSC_INFO) == 8);
|
|
|
|
typedef struct WHV_X64_RDTSC_CONTEXT {
|
|
UINT64 TscAux;
|
|
UINT64 VirtualOffset;
|
|
UINT64 Tsc;
|
|
UINT64 ReferenceTime;
|
|
WHV_X64_RDTSC_INFO RdtscInfo;
|
|
} WHV_X64_RDTSC_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_RDTSC_CONTEXT) == 40);
|
|
|
|
typedef struct WHV_X64_APIC_SMI_CONTEXT {
|
|
UINT64 ApicIcr;
|
|
} WHV_X64_APIC_SMI_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_APIC_SMI_CONTEXT) == 8);
|
|
|
|
#define WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS 6
|
|
|
|
typedef struct _WHV_HYPERCALL_CONTEXT {
|
|
UINT64 Rax;
|
|
UINT64 Rbx;
|
|
UINT64 Rcx;
|
|
UINT64 Rdx;
|
|
UINT64 R8;
|
|
UINT64 Rsi;
|
|
UINT64 Rdi;
|
|
UINT64 Reserved0;
|
|
WHV_UINT128 XmmRegisters[WHV_HYPERCALL_CONTEXT_MAX_XMM_REGISTERS];
|
|
UINT64 Reserved1[2];
|
|
} WHV_HYPERCALL_CONTEXT, *PWHV_HYPERCALL_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_HYPERCALL_CONTEXT) == 176);
|
|
|
|
typedef struct WHV_X64_APIC_INIT_SIPI_CONTEXT {
|
|
UINT64 ApicIcr;
|
|
} WHV_X64_APIC_INIT_SIPI_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_APIC_INIT_SIPI_CONTEXT) == 8);
|
|
|
|
typedef enum WHV_X64_APIC_WRITE_TYPE {
|
|
WHvX64ApicWriteTypeLdr = 0xD0,
|
|
WHvX64ApicWriteTypeDfr = 0xE0,
|
|
WHvX64ApicWriteTypeSvr = 0xF0,
|
|
WHvX64ApicWriteTypeLint0 = 0x350,
|
|
WHvX64ApicWriteTypeLint1 = 0x360
|
|
} WHV_X64_APIC_WRITE_TYPE;
|
|
|
|
typedef struct WHV_X64_APIC_WRITE_CONTEXT {
|
|
WHV_X64_APIC_WRITE_TYPE Type;
|
|
UINT32 Reserved;
|
|
UINT64 WriteValue;
|
|
} WHV_X64_APIC_WRITE_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_X64_APIC_WRITE_CONTEXT) == 16);
|
|
|
|
typedef struct WHV_RUN_VP_EXIT_CONTEXT {
|
|
WHV_RUN_VP_EXIT_REASON ExitReason;
|
|
UINT32 Reserved;
|
|
WHV_VP_EXIT_CONTEXT VpContext;
|
|
__C89_NAMELESS union {
|
|
WHV_MEMORY_ACCESS_CONTEXT MemoryAccess;
|
|
WHV_X64_IO_PORT_ACCESS_CONTEXT IoPortAccess;
|
|
WHV_X64_MSR_ACCESS_CONTEXT MsrAccess;
|
|
WHV_X64_CPUID_ACCESS_CONTEXT CpuidAccess;
|
|
WHV_VP_EXCEPTION_CONTEXT VpException;
|
|
WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT InterruptWindow;
|
|
WHV_X64_UNSUPPORTED_FEATURE_CONTEXT UnsupportedFeature;
|
|
WHV_RUN_VP_CANCELED_CONTEXT CancelReason;
|
|
WHV_X64_APIC_EOI_CONTEXT ApicEoi;
|
|
WHV_X64_RDTSC_CONTEXT ReadTsc;
|
|
WHV_X64_APIC_SMI_CONTEXT ApicSmi;
|
|
WHV_HYPERCALL_CONTEXT Hypercall;
|
|
WHV_X64_APIC_INIT_SIPI_CONTEXT ApicInitSipi;
|
|
WHV_X64_APIC_WRITE_CONTEXT ApicWrite;
|
|
WHV_SYNIC_SINT_DELIVERABLE_CONTEXT SynicSintDeliverable;
|
|
};
|
|
} WHV_RUN_VP_EXIT_CONTEXT;
|
|
|
|
C_ASSERT(sizeof(WHV_RUN_VP_EXIT_CONTEXT) == 224);
|
|
|
|
typedef enum WHV_INTERRUPT_TYPE {
|
|
WHvX64InterruptTypeFixed = 0,
|
|
WHvX64InterruptTypeLowestPriority = 1,
|
|
WHvX64InterruptTypeNmi = 4,
|
|
WHvX64InterruptTypeInit = 5,
|
|
WHvX64InterruptTypeSipi = 6,
|
|
WHvX64InterruptTypeLocalInt1 = 9
|
|
} WHV_INTERRUPT_TYPE;
|
|
|
|
typedef enum WHV_INTERRUPT_DESTINATION_MODE {
|
|
WHvX64InterruptDestinationModePhysical,
|
|
WHvX64InterruptDestinationModeLogical
|
|
} WHV_INTERRUPT_DESTINATION_MODE;
|
|
|
|
typedef enum WHV_INTERRUPT_TRIGGER_MODE {
|
|
WHvX64InterruptTriggerModeEdge,
|
|
WHvX64InterruptTriggerModeLevel
|
|
} WHV_INTERRUPT_TRIGGER_MODE;
|
|
|
|
typedef struct WHV_INTERRUPT_CONTROL {
|
|
UINT64 Type : 8;
|
|
UINT64 DestinationMode : 4;
|
|
UINT64 TriggerMode : 4;
|
|
UINT64 Reserved : 48;
|
|
UINT32 Destination;
|
|
UINT32 Vector;
|
|
} WHV_INTERRUPT_CONTROL;
|
|
|
|
C_ASSERT(sizeof(WHV_INTERRUPT_CONTROL) == 16);
|
|
|
|
typedef struct WHV_DOORBELL_MATCH_DATA {
|
|
WHV_GUEST_PHYSICAL_ADDRESS GuestAddress;
|
|
UINT64 Value;
|
|
UINT32 Length;
|
|
UINT32 MatchOnValue : 1;
|
|
UINT32 MatchOnLength : 1;
|
|
UINT32 Reserved : 30;
|
|
} WHV_DOORBELL_MATCH_DATA;
|
|
|
|
C_ASSERT(sizeof(WHV_DOORBELL_MATCH_DATA) == 24);
|
|
|
|
typedef enum WHV_PARTITION_COUNTER_SET {
|
|
WHvPartitionCounterSetMemory
|
|
} WHV_PARTITION_COUNTER_SET;
|
|
|
|
typedef struct WHV_PARTITION_MEMORY_COUNTERS {
|
|
UINT64 Mapped4KPageCount;
|
|
UINT64 Mapped2MPageCount;
|
|
UINT64 Mapped1GPageCount;
|
|
} WHV_PARTITION_MEMORY_COUNTERS;
|
|
|
|
C_ASSERT(sizeof(WHV_PARTITION_MEMORY_COUNTERS) == 24);
|
|
|
|
typedef enum WHV_PROCESSOR_COUNTER_SET {
|
|
WHvProcessorCounterSetRuntime,
|
|
WHvProcessorCounterSetIntercepts,
|
|
WHvProcessorCounterSetEvents,
|
|
WHvProcessorCounterSetApic,
|
|
WHvProcessorCounterSetSyntheticFeatures
|
|
} WHV_PROCESSOR_COUNTER_SET;
|
|
|
|
typedef struct WHV_PROCESSOR_RUNTIME_COUNTERS {
|
|
UINT64 TotalRuntime100ns;
|
|
UINT64 HypervisorRuntime100ns;
|
|
} WHV_PROCESSOR_RUNTIME_COUNTERS;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_RUNTIME_COUNTERS) == 16);
|
|
|
|
typedef struct WHV_PROCESSOR_INTERCEPT_COUNTER {
|
|
UINT64 Count;
|
|
UINT64 Time100ns;
|
|
} WHV_PROCESSOR_INTERCEPT_COUNTER;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_INTERCEPT_COUNTER) == 16);
|
|
|
|
typedef struct WHV_PROCESSOR_INTERCEPT_COUNTERS {
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER PageInvalidations;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER ControlRegisterAccesses;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER IoInstructions;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER HaltInstructions;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER CpuidInstructions;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER MsrAccesses;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER OtherIntercepts;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER PendingInterrupts;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER EmulatedInstructions;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER DebugRegisterAccesses;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER PageFaultIntercepts;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER NestedPageFaultIntercepts;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER Hypercalls;
|
|
WHV_PROCESSOR_INTERCEPT_COUNTER RdpmcInstructions;
|
|
} WHV_PROCESSOR_ACTIVITY_COUNTERS;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_ACTIVITY_COUNTERS) == 224);
|
|
|
|
typedef struct WHV_PROCESSOR_EVENT_COUNTERS {
|
|
UINT64 PageFaultCount;
|
|
UINT64 ExceptionCount;
|
|
UINT64 InterruptCount;
|
|
} WHV_PROCESSOR_GUEST_EVENT_COUNTERS;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_GUEST_EVENT_COUNTERS) == 24);
|
|
|
|
typedef struct WHV_PROCESSOR_APIC_COUNTERS {
|
|
UINT64 MmioAccessCount;
|
|
UINT64 EoiAccessCount;
|
|
UINT64 TprAccessCount;
|
|
UINT64 SentIpiCount;
|
|
UINT64 SelfIpiCount;
|
|
} WHV_PROCESSOR_APIC_COUNTERS;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_APIC_COUNTERS) == 40);
|
|
|
|
typedef struct WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS {
|
|
UINT64 SyntheticInterruptsCount;
|
|
UINT64 LongSpinWaitHypercallsCount;
|
|
UINT64 OtherHypercallsCount;
|
|
UINT64 SyntheticInterruptHypercallsCount;
|
|
UINT64 VirtualInterruptHypercallsCount;
|
|
UINT64 VirtualMmuHypercallsCount;
|
|
} WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS;
|
|
|
|
C_ASSERT(sizeof(WHV_PROCESSOR_SYNTHETIC_FEATURES_COUNTERS) == 48);
|
|
|
|
typedef enum WHV_ADVISE_GPA_RANGE_CODE {
|
|
WHvAdviseGpaRangeCodePopulate = 0x00000000,
|
|
WHvAdviseGpaRangeCodePin = 0x00000001,
|
|
WHvAdviseGpaRangeCodeUnpin = 0x00000002
|
|
} WHV_ADVISE_GPA_RANGE_CODE;
|
|
|
|
typedef enum WHV_VIRTUAL_PROCESSOR_STATE_TYPE {
|
|
WHvVirtualProcessorStateTypeSynicMessagePage = 0x00000000,
|
|
WHvVirtualProcessorStateTypeSynicEventFlagPage = 0x00000001,
|
|
WHvVirtualProcessorStateTypeSynicTimerState = 0x00000002,
|
|
WHvVirtualProcessorStateTypeInterruptControllerState2 = 0x00001000,
|
|
WHvVirtualProcessorStateTypeXsaveState = 0x00001001
|
|
} WHV_VIRTUAL_PROCESSOR_STATE_TYPE;
|
|
|
|
typedef struct WHV_SYNIC_EVENT_PARAMETERS {
|
|
UINT32 VpIndex;
|
|
UINT8 TargetSint;
|
|
UINT8 Reserved;
|
|
UINT16 FlagNumber;
|
|
} WHV_SYNIC_EVENT_PARAMETERS;
|
|
|
|
C_ASSERT(sizeof(WHV_SYNIC_EVENT_PARAMETERS) == 8);
|
|
|
|
typedef enum WHV_ALLOCATE_VPCI_RESOURCE_FLAGS {
|
|
WHvAllocateVpciResourceFlagNone = 0x00000000,
|
|
WHvAllocateVpciResourceFlagAllowDirectP2P = 0x00000001
|
|
} WHV_ALLOCATE_VPCI_RESOURCE_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_ALLOCATE_VPCI_RESOURCE_FLAGS);
|
|
|
|
#define WHV_MAX_DEVICE_ID_SIZE_IN_CHARS 200
|
|
|
|
typedef struct WHV_SRIOV_RESOURCE_DESCRIPTOR {
|
|
WCHAR PnpInstanceId[WHV_MAX_DEVICE_ID_SIZE_IN_CHARS];
|
|
LUID VirtualFunctionId;
|
|
UINT16 VirtualFunctionIndex;
|
|
UINT16 Reserved;
|
|
} WHV_SRIOV_RESOURCE_DESCRIPTOR;
|
|
|
|
C_ASSERT(sizeof(WHV_SRIOV_RESOURCE_DESCRIPTOR) == 412);
|
|
|
|
typedef enum WHV_VPCI_DEVICE_NOTIFICATION_TYPE {
|
|
WHvVpciDeviceNotificationUndefined = 0,
|
|
WHvVpciDeviceNotificationMmioRemapping = 1,
|
|
WHvVpciDeviceNotificationSurpriseRemoval = 2
|
|
} WHV_VPCI_DEVICE_NOTIFICATION_TYPE;
|
|
|
|
typedef struct WHV_VPCI_DEVICE_NOTIFICATION {
|
|
WHV_VPCI_DEVICE_NOTIFICATION_TYPE NotificationType;
|
|
UINT32 Reserved1;
|
|
__C89_NAMELESS union {
|
|
UINT64 Reserved2;
|
|
};
|
|
} WHV_VPCI_DEVICE_NOTIFICATION;
|
|
|
|
C_ASSERT(sizeof(WHV_VPCI_DEVICE_NOTIFICATION) == 16);
|
|
|
|
typedef enum WHV_CREATE_VPCI_DEVICE_FLAGS {
|
|
WHvCreateVpciDeviceFlagNone = 0x00000000,
|
|
WHvCreateVpciDeviceFlagPhysicallyBacked = 0x00000001,
|
|
WHvCreateVpciDeviceFlagUseLogicalInterrupts = 0x00000002
|
|
} WHV_CREATE_VPCI_DEVICE_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_CREATE_VPCI_DEVICE_FLAGS);
|
|
|
|
typedef enum WHV_VPCI_DEVICE_PROPERTY_CODE {
|
|
WHvVpciDevicePropertyCodeUndefined = 0,
|
|
WHvVpciDevicePropertyCodeHardwareIDs = 1,
|
|
WHvVpciDevicePropertyCodeProbedBARs = 2
|
|
} WHV_VPCI_DEVICE_PROPERTY_CODE;
|
|
|
|
typedef struct WHV_VPCI_HARDWARE_IDS {
|
|
UINT16 VendorID;
|
|
UINT16 DeviceID;
|
|
UINT8 RevisionID;
|
|
UINT8 ProgIf;
|
|
UINT8 SubClass;
|
|
UINT8 BaseClass;
|
|
UINT16 SubVendorID;
|
|
UINT16 SubSystemID;
|
|
} WHV_VPCI_HARDWARE_IDS;
|
|
|
|
C_ASSERT(sizeof(WHV_VPCI_HARDWARE_IDS) == 12);
|
|
|
|
#define WHV_VPCI_TYPE0_BAR_COUNT 6
|
|
|
|
typedef struct WHV_VPCI_PROBED_BARS {
|
|
UINT32 Value[WHV_VPCI_TYPE0_BAR_COUNT];
|
|
} WHV_VPCI_PROBED_BARS;
|
|
|
|
C_ASSERT(sizeof(WHV_VPCI_PROBED_BARS) == 24);
|
|
|
|
typedef enum WHV_VPCI_MMIO_RANGE_FLAGS {
|
|
WHvVpciMmioRangeFlagReadAccess = 0x00000001,
|
|
WHvVpciMmioRangeFlagWriteAccess = 0x00000002
|
|
} WHV_VPCI_MMIO_RANGE_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_MMIO_RANGE_FLAGS);
|
|
|
|
typedef enum WHV_VPCI_DEVICE_REGISTER_SPACE {
|
|
WHvVpciConfigSpace = -1,
|
|
WHvVpciBar0 = 0,
|
|
WHvVpciBar1 = 1,
|
|
WHvVpciBar2 = 2,
|
|
WHvVpciBar3 = 3,
|
|
WHvVpciBar4 = 4,
|
|
WHvVpciBar5 = 5
|
|
} WHV_VPCI_DEVICE_REGISTER_SPACE;
|
|
|
|
typedef struct WHV_VPCI_MMIO_MAPPING {
|
|
WHV_VPCI_DEVICE_REGISTER_SPACE Location;
|
|
WHV_VPCI_MMIO_RANGE_FLAGS Flags;
|
|
UINT64 SizeInBytes;
|
|
UINT64 OffsetInBytes;
|
|
PVOID VirtualAddress;
|
|
} WHV_VPCI_MMIO_MAPPING;
|
|
|
|
C_ASSERT(sizeof(WHV_VPCI_MMIO_MAPPING) == 32);
|
|
|
|
typedef struct WHV_VPCI_DEVICE_REGISTER {
|
|
WHV_VPCI_DEVICE_REGISTER_SPACE Location;
|
|
UINT32 SizeInBytes;
|
|
UINT64 OffsetInBytes;
|
|
} WHV_VPCI_DEVICE_REGISTER;
|
|
|
|
C_ASSERT(sizeof(WHV_VPCI_DEVICE_REGISTER) == 16);
|
|
|
|
typedef enum WHV_VPCI_INTERRUPT_TARGET_FLAGS {
|
|
WHvVpciInterruptTargetFlagNone = 0x00000000,
|
|
WHvVpciInterruptTargetFlagMulticast = 0x00000001
|
|
} WHV_VPCI_INTERRUPT_TARGET_FLAGS;
|
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_INTERRUPT_TARGET_FLAGS);
|
|
|
|
typedef struct WHV_VPCI_INTERRUPT_TARGET {
|
|
UINT32 Vector;
|
|
WHV_VPCI_INTERRUPT_TARGET_FLAGS Flags;
|
|
UINT32 ProcessorCount;
|
|
UINT32 Processors[ANYSIZE_ARRAY];
|
|
} WHV_VPCI_INTERRUPT_TARGET;
|
|
|
|
C_ASSERT(sizeof(WHV_VPCI_INTERRUPT_TARGET) == 16);
|
|
|
|
typedef enum WHV_TRIGGER_TYPE {
|
|
WHvTriggerTypeInterrupt = 0,
|
|
WHvTriggerTypeSynicEvent = 1,
|
|
WHvTriggerTypeDeviceInterrupt = 2
|
|
} WHV_TRIGGER_TYPE;
|
|
|
|
typedef struct WHV_TRIGGER_PARAMETERS {
|
|
WHV_TRIGGER_TYPE TriggerType;
|
|
UINT32 Reserved;
|
|
__C89_NAMELESS union {
|
|
WHV_INTERRUPT_CONTROL Interrupt;
|
|
WHV_SYNIC_EVENT_PARAMETERS SynicEvent;
|
|
__C89_NAMELESS struct {
|
|
UINT64 LogicalDeviceId;
|
|
UINT64 MsiAddress;
|
|
UINT32 MsiData;
|
|
UINT32 Reserved;
|
|
} DeviceInterrupt;
|
|
};
|
|
} WHV_TRIGGER_PARAMETERS;
|
|
|
|
C_ASSERT(sizeof(WHV_TRIGGER_PARAMETERS) == 32);
|
|
|
|
typedef PVOID WHV_TRIGGER_HANDLE;
|
|
|
|
typedef enum WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE {
|
|
WHvVirtualProcessorPropertyCodeNumaNode = 0x00000000
|
|
} WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE;
|
|
|
|
typedef struct WHV_VIRTUAL_PROCESSOR_PROPERTY {
|
|
WHV_VIRTUAL_PROCESSOR_PROPERTY_CODE PropertyCode;
|
|
UINT32 Reserved;
|
|
__C89_NAMELESS union {
|
|
USHORT NumaNode;
|
|
UINT64 Padding;
|
|
};
|
|
} WHV_VIRTUAL_PROCESSOR_PROPERTY;
|
|
|
|
C_ASSERT(sizeof(WHV_VIRTUAL_PROCESSOR_PROPERTY) == 16);
|
|
|
|
typedef enum WHV_NOTIFICATION_PORT_TYPE {
|
|
WHvNotificationPortTypeEvent = 2,
|
|
WHvNotificationPortTypeDoorbell = 4
|
|
} WHV_NOTIFICATION_PORT_TYPE;
|
|
|
|
typedef struct WHV_NOTIFICATION_PORT_PARAMETERS {
|
|
WHV_NOTIFICATION_PORT_TYPE NotificationPortType;
|
|
UINT32 Reserved;
|
|
__C89_NAMELESS union {
|
|
WHV_DOORBELL_MATCH_DATA Doorbell;
|
|
__C89_NAMELESS struct {
|
|
UINT32 ConnectionId;
|
|
} Event;
|
|
};
|
|
} WHV_NOTIFICATION_PORT_PARAMETERS;
|
|
|
|
C_ASSERT(sizeof(WHV_NOTIFICATION_PORT_PARAMETERS) == 32);
|
|
|
|
typedef enum WHV_NOTIFICATION_PORT_PROPERTY_CODE {
|
|
WHvNotificationPortPropertyPreferredTargetVp = 1,
|
|
WHvNotificationPortPropertyPreferredTargetDuration = 5
|
|
} WHV_NOTIFICATION_PORT_PROPERTY_CODE;
|
|
|
|
typedef UINT64 WHV_NOTIFICATION_PORT_PROPERTY;
|
|
|
|
#define WHV_ANY_VP (0xFFFFFFFF)
|
|
|
|
#define WHV_NOTIFICATION_PORT_PREFERRED_DURATION_MAX (0xFFFFFFFFFFFFFFFFULL)
|
|
|
|
typedef PVOID WHV_NOTIFICATION_PORT_HANDLE;
|
|
|
|
#define WHV_SYNIC_MESSAGE_SIZE 256
|
|
|
|
#endif /* _WINHVAPIDEFS_H_ */
|