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 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
145 for (BankIndex
= 0; BankIndex
< (UINT32
) McgCap
.Bits
.Count
; BankIndex
++) {
146 CPU_REGISTER_TABLE_WRITE64 (
149 MSR_IA32_MC0_CTL
+ BankIndex
* 4,
154 if (PcdGetBool (PcdIsPowerOnReset
)) {
155 for (BankIndex
= 0; BankIndex
< (UINTN
) McgCap
.Bits
.Count
; BankIndex
++) {
156 CPU_REGISTER_TABLE_WRITE64 (
159 MSR_IA32_MC0_STATUS
+ BankIndex
* 4,
166 return RETURN_SUCCESS
;
170 Detects if IA32_MCG_CTL feature supported on current processor.
172 @param[in] ProcessorNumber The index of the CPU executing this function.
173 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
174 structure for the CPU executing this function.
175 @param[in] ConfigData A pointer to the configuration buffer returned
176 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
177 CPU_FEATURE_GET_CONFIG_DATA was not provided in
178 RegisterCpuFeature().
180 @retval TRUE IA32_MCG_CTL feature is supported.
181 @retval FALSE IA32_MCG_CTL feature is not supported.
183 @note This service could be called by BSP/APs.
188 IN UINTN ProcessorNumber
,
189 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
190 IN VOID
*ConfigData OPTIONAL
193 MSR_IA32_MCG_CAP_REGISTER McgCap
;
195 if (!McaSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
198 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
199 return (McgCap
.Bits
.MCG_CTL_P
== 1);
203 Initializes IA32_MCG_CTL feature to specific state.
205 @param[in] ProcessorNumber The index of the CPU executing this function.
206 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
207 structure for the CPU executing this function.
208 @param[in] ConfigData A pointer to the configuration buffer returned
209 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
210 CPU_FEATURE_GET_CONFIG_DATA was not provided in
211 RegisterCpuFeature().
212 @param[in] State If TRUE, then the IA32_MCG_CTL feature must be enabled.
213 If FALSE, then the IA32_MCG_CTL feature must be disabled.
215 @retval RETURN_SUCCESS IA32_MCG_CTL feature is initialized.
217 @note This service could be called by BSP only.
222 IN UINTN ProcessorNumber
,
223 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
224 IN VOID
*ConfigData
, OPTIONAL
228 CPU_REGISTER_TABLE_WRITE64 (
232 (State
)? MAX_UINT64
: 0
234 return RETURN_SUCCESS
;
238 Detects if Local machine check exception feature supported on current
241 @param[in] ProcessorNumber The index of the CPU executing this function.
242 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
243 structure for the CPU executing this function.
244 @param[in] ConfigData A pointer to the configuration buffer returned
245 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
246 CPU_FEATURE_GET_CONFIG_DATA was not provided in
247 RegisterCpuFeature().
249 @retval TRUE Local machine check exception feature is supported.
250 @retval FALSE Local machine check exception feature is not supported.
252 @note This service could be called by BSP/APs.
257 IN UINTN ProcessorNumber
,
258 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
259 IN VOID
*ConfigData OPTIONAL
262 MSR_IA32_MCG_CAP_REGISTER McgCap
;
264 if (!McaSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
268 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
269 if (ProcessorNumber
== 0) {
270 DEBUG ((EFI_D_INFO
, "LMCE eanble = %x\n", (BOOLEAN
) (McgCap
.Bits
.MCG_LMCE_P
!= 0)));
272 return (BOOLEAN
) (McgCap
.Bits
.MCG_LMCE_P
!= 0);
276 Initializes Local machine check exception feature to specific state.
278 @param[in] ProcessorNumber The index of the CPU executing this function.
279 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
280 structure for the CPU executing this function.
281 @param[in] ConfigData A pointer to the configuration buffer returned
282 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
283 CPU_FEATURE_GET_CONFIG_DATA was not provided in
284 RegisterCpuFeature().
285 @param[in] State If TRUE, then the Local machine check exception
286 feature must be enabled.
287 If FALSE, then the Local machine check exception
288 feature must be disabled.
290 @retval RETURN_SUCCESS Local machine check exception feature is initialized.
296 IN UINTN ProcessorNumber
,
297 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
298 IN VOID
*ConfigData
, OPTIONAL
302 MSR_IA32_FEATURE_CONTROL_REGISTER
*MsrRegister
;
304 ASSERT (ConfigData
!= NULL
);
305 MsrRegister
= (MSR_IA32_FEATURE_CONTROL_REGISTER
*) ConfigData
;
306 if (MsrRegister
[ProcessorNumber
].Bits
.Lock
== 0) {
307 CPU_REGISTER_TABLE_WRITE_FIELD (
310 MSR_IA32_FEATURE_CONTROL
,
311 MSR_IA32_FEATURE_CONTROL_REGISTER
,
316 return RETURN_SUCCESS
;