17#define XSTATE_UINTR 14
19#define XSTATE_MASK_PKRU (1LL << (XSTATE_PKRU))
20#define XSTATE_MASK_HDC (1LL << (XSTATE_HDC))
21#define XSTATE_MASK_UINTR (1LL << (XSTATE_UINTR))
22#define XSTATE_MASK_LBR (1LL << (XSTATE_LBR))
24#define XSTATE_MASK_SUPERVISOR \
47 ULONG64 SupportedSupervisorMask;
49 ULONG NextUserOffset, NextSupervisorOffset, NextOffset;
60 SupportedUserMask = (
ULONG64)ExtStateMain.
Edx << 32 |
64 SupportedUserMask &= ~XSTATE_MASK_LARGE_FEATURES;
67 SupportedUserMask &= XSTATE_MASK_ALLOWED;
76 XStateConfig->OptimizedSave = ExtStateSub.
Eax.
Bits.XSAVEOPT;
77 XStateConfig->CompactionEnabled = ExtStateSub.
Eax.
Bits.XSAVEC;
78 XStateConfig->ExtendedFeatureDisable = ExtStateSub.
Eax.
Bits.Xfd;
81 SupportedSupervisorMask = 0;
82 if (ExtStateSub.
Eax.
Bits.XSAVES)
84 SupportedSupervisorMask = (
ULONG64)ExtStateSub.
Edx << 32 |
90 SupportedComponentMask = SupportedUserMask | SupportedSupervisorMask;
101 NextUserOffset = NextSupervisorOffset =
sizeof(
XSAVE_AREA);
115 XStateConfig->AllFeatures[
Component] = ExtStateComponent.
Size;
118 if (ExtStateComponent.
Size == 0)
continue;
121 if ((ComponentBit & SupportedComponentMask) == 0)
127 XStateConfig->Features[
Component].Size = ExtStateComponent.
Size;
135 if (XStateConfig->CompactionEnabled)
138 if (ExtStateComponent.
Ecx.
Bits.Aligned)
140 XStateConfig->AlignedFeatures |= ComponentBit;
141 NextSupervisorOffset =
ALIGN_UP(NextSupervisorOffset, 64);
142 if ((ComponentBit & SupportedUserMask) != 0)
144 NextUserOffset =
ALIGN_UP(NextUserOffset, 64);
149 NextSupervisorOffset += ExtStateComponent.
Size;
152 if ((ComponentBit & SupportedUserMask) != 0)
154 XStateConfig->Features[
Component].Offset = NextUserOffset;
155 XStateConfig->Features[
Component].Size = ExtStateComponent.
Size;
156 NextUserOffset += ExtStateComponent.
Size;
162 NextOffset = ExtStateComponent.
Offset + ExtStateComponent.
Size;
163 NextSupervisorOffset =
max(NextSupervisorOffset, NextOffset);
166 if ((ComponentBit & SupportedUserMask) != 0)
169 XStateConfig->Features[
Component].Size = ExtStateComponent.
Size;
170 NextUserOffset =
max(NextUserOffset, NextOffset);
176 XStateConfig->EnabledFeatures = SupportedUserMask;
177 XStateConfig->EnabledVolatileFeatures =
178 SupportedUserMask & ~XSTATE_MASK_PERSISTENT;
179 XStateConfig->EnabledSupervisorFeatures = SupportedSupervisorMask;
180 XStateConfig->EnabledUserVisibleSupervisorFeatures =
184 XStateConfig->Size = NextUserOffset;
185 XStateConfig->AllFeatureSize = NextSupervisorOffset;
186 ASSERT(XStateConfig->AllFeatureSize >= XStateConfig->Size);
204 (XState->Size != GlobalXState->
Size) ||
208 KeBugCheck(MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED);
213 if ((XState->Features[
i].Size != GlobalXState->
Features[
i].Size) ||
214 (XState->Features[
i].Offset != GlobalXState->
Features[
i].Offset) ||
218 KeBugCheck(MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED);
241 if (ProcessorNumber == 0)
278 DPRINT1(
"Processor %lu, CPUID 0xD, leaf 0, EBX returns 0x%x, but we calculated 0x%lx\n",
300 DPRINT1(
"Processor %lu, CPUID 0xD, leaf 1, EBX returns 0x%x, but we calculated 0x%lx\n",
#define CPUID_EXTENDED_STATE
#define CPUID_EXTENDED_STATE_SUB_LEAF
#define CPUID_EXTENDED_STATE_MAIN_LEAF
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
void __cdecl _xsetbv(unsigned int, unsigned __int64)
PPC_QUAL void __writemsr(const unsigned long Value)
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]
ULONG64 EnabledSupervisorFeatures
ULONG AllFeatures[MAXIMUM_XSTATE_FEATURES]
#define FIELD_OFFSET(t, f)
#define RtlZeroMemory(Destination, Length)
#define ALIGN_UP(size, type)
CPUID_EXTENDED_STATE_MAIN_LEAF_EAX Eax
struct CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX::@4047 Bits
CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX Ecx
struct CPUID_EXTENDED_STATE_SUB_LEAF_EAX::@4045 Bits
CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax
CPUID_EXTENDED_STATE_SUB_LEAF_ECX Ecx
struct CPUID_EXTENDED_STATE_SUB_LEAF_REGS::@3942::@3944 Ebx
#define MAXIMUM_XSTATE_FEATURES
#define XSTATE_LEGACY_SSE
#define XSTATE_LEGACY_FLOATING_POINT
#define XSTATE_MASK_USER_VISIBLE_SUPERVISOR
#define FIELD_SIZE(type, field)
VOID NTAPI KiInitializeXStateConfiguration(_In_ ULONG ProcessorNumber)
Initializes the extended state configuration for the current processor.
#define XSTATE_MASK_SUPERVISOR
static VOID KiGetXStateConfiguration(_Out_ PXSTATE_CONFIGURATION XStateConfig)
Determines the extended state configuration for the current processor.
static VOID ValidateXStateConfig(_In_ PXSTATE_CONFIGURATION XState)
Validates the provided extended state configuration against the global one.