]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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 4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
289b714b 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
1abfa4ce
JY
6\r
7**/\r
8\r
9#include "Tcg2ConfigImpl.h"\r
10\r
11extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];\r
12\r
13/**\r
14 Update default PCR banks data.\r
15\r
16 @param[in] HiiPackage HII Package.\r
17 @param[in] HiiPackageSize HII Package size.\r
18 @param[in] PCRBanks PCR Banks data.\r
19\r
20**/\r
21VOID\r
22UpdateDefaultPCRBanks (\r
c411b485
MK
23 IN VOID *HiiPackage,\r
24 IN UINTN HiiPackageSize,\r
25 IN UINT32 PCRBanks\r
1abfa4ce
JY
26 )\r
27{\r
c411b485
MK
28 EFI_HII_PACKAGE_HEADER *HiiPackageHeader;\r
29 EFI_IFR_OP_HEADER *IfrOpCodeHeader;\r
30 EFI_IFR_CHECKBOX *IfrCheckBox;\r
31 EFI_IFR_DEFAULT *IfrDefault;\r
1abfa4ce
JY
32\r
33 HiiPackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiPackage;\r
34\r
35 switch (HiiPackageHeader->Type) {\r
c411b485
MK
36 case EFI_HII_PACKAGE_FORMS:\r
37 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1);\r
38 while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) {\r
39 switch (IfrOpCodeHeader->OpCode) {\r
40 case EFI_IFR_CHECKBOX_OP:\r
41 IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader;\r
42 if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
43 IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1);\r
44 ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP);\r
45 ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN);\r
46 IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1);\r
47 }\r
48\r
49 break;\r
1abfa4ce 50 }\r
c411b485
MK
51\r
52 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length);\r
1abfa4ce 53 }\r
c411b485
MK
54\r
55 break;\r
1abfa4ce 56 }\r
c411b485
MK
57\r
58 return;\r
1abfa4ce
JY
59}\r
60\r
dd6d0a52
SZ
61/**\r
62 Initialize TCG2 version information.\r
63\r
64 This function will initialize efi varstore configuration data for\r
65 TCG2_VERSION_NAME variable, check the value of related PCD with\r
66 the variable value and set string for the version state content\r
67 according to the PCD value.\r
68\r
69 @param[in] PrivateData Points to TCG2 configuration private data.\r
70\r
71**/\r
72VOID\r
73InitializeTcg2VersionInfo (\r
c411b485 74 IN TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
dd6d0a52
SZ
75 )\r
76{\r
c411b485
MK
77 EFI_STATUS Status;\r
78 EFI_STRING ConfigRequestHdr;\r
79 BOOLEAN ActionFlag;\r
80 TCG2_VERSION Tcg2Version;\r
81 UINTN DataSize;\r
82 UINT64 PcdTcg2PpiVersion;\r
83 UINT8 PcdTpm2AcpiTableRev;\r
dd6d0a52
SZ
84\r
85 //\r
86 // Get the PCD value before initializing efi varstore configuration data.\r
87 //\r
88 PcdTcg2PpiVersion = 0;\r
89 CopyMem (\r
90 &PcdTcg2PpiVersion,\r
91 PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
c411b485 92 AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
dd6d0a52
SZ
93 );\r
94\r
fca42289
ZC
95 PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
96\r
dd6d0a52
SZ
97 //\r
98 // Initialize efi varstore configuration data.\r
99 //\r
100 ZeroMem (&Tcg2Version, sizeof (Tcg2Version));\r
101 ConfigRequestHdr = HiiConstructConfigHdr (\r
102 &gTcg2ConfigFormSetGuid,\r
103 TCG2_VERSION_NAME,\r
104 PrivateData->DriverHandle\r
105 );\r
106 ASSERT (ConfigRequestHdr != NULL);\r
107 DataSize = sizeof (Tcg2Version);\r
c411b485
MK
108 Status = gRT->GetVariable (\r
109 TCG2_VERSION_NAME,\r
110 &gTcg2ConfigFormSetGuid,\r
111 NULL,\r
112 &DataSize,\r
113 &Tcg2Version\r
114 );\r
dd6d0a52
SZ
115 if (!EFI_ERROR (Status)) {\r
116 //\r
117 // EFI variable does exist and validate current setting.\r
118 //\r
119 ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
120 if (!ActionFlag) {\r
121 //\r
122 // Current configuration is invalid, reset to defaults.\r
123 //\r
124 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
125 ASSERT (ActionFlag);\r
126 //\r
127 // Get the default values from variable.\r
128 //\r
129 DataSize = sizeof (Tcg2Version);\r
c411b485
MK
130 Status = gRT->GetVariable (\r
131 TCG2_VERSION_NAME,\r
132 &gTcg2ConfigFormSetGuid,\r
133 NULL,\r
134 &DataSize,\r
135 &Tcg2Version\r
136 );\r
dd6d0a52
SZ
137 ASSERT_EFI_ERROR (Status);\r
138 }\r
139 } else {\r
140 //\r
13383485 141 // EFI variable doesn't exist or variable size is not expected.\r
dd6d0a52
SZ
142 //\r
143\r
144 //\r
145 // Store zero data Buffer Storage to EFI variable.\r
146 //\r
147 Status = gRT->SetVariable (\r
148 TCG2_VERSION_NAME,\r
149 &gTcg2ConfigFormSetGuid,\r
150 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
151 sizeof (Tcg2Version),\r
152 &Tcg2Version\r
153 );\r
154 if (EFI_ERROR (Status)) {\r
155 DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_VERSION_NAME\n"));\r
156 return;\r
157 } else {\r
158 //\r
159 // Build this variable based on default values stored in IFR.\r
160 //\r
161 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
162 ASSERT (ActionFlag);\r
163 //\r
164 // Get the default values from variable.\r
165 //\r
166 DataSize = sizeof (Tcg2Version);\r
c411b485
MK
167 Status = gRT->GetVariable (\r
168 TCG2_VERSION_NAME,\r
169 &gTcg2ConfigFormSetGuid,\r
170 NULL,\r
171 &DataSize,\r
172 &Tcg2Version\r
173 );\r
dd6d0a52
SZ
174 ASSERT_EFI_ERROR (Status);\r
175 if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
176 DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer default value is not same with the default value in VFR\n"));\r
177 DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
178 }\r
c411b485 179\r
fca42289
ZC
180 if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) {\r
181 DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev default value is not same with the default value in VFR\n"));\r
182 DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
183 }\r
dd6d0a52
SZ
184 }\r
185 }\r
c411b485 186\r
dd6d0a52
SZ
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
c411b485 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
d6b926e7 249 @retval EFI_SUCCESS All the related protocols are installed on the driver.\r
1abfa4ce
JY
250 @retval Others Fail to install protocols as indicated.\r
251\r
252**/\r
253EFI_STATUS\r
254EFIAPI\r
255Tcg2ConfigDriverEntryPoint (\r
c411b485
MK
256 IN EFI_HANDLE ImageHandle,\r
257 IN EFI_SYSTEM_TABLE *SystemTable\r
1abfa4ce
JY
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
c411b485 298 Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **)&PrivateData->Tcg2Protocol);\r
1abfa4ce
JY
299 ASSERT_EFI_ERROR (Status);\r
300\r
c411b485
MK
301 PrivateData->ProtocolCapability.Size = sizeof (PrivateData->ProtocolCapability);\r
302 Status = PrivateData->Tcg2Protocol->GetCapability (\r
303 PrivateData->Tcg2Protocol,\r
304 &PrivateData->ProtocolCapability\r
305 );\r
1abfa4ce
JY
306 ASSERT_EFI_ERROR (Status);\r
307\r
c411b485
MK
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
1abfa4ce
JY
316 if (EFI_ERROR (Status)) {\r
317 //\r
318 // Variable not ready, set default value\r
319 //\r
c411b485 320 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
1abfa4ce
JY
321 }\r
322\r
323 //\r
324 // Validation\r
325 //\r
326 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
c411b485 327 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
1abfa4ce
JY
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
c411b485 337 UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof (UINT32), ReadUnaligned32 ((UINT32 *)Tcg2ConfigBin) - sizeof (UINT32), CurrentActivePCRBanks);\r
1abfa4ce 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
c411b485
MK
343 for (Index = 0; Index < sizeof (mTpmInstanceId)/sizeof (mTpmInstanceId[0]); Index++) {\r
344 if (CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
1abfa4ce
JY
345 Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
346 break;\r
347 }\r
348 }\r
349\r
350 PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
c411b485 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
c411b485 360 sizeof (Tcg2DeviceDetection),\r
1abfa4ce
JY
361 &Tcg2DeviceDetection\r
362 );\r
363 if (EFI_ERROR (Status)) {\r
e905fbb0 364 DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
1abfa4ce
JY
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
c411b485 382 sizeof (Tcg2Configuration),\r
518b6f65
JY
383 &Tcg2Configuration\r
384 );\r
385 if (EFI_ERROR (Status)) {\r
e905fbb0 386 DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
518b6f65
JY
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
c411b485
MK
437 EFI_STATUS Status;\r
438 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
1abfa4ce
JY
439\r
440 Status = gBS->HandleProtocol (\r
441 ImageHandle,\r
442 &gEfiCallerIdGuid,\r
c411b485 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
a629d5b9 452 ImageHandle,\r
1abfa4ce
JY
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