Determines the extended state configuration for the current processor.
45{
47 ULONG64 SupportedSupervisorMask;
49 ULONG NextUserOffset, NextSupervisorOffset, NextOffset;
50
52
53
58
59
60 SupportedUserMask = (
ULONG64)ExtStateMain.
Edx << 32 |
62
63
64 SupportedUserMask &= ~XSTATE_MASK_LARGE_FEATURES;
65
66
67 SupportedUserMask &= XSTATE_MASK_ALLOWED;
68
69
74
75
76 XStateConfig->OptimizedSave = ExtStateSub.
Eax.
Bits.XSAVEOPT;
77 XStateConfig->CompactionEnabled = ExtStateSub.
Eax.
Bits.XSAVEC;
78 XStateConfig->ExtendedFeatureDisable = ExtStateSub.
Eax.
Bits.Xfd;
79
80
81 SupportedSupervisorMask = 0;
82 if (ExtStateSub.
Eax.
Bits.XSAVES)
83 {
84 SupportedSupervisorMask = (
ULONG64)ExtStateSub.
Edx << 32 |
87 }
88
89
90 SupportedComponentMask = SupportedUserMask | SupportedSupervisorMask;
91
92
99
100
101 NextUserOffset = NextSupervisorOffset =
sizeof(
XSAVE_AREA);
102
103
105 {
107
108
113
114
115 XStateConfig->AllFeatures[
Component] = ExtStateComponent.
Size;
116
117
118 if (ExtStateComponent.
Size == 0)
continue;
119
120
121 if ((ComponentBit & SupportedComponentMask) == 0)
122 {
123
125 {
127 XStateConfig->Features[
Component].Size = ExtStateComponent.
Size;
128 }
129
130
131 continue;
132 }
133
134
135 if (XStateConfig->CompactionEnabled)
136 {
137
138 if (ExtStateComponent.
Ecx.
Bits.Aligned)
139 {
140 XStateConfig->AlignedFeatures |= ComponentBit;
141 NextSupervisorOffset =
ALIGN_UP(NextSupervisorOffset, 64);
142 if ((ComponentBit & SupportedUserMask) != 0)
143 {
144 NextUserOffset =
ALIGN_UP(NextUserOffset, 64);
145 }
146 }
147
148
149 NextSupervisorOffset += ExtStateComponent.
Size;
150
151
152 if ((ComponentBit & SupportedUserMask) != 0)
153 {
154 XStateConfig->Features[
Component].Offset = NextUserOffset;
155 XStateConfig->Features[
Component].Size = ExtStateComponent.
Size;
156 NextUserOffset += ExtStateComponent.
Size;
157 }
158 }
159 else
160 {
161
162 NextOffset = ExtStateComponent.
Offset + ExtStateComponent.
Size;
163 NextSupervisorOffset =
max(NextSupervisorOffset, NextOffset);
164
165
166 if ((ComponentBit & SupportedUserMask) != 0)
167 {
169 XStateConfig->Features[
Component].Size = ExtStateComponent.
Size;
170 NextUserOffset =
max(NextUserOffset, NextOffset);
171 }
172 }
173 }
174
175
176 XStateConfig->EnabledFeatures = SupportedUserMask;
177 XStateConfig->EnabledVolatileFeatures =
178 SupportedUserMask & ~XSTATE_MASK_PERSISTENT;
179 XStateConfig->EnabledSupervisorFeatures = SupportedSupervisorMask;
180 XStateConfig->EnabledUserVisibleSupervisorFeatures =
182
183
184 XStateConfig->Size = NextUserOffset;
185 XStateConfig->AllFeatureSize = NextSupervisorOffset;
186 ASSERT(XStateConfig->AllFeatureSize >= XStateConfig->Size);
187}
#define CPUID_EXTENDED_STATE
#define CPUID_EXTENDED_STATE_SUB_LEAF
#define CPUID_EXTENDED_STATE_MAIN_LEAF
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
#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::@3898 Bits
CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX Ecx
struct CPUID_EXTENDED_STATE_SUB_LEAF_EAX::@3896 Bits
CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax
CPUID_EXTENDED_STATE_SUB_LEAF_ECX Ecx
#define MAXIMUM_XSTATE_FEATURES
#define XSTATE_LEGACY_SSE
#define XSTATE_LEGACY_FLOATING_POINT
#define XSTATE_MASK_USER_VISIBLE_SUPERVISOR
#define FIELD_SIZE(type, field)
#define XSTATE_MASK_SUPERVISOR