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