HV_X64_HYPERVISOR_FEATURES

The HV_X64_HYPERVISOR_FEATURES structure collects the flags that a Microsoft-compatible hypervisor’s cpuid leaf 0x40000003 produces in the eax, ebx, ecx and edx registers.

Availability

The HV_X64_HYPERVISOR_FEATURES is defined for Windows 10. Earlier versions have an HV_HYPERVISOR_FEATURES. The new name suggests a specialisation to one processor architecture, yet the the structure appears to be defined for both 32-bit and 64-bit Windows.

Documentation Status

The HV_X64_HYPERVISOR_FEATURES is not documented. Some of its members, having previously been defined in the MsHvFeatures member of the HV_CPUID_RESULT union, are documented in the Windows Driver Kit (WDK) for Windows 7, which also provided a C-language definition in the HVGDK.H header file.

The structure anyway repackages material that Microsoft does document—or represents as documented—in the Hypervisor Top-Level Functional Specification. If the structure or its members’ previous definitions have become undocumented, it may be just that Microsoft regards the structure as no more than a convenience for Microsoft’s own programming in the loader and kernel, if not in the hypervisor itself. That said, the Specification that is offered today (12th November 2016) as the most recent version is a PDF that is three years old. Despite the Microsoft Open Specification Promise, flags that have been added since, notably for Windows 10, seem not yet to be documented anywhere in any sense.

Layout

The HV_X64_HYPERVISOR_FEATURES is 0x10 bytes. Names and definitions below are from type information in the symbol files for the Windows 10 kernel.

Offset Definition
0x00
HV_PARTITION_PRIVILEGE_MASK PartitionPrivileges;
0x08
UINT MaxSupportedCState : 4;                                        // 0x0000000F (6.1)
UINT HpetNeededForC3PowerState_Deprecated : 1;                      // 0x00000010 (6.2)
UINT Reserved : 27;
0x0C
UINT MwaitAvailable_Deprecated : 1;                                 // 0x00000001 (6.1)
UINT GuestDebuggingAvailable : 1;                                   // 0x00000002 (6.1)
UINT PerformanceMonitorsAvailable : 1;                              // 0x00000004 (6.1)
UINT CpuDynamicPartitioningAvailable : 1;                           // 0x00000008 (6.1)
UINT XmmRegistersForFastHypercallAvailable : 1;                     // 0x00000010 (6.1)
UINT GuestIdleAvailable : 1;                                        // 0x00000020 (6.1)
UINT HypervisorSleepStateSupportAvailable : 1;                      // 0x00000040 (6.2)
UINT NumaDistanceQueryAvailable : 1;                                // 0x00000080 (6.2)
UINT FrequencyRegsAvailable : 1;                                    // 0x00000100 (6.2)
UINT SyntheticMachineCheckAvailable : 1;                            // 0x00000200 (6.2)
UINT GuestCrashRegsAvailable : 1;                                   // 0x00000400 (6.2)
UINT DebugRegsAvailable : 1;                                        // 0x00000800 (6.2)
UINT Npiep1Available : 1;                                           // 0x00001000 (6.3)
UINT DisableHypervisorAvailable : 1;                                // 0x00002000 (6.3)
UINT ExtendedGvaRangesForFlushVirtualAddressListAvailable : 1;      // 0x00004000
UINT FastHypercallOutputAvailable : 1;                              // 0x00008000
UINT SvmFeaturesAvailable : 1;                                      // 0x00010000
UINT SintPollingModeAvailable : 1;                                  // 0x00020000
UINT Reserved1 : 14;

Version numbers in parentheses date each member’s introduction, as known from prior appearance in the HV_HYPERVISOR_FEATURES or in the even older HV_CPUID_RESULT.