]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - UefiCpuPkg/Library/CpuCommonFeaturesLib/FeatureControl.c
UefiCpuPkg/CpuFeatures: Change files format to DOS
[mirror_edk2.git] / UefiCpuPkg / Library / CpuCommonFeaturesLib / FeatureControl.c
... / ...
CommitLineData
1/** @file\r
2 Features in MSR_IA32_FEATURE_CONTROL register.\r
3\r
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "CpuCommonFeatures.h"\r
16\r
17/**\r
18 Prepares for the data used by CPU feature detection and initialization.\r
19\r
20 @param[in] NumberOfProcessors The number of CPUs in the platform.\r
21\r
22 @return Pointer to a buffer of CPU related configuration data.\r
23\r
24 @note This service could be called by BSP only.\r
25**/\r
26VOID *\r
27EFIAPI\r
28FeatureControlGetConfigData (\r
29 IN UINTN NumberOfProcessors\r
30 )\r
31{\r
32 VOID *ConfigData;\r
33\r
34 ConfigData = AllocateZeroPool (sizeof (MSR_IA32_FEATURE_CONTROL_REGISTER) * NumberOfProcessors);\r
35 ASSERT (ConfigData != NULL);\r
36 return ConfigData;\r
37}\r
38\r
39/**\r
40 Detects if VMX feature supported on current processor.\r
41\r
42 @param[in] ProcessorNumber The index of the CPU executing this function.\r
43 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
44 structure for the CPU executing this function.\r
45 @param[in] ConfigData A pointer to the configuration buffer returned\r
46 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
47 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
48 RegisterCpuFeature().\r
49\r
50 @retval TRUE VMX feature is supported.\r
51 @retval FALSE VMX feature is not supported.\r
52\r
53 @note This service could be called by BSP/APs.\r
54**/\r
55BOOLEAN\r
56EFIAPI\r
57VmxSupport (\r
58 IN UINTN ProcessorNumber,\r
59 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
60 IN VOID *ConfigData OPTIONAL\r
61 )\r
62{\r
63 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
64\r
65 ASSERT (ConfigData != NULL);\r
66 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
67 MsrRegister[ProcessorNumber].Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);\r
68 return (CpuInfo->CpuIdVersionInfoEcx.Bits.VMX == 1);\r
69}\r
70\r
71/**\r
72 Initializes VMX inside SMX feature to specific state.\r
73\r
74 @param[in] ProcessorNumber The index of the CPU executing this function.\r
75 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
76 structure for the CPU executing this function.\r
77 @param[in] ConfigData A pointer to the configuration buffer returned\r
78 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
79 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
80 RegisterCpuFeature().\r
81 @param[in] State If TRUE, then the VMX inside SMX feature must be enabled.\r
82 If FALSE, then the VMX inside SMX feature must be disabled.\r
83\r
84 @retval RETURN_SUCCESS VMX inside SMX feature is initialized.\r
85\r
86 @note This service could be called by BSP only.\r
87**/\r
88RETURN_STATUS\r
89EFIAPI\r
90VmxInsideSmxInitialize (\r
91 IN UINTN ProcessorNumber,\r
92 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
93 IN VOID *ConfigData, OPTIONAL\r
94 IN BOOLEAN State\r
95 )\r
96{\r
97 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
98\r
99 ASSERT (ConfigData != NULL);\r
100 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
101 if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
102 CPU_REGISTER_TABLE_WRITE_FIELD (\r
103 ProcessorNumber,\r
104 Msr,\r
105 MSR_IA32_FEATURE_CONTROL,\r
106 MSR_IA32_FEATURE_CONTROL_REGISTER,\r
107 Bits.EnableVmxInsideSmx,\r
108 (State) ? 1 : 0\r
109 );\r
110 }\r
111 return RETURN_SUCCESS;\r
112}\r
113\r
114/**\r
115 Initializes SENTER feature to specific state.\r
116\r
117 @param[in] ProcessorNumber The index of the CPU executing this function.\r
118 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
119 structure for the CPU executing this function.\r
120 @param[in] ConfigData A pointer to the configuration buffer returned\r
121 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
122 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
123 RegisterCpuFeature().\r
124 @param[in] State If TRUE, then the SENTER feature must be enabled.\r
125 If FALSE, then the SENTER feature must be disabled.\r
126\r
127 @retval RETURN_SUCCESS SENTER feature is initialized.\r
128\r
129 @note This service could be called by BSP only.\r
130**/\r
131RETURN_STATUS\r
132EFIAPI\r
133SenterInitialize (\r
134 IN UINTN ProcessorNumber,\r
135 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
136 IN VOID *ConfigData, OPTIONAL\r
137 IN BOOLEAN State\r
138 )\r
139{\r
140 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
141\r
142 ASSERT (ConfigData != NULL);\r
143 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
144 if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
145 CPU_REGISTER_TABLE_WRITE_FIELD (\r
146 ProcessorNumber,\r
147 Msr,\r
148 MSR_IA32_FEATURE_CONTROL,\r
149 MSR_IA32_FEATURE_CONTROL_REGISTER,\r
150 Bits.SenterLocalFunctionEnables,\r
151 (State) ? 0x7F : 0\r
152 );\r
153\r
154 CPU_REGISTER_TABLE_WRITE_FIELD (\r
155 ProcessorNumber,\r
156 Msr,\r
157 MSR_IA32_FEATURE_CONTROL,\r
158 MSR_IA32_FEATURE_CONTROL_REGISTER,\r
159 Bits.SenterGlobalEnable,\r
160 (State) ? 1 : 0\r
161 );\r
162 }\r
163 return RETURN_SUCCESS;\r
164}\r
165\r
166/**\r
167 Detects if Lock Feature Control Register feature supported on current processor.\r
168\r
169 @param[in] ProcessorNumber The index of the CPU executing this function.\r
170 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
171 structure for the CPU executing this function.\r
172 @param[in] ConfigData A pointer to the configuration buffer returned\r
173 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
174 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
175 RegisterCpuFeature().\r
176\r
177 @retval TRUE Lock Feature Control Register feature is supported.\r
178 @retval FALSE Lock Feature Control Register feature is not supported.\r
179\r
180 @note This service could be called by BSP/APs.\r
181**/\r
182BOOLEAN\r
183EFIAPI\r
184LockFeatureControlRegisterSupport (\r
185 IN UINTN ProcessorNumber,\r
186 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
187 IN VOID *ConfigData OPTIONAL\r
188 )\r
189{\r
190 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
191\r
192 ASSERT (ConfigData != NULL);\r
193 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
194 MsrRegister[ProcessorNumber].Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);\r
195 return TRUE;\r
196}\r
197\r
198/**\r
199 Initializes Lock Feature Control Register feature to specific state.\r
200\r
201 @param[in] ProcessorNumber The index of the CPU executing this function.\r
202 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
203 structure for the CPU executing this function.\r
204 @param[in] ConfigData A pointer to the configuration buffer returned\r
205 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
206 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
207 RegisterCpuFeature().\r
208 @param[in] State If TRUE, then the Lock Feature Control Register feature must be enabled.\r
209 If FALSE, then the Lock Feature Control Register feature must be disabled.\r
210\r
211 @retval RETURN_SUCCESS Lock Feature Control Register feature is initialized.\r
212\r
213 @note This service could be called by BSP only.\r
214**/\r
215RETURN_STATUS\r
216EFIAPI\r
217LockFeatureControlRegisterInitialize (\r
218 IN UINTN ProcessorNumber,\r
219 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
220 IN VOID *ConfigData, OPTIONAL\r
221 IN BOOLEAN State\r
222 )\r
223{\r
224 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
225\r
226 ASSERT (ConfigData != NULL);\r
227 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
228 if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
229 CPU_REGISTER_TABLE_WRITE_FIELD (\r
230 ProcessorNumber,\r
231 Msr,\r
232 MSR_IA32_FEATURE_CONTROL,\r
233 MSR_IA32_FEATURE_CONTROL_REGISTER,\r
234 Bits.Lock,\r
235 1\r
236 );\r
237 }\r
238 return RETURN_SUCCESS;\r
239}\r
240\r
241/**\r
242 Detects if SMX feature supported on current processor.\r
243\r
244 @param[in] ProcessorNumber The index of the CPU executing this function.\r
245 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
246 structure for the CPU executing this function.\r
247 @param[in] ConfigData A pointer to the configuration buffer returned\r
248 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
249 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
250 RegisterCpuFeature().\r
251\r
252 @retval TRUE SMX feature is supported.\r
253 @retval FALSE SMX feature is not supported.\r
254\r
255 @note This service could be called by BSP/APs.\r
256**/\r
257BOOLEAN\r
258EFIAPI\r
259SmxSupport (\r
260 IN UINTN ProcessorNumber,\r
261 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
262 IN VOID *ConfigData OPTIONAL\r
263 )\r
264{\r
265 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
266\r
267 ASSERT (ConfigData != NULL);\r
268 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
269 MsrRegister[ProcessorNumber].Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);\r
270 return (CpuInfo->CpuIdVersionInfoEcx.Bits.SMX == 1);\r
271}\r
272\r
273/**\r
274 Initializes VMX outside SMX feature to specific state.\r
275\r
276 @param[in] ProcessorNumber The index of the CPU executing this function.\r
277 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
278 structure for the CPU executing this function.\r
279 @param[in] ConfigData A pointer to the configuration buffer returned\r
280 by CPU_FEATURE_GET_CONFIG_DATA. NULL if\r
281 CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
282 RegisterCpuFeature().\r
283 @param[in] State If TRUE, then the VMX outside SMX feature must be enabled.\r
284 If FALSE, then the VMX outside SMX feature must be disabled.\r
285\r
286 @retval RETURN_SUCCESS VMX outside SMX feature is initialized.\r
287\r
288 @note This service could be called by BSP only.\r
289**/\r
290RETURN_STATUS\r
291EFIAPI\r
292VmxOutsideSmxInitialize (\r
293 IN UINTN ProcessorNumber,\r
294 IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,\r
295 IN VOID *ConfigData, OPTIONAL\r
296 IN BOOLEAN State\r
297 )\r
298{\r
299 MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
300\r
301 ASSERT (ConfigData != NULL);\r
302 MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
303 if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
304 CPU_REGISTER_TABLE_WRITE_FIELD (\r
305 ProcessorNumber,\r
306 Msr,\r
307 MSR_IA32_FEATURE_CONTROL,\r
308 MSR_IA32_FEATURE_CONTROL_REGISTER,\r
309 Bits.EnableVmxOutsideSmx,\r
310 (State) ? 1 : 0\r
311 );\r
312 }\r
313 return RETURN_SUCCESS;\r
314}\r