]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - SecurityPkg/Tcg/TrEEConfig/TrEEConfigDriver.c
Fix execution status & DEBUG message level mismatch. EFI_D_ERROR is used only...
[mirror_edk2.git] / SecurityPkg / Tcg / TrEEConfig / TrEEConfigDriver.c
... / ...
CommitLineData
1/** @file\r
2 The module entry point for TrEE configuration module.\r
3\r
4Copyright (c) 2013, 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
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 "TrEEConfigImpl.h"\r
16\r
17extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];\r
18\r
19/**\r
20 The entry point for TrEE configuration driver.\r
21\r
22 @param[in] ImageHandle The image handle of the driver.\r
23 @param[in] SystemTable The system table.\r
24\r
25 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
26 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
27 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
28 @retval Others Fail to install protocols as indicated.\r
29\r
30**/\r
31EFI_STATUS\r
32EFIAPI\r
33TrEEConfigDriverEntryPoint (\r
34 IN EFI_HANDLE ImageHandle,\r
35 IN EFI_SYSTEM_TABLE *SystemTable\r
36 )\r
37{\r
38 EFI_STATUS Status;\r
39 TREE_CONFIG_PRIVATE_DATA *PrivateData;\r
40 TREE_CONFIGURATION TrEEConfiguration;\r
41 TREE_DEVICE_DETECTION TrEEDeviceDetection;\r
42 UINTN Index;\r
43 UINTN DataSize;\r
44 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
45\r
46 Status = gBS->OpenProtocol (\r
47 ImageHandle,\r
48 &gEfiCallerIdGuid,\r
49 NULL,\r
50 ImageHandle,\r
51 ImageHandle,\r
52 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
53 );\r
54 if (!EFI_ERROR (Status)) {\r
55 return EFI_ALREADY_STARTED;\r
56 }\r
57 \r
58 //\r
59 // Create a private data structure.\r
60 //\r
61 PrivateData = AllocateCopyPool (sizeof (TREE_CONFIG_PRIVATE_DATA), &mTrEEConfigPrivateDateTemplate);\r
62 ASSERT (PrivateData != NULL);\r
63\r
64 //\r
65 // Install private GUID.\r
66 // \r
67 Status = gBS->InstallMultipleProtocolInterfaces (\r
68 &ImageHandle,\r
69 &gEfiCallerIdGuid,\r
70 PrivateData,\r
71 NULL\r
72 );\r
73 ASSERT_EFI_ERROR (Status);\r
74\r
75 DataSize = sizeof(TrEEConfiguration);\r
76 Status = gRT->GetVariable (\r
77 TREE_STORAGE_NAME,\r
78 &gTrEEConfigFormSetGuid,\r
79 NULL,\r
80 &DataSize,\r
81 &TrEEConfiguration\r
82 );\r
83 if (EFI_ERROR (Status)) {\r
84 //\r
85 // Variable not ready, set default value\r
86 //\r
87 TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;\r
88 }\r
89\r
90 //\r
91 // Validation\r
92 //\r
93 if ((TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) || (TrEEConfiguration.TpmDevice < TPM_DEVICE_MIN)) {\r
94 TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;\r
95 }\r
96\r
97 //\r
98 // Save to variable so platform driver can get it.\r
99 //\r
100 Status = gRT->SetVariable (\r
101 TREE_STORAGE_NAME,\r
102 &gTrEEConfigFormSetGuid,\r
103 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
104 sizeof(TrEEConfiguration),\r
105 &TrEEConfiguration\r
106 );\r
107 if (EFI_ERROR (Status)) {\r
108 DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_STORAGE_NAME\n"));\r
109 }\r
110\r
111 //\r
112 // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
113 //\r
114 TrEEDeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
115 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
116 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
117 TrEEDeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
118 break;\r
119 }\r
120 }\r
121\r
122 PrivateData->TpmDeviceDetected = TrEEDeviceDetection.TpmDeviceDetected;\r
123\r
124 //\r
125 // Save to variable so platform driver can get it.\r
126 //\r
127 Status = gRT->SetVariable (\r
128 TREE_DEVICE_DETECTION_NAME,\r
129 &gTrEEConfigFormSetGuid,\r
130 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
131 sizeof(TrEEDeviceDetection),\r
132 &TrEEDeviceDetection\r
133 );\r
134 if (EFI_ERROR (Status)) {\r
135 DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_DEVICE_DETECTION_NAME\n"));\r
136 Status = gRT->SetVariable (\r
137 TREE_DEVICE_DETECTION_NAME,\r
138 &gTrEEConfigFormSetGuid,\r
139 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
140 0,\r
141 NULL\r
142 );\r
143 ASSERT_EFI_ERROR (Status);\r
144 }\r
145\r
146 //\r
147 // We should lock TrEEDeviceDetection, because it contains information needed at S3.\r
148 //\r
149 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
150 if (!EFI_ERROR (Status)) {\r
151 Status = VariableLockProtocol->RequestToLock (\r
152 VariableLockProtocol,\r
153 TREE_DEVICE_DETECTION_NAME,\r
154 &gTrEEConfigFormSetGuid\r
155 );\r
156 ASSERT_EFI_ERROR (Status);\r
157 }\r
158 \r
159 //\r
160 // Install TrEE configuration form\r
161 //\r
162 Status = InstallTrEEConfigForm (PrivateData);\r
163 if (EFI_ERROR (Status)) {\r
164 goto ErrorExit;\r
165 }\r
166\r
167 return EFI_SUCCESS;\r
168\r
169ErrorExit:\r
170 if (PrivateData != NULL) {\r
171 UninstallTrEEConfigForm (PrivateData);\r
172 } \r
173 \r
174 return Status;\r
175}\r
176\r
177/**\r
178 Unload the TrEE configuration form.\r
179\r
180 @param[in] ImageHandle The driver's image handle.\r
181\r
182 @retval EFI_SUCCESS The TrEE configuration form is unloaded.\r
183 @retval Others Failed to unload the form.\r
184\r
185**/\r
186EFI_STATUS\r
187EFIAPI\r
188TrEEConfigDriverUnload (\r
189 IN EFI_HANDLE ImageHandle\r
190 )\r
191{\r
192 EFI_STATUS Status;\r
193 TREE_CONFIG_PRIVATE_DATA *PrivateData;\r
194\r
195 Status = gBS->HandleProtocol (\r
196 ImageHandle,\r
197 &gEfiCallerIdGuid,\r
198 (VOID **) &PrivateData\r
199 ); \r
200 if (EFI_ERROR (Status)) {\r
201 return Status; \r
202 }\r
203 \r
204 ASSERT (PrivateData->Signature == TREE_CONFIG_PRIVATE_DATA_SIGNATURE);\r
205\r
206 gBS->UninstallMultipleProtocolInterfaces (\r
207 &ImageHandle,\r
208 &gEfiCallerIdGuid,\r
209 PrivateData,\r
210 NULL\r
211 );\r
212 \r
213 UninstallTrEEConfigForm (PrivateData);\r
214\r
215 return EFI_SUCCESS;\r
216}\r