| /** @file | |
| This library registers CPU features defined in Intel(R) 64 and IA-32 | |
| Architectures Software Developer's Manual. | |
| Copyright (c) 2017 - 2020, 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", | |
| ClockModulationGetConfigData, | |
| 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_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", | |
| NULL, | |
| LockFeatureControlRegisterSupport, | |
| LockFeatureControlRegisterInitialize, | |
| CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER, | |
| CPU_FEATURE_END | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| } | |
| if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) { | |
| Status = RegisterCpuFeature ( | |
| "SMX", | |
| NULL, | |
| SmxSupport, | |
| SmxInitialize, | |
| CPU_FEATURE_SMX, | |
| CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_THREAD_BEFORE, | |
| CPU_FEATURE_END | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| } | |
| if (IsCpuFeatureSupported (CPU_FEATURE_VMX)) { | |
| Status = RegisterCpuFeature ( | |
| "VMX", | |
| NULL, | |
| VmxSupport, | |
| VmxInitialize, | |
| CPU_FEATURE_VMX, | |
| CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_THREAD_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", | |
| PpinGetConfigData, | |
| PpinSupport, | |
| PpinInitialize, | |
| CPU_FEATURE_PPIN, | |
| CPU_FEATURE_END | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| } | |
| if (IsCpuFeatureSupported (CPU_FEATURE_LMCE)) { | |
| Status = RegisterCpuFeature ( | |
| "LMCE", | |
| NULL, | |
| LmceSupport, | |
| LmceInitialize, | |
| CPU_FEATURE_LMCE, | |
| CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_THREAD_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; | |
| } |