2 Machine Check features.
4 Copyright (c) 2017, 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 return (CpuInfo
->CpuIdVersionInfoEdx
.Bits
.MCA
== 1);
112 Initializes Machine Check Architecture feature to specific state.
114 @param[in] ProcessorNumber The index of the CPU executing this function.
115 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
116 structure for the CPU executing this function.
117 @param[in] ConfigData A pointer to the configuration buffer returned
118 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
119 CPU_FEATURE_GET_CONFIG_DATA was not provided in
120 RegisterCpuFeature().
121 @param[in] State If TRUE, then the Machine Check Architecture feature must be enabled.
122 If FALSE, then the Machine Check Architecture feature must be disabled.
124 @retval RETURN_SUCCESS Machine Check Architecture feature is initialized.
126 @note This service could be called by BSP only.
131 IN UINTN ProcessorNumber
,
132 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
133 IN VOID
*ConfigData
, OPTIONAL
137 MSR_IA32_MCG_CAP_REGISTER McgCap
;
140 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
141 for (BankIndex
= 0; BankIndex
< (UINT32
) McgCap
.Bits
.Count
; BankIndex
++) {
142 CPU_REGISTER_TABLE_WRITE64 (
145 MSR_IA32_MC0_CTL
+ BankIndex
* 4,
150 if (PcdGetBool (PcdIsPowerOnReset
)) {
151 for (BankIndex
= 0; BankIndex
< (UINTN
) McgCap
.Bits
.Count
; BankIndex
++) {
152 CPU_REGISTER_TABLE_WRITE64 (
155 MSR_IA32_MC0_STATUS
+ BankIndex
* 4,
161 return RETURN_SUCCESS
;
165 Detects if IA32_MCG_CTL feature supported on current processor.
167 @param[in] ProcessorNumber The index of the CPU executing this function.
168 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
169 structure for the CPU executing this function.
170 @param[in] ConfigData A pointer to the configuration buffer returned
171 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
172 CPU_FEATURE_GET_CONFIG_DATA was not provided in
173 RegisterCpuFeature().
175 @retval TRUE IA32_MCG_CTL feature is supported.
176 @retval FALSE IA32_MCG_CTL feature is not supported.
178 @note This service could be called by BSP/APs.
183 IN UINTN ProcessorNumber
,
184 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
185 IN VOID
*ConfigData OPTIONAL
188 MSR_IA32_MCG_CAP_REGISTER McgCap
;
190 if (!McaSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
193 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
194 return (McgCap
.Bits
.MCG_CTL_P
== 1);
198 Initializes IA32_MCG_CTL feature to specific state.
200 @param[in] ProcessorNumber The index of the CPU executing this function.
201 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
202 structure for the CPU executing this function.
203 @param[in] ConfigData A pointer to the configuration buffer returned
204 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
205 CPU_FEATURE_GET_CONFIG_DATA was not provided in
206 RegisterCpuFeature().
207 @param[in] State If TRUE, then the IA32_MCG_CTL feature must be enabled.
208 If FALSE, then the IA32_MCG_CTL feature must be disabled.
210 @retval RETURN_SUCCESS IA32_MCG_CTL feature is initialized.
212 @note This service could be called by BSP only.
217 IN UINTN ProcessorNumber
,
218 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
219 IN VOID
*ConfigData
, OPTIONAL
223 CPU_REGISTER_TABLE_WRITE64 (
227 (State
)? MAX_UINT64
: 0
229 return RETURN_SUCCESS
;
233 Detects if Local machine check exception feature supported on current
236 @param[in] ProcessorNumber The index of the CPU executing this function.
237 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
238 structure for the CPU executing this function.
239 @param[in] ConfigData A pointer to the configuration buffer returned
240 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
241 CPU_FEATURE_GET_CONFIG_DATA was not provided in
242 RegisterCpuFeature().
244 @retval TRUE Local machine check exception feature is supported.
245 @retval FALSE Local machine check exception feature is not supported.
247 @note This service could be called by BSP/APs.
252 IN UINTN ProcessorNumber
,
253 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
254 IN VOID
*ConfigData OPTIONAL
257 MSR_IA32_MCG_CAP_REGISTER McgCap
;
259 if (!McaSupport (ProcessorNumber
, CpuInfo
, ConfigData
)) {
263 McgCap
.Uint64
= AsmReadMsr64 (MSR_IA32_MCG_CAP
);
264 if (ProcessorNumber
== 0) {
265 DEBUG ((EFI_D_INFO
, "LMCE eanble = %x\n", (BOOLEAN
) (McgCap
.Bits
.MCG_LMCE_P
!= 0)));
267 return (BOOLEAN
) (McgCap
.Bits
.MCG_LMCE_P
!= 0);
271 Initializes Local machine check exception feature to specific state.
273 @param[in] ProcessorNumber The index of the CPU executing this function.
274 @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
275 structure for the CPU executing this function.
276 @param[in] ConfigData A pointer to the configuration buffer returned
277 by CPU_FEATURE_GET_CONFIG_DATA. NULL if
278 CPU_FEATURE_GET_CONFIG_DATA was not provided in
279 RegisterCpuFeature().
280 @param[in] State If TRUE, then the Local machine check exception
281 feature must be enabled.
282 If FALSE, then the Local machine check exception
283 feature must be disabled.
285 @retval RETURN_SUCCESS Local machine check exception feature is initialized.
291 IN UINTN ProcessorNumber
,
292 IN REGISTER_CPU_FEATURE_INFORMATION
*CpuInfo
,
293 IN VOID
*ConfigData
, OPTIONAL
297 MSR_IA32_FEATURE_CONTROL_REGISTER
*MsrRegister
;
299 ASSERT (ConfigData
!= NULL
);
300 MsrRegister
= (MSR_IA32_FEATURE_CONTROL_REGISTER
*) ConfigData
;
301 if (MsrRegister
[ProcessorNumber
].Bits
.Lock
== 0) {
302 CPU_REGISTER_TABLE_WRITE_FIELD (
305 MSR_IA32_FEATURE_CONTROL
,
306 MSR_IA32_FEATURE_CONTROL_REGISTER
,
311 return RETURN_SUCCESS
;