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