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