]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
SecurityPkg: Tcg2Dxe: Report correct FinalEventLog size
[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
518b6f65 4Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
1abfa4ce
JY
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
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
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
63/**\r
64 The entry point for Tcg2 configuration driver.\r
65\r
66 @param[in] ImageHandle The image handle of the driver.\r
67 @param[in] SystemTable The system table.\r
68\r
69 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
70 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
71 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
72 @retval Others Fail to install protocols as indicated.\r
73\r
74**/\r
75EFI_STATUS\r
76EFIAPI\r
77Tcg2ConfigDriverEntryPoint (\r
78 IN EFI_HANDLE ImageHandle,\r
79 IN EFI_SYSTEM_TABLE *SystemTable\r
80 )\r
81{\r
82 EFI_STATUS Status;\r
83 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
84 TCG2_CONFIGURATION Tcg2Configuration;\r
85 TCG2_DEVICE_DETECTION Tcg2DeviceDetection;\r
86 UINTN Index;\r
87 UINTN DataSize;\r
88 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
89 UINT32 CurrentActivePCRBanks;\r
90\r
91 Status = gBS->OpenProtocol (\r
92 ImageHandle,\r
93 &gEfiCallerIdGuid,\r
94 NULL,\r
95 ImageHandle,\r
96 ImageHandle,\r
97 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
98 );\r
99 if (!EFI_ERROR (Status)) {\r
100 return EFI_ALREADY_STARTED;\r
101 }\r
102 \r
103 //\r
104 // Create a private data structure.\r
105 //\r
106 PrivateData = AllocateCopyPool (sizeof (TCG2_CONFIG_PRIVATE_DATA), &mTcg2ConfigPrivateDateTemplate);\r
107 ASSERT (PrivateData != NULL);\r
108 mTcg2ConfigPrivateDate = PrivateData;\r
109 //\r
110 // Install private GUID.\r
111 // \r
112 Status = gBS->InstallMultipleProtocolInterfaces (\r
113 &ImageHandle,\r
114 &gEfiCallerIdGuid,\r
115 PrivateData,\r
116 NULL\r
117 );\r
118 ASSERT_EFI_ERROR (Status);\r
119\r
120 Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &PrivateData->Tcg2Protocol);\r
121 ASSERT_EFI_ERROR (Status);\r
122\r
123 PrivateData->ProtocolCapability.Size = sizeof(PrivateData->ProtocolCapability);\r
124 Status = PrivateData->Tcg2Protocol->GetCapability (\r
125 PrivateData->Tcg2Protocol,\r
126 &PrivateData->ProtocolCapability\r
127 );\r
128 ASSERT_EFI_ERROR (Status);\r
129\r
130 DataSize = sizeof(Tcg2Configuration);\r
131 Status = gRT->GetVariable (\r
132 TCG2_STORAGE_NAME,\r
133 &gTcg2ConfigFormSetGuid,\r
134 NULL,\r
135 &DataSize,\r
136 &Tcg2Configuration\r
137 );\r
138 if (EFI_ERROR (Status)) {\r
139 //\r
140 // Variable not ready, set default value\r
141 //\r
142 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
143 }\r
144\r
145 //\r
146 // Validation\r
147 //\r
148 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
149 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
150 }\r
151\r
152 //\r
153 // Set value for Tcg2CurrentActivePCRBanks\r
154 // Search Tcg2ConfigBin[] and update default value there\r
155 //\r
156 Status = PrivateData->Tcg2Protocol->GetActivePcrBanks (PrivateData->Tcg2Protocol, &CurrentActivePCRBanks);\r
157 ASSERT_EFI_ERROR (Status);\r
158 PrivateData->PCRBanksDesired = CurrentActivePCRBanks;\r
159 UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks);\r
160\r
1abfa4ce
JY
161 //\r
162 // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
163 //\r
164 Tcg2DeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
165 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
166 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
167 Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
168 break;\r
169 }\r
170 }\r
171\r
172 PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
518b6f65 173 Tcg2Configuration.TpmDevice = Tcg2DeviceDetection.TpmDeviceDetected;\r
1abfa4ce
JY
174\r
175 //\r
176 // Save to variable so platform driver can get it.\r
177 //\r
178 Status = gRT->SetVariable (\r
179 TCG2_DEVICE_DETECTION_NAME,\r
180 &gTcg2ConfigFormSetGuid,\r
181 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
182 sizeof(Tcg2DeviceDetection),\r
183 &Tcg2DeviceDetection\r
184 );\r
185 if (EFI_ERROR (Status)) {\r
186 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
187 Status = gRT->SetVariable (\r
188 TCG2_DEVICE_DETECTION_NAME,\r
189 &gTcg2ConfigFormSetGuid,\r
190 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
191 0,\r
192 NULL\r
193 );\r
194 ASSERT_EFI_ERROR (Status);\r
195 }\r
196\r
518b6f65
JY
197 //\r
198 // Save to variable so platform driver can get it.\r
199 //\r
200 Status = gRT->SetVariable (\r
201 TCG2_STORAGE_NAME,\r
202 &gTcg2ConfigFormSetGuid,\r
203 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
204 sizeof(Tcg2Configuration),\r
205 &Tcg2Configuration\r
206 );\r
207 if (EFI_ERROR (Status)) {\r
208 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
209 }\r
210\r
1abfa4ce
JY
211 //\r
212 // We should lock Tcg2DeviceDetection, because it contains information needed at S3.\r
213 //\r
214 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
215 if (!EFI_ERROR (Status)) {\r
216 Status = VariableLockProtocol->RequestToLock (\r
217 VariableLockProtocol,\r
218 TCG2_DEVICE_DETECTION_NAME,\r
219 &gTcg2ConfigFormSetGuid\r
220 );\r
221 ASSERT_EFI_ERROR (Status);\r
222 }\r
223 \r
224 //\r
225 // Install Tcg2 configuration form\r
226 //\r
227 Status = InstallTcg2ConfigForm (PrivateData);\r
228 if (EFI_ERROR (Status)) {\r
229 goto ErrorExit;\r
230 }\r
231\r
232 return EFI_SUCCESS;\r
233\r
234ErrorExit:\r
235 if (PrivateData != NULL) {\r
236 UninstallTcg2ConfigForm (PrivateData);\r
237 } \r
238 \r
239 return Status;\r
240}\r
241\r
242/**\r
243 Unload the Tcg2 configuration form.\r
244\r
245 @param[in] ImageHandle The driver's image handle.\r
246\r
247 @retval EFI_SUCCESS The Tcg2 configuration form is unloaded.\r
248 @retval Others Failed to unload the form.\r
249\r
250**/\r
251EFI_STATUS\r
252EFIAPI\r
253Tcg2ConfigDriverUnload (\r
254 IN EFI_HANDLE ImageHandle\r
255 )\r
256{\r
257 EFI_STATUS Status;\r
258 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
259\r
260 Status = gBS->HandleProtocol (\r
261 ImageHandle,\r
262 &gEfiCallerIdGuid,\r
263 (VOID **) &PrivateData\r
264 ); \r
265 if (EFI_ERROR (Status)) {\r
266 return Status; \r
267 }\r
268 \r
269 ASSERT (PrivateData->Signature == TCG2_CONFIG_PRIVATE_DATA_SIGNATURE);\r
270\r
271 gBS->UninstallMultipleProtocolInterfaces (\r
272 &ImageHandle,\r
273 &gEfiCallerIdGuid,\r
274 PrivateData,\r
275 NULL\r
276 );\r
277 \r
278 UninstallTcg2ConfigForm (PrivateData);\r
279\r
280 return EFI_SUCCESS;\r
281}\r