]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / SmmLockBoxLib / SmmLockBoxDxeLib.c
CommitLineData
1c837cd5 1/** @file\r
2\r
481ffd6f 3Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>\r
1c837cd5 4\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
1c837cd5 6\r
7**/\r
8\r
9#include <PiDxe.h>\r
10#include <Library/UefiBootServicesTableLib.h>\r
11#include <Library/UefiRuntimeServicesTableLib.h>\r
12#include <Library/BaseLib.h>\r
13#include <Library/BaseMemoryLib.h>\r
14#include <Library/LockBoxLib.h>\r
15#include <Library/DebugLib.h>\r
b926a05b 16#include <Library/UefiLib.h>\r
1c837cd5 17#include <Protocol/SmmCommunication.h>\r
18#include <Guid/SmmLockBox.h>\r
b926a05b 19#include <Guid/PiSmmCommunicationRegionTable.h>\r
1c837cd5 20\r
21#include "SmmLockBoxLibPrivate.h"\r
22\r
b926a05b
SZ
23EFI_SMM_COMMUNICATION_PROTOCOL *mLockBoxSmmCommProtocol = NULL;\r
24UINT8 *mLockBoxSmmCommBuffer = NULL;\r
25\r
26/**\r
27 Get smm communication protocol for lockbox.\r
28\r
29 @return Pointer to smm communication protocol, NULL if not found.\r
30\r
31**/\r
32EFI_SMM_COMMUNICATION_PROTOCOL *\r
33LockBoxGetSmmCommProtocol (\r
34 VOID\r
35 )\r
36{\r
37 EFI_STATUS Status;\r
38\r
39 //\r
40 // If the protocol has been got previously, return it.\r
41 //\r
42 if (mLockBoxSmmCommProtocol != NULL) {\r
43 return mLockBoxSmmCommProtocol;\r
44 }\r
45\r
46 Status = gBS->LocateProtocol (\r
47 &gEfiSmmCommunicationProtocolGuid,\r
48 NULL,\r
49 (VOID **)&mLockBoxSmmCommProtocol\r
50 );\r
51 if (EFI_ERROR (Status)) {\r
52 mLockBoxSmmCommProtocol = NULL;\r
53 }\r
54 return mLockBoxSmmCommProtocol;\r
55}\r
56\r
57/**\r
58 Get smm communication buffer for lockbox.\r
59\r
60 @return Pointer to smm communication buffer, NULL if not found.\r
61\r
62**/\r
63UINT8 *\r
64LockBoxGetSmmCommBuffer (\r
65 VOID\r
66 )\r
67{\r
68 EFI_STATUS Status;\r
69 UINTN MinimalSizeNeeded;\r
70 EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;\r
71 UINT32 Index;\r
72 EFI_MEMORY_DESCRIPTOR *Entry;\r
73 UINTN Size;\r
74\r
75 //\r
76 // If the buffer has been got previously, return it.\r
77 //\r
78 if (mLockBoxSmmCommBuffer != NULL) {\r
79 return mLockBoxSmmCommBuffer;\r
80 }\r
81\r
82 MinimalSizeNeeded = sizeof (EFI_GUID) +\r
83 sizeof (UINTN) +\r
84 MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SAVE),\r
85 MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES),\r
86 MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_UPDATE),\r
87 MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE),\r
88 sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)))));\r
89\r
90 Status = EfiGetSystemConfigurationTable (\r
91 &gEdkiiPiSmmCommunicationRegionTableGuid,\r
92 (VOID **) &PiSmmCommunicationRegionTable\r
93 );\r
94 if (EFI_ERROR (Status)) {\r
95 mLockBoxSmmCommBuffer = NULL;\r
96 return mLockBoxSmmCommBuffer;\r
97 }\r
98 ASSERT (PiSmmCommunicationRegionTable != NULL);\r
99 Entry = (EFI_MEMORY_DESCRIPTOR *) (PiSmmCommunicationRegionTable + 1);\r
100 Size = 0;\r
101 for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {\r
102 if (Entry->Type == EfiConventionalMemory) {\r
103 Size = EFI_PAGES_TO_SIZE ((UINTN) Entry->NumberOfPages);\r
104 if (Size >= MinimalSizeNeeded) {\r
105 break;\r
106 }\r
107 }\r
108 Entry = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) Entry + PiSmmCommunicationRegionTable->DescriptorSize);\r
109 }\r
110 if (Index >= PiSmmCommunicationRegionTable->NumberOfEntries) {\r
111 mLockBoxSmmCommBuffer = NULL;\r
112 } else {\r
113 mLockBoxSmmCommBuffer = (UINT8 *) (UINTN) Entry->PhysicalStart;\r
114 }\r
115 return mLockBoxSmmCommBuffer;\r
116}\r
117\r
1c837cd5 118/**\r
119 This function will save confidential information to lockbox.\r
120\r
121 @param Guid the guid to identify the confidential information\r
122 @param Buffer the address of the confidential information\r
123 @param Length the length of the confidential information\r
124\r
125 @retval RETURN_SUCCESS the information is saved successfully.\r
126 @retval RETURN_INVALID_PARAMETER the Guid is NULL, or Buffer is NULL, or Length is 0\r
127 @retval RETURN_ALREADY_STARTED the requested GUID already exist.\r
128 @retval RETURN_OUT_OF_RESOURCES no enough resource to save the information.\r
129 @retval RETURN_ACCESS_DENIED it is too late to invoke this interface\r
130 @retval RETURN_NOT_STARTED it is too early to invoke this interface\r
131 @retval RETURN_UNSUPPORTED the service is not supported by implementaion.\r
132**/\r
133RETURN_STATUS\r
134EFIAPI\r
135SaveLockBox (\r
136 IN GUID *Guid,\r
137 IN VOID *Buffer,\r
138 IN UINTN Length\r
139 )\r
140{\r
141 EFI_STATUS Status;\r
142 EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
143 EFI_SMM_LOCK_BOX_PARAMETER_SAVE *LockBoxParameterSave;\r
144 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
b926a05b
SZ
145 UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SAVE)];\r
146 UINT8 *CommBuffer;\r
1c837cd5 147 UINTN CommSize;\r
148\r
481ffd6f 149 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib SaveLockBox - Enter\n"));\r
1c837cd5 150\r
151 //\r
152 // Basic check\r
153 //\r
154 if ((Guid == NULL) || (Buffer == NULL) || (Length == 0)) {\r
155 return EFI_INVALID_PARAMETER;\r
156 }\r
157\r
b926a05b
SZ
158 SmmCommunication = LockBoxGetSmmCommProtocol ();\r
159 if (SmmCommunication == NULL) {\r
1c837cd5 160 return EFI_NOT_STARTED;\r
161 }\r
162\r
163 //\r
164 // Prepare parameter\r
165 //\r
b926a05b
SZ
166 CommBuffer = LockBoxGetSmmCommBuffer ();\r
167 if (CommBuffer == NULL) {\r
168 CommBuffer = &TempCommBuffer[0];\r
169 }\r
1c837cd5 170 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
171 CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
172 CommHeader->MessageLength = sizeof(*LockBoxParameterSave);\r
173\r
174 LockBoxParameterSave = (EFI_SMM_LOCK_BOX_PARAMETER_SAVE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
175 LockBoxParameterSave->Header.Command = EFI_SMM_LOCK_BOX_COMMAND_SAVE;\r
176 LockBoxParameterSave->Header.DataLength = sizeof(*LockBoxParameterSave);\r
177 LockBoxParameterSave->Header.ReturnStatus = (UINT64)-1;\r
178 CopyMem (&LockBoxParameterSave->Guid, Guid, sizeof(*Guid));\r
179 LockBoxParameterSave->Buffer = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;\r
180 LockBoxParameterSave->Length = (UINT64)Length;\r
181\r
182 //\r
183 // Send command\r
184 //\r
b926a05b 185 CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SAVE);\r
1c837cd5 186 Status = SmmCommunication->Communicate (\r
187 SmmCommunication,\r
188 &CommBuffer[0],\r
189 &CommSize\r
190 );\r
191 ASSERT_EFI_ERROR (Status);\r
192\r
193 Status = (EFI_STATUS)LockBoxParameterSave->Header.ReturnStatus;\r
194\r
481ffd6f 195 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib SaveLockBox - Exit (%r)\n", Status));\r
1c837cd5 196\r
197 //\r
198 // Done\r
199 //\r
200 return Status;\r
201}\r
202\r
203/**\r
204 This function will set lockbox attributes.\r
205\r
206 @param Guid the guid to identify the confidential information\r
207 @param Attributes the attributes of the lockbox\r
208\r
209 @retval RETURN_SUCCESS the information is saved successfully.\r
210 @retval RETURN_INVALID_PARAMETER attributes is invalid.\r
211 @retval RETURN_NOT_FOUND the requested GUID not found.\r
212 @retval RETURN_ACCESS_DENIED it is too late to invoke this interface\r
213 @retval RETURN_NOT_STARTED it is too early to invoke this interface\r
214 @retval RETURN_UNSUPPORTED the service is not supported by implementaion.\r
215**/\r
216RETURN_STATUS\r
217EFIAPI\r
218SetLockBoxAttributes (\r
219 IN GUID *Guid,\r
220 IN UINT64 Attributes\r
221 )\r
222{\r
223 EFI_STATUS Status;\r
224 EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
225 EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *LockBoxParameterSetAttributes;\r
226 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
b926a05b
SZ
227 UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES)];\r
228 UINT8 *CommBuffer;\r
1c837cd5 229 UINTN CommSize;\r
230\r
481ffd6f 231 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib SetLockBoxAttributes - Enter\n"));\r
1c837cd5 232\r
233 //\r
234 // Basic check\r
235 //\r
236 if ((Guid == NULL) ||\r
6bd4af30 237 ((Attributes & ~(LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE | LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY)) != 0)) {\r
1c837cd5 238 return EFI_INVALID_PARAMETER;\r
239 }\r
240\r
b926a05b
SZ
241 SmmCommunication = LockBoxGetSmmCommProtocol ();\r
242 if (SmmCommunication == NULL) {\r
1c837cd5 243 return EFI_NOT_STARTED;\r
244 }\r
245\r
246 //\r
247 // Prepare parameter\r
248 //\r
b926a05b
SZ
249 CommBuffer = LockBoxGetSmmCommBuffer ();\r
250 if (CommBuffer == NULL) {\r
251 CommBuffer = &TempCommBuffer[0];\r
252 }\r
1c837cd5 253 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
254 CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
255 CommHeader->MessageLength = sizeof(*LockBoxParameterSetAttributes);\r
256\r
257 LockBoxParameterSetAttributes = (EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
258 LockBoxParameterSetAttributes->Header.Command = EFI_SMM_LOCK_BOX_COMMAND_SET_ATTRIBUTES;\r
259 LockBoxParameterSetAttributes->Header.DataLength = sizeof(*LockBoxParameterSetAttributes);\r
260 LockBoxParameterSetAttributes->Header.ReturnStatus = (UINT64)-1;\r
261 CopyMem (&LockBoxParameterSetAttributes->Guid, Guid, sizeof(*Guid));\r
262 LockBoxParameterSetAttributes->Attributes = (UINT64)Attributes;\r
263\r
264 //\r
265 // Send command\r
266 //\r
b926a05b 267 CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES);\r
1c837cd5 268 Status = SmmCommunication->Communicate (\r
269 SmmCommunication,\r
270 &CommBuffer[0],\r
271 &CommSize\r
272 );\r
273 ASSERT_EFI_ERROR (Status);\r
274\r
275 Status = (EFI_STATUS)LockBoxParameterSetAttributes->Header.ReturnStatus;\r
276\r
481ffd6f 277 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib SetLockBoxAttributes - Exit (%r)\n", Status));\r
1c837cd5 278\r
279 //\r
280 // Done\r
281 //\r
282 return Status;\r
283}\r
284\r
285/**\r
286 This function will update confidential information to lockbox.\r
287\r
288 @param Guid the guid to identify the original confidential information\r
289 @param Offset the offset of the original confidential information\r
290 @param Buffer the address of the updated confidential information\r
291 @param Length the length of the updated confidential information\r
292\r
293 @retval RETURN_SUCCESS the information is saved successfully.\r
294 @retval RETURN_INVALID_PARAMETER the Guid is NULL, or Buffer is NULL, or Length is 0.\r
295 @retval RETURN_NOT_FOUND the requested GUID not found.\r
99383667
HW
296 @retval RETURN_BUFFER_TOO_SMALL for lockbox without attribute LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY,\r
297 the original buffer to too small to hold new information.\r
298 @retval RETURN_OUT_OF_RESOURCES for lockbox with attribute LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY,\r
299 no enough resource to save the information.\r
1c837cd5 300 @retval RETURN_ACCESS_DENIED it is too late to invoke this interface\r
301 @retval RETURN_NOT_STARTED it is too early to invoke this interface\r
302 @retval RETURN_UNSUPPORTED the service is not supported by implementaion.\r
303**/\r
304RETURN_STATUS\r
305EFIAPI\r
306UpdateLockBox (\r
307 IN GUID *Guid,\r
308 IN UINTN Offset,\r
309 IN VOID *Buffer,\r
310 IN UINTN Length\r
311 )\r
312{\r
313 EFI_STATUS Status;\r
314 EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
315 EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *LockBoxParameterUpdate;\r
316 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
b926a05b
SZ
317 UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_UPDATE)];\r
318 UINT8 *CommBuffer;\r
1c837cd5 319 UINTN CommSize;\r
320\r
481ffd6f 321 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib UpdateLockBox - Enter\n"));\r
1c837cd5 322\r
323 //\r
324 // Basic check\r
325 //\r
326 if ((Guid == NULL) || (Buffer == NULL) || (Length == 0)) {\r
327 return EFI_INVALID_PARAMETER;\r
328 }\r
329\r
b926a05b
SZ
330 SmmCommunication = LockBoxGetSmmCommProtocol ();\r
331 if (SmmCommunication == NULL) {\r
1c837cd5 332 return EFI_NOT_STARTED;\r
333 }\r
334\r
335 //\r
336 // Prepare parameter\r
337 //\r
b926a05b
SZ
338 CommBuffer = LockBoxGetSmmCommBuffer ();\r
339 if (CommBuffer == NULL) {\r
340 CommBuffer = &TempCommBuffer[0];\r
341 }\r
1c837cd5 342 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
343 CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
344 CommHeader->MessageLength = sizeof(*LockBoxParameterUpdate);\r
345\r
346 LockBoxParameterUpdate = (EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *)(UINTN)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
347 LockBoxParameterUpdate->Header.Command = EFI_SMM_LOCK_BOX_COMMAND_UPDATE;\r
348 LockBoxParameterUpdate->Header.DataLength = sizeof(*LockBoxParameterUpdate);\r
349 LockBoxParameterUpdate->Header.ReturnStatus = (UINT64)-1;\r
350 CopyMem (&LockBoxParameterUpdate->Guid, Guid, sizeof(*Guid));\r
351 LockBoxParameterUpdate->Offset = (UINT64)Offset;\r
352 LockBoxParameterUpdate->Buffer = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;\r
353 LockBoxParameterUpdate->Length = (UINT64)Length;\r
354\r
355 //\r
356 // Send command\r
357 //\r
b926a05b 358 CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_UPDATE);\r
1c837cd5 359 Status = SmmCommunication->Communicate (\r
360 SmmCommunication,\r
361 &CommBuffer[0],\r
362 &CommSize\r
363 );\r
364 ASSERT_EFI_ERROR (Status);\r
365\r
366 Status = (EFI_STATUS)LockBoxParameterUpdate->Header.ReturnStatus;\r
367\r
481ffd6f 368 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib UpdateLockBox - Exit (%r)\n", Status));\r
1c837cd5 369\r
370 //\r
371 // Done\r
372 //\r
373 return Status;\r
374}\r
375\r
376/**\r
377 This function will restore confidential information from lockbox.\r
378\r
379 @param Guid the guid to identify the confidential information\r
380 @param Buffer the address of the restored confidential information\r
381 NULL means restored to original address, Length MUST be NULL at same time.\r
382 @param Length the length of the restored confidential information\r
383\r
384 @retval RETURN_SUCCESS the information is restored successfully.\r
385 @retval RETURN_INVALID_PARAMETER the Guid is NULL, or one of Buffer and Length is NULL.\r
d1102dba 386 @retval RETURN_WRITE_PROTECTED Buffer and Length are NULL, but the LockBox has no\r
1c837cd5 387 LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE attribute.\r
388 @retval RETURN_BUFFER_TOO_SMALL the Length is too small to hold the confidential information.\r
389 @retval RETURN_NOT_FOUND the requested GUID not found.\r
390 @retval RETURN_NOT_STARTED it is too early to invoke this interface\r
391 @retval RETURN_ACCESS_DENIED not allow to restore to the address\r
392 @retval RETURN_UNSUPPORTED the service is not supported by implementaion.\r
393**/\r
394RETURN_STATUS\r
395EFIAPI\r
396RestoreLockBox (\r
397 IN GUID *Guid,\r
398 IN VOID *Buffer, OPTIONAL\r
399 IN OUT UINTN *Length OPTIONAL\r
400 )\r
401{\r
402 EFI_STATUS Status;\r
403 EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
404 EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *LockBoxParameterRestore;\r
405 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
b926a05b
SZ
406 UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE)];\r
407 UINT8 *CommBuffer;\r
1c837cd5 408 UINTN CommSize;\r
409\r
481ffd6f 410 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib RestoreLockBox - Enter\n"));\r
1c837cd5 411\r
412 //\r
413 // Basic check\r
414 //\r
415 if ((Guid == NULL) ||\r
416 ((Buffer == NULL) && (Length != NULL)) ||\r
417 ((Buffer != NULL) && (Length == NULL))) {\r
418 return EFI_INVALID_PARAMETER;\r
419 }\r
420\r
b926a05b
SZ
421 SmmCommunication = LockBoxGetSmmCommProtocol ();\r
422 if (SmmCommunication == NULL) {\r
1c837cd5 423 return EFI_NOT_STARTED;\r
424 }\r
425\r
426 //\r
427 // Prepare parameter\r
428 //\r
b926a05b
SZ
429 CommBuffer = LockBoxGetSmmCommBuffer ();\r
430 if (CommBuffer == NULL) {\r
431 CommBuffer = &TempCommBuffer[0];\r
432 }\r
1c837cd5 433 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
434 CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
435 CommHeader->MessageLength = sizeof(*LockBoxParameterRestore);\r
436\r
437 LockBoxParameterRestore = (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
438 LockBoxParameterRestore->Header.Command = EFI_SMM_LOCK_BOX_COMMAND_RESTORE;\r
439 LockBoxParameterRestore->Header.DataLength = sizeof(*LockBoxParameterRestore);\r
440 LockBoxParameterRestore->Header.ReturnStatus = (UINT64)-1;\r
441 CopyMem (&LockBoxParameterRestore->Guid, Guid, sizeof(*Guid));\r
442 LockBoxParameterRestore->Buffer = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;\r
443 if (Length != NULL) {\r
444 LockBoxParameterRestore->Length = (EFI_PHYSICAL_ADDRESS)*Length;\r
445 } else {\r
446 LockBoxParameterRestore->Length = 0;\r
447 }\r
448\r
449 //\r
450 // Send command\r
451 //\r
b926a05b 452 CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE);\r
1c837cd5 453 Status = SmmCommunication->Communicate (\r
454 SmmCommunication,\r
455 &CommBuffer[0],\r
456 &CommSize\r
457 );\r
458 ASSERT_EFI_ERROR (Status);\r
459\r
460 if (Length != NULL) {\r
461 *Length = (UINTN)LockBoxParameterRestore->Length;\r
462 }\r
463\r
464 Status = (EFI_STATUS)LockBoxParameterRestore->Header.ReturnStatus;\r
465\r
481ffd6f 466 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib RestoreLockBox - Exit (%r)\n", Status));\r
1c837cd5 467\r
468 //\r
469 // Done\r
470 //\r
471 return Status;\r
472}\r
473\r
474/**\r
475 This function will restore confidential information from all lockbox which have RestoreInPlace attribute.\r
476\r
477 @retval RETURN_SUCCESS the information is restored successfully.\r
478 @retval RETURN_NOT_STARTED it is too early to invoke this interface\r
479 @retval RETURN_UNSUPPORTED the service is not supported by implementaion.\r
480**/\r
481RETURN_STATUS\r
482EFIAPI\r
483RestoreAllLockBoxInPlace (\r
484 VOID\r
485 )\r
486{\r
487 EFI_STATUS Status;\r
488 EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
489 EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *LockBoxParameterRestoreAllInPlace;\r
490 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
b926a05b
SZ
491 UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)];\r
492 UINT8 *CommBuffer;\r
1c837cd5 493 UINTN CommSize;\r
494\r
481ffd6f 495 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib RestoreAllLockBoxInPlace - Enter\n"));\r
1c837cd5 496\r
b926a05b
SZ
497 SmmCommunication = LockBoxGetSmmCommProtocol ();\r
498 if (SmmCommunication == NULL) {\r
1c837cd5 499 return EFI_NOT_STARTED;\r
500 }\r
501\r
502 //\r
503 // Prepare parameter\r
504 //\r
b926a05b
SZ
505 CommBuffer = LockBoxGetSmmCommBuffer ();\r
506 if (CommBuffer == NULL) {\r
507 CommBuffer = &TempCommBuffer[0];\r
508 }\r
1c837cd5 509 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
510 CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
511 CommHeader->MessageLength = sizeof(*LockBoxParameterRestoreAllInPlace);\r
512\r
513 LockBoxParameterRestoreAllInPlace = (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
514 LockBoxParameterRestoreAllInPlace->Header.Command = EFI_SMM_LOCK_BOX_COMMAND_RESTORE_ALL_IN_PLACE;\r
515 LockBoxParameterRestoreAllInPlace->Header.DataLength = sizeof(*LockBoxParameterRestoreAllInPlace);\r
516 LockBoxParameterRestoreAllInPlace->Header.ReturnStatus = (UINT64)-1;\r
517\r
518 //\r
519 // Send command\r
520 //\r
b926a05b 521 CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE);\r
1c837cd5 522 Status = SmmCommunication->Communicate (\r
523 SmmCommunication,\r
524 &CommBuffer[0],\r
525 &CommSize\r
526 );\r
527 ASSERT_EFI_ERROR (Status);\r
528\r
529 Status = (EFI_STATUS)LockBoxParameterRestoreAllInPlace->Header.ReturnStatus;\r
530\r
481ffd6f 531 DEBUG ((DEBUG_INFO, "SmmLockBoxDxeLib RestoreAllLockBoxInPlace - Exit (%r)\n", Status));\r
1c837cd5 532\r
533 //\r
534 // Done\r
535 //\r
536 return Status;\r
537}\r
538\r