]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
SecurityPkg: Clean up source files
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigDriver.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 The module entry point for Tcg2 configuration module.\r
3\r
b3548d32
LG
4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
1abfa4ce
JY
8http://opensource.org/licenses/bsd-license.php\r
9\r
b3548d32 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
1abfa4ce
JY
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Tcg2ConfigImpl.h"\r
16\r
17extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];\r
18\r
19/**\r
20 Update default PCR banks data.\r
21\r
22 @param[in] HiiPackage HII Package.\r
23 @param[in] HiiPackageSize HII Package size.\r
24 @param[in] PCRBanks PCR Banks data.\r
25\r
26**/\r
27VOID\r
28UpdateDefaultPCRBanks (\r
29 IN VOID *HiiPackage,\r
30 IN UINTN HiiPackageSize,\r
31 IN UINT32 PCRBanks\r
32 )\r
33{\r
34 EFI_HII_PACKAGE_HEADER *HiiPackageHeader;\r
35 EFI_IFR_OP_HEADER *IfrOpCodeHeader;\r
36 EFI_IFR_CHECKBOX *IfrCheckBox;\r
37 EFI_IFR_DEFAULT *IfrDefault;\r
38\r
39 HiiPackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiPackage;\r
40\r
41 switch (HiiPackageHeader->Type) {\r
42 case EFI_HII_PACKAGE_FORMS:\r
43 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1);\r
44 while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) {\r
45 switch (IfrOpCodeHeader->OpCode) {\r
46 case EFI_IFR_CHECKBOX_OP:\r
47 IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader;\r
48 if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
49 IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1);\r
50 ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP);\r
51 ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN);\r
52 IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1);\r
53 }\r
54 break;\r
55 }\r
56 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length);\r
57 }\r
58 break;\r
59 }\r
60 return ;\r
61}\r
62\r
dd6d0a52
SZ
63/**\r
64 Initialize TCG2 version information.\r
65\r
66 This function will initialize efi varstore configuration data for\r
67 TCG2_VERSION_NAME variable, check the value of related PCD with\r
68 the variable value and set string for the version state content\r
69 according to the PCD value.\r
70\r
71 @param[in] PrivateData Points to TCG2 configuration private data.\r
72\r
73**/\r
74VOID\r
75InitializeTcg2VersionInfo (\r
76 IN TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
77 )\r
78{\r
79 EFI_STATUS Status;\r
80 EFI_STRING ConfigRequestHdr;\r
81 BOOLEAN ActionFlag;\r
82 TCG2_VERSION Tcg2Version;\r
83 UINTN DataSize;\r
84 UINT64 PcdTcg2PpiVersion;\r
fca42289 85 UINT8 PcdTpm2AcpiTableRev;\r
dd6d0a52
SZ
86\r
87 //\r
88 // Get the PCD value before initializing efi varstore configuration data.\r
89 //\r
90 PcdTcg2PpiVersion = 0;\r
91 CopyMem (\r
92 &PcdTcg2PpiVersion,\r
93 PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
3613af91 94 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
dd6d0a52
SZ
95 );\r
96\r
fca42289
ZC
97 PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
98\r
dd6d0a52
SZ
99 //\r
100 // Initialize efi varstore configuration data.\r
101 //\r
102 ZeroMem (&Tcg2Version, sizeof (Tcg2Version));\r
103 ConfigRequestHdr = HiiConstructConfigHdr (\r
104 &gTcg2ConfigFormSetGuid,\r
105 TCG2_VERSION_NAME,\r
106 PrivateData->DriverHandle\r
107 );\r
108 ASSERT (ConfigRequestHdr != NULL);\r
109 DataSize = sizeof (Tcg2Version);\r
110 Status = gRT->GetVariable (\r
111 TCG2_VERSION_NAME,\r
112 &gTcg2ConfigFormSetGuid,\r
113 NULL,\r
114 &DataSize,\r
115 &Tcg2Version\r
116 );\r
117 if (!EFI_ERROR (Status)) {\r
118 //\r
119 // EFI variable does exist and validate current setting.\r
120 //\r
121 ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
122 if (!ActionFlag) {\r
123 //\r
124 // Current configuration is invalid, reset to defaults.\r
125 //\r
126 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
127 ASSERT (ActionFlag);\r
128 //\r
129 // Get the default values from variable.\r
130 //\r
131 DataSize = sizeof (Tcg2Version);\r
132 Status = gRT->GetVariable (\r
133 TCG2_VERSION_NAME,\r
134 &gTcg2ConfigFormSetGuid,\r
135 NULL,\r
136 &DataSize,\r
137 &Tcg2Version\r
138 );\r
139 ASSERT_EFI_ERROR (Status);\r
140 }\r
141 } else {\r
142 //\r
13383485 143 // EFI variable doesn't exist or variable size is not expected.\r
dd6d0a52
SZ
144 //\r
145\r
146 //\r
147 // Store zero data Buffer Storage to EFI variable.\r
148 //\r
149 Status = gRT->SetVariable (\r
150 TCG2_VERSION_NAME,\r
151 &gTcg2ConfigFormSetGuid,\r
152 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
153 sizeof (Tcg2Version),\r
154 &Tcg2Version\r
155 );\r
156 if (EFI_ERROR (Status)) {\r
157 DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_VERSION_NAME\n"));\r
158 return;\r
159 } else {\r
160 //\r
161 // Build this variable based on default values stored in IFR.\r
162 //\r
163 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
164 ASSERT (ActionFlag);\r
165 //\r
166 // Get the default values from variable.\r
167 //\r
168 DataSize = sizeof (Tcg2Version);\r
169 Status = gRT->GetVariable (\r
170 TCG2_VERSION_NAME,\r
171 &gTcg2ConfigFormSetGuid,\r
172 NULL,\r
173 &DataSize,\r
174 &Tcg2Version\r
175 );\r
176 ASSERT_EFI_ERROR (Status);\r
177 if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
178 DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer default value is not same with the default value in VFR\n"));\r
179 DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
180 }\r
fca42289
ZC
181 if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) {\r
182 DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev default value is not same with the default value in VFR\n"));\r
183 DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
184 }\r
dd6d0a52
SZ
185 }\r
186 }\r
187 FreePool (ConfigRequestHdr);\r
188\r
189 //\r
190 // Get the PCD value again.\r
191 // If the PCD value is not equal to the value in variable,\r
13383485 192 // the PCD is not DynamicHii type and does not map to the setup option.\r
dd6d0a52
SZ
193 //\r
194 PcdTcg2PpiVersion = 0;\r
195 CopyMem (\r
196 &PcdTcg2PpiVersion,\r
197 PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
3613af91 198 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
dd6d0a52
SZ
199 );\r
200 if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
13383485 201 DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and does not map to TCG2_VERSION.PpiVersion\n"));\r
dd6d0a52
SZ
202 DEBUG ((DEBUG_WARN, "WARNING: The TCG2 PPI version configuring from setup page will not work\n"));\r
203 }\r
204\r
205 switch (PcdTcg2PpiVersion) {\r
206 case TCG2_PPI_VERSION_1_2:\r
207 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.2", NULL);\r
208 break;\r
209 case TCG2_PPI_VERSION_1_3:\r
210 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.3", NULL);\r
211 break;\r
212 default:\r
213 ASSERT (FALSE);\r
214 break;\r
215 }\r
fca42289
ZC
216\r
217 //\r
218 // Get the PcdTpm2AcpiTableRev value again.\r
219 // If the PCD value is not equal to the value in variable,\r
220 // the PCD is not DynamicHii type and does not map to TCG2_VERSION Variable.\r
221 //\r
222 PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
223 if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) {\r
224 DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev is not DynamicHii type and does not map to TCG2_VERSION.Tpm2AcpiTableRev\n"));\r
225 DEBUG ((DEBUG_WARN, "WARNING: The Tpm2 ACPI Revision configuring from setup page will not work\n"));\r
226 }\r
227\r
228 switch (PcdTpm2AcpiTableRev) {\r
229 case EFI_TPM2_ACPI_TABLE_REVISION_3:\r
230 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_REVISION_STATE_CONTENT), L"Rev 3", NULL);\r
231 break;\r
232 case EFI_TPM2_ACPI_TABLE_REVISION_4:\r
233 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_REVISION_STATE_CONTENT), L"Rev 4", NULL);\r
234 break;\r
235 default:\r
236 ASSERT (FALSE);\r
237 break;\r
238 }\r
dd6d0a52
SZ
239}\r
240\r
1abfa4ce
JY
241/**\r
242 The entry point for Tcg2 configuration driver.\r
243\r
244 @param[in] ImageHandle The image handle of the driver.\r
245 @param[in] SystemTable The system table.\r
246\r
247 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
248 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
249 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
250 @retval Others Fail to install protocols as indicated.\r
251\r
252**/\r
253EFI_STATUS\r
254EFIAPI\r
255Tcg2ConfigDriverEntryPoint (\r
256 IN EFI_HANDLE ImageHandle,\r
257 IN EFI_SYSTEM_TABLE *SystemTable\r
258 )\r
259{\r
260 EFI_STATUS Status;\r
261 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
262 TCG2_CONFIGURATION Tcg2Configuration;\r
263 TCG2_DEVICE_DETECTION Tcg2DeviceDetection;\r
264 UINTN Index;\r
265 UINTN DataSize;\r
266 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
267 UINT32 CurrentActivePCRBanks;\r
268\r
269 Status = gBS->OpenProtocol (\r
270 ImageHandle,\r
271 &gEfiCallerIdGuid,\r
272 NULL,\r
273 ImageHandle,\r
274 ImageHandle,\r
275 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
276 );\r
277 if (!EFI_ERROR (Status)) {\r
278 return EFI_ALREADY_STARTED;\r
279 }\r
b3548d32 280\r
1abfa4ce
JY
281 //\r
282 // Create a private data structure.\r
283 //\r
284 PrivateData = AllocateCopyPool (sizeof (TCG2_CONFIG_PRIVATE_DATA), &mTcg2ConfigPrivateDateTemplate);\r
285 ASSERT (PrivateData != NULL);\r
286 mTcg2ConfigPrivateDate = PrivateData;\r
287 //\r
288 // Install private GUID.\r
b3548d32 289 //\r
1abfa4ce
JY
290 Status = gBS->InstallMultipleProtocolInterfaces (\r
291 &ImageHandle,\r
292 &gEfiCallerIdGuid,\r
293 PrivateData,\r
294 NULL\r
295 );\r
296 ASSERT_EFI_ERROR (Status);\r
297\r
298 Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &PrivateData->Tcg2Protocol);\r
299 ASSERT_EFI_ERROR (Status);\r
300\r
301 PrivateData->ProtocolCapability.Size = sizeof(PrivateData->ProtocolCapability);\r
302 Status = PrivateData->Tcg2Protocol->GetCapability (\r
303 PrivateData->Tcg2Protocol,\r
304 &PrivateData->ProtocolCapability\r
305 );\r
306 ASSERT_EFI_ERROR (Status);\r
307\r
308 DataSize = sizeof(Tcg2Configuration);\r
309 Status = gRT->GetVariable (\r
310 TCG2_STORAGE_NAME,\r
311 &gTcg2ConfigFormSetGuid,\r
312 NULL,\r
313 &DataSize,\r
314 &Tcg2Configuration\r
315 );\r
316 if (EFI_ERROR (Status)) {\r
317 //\r
318 // Variable not ready, set default value\r
319 //\r
320 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
321 }\r
322\r
323 //\r
324 // Validation\r
325 //\r
326 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
327 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
328 }\r
329\r
330 //\r
331 // Set value for Tcg2CurrentActivePCRBanks\r
332 // Search Tcg2ConfigBin[] and update default value there\r
333 //\r
334 Status = PrivateData->Tcg2Protocol->GetActivePcrBanks (PrivateData->Tcg2Protocol, &CurrentActivePCRBanks);\r
335 ASSERT_EFI_ERROR (Status);\r
336 PrivateData->PCRBanksDesired = CurrentActivePCRBanks;\r
337 UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks);\r
338\r
1abfa4ce
JY
339 //\r
340 // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
341 //\r
342 Tcg2DeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
343 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
344 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
345 Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
346 break;\r
347 }\r
348 }\r
349\r
350 PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
518b6f65 351 Tcg2Configuration.TpmDevice = Tcg2DeviceDetection.TpmDeviceDetected;\r
1abfa4ce
JY
352\r
353 //\r
354 // Save to variable so platform driver can get it.\r
355 //\r
356 Status = gRT->SetVariable (\r
357 TCG2_DEVICE_DETECTION_NAME,\r
358 &gTcg2ConfigFormSetGuid,\r
359 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
360 sizeof(Tcg2DeviceDetection),\r
361 &Tcg2DeviceDetection\r
362 );\r
363 if (EFI_ERROR (Status)) {\r
364 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
365 Status = gRT->SetVariable (\r
366 TCG2_DEVICE_DETECTION_NAME,\r
367 &gTcg2ConfigFormSetGuid,\r
368 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
369 0,\r
370 NULL\r
371 );\r
372 ASSERT_EFI_ERROR (Status);\r
373 }\r
374\r
518b6f65
JY
375 //\r
376 // Save to variable so platform driver can get it.\r
377 //\r
378 Status = gRT->SetVariable (\r
379 TCG2_STORAGE_NAME,\r
380 &gTcg2ConfigFormSetGuid,\r
381 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
382 sizeof(Tcg2Configuration),\r
383 &Tcg2Configuration\r
384 );\r
385 if (EFI_ERROR (Status)) {\r
386 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
387 }\r
388\r
1abfa4ce
JY
389 //\r
390 // We should lock Tcg2DeviceDetection, because it contains information needed at S3.\r
391 //\r
392 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
393 if (!EFI_ERROR (Status)) {\r
394 Status = VariableLockProtocol->RequestToLock (\r
395 VariableLockProtocol,\r
396 TCG2_DEVICE_DETECTION_NAME,\r
397 &gTcg2ConfigFormSetGuid\r
398 );\r
399 ASSERT_EFI_ERROR (Status);\r
400 }\r
b3548d32 401\r
1abfa4ce
JY
402 //\r
403 // Install Tcg2 configuration form\r
404 //\r
405 Status = InstallTcg2ConfigForm (PrivateData);\r
406 if (EFI_ERROR (Status)) {\r
407 goto ErrorExit;\r
408 }\r
409\r
dd6d0a52
SZ
410 InitializeTcg2VersionInfo (PrivateData);\r
411\r
1abfa4ce
JY
412 return EFI_SUCCESS;\r
413\r
414ErrorExit:\r
415 if (PrivateData != NULL) {\r
416 UninstallTcg2ConfigForm (PrivateData);\r
b3548d32
LG
417 }\r
418\r
1abfa4ce
JY
419 return Status;\r
420}\r
421\r
422/**\r
423 Unload the Tcg2 configuration form.\r
424\r
425 @param[in] ImageHandle The driver's image handle.\r
426\r
427 @retval EFI_SUCCESS The Tcg2 configuration form is unloaded.\r
428 @retval Others Failed to unload the form.\r
429\r
430**/\r
431EFI_STATUS\r
432EFIAPI\r
433Tcg2ConfigDriverUnload (\r
434 IN EFI_HANDLE ImageHandle\r
435 )\r
436{\r
437 EFI_STATUS Status;\r
438 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
439\r
440 Status = gBS->HandleProtocol (\r
441 ImageHandle,\r
442 &gEfiCallerIdGuid,\r
443 (VOID **) &PrivateData\r
b3548d32 444 );\r
1abfa4ce 445 if (EFI_ERROR (Status)) {\r
b3548d32 446 return Status;\r
1abfa4ce 447 }\r
b3548d32 448\r
1abfa4ce
JY
449 ASSERT (PrivateData->Signature == TCG2_CONFIG_PRIVATE_DATA_SIGNATURE);\r
450\r
451 gBS->UninstallMultipleProtocolInterfaces (\r
452 &ImageHandle,\r
453 &gEfiCallerIdGuid,\r
454 PrivateData,\r
455 NULL\r
456 );\r
b3548d32 457\r
1abfa4ce
JY
458 UninstallTcg2ConfigForm (PrivateData);\r
459\r
460 return EFI_SUCCESS;\r
461}\r