2 Machine Check features.
4 Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "CpuCommonFeatures.h"
18 Detects if Machine Check Exception feature supported on current processor.
20 @param[in] ProcessorNumber The index of the CPU executing this function.
21 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
22 structure for the CPU executing this function.
23 @param[in] ConfigData A pointer to the configuration buffer returned
24 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
25 CPU_FEATURE_GET_CONFIG_DATA was not provided in
28 @retval TRUE Machine Check Exception feature is supported.
29 @retval FALSE Machine Check Exception feature is not supported.
31 @note This service could be called by BSP/APs.
36 IN UINTN ProcessorNumber
,
37 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
38 IN VOID
*ConfigData OPTIONAL
41 return (CpuInfo
->CpuIdVersionInfoEdx
.Bits
.MCE
== 1);
45 Initializes Machine Check Exception feature to specific state.
47 @param[in] ProcessorNumber The index of the CPU executing this function.
48 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
49 structure for the CPU executing this function.
50 @param[in] ConfigData A pointer to the configuration buffer returned
51 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
52 CPU_FEATURE_GET_CONFIG_DATA was not provided in
54 @param[in] State If TRUE, then the Machine Check Exception feature must be enabled.
55 If FALSE, then the Machine Check Exception feature must be disabled.
57 @retval RETURN_SUCCESS Machine Check Exception feature is initialized.
59 @note This service could be called by BSP only.
64 IN UINTN ProcessorNumber
,
65 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
66 IN VOID
*ConfigData
, OPTIONAL
73 CPU_REGISTER_TABLE_WRITE_FIELD (
81 return RETURN_SUCCESS
;
85 Detects if Machine Check Architecture feature supported on current processor.
87 @param[in] ProcessorNumber The index of the CPU executing this function.
88 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
89 structure for the CPU executing this function.
90 @param[in] ConfigData A pointer to the configuration buffer returned
91 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
92 CPU_FEATURE_GET_CONFIG_DATA was not provided in
95 @retval TRUE Machine Check Architecture feature is supported.
96 @retval FALSE Machine Check Architecture feature is not supported.
98 @note This service could be called by BSP/APs.
103 IN UINTN ProcessorNumber
,
104 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
105 IN VOID
*ConfigData OPTIONAL
108 if (!MceSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
111 return (CpuInfo
->CpuIdVersionInfoEdx
.Bits
.MCA
== 1);
115 Initializes Machine Check Architecture feature to specific state.
117 @param[in] ProcessorNumber The index of the CPU executing this function.
118 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
119 structure for the CPU executing this function.
120 @param[in] ConfigData A pointer to the configuration buffer returned
121 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
122 CPU_FEATURE_GET_CONFIG_DATA was not provided in
123 RegisterCpuFeature().
124 @param[in] State If TRUE, then the Machine Check Architecture feature must be enabled.
125 If FALSE, then the Machine Check Architecture feature must be disabled.
127 @retval RETURN_SUCCESS Machine Check Architecture feature is initialized.
129 @note This service could be called by BSP only.
134 IN UINTN ProcessorNumber
,
135 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
136 IN VOID
*ConfigData
, OPTIONAL
140 MSR_IA32_MCG_CAP_REGISTER McgCap
;
144 // The scope of MSR_IA32_MC*_CTL/MSR_IA32_MC*_STATUS is core for below processor type, only program
145 // MSR_IA32_MC*_CTL/MSR_IA32_MC*_STATUS for thread 0 in each core.
147 if (IS_ATOM_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
148 IS_SILVERMONT_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
149 IS_SANDY_BRIDGE_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
150 IS_SKYLAKE_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
151 IS_XEON_PHI_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
152 IS_PENTIUM_4_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
153 IS_CORE_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
)) {
154 if (CpuInfo
->ProcessorInfo
.Location
.Thread
!= 0) {
155 return RETURN_SUCCESS
;
160 // The scope of MSR_IA32_MC*_CTL/MSR_IA32_MC*_STATUS is package for below processor type, only program
161 // MSR_IA32_MC*_CTL/MSR_IA32_MC*_STATUS for thread 0 core 0 in each package.
163 if (IS_NEHALEM_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
)) {
164 if ((CpuInfo
->ProcessorInfo
.Location
.Thread
!= 0) || (CpuInfo
->ProcessorInfo
.Location
.Core
!= 0)) {
165 return RETURN_SUCCESS
;
170 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
171 for (BankIndex
= 0; BankIndex
< (UINT32
) McgCap
.Bits
.Count
; BankIndex
++) {
172 CPU_REGISTER_TABLE_WRITE64 (
175 MSR_IA32_MC0_CTL
+ BankIndex
* 4,
180 if (PcdGetBool (PcdIsPowerOnReset
)) {
181 for (BankIndex
= 0; BankIndex
< (UINTN
) McgCap
.Bits
.Count
; BankIndex
++) {
182 CPU_REGISTER_TABLE_WRITE64 (
185 MSR_IA32_MC0_STATUS
+ BankIndex
* 4,
192 return RETURN_SUCCESS
;
196 Detects if IA32_MCG_CTL feature supported on current processor.
198 @param[in] ProcessorNumber The index of the CPU executing this function.
199 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
200 structure for the CPU executing this function.
201 @param[in] ConfigData A pointer to the configuration buffer returned
202 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
203 CPU_FEATURE_GET_CONFIG_DATA was not provided in
204 RegisterCpuFeature().
206 @retval TRUE IA32_MCG_CTL feature is supported.
207 @retval FALSE IA32_MCG_CTL feature is not supported.
209 @note This service could be called by BSP/APs.
214 IN UINTN ProcessorNumber
,
215 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
216 IN VOID
*ConfigData OPTIONAL
219 MSR_IA32_MCG_CAP_REGISTER McgCap
;
221 if (!McaSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
224 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
225 return (McgCap
.Bits
.MCG_CTL_P
== 1);
229 Initializes IA32_MCG_CTL feature to specific state.
231 @param[in] ProcessorNumber The index of the CPU executing this function.
232 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
233 structure for the CPU executing this function.
234 @param[in] ConfigData A pointer to the configuration buffer returned
235 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
236 CPU_FEATURE_GET_CONFIG_DATA was not provided in
237 RegisterCpuFeature().
238 @param[in] State If TRUE, then the IA32_MCG_CTL feature must be enabled.
239 If FALSE, then the IA32_MCG_CTL feature must be disabled.
241 @retval RETURN_SUCCESS IA32_MCG_CTL feature is initialized.
243 @note This service could be called by BSP only.
248 IN UINTN ProcessorNumber
,
249 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
250 IN VOID
*ConfigData
, OPTIONAL
254 CPU_REGISTER_TABLE_WRITE64 (
258 (State
)? MAX_UINT64
: 0
260 return RETURN_SUCCESS
;
264 Detects if Local machine check exception feature supported on current
267 @param[in] ProcessorNumber The index of the CPU executing this function.
268 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
269 structure for the CPU executing this function.
270 @param[in] ConfigData A pointer to the configuration buffer returned
271 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
272 CPU_FEATURE_GET_CONFIG_DATA was not provided in
273 RegisterCpuFeature().
275 @retval TRUE Local machine check exception feature is supported.
276 @retval FALSE Local machine check exception feature is not supported.
278 @note This service could be called by BSP/APs.
283 IN UINTN ProcessorNumber
,
284 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
285 IN VOID
*ConfigData OPTIONAL
288 MSR_IA32_MCG_CAP_REGISTER McgCap
;
290 if (!McaSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
294 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
295 if (ProcessorNumber
== 0) {
296 DEBUG ((EFI_D_INFO
, "LMCE eanble = %x\n", (BOOLEAN
) (McgCap
.Bits
.MCG_LMCE_P
!= 0)));
298 return (BOOLEAN
) (McgCap
.Bits
.MCG_LMCE_P
!= 0);
302 Initializes Local machine check exception feature to specific state.
304 @param[in] ProcessorNumber The index of the CPU executing this function.
305 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
306 structure for the CPU executing this function.
307 @param[in] ConfigData A pointer to the configuration buffer returned
308 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
309 CPU_FEATURE_GET_CONFIG_DATA was not provided in
310 RegisterCpuFeature().
311 @param[in] State If TRUE, then the Local machine check exception
312 feature must be enabled.
313 If FALSE, then the Local machine check exception
314 feature must be disabled.
316 @retval RETURN_SUCCESS Local machine check exception feature is initialized.
322 IN UINTN ProcessorNumber
,
323 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
324 IN VOID
*ConfigData
, OPTIONAL
328 MSR_IA32_FEATURE_CONTROL_REGISTER
*MsrRegister
;
331 // The scope of FastStrings bit in the MSR_IA32_MISC_ENABLE is core for below processor type, only program
332 // MSR_IA32_MISC_ENABLE for thread 0 in each core.
334 if (IS_SILVERMONT_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
335 IS_GOLDMONT_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
) ||
336 IS_PENTIUM_4_PROCESSOR (CpuInfo
->DisplayFamily
, CpuInfo
->DisplayModel
)) {
337 if (CpuInfo
->ProcessorInfo
.Location
.Thread
!= 0) {
338 return RETURN_SUCCESS
;
342 ASSERT (ConfigData
!= NULL
);
343 MsrRegister
= (MSR_IA32_FEATURE_CONTROL_REGISTER
*) ConfigData
;
344 if (MsrRegister
[ProcessorNumber
].Bits
.Lock
== 0) {
345 CPU_REGISTER_TABLE_WRITE_FIELD (
348 MSR_IA32_FEATURE_CONTROL
,
349 MSR_IA32_FEATURE_CONTROL_REGISTER
,
354 return RETURN_SUCCESS
;