CpuCommonFeaturesLib.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /** @file
  2. This library registers CPU features defined in Intel(R) 64 and IA-32
  3. Architectures Software Developer's Manual.
  4. Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include "CpuCommonFeatures.h"
  8. /**
  9. Register CPU features.
  10. @retval RETURN_SUCCESS Register successfully
  11. **/
  12. RETURN_STATUS
  13. EFIAPI
  14. CpuCommonFeaturesLibConstructor (
  15. VOID
  16. )
  17. {
  18. RETURN_STATUS Status;
  19. if (IsCpuFeatureSupported (CPU_FEATURE_AESNI)) {
  20. Status = RegisterCpuFeature (
  21. "AESNI",
  22. AesniGetConfigData,
  23. AesniSupport,
  24. AesniInitialize,
  25. CPU_FEATURE_AESNI,
  26. CPU_FEATURE_END
  27. );
  28. ASSERT_EFI_ERROR (Status);
  29. }
  30. if (IsCpuFeatureSupported (CPU_FEATURE_MWAIT)) {
  31. Status = RegisterCpuFeature (
  32. "MWAIT",
  33. NULL,
  34. MonitorMwaitSupport,
  35. MonitorMwaitInitialize,
  36. CPU_FEATURE_MWAIT,
  37. CPU_FEATURE_END
  38. );
  39. ASSERT_EFI_ERROR (Status);
  40. }
  41. if (IsCpuFeatureSupported (CPU_FEATURE_ACPI)) {
  42. Status = RegisterCpuFeature (
  43. "ACPI",
  44. ClockModulationGetConfigData,
  45. ClockModulationSupport,
  46. ClockModulationInitialize,
  47. CPU_FEATURE_ACPI,
  48. CPU_FEATURE_END
  49. );
  50. ASSERT_EFI_ERROR (Status);
  51. }
  52. if (IsCpuFeatureSupported (CPU_FEATURE_EIST)) {
  53. Status = RegisterCpuFeature (
  54. "EIST",
  55. NULL,
  56. EistSupport,
  57. EistInitialize,
  58. CPU_FEATURE_EIST,
  59. CPU_FEATURE_END
  60. );
  61. ASSERT_EFI_ERROR (Status);
  62. }
  63. if (IsCpuFeatureSupported (CPU_FEATURE_FASTSTRINGS)) {
  64. Status = RegisterCpuFeature (
  65. "FastStrings",
  66. NULL,
  67. NULL,
  68. FastStringsInitialize,
  69. CPU_FEATURE_FASTSTRINGS,
  70. CPU_FEATURE_END
  71. );
  72. ASSERT_EFI_ERROR (Status);
  73. }
  74. if (IsCpuFeatureSupported (CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER)) {
  75. Status = RegisterCpuFeature (
  76. "Lock Feature Control Register",
  77. NULL,
  78. LockFeatureControlRegisterSupport,
  79. LockFeatureControlRegisterInitialize,
  80. CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER,
  81. CPU_FEATURE_END
  82. );
  83. ASSERT_EFI_ERROR (Status);
  84. }
  85. if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {
  86. Status = RegisterCpuFeature (
  87. "SMX",
  88. NULL,
  89. SmxSupport,
  90. SmxInitialize,
  91. CPU_FEATURE_SMX,
  92. CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_THREAD_BEFORE,
  93. CPU_FEATURE_END
  94. );
  95. ASSERT_EFI_ERROR (Status);
  96. }
  97. if (IsCpuFeatureSupported (CPU_FEATURE_VMX)) {
  98. Status = RegisterCpuFeature (
  99. "VMX",
  100. NULL,
  101. VmxSupport,
  102. VmxInitialize,
  103. CPU_FEATURE_VMX,
  104. CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_THREAD_BEFORE,
  105. CPU_FEATURE_END
  106. );
  107. ASSERT_EFI_ERROR (Status);
  108. }
  109. if (IsCpuFeatureSupported (CPU_FEATURE_LIMIT_CPUID_MAX_VAL)) {
  110. Status = RegisterCpuFeature (
  111. "Limit CpuId Maximum Value",
  112. NULL,
  113. LimitCpuidMaxvalSupport,
  114. LimitCpuidMaxvalInitialize,
  115. CPU_FEATURE_LIMIT_CPUID_MAX_VAL,
  116. CPU_FEATURE_END
  117. );
  118. ASSERT_EFI_ERROR (Status);
  119. }
  120. if (IsCpuFeatureSupported (CPU_FEATURE_MCE)) {
  121. Status = RegisterCpuFeature (
  122. "Machine Check Enable",
  123. NULL,
  124. MceSupport,
  125. MceInitialize,
  126. CPU_FEATURE_MCE,
  127. CPU_FEATURE_END
  128. );
  129. ASSERT_EFI_ERROR (Status);
  130. }
  131. if (IsCpuFeatureSupported (CPU_FEATURE_MCA)) {
  132. Status = RegisterCpuFeature (
  133. "Machine Check Architect",
  134. NULL,
  135. McaSupport,
  136. McaInitialize,
  137. CPU_FEATURE_MCA,
  138. CPU_FEATURE_END
  139. );
  140. ASSERT_EFI_ERROR (Status);
  141. }
  142. if (IsCpuFeatureSupported (CPU_FEATURE_MCG_CTL)) {
  143. Status = RegisterCpuFeature (
  144. "MCG_CTL",
  145. NULL,
  146. McgCtlSupport,
  147. McgCtlInitialize,
  148. CPU_FEATURE_MCG_CTL,
  149. CPU_FEATURE_END
  150. );
  151. ASSERT_EFI_ERROR (Status);
  152. }
  153. if (IsCpuFeatureSupported (CPU_FEATURE_PENDING_BREAK)) {
  154. Status = RegisterCpuFeature (
  155. "Pending Break",
  156. NULL,
  157. PendingBreakSupport,
  158. PendingBreakInitialize,
  159. CPU_FEATURE_PENDING_BREAK,
  160. CPU_FEATURE_END
  161. );
  162. ASSERT_EFI_ERROR (Status);
  163. }
  164. if (IsCpuFeatureSupported (CPU_FEATURE_C1E)) {
  165. Status = RegisterCpuFeature (
  166. "C1E",
  167. NULL,
  168. C1eSupport,
  169. C1eInitialize,
  170. CPU_FEATURE_C1E,
  171. CPU_FEATURE_END
  172. );
  173. ASSERT_EFI_ERROR (Status);
  174. }
  175. if (IsCpuFeatureSupported (CPU_FEATURE_X2APIC)) {
  176. Status = RegisterCpuFeature (
  177. "X2Apic",
  178. X2ApicGetConfigData,
  179. X2ApicSupport,
  180. X2ApicInitialize,
  181. CPU_FEATURE_X2APIC,
  182. CPU_FEATURE_END
  183. );
  184. ASSERT_EFI_ERROR (Status);
  185. }
  186. if (IsCpuFeatureSupported (CPU_FEATURE_PPIN)) {
  187. Status = RegisterCpuFeature (
  188. "PPIN",
  189. PpinGetConfigData,
  190. PpinSupport,
  191. PpinInitialize,
  192. CPU_FEATURE_PPIN,
  193. CPU_FEATURE_END
  194. );
  195. ASSERT_EFI_ERROR (Status);
  196. }
  197. if (IsCpuFeatureSupported (CPU_FEATURE_LMCE)) {
  198. Status = RegisterCpuFeature (
  199. "LMCE",
  200. NULL,
  201. LmceSupport,
  202. LmceInitialize,
  203. CPU_FEATURE_LMCE,
  204. CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_THREAD_BEFORE,
  205. CPU_FEATURE_END
  206. );
  207. ASSERT_EFI_ERROR (Status);
  208. }
  209. if (IsCpuFeatureSupported (CPU_FEATURE_PROC_TRACE)) {
  210. Status = RegisterCpuFeature (
  211. "Proc Trace",
  212. ProcTraceGetConfigData,
  213. ProcTraceSupport,
  214. ProcTraceInitialize,
  215. CPU_FEATURE_PROC_TRACE,
  216. CPU_FEATURE_END
  217. );
  218. ASSERT_EFI_ERROR (Status);
  219. }
  220. return RETURN_SUCCESS;
  221. }