]> git.proxmox.com Git - mirror_edk2.git/blob - UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c
UefiCpuPkg: Enhance feature dependency check
[mirror_edk2.git] / UefiCpuPkg / Library / CpuCommonFeaturesLib / CpuCommonFeaturesLib.c
1 /** @file
2 This library registers CPU features defined in Intel(R) 64 and IA-32
3 Architectures Software Developer's Manual.
4
5 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #include "CpuCommonFeatures.h"
17
18 /**
19 Register CPU features.
20
21 @retval RETURN_SUCCESS Register successfully
22 **/
23 RETURN_STATUS
24 EFIAPI
25 CpuCommonFeaturesLibConstructor (
26 VOID
27 )
28 {
29 RETURN_STATUS Status;
30
31 if (IsCpuFeatureSupported (CPU_FEATURE_AESNI)) {
32 Status = RegisterCpuFeature (
33 "AESNI",
34 AesniGetConfigData,
35 AesniSupport,
36 AesniInitialize,
37 CPU_FEATURE_AESNI,
38 CPU_FEATURE_END
39 );
40 ASSERT_EFI_ERROR (Status);
41 }
42 if (IsCpuFeatureSupported (CPU_FEATURE_MWAIT)) {
43 Status = RegisterCpuFeature (
44 "MWAIT",
45 NULL,
46 MonitorMwaitSupport,
47 MonitorMwaitInitialize,
48 CPU_FEATURE_MWAIT,
49 CPU_FEATURE_END
50 );
51 ASSERT_EFI_ERROR (Status);
52 }
53 if (IsCpuFeatureSupported (CPU_FEATURE_ACPI)) {
54 Status = RegisterCpuFeature (
55 "ACPI",
56 NULL,
57 ClockModulationSupport,
58 ClockModulationInitialize,
59 CPU_FEATURE_ACPI,
60 CPU_FEATURE_END
61 );
62 ASSERT_EFI_ERROR (Status);
63 }
64 if (IsCpuFeatureSupported (CPU_FEATURE_EIST)) {
65 Status = RegisterCpuFeature (
66 "EIST",
67 NULL,
68 EistSupport,
69 EistInitialize,
70 CPU_FEATURE_EIST,
71 CPU_FEATURE_END
72 );
73 ASSERT_EFI_ERROR (Status);
74 }
75 if (IsCpuFeatureSupported (CPU_FEATURE_XD)) {
76 Status = RegisterCpuFeature (
77 "Execute Disable",
78 NULL,
79 ExecuteDisableSupport,
80 ExecuteDisableInitialize,
81 CPU_FEATURE_XD,
82 CPU_FEATURE_END
83 );
84 ASSERT_EFI_ERROR (Status);
85 }
86 if (IsCpuFeatureSupported (CPU_FEATURE_FASTSTRINGS)) {
87 Status = RegisterCpuFeature (
88 "FastStrings",
89 NULL,
90 NULL,
91 FastStringsInitialize,
92 CPU_FEATURE_FASTSTRINGS,
93 CPU_FEATURE_END
94 );
95 ASSERT_EFI_ERROR (Status);
96 }
97 if (IsCpuFeatureSupported (CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER)) {
98 Status = RegisterCpuFeature (
99 "Lock Feature Control Register",
100 FeatureControlGetConfigData,
101 LockFeatureControlRegisterSupport,
102 LockFeatureControlRegisterInitialize,
103 CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER,
104 CPU_FEATURE_END
105 );
106 ASSERT_EFI_ERROR (Status);
107 }
108 if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {
109 Status = RegisterCpuFeature (
110 "SMX",
111 FeatureControlGetConfigData,
112 SmxSupport,
113 SmxInitialize,
114 CPU_FEATURE_SMX,
115 CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
116 CPU_FEATURE_END
117 );
118 ASSERT_EFI_ERROR (Status);
119 }
120 if (IsCpuFeatureSupported (CPU_FEATURE_VMX)) {
121 Status = RegisterCpuFeature (
122 "VMX",
123 FeatureControlGetConfigData,
124 VmxSupport,
125 VmxInitialize,
126 CPU_FEATURE_VMX,
127 CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
128 CPU_FEATURE_END
129 );
130 ASSERT_EFI_ERROR (Status);
131 }
132 if (IsCpuFeatureSupported (CPU_FEATURE_LIMIT_CPUID_MAX_VAL)) {
133 Status = RegisterCpuFeature (
134 "Limit CpuId Maximum Value",
135 NULL,
136 LimitCpuidMaxvalSupport,
137 LimitCpuidMaxvalInitialize,
138 CPU_FEATURE_LIMIT_CPUID_MAX_VAL,
139 CPU_FEATURE_END
140 );
141 ASSERT_EFI_ERROR (Status);
142 }
143 if (IsCpuFeatureSupported (CPU_FEATURE_MCE)) {
144 Status = RegisterCpuFeature (
145 "Machine Check Enable",
146 NULL,
147 MceSupport,
148 MceInitialize,
149 CPU_FEATURE_MCE,
150 CPU_FEATURE_END
151 );
152 ASSERT_EFI_ERROR (Status);
153 }
154 if (IsCpuFeatureSupported (CPU_FEATURE_MCA)) {
155 Status = RegisterCpuFeature (
156 "Machine Check Architect",
157 NULL,
158 McaSupport,
159 McaInitialize,
160 CPU_FEATURE_MCA,
161 CPU_FEATURE_END
162 );
163 ASSERT_EFI_ERROR (Status);
164 }
165 if (IsCpuFeatureSupported (CPU_FEATURE_MCG_CTL)) {
166 Status = RegisterCpuFeature (
167 "MCG_CTL",
168 NULL,
169 McgCtlSupport,
170 McgCtlInitialize,
171 CPU_FEATURE_MCG_CTL,
172 CPU_FEATURE_END
173 );
174 ASSERT_EFI_ERROR (Status);
175 }
176 if (IsCpuFeatureSupported (CPU_FEATURE_PENDING_BREAK)) {
177 Status = RegisterCpuFeature (
178 "Pending Break",
179 NULL,
180 PendingBreakSupport,
181 PendingBreakInitialize,
182 CPU_FEATURE_PENDING_BREAK,
183 CPU_FEATURE_END
184 );
185 ASSERT_EFI_ERROR (Status);
186 }
187 if (IsCpuFeatureSupported (CPU_FEATURE_C1E)) {
188 Status = RegisterCpuFeature (
189 "C1E",
190 NULL,
191 C1eSupport,
192 C1eInitialize,
193 CPU_FEATURE_C1E,
194 CPU_FEATURE_END
195 );
196 ASSERT_EFI_ERROR (Status);
197 }
198 if (IsCpuFeatureSupported (CPU_FEATURE_X2APIC)) {
199 Status = RegisterCpuFeature (
200 "X2Apic",
201 X2ApicGetConfigData,
202 X2ApicSupport,
203 X2ApicInitialize,
204 CPU_FEATURE_X2APIC,
205 CPU_FEATURE_END
206 );
207 ASSERT_EFI_ERROR (Status);
208 }
209 if (IsCpuFeatureSupported (CPU_FEATURE_PPIN)) {
210 Status = RegisterCpuFeature (
211 "PPIN",
212 NULL,
213 PpinSupport,
214 PpinInitialize,
215 CPU_FEATURE_PPIN,
216 CPU_FEATURE_END
217 );
218 ASSERT_EFI_ERROR (Status);
219 }
220 if (IsCpuFeatureSupported (CPU_FEATURE_LMCE)) {
221 Status = RegisterCpuFeature (
222 "LMCE",
223 NULL,
224 LmceSupport,
225 LmceInitialize,
226 CPU_FEATURE_LMCE,
227 CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
228 CPU_FEATURE_END
229 );
230 ASSERT_EFI_ERROR (Status);
231 }
232 if (IsCpuFeatureSupported (CPU_FEATURE_PROC_TRACE)) {
233 Status = RegisterCpuFeature (
234 "Proc Trace",
235 ProcTraceGetConfigData,
236 ProcTraceSupport,
237 ProcTraceInitialize,
238 CPU_FEATURE_PROC_TRACE,
239 CPU_FEATURE_END
240 );
241 ASSERT_EFI_ERROR (Status);
242 }
243
244 return RETURN_SUCCESS;
245 }
246
247
248