BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1829 There will be ASSERT if LMCE is supported as below. DXE_ASSERT!: [CpuFeaturesDxe] XXX\UefiCpuPkg\Library\CpuCommonFeaturesLib\MachineCheck.c (342): ConfigData != ((void *) 0) The code should get Config Data and FeatureControlGetConfigData could be used. This issue is there since the code was added at the commit below. Revision:3d6275c113
Date: 2017/8/4 8:46:41 UefiCpuPkg CpuCommonFeaturesLib: Enable LMCE feature. The commits below are also related to move the code. Revision:0233871442
Date: 2017/9/1 10:12:38 UefiCpuPkg/Lmce.c Remove useless file. Revision:306a5bcc6b
Date: 2017/8/17 11:40:38 UefiCpuPkg/CpuCommonFeaturesLib: Merge machine check code to same file. So, the code may not be tested at all on a platform that supports LMCE. BTW: A typo in LmceInitialize is also fixed. The typo is introduced by the commit below. Revision:d28daaddb3
Date: 2018/10/17 9:24:05 UefiCpuPkg/CpuCommonFeaturesLib: Register MSR base on scope Info. Cc: Laszlo Ersek <lersek@redhat.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Chandana Kumar <chandana.c.kumar@intel.com> Cc: Kevin Li <kevin.y.li@intel.com> Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com>
243 lines
7.1 KiB
C
243 lines
7.1 KiB
C
/** @file
|
|
This library registers CPU features defined in Intel(R) 64 and IA-32
|
|
Architectures Software Developer's Manual.
|
|
|
|
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include "CpuCommonFeatures.h"
|
|
|
|
/**
|
|
Register CPU features.
|
|
|
|
@retval RETURN_SUCCESS Register successfully
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
CpuCommonFeaturesLibConstructor (
|
|
VOID
|
|
)
|
|
{
|
|
RETURN_STATUS Status;
|
|
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_AESNI)) {
|
|
Status = RegisterCpuFeature (
|
|
"AESNI",
|
|
AesniGetConfigData,
|
|
AesniSupport,
|
|
AesniInitialize,
|
|
CPU_FEATURE_AESNI,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_MWAIT)) {
|
|
Status = RegisterCpuFeature (
|
|
"MWAIT",
|
|
NULL,
|
|
MonitorMwaitSupport,
|
|
MonitorMwaitInitialize,
|
|
CPU_FEATURE_MWAIT,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_ACPI)) {
|
|
Status = RegisterCpuFeature (
|
|
"ACPI",
|
|
NULL,
|
|
ClockModulationSupport,
|
|
ClockModulationInitialize,
|
|
CPU_FEATURE_ACPI,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_EIST)) {
|
|
Status = RegisterCpuFeature (
|
|
"EIST",
|
|
NULL,
|
|
EistSupport,
|
|
EistInitialize,
|
|
CPU_FEATURE_EIST,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_XD)) {
|
|
Status = RegisterCpuFeature (
|
|
"Execute Disable",
|
|
NULL,
|
|
ExecuteDisableSupport,
|
|
ExecuteDisableInitialize,
|
|
CPU_FEATURE_XD,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_FASTSTRINGS)) {
|
|
Status = RegisterCpuFeature (
|
|
"FastStrings",
|
|
NULL,
|
|
NULL,
|
|
FastStringsInitialize,
|
|
CPU_FEATURE_FASTSTRINGS,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER)) {
|
|
Status = RegisterCpuFeature (
|
|
"Lock Feature Control Register",
|
|
FeatureControlGetConfigData,
|
|
LockFeatureControlRegisterSupport,
|
|
LockFeatureControlRegisterInitialize,
|
|
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {
|
|
Status = RegisterCpuFeature (
|
|
"SMX",
|
|
FeatureControlGetConfigData,
|
|
SmxSupport,
|
|
SmxInitialize,
|
|
CPU_FEATURE_SMX,
|
|
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_VMX)) {
|
|
Status = RegisterCpuFeature (
|
|
"VMX",
|
|
FeatureControlGetConfigData,
|
|
VmxSupport,
|
|
VmxInitialize,
|
|
CPU_FEATURE_VMX,
|
|
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_LIMIT_CPUID_MAX_VAL)) {
|
|
Status = RegisterCpuFeature (
|
|
"Limit CpuId Maximum Value",
|
|
NULL,
|
|
LimitCpuidMaxvalSupport,
|
|
LimitCpuidMaxvalInitialize,
|
|
CPU_FEATURE_LIMIT_CPUID_MAX_VAL,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_MCE)) {
|
|
Status = RegisterCpuFeature (
|
|
"Machine Check Enable",
|
|
NULL,
|
|
MceSupport,
|
|
MceInitialize,
|
|
CPU_FEATURE_MCE,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_MCA)) {
|
|
Status = RegisterCpuFeature (
|
|
"Machine Check Architect",
|
|
NULL,
|
|
McaSupport,
|
|
McaInitialize,
|
|
CPU_FEATURE_MCA,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_MCG_CTL)) {
|
|
Status = RegisterCpuFeature (
|
|
"MCG_CTL",
|
|
NULL,
|
|
McgCtlSupport,
|
|
McgCtlInitialize,
|
|
CPU_FEATURE_MCG_CTL,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_PENDING_BREAK)) {
|
|
Status = RegisterCpuFeature (
|
|
"Pending Break",
|
|
NULL,
|
|
PendingBreakSupport,
|
|
PendingBreakInitialize,
|
|
CPU_FEATURE_PENDING_BREAK,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_C1E)) {
|
|
Status = RegisterCpuFeature (
|
|
"C1E",
|
|
NULL,
|
|
C1eSupport,
|
|
C1eInitialize,
|
|
CPU_FEATURE_C1E,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_X2APIC)) {
|
|
Status = RegisterCpuFeature (
|
|
"X2Apic",
|
|
X2ApicGetConfigData,
|
|
X2ApicSupport,
|
|
X2ApicInitialize,
|
|
CPU_FEATURE_X2APIC,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_PPIN)) {
|
|
Status = RegisterCpuFeature (
|
|
"PPIN",
|
|
NULL,
|
|
PpinSupport,
|
|
PpinInitialize,
|
|
CPU_FEATURE_PPIN,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_LMCE)) {
|
|
Status = RegisterCpuFeature (
|
|
"LMCE",
|
|
FeatureControlGetConfigData,
|
|
LmceSupport,
|
|
LmceInitialize,
|
|
CPU_FEATURE_LMCE,
|
|
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
if (IsCpuFeatureSupported (CPU_FEATURE_PROC_TRACE)) {
|
|
Status = RegisterCpuFeature (
|
|
"Proc Trace",
|
|
ProcTraceGetConfigData,
|
|
ProcTraceSupport,
|
|
ProcTraceInitialize,
|
|
CPU_FEATURE_PROC_TRACE,
|
|
CPU_FEATURE_END
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
return RETURN_SUCCESS;
|
|
}
|
|
|
|
|
|
|