/** @file\r
\r
-Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/LockBoxLib.h>\r
#include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
#include <Protocol/SmmCommunication.h>\r
#include <Guid/SmmLockBox.h>\r
+#include <Guid/PiSmmCommunicationRegionTable.h>\r
\r
#include "SmmLockBoxLibPrivate.h"\r
\r
+EFI_SMM_COMMUNICATION_PROTOCOL *mLockBoxSmmCommProtocol = NULL;\r
+UINT8 *mLockBoxSmmCommBuffer = NULL;\r
+\r
+/**\r
+ Get smm communication protocol for lockbox.\r
+\r
+ @return Pointer to smm communication protocol, NULL if not found.\r
+\r
+**/\r
+EFI_SMM_COMMUNICATION_PROTOCOL *\r
+LockBoxGetSmmCommProtocol (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // If the protocol has been got previously, return it.\r
+ //\r
+ if (mLockBoxSmmCommProtocol != NULL) {\r
+ return mLockBoxSmmCommProtocol;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiSmmCommunicationProtocolGuid,\r
+ NULL,\r
+ (VOID **)&mLockBoxSmmCommProtocol\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ mLockBoxSmmCommProtocol = NULL;\r
+ }\r
+ return mLockBoxSmmCommProtocol;\r
+}\r
+\r
+/**\r
+ Get smm communication buffer for lockbox.\r
+\r
+ @return Pointer to smm communication buffer, NULL if not found.\r
+\r
+**/\r
+UINT8 *\r
+LockBoxGetSmmCommBuffer (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN MinimalSizeNeeded;\r
+ EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;\r
+ UINT32 Index;\r
+ EFI_MEMORY_DESCRIPTOR *Entry;\r
+ UINTN Size;\r
+\r
+ //\r
+ // If the buffer has been got previously, return it.\r
+ //\r
+ if (mLockBoxSmmCommBuffer != NULL) {\r
+ return mLockBoxSmmCommBuffer;\r
+ }\r
+\r
+ MinimalSizeNeeded = sizeof (EFI_GUID) +\r
+ sizeof (UINTN) +\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SAVE),\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES),\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_UPDATE),\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE),\r
+ sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)))));\r
+\r
+ Status = EfiGetSystemConfigurationTable (\r
+ &gEdkiiPiSmmCommunicationRegionTableGuid,\r
+ (VOID **) &PiSmmCommunicationRegionTable\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ mLockBoxSmmCommBuffer = NULL;\r
+ return mLockBoxSmmCommBuffer;\r
+ }\r
+ ASSERT (PiSmmCommunicationRegionTable != NULL);\r
+ Entry = (EFI_MEMORY_DESCRIPTOR *) (PiSmmCommunicationRegionTable + 1);\r
+ Size = 0;\r
+ for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {\r
+ if (Entry->Type == EfiConventionalMemory) {\r
+ Size = EFI_PAGES_TO_SIZE ((UINTN) Entry->NumberOfPages);\r
+ if (Size >= MinimalSizeNeeded) {\r
+ break;\r
+ }\r
+ }\r
+ Entry = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) Entry + PiSmmCommunicationRegionTable->DescriptorSize);\r
+ }\r
+ if (Index >= PiSmmCommunicationRegionTable->NumberOfEntries) {\r
+ mLockBoxSmmCommBuffer = NULL;\r
+ } else {\r
+ mLockBoxSmmCommBuffer = (UINT8 *) (UINTN) Entry->PhysicalStart;\r
+ }\r
+ return mLockBoxSmmCommBuffer;\r
+}\r
+\r
/**\r
This function will save confidential information to lockbox.\r
\r
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
EFI_SMM_LOCK_BOX_PARAMETER_SAVE *LockBoxParameterSave;\r
EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
- UINT8 CommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SAVE)];\r
+ UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SAVE)];\r
+ UINT8 *CommBuffer;\r
UINTN CommSize;\r
\r
DEBUG ((EFI_D_INFO, "SmmLockBoxDxeLib SaveLockBox - Enter\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- //\r
- // Get needed resource\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiSmmCommunicationProtocolGuid,\r
- NULL,\r
- (VOID **)&SmmCommunication\r
- );\r
- if (EFI_ERROR (Status)) {\r
+ SmmCommunication = LockBoxGetSmmCommProtocol ();\r
+ if (SmmCommunication == NULL) {\r
return EFI_NOT_STARTED;\r
}\r
\r
//\r
// Prepare parameter\r
//\r
+ CommBuffer = LockBoxGetSmmCommBuffer ();\r
+ if (CommBuffer == NULL) {\r
+ CommBuffer = &TempCommBuffer[0];\r
+ }\r
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
CommHeader->MessageLength = sizeof(*LockBoxParameterSave);\r
//\r
// Send command\r
//\r
- CommSize = sizeof(CommBuffer);\r
+ CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SAVE);\r
Status = SmmCommunication->Communicate (\r
SmmCommunication,\r
&CommBuffer[0],\r
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *LockBoxParameterSetAttributes;\r
EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
- UINT8 CommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES)];\r
+ UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES)];\r
+ UINT8 *CommBuffer;\r
UINTN CommSize;\r
\r
DEBUG ((EFI_D_INFO, "SmmLockBoxDxeLib SetLockBoxAttributes - Enter\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- //\r
- // Get needed resource\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiSmmCommunicationProtocolGuid,\r
- NULL,\r
- (VOID **)&SmmCommunication\r
- );\r
- if (EFI_ERROR (Status)) {\r
+ SmmCommunication = LockBoxGetSmmCommProtocol ();\r
+ if (SmmCommunication == NULL) {\r
return EFI_NOT_STARTED;\r
}\r
\r
//\r
// Prepare parameter\r
//\r
+ CommBuffer = LockBoxGetSmmCommBuffer ();\r
+ if (CommBuffer == NULL) {\r
+ CommBuffer = &TempCommBuffer[0];\r
+ }\r
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
CommHeader->MessageLength = sizeof(*LockBoxParameterSetAttributes);\r
//\r
// Send command\r
//\r
- CommSize = sizeof(CommBuffer);\r
+ CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES);\r
Status = SmmCommunication->Communicate (\r
SmmCommunication,\r
&CommBuffer[0],\r
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *LockBoxParameterUpdate;\r
EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
- UINT8 CommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_UPDATE)];\r
+ UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_UPDATE)];\r
+ UINT8 *CommBuffer;\r
UINTN CommSize;\r
\r
DEBUG ((EFI_D_INFO, "SmmLockBoxDxeLib UpdateLockBox - Enter\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- //\r
- // Get needed resource\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiSmmCommunicationProtocolGuid,\r
- NULL,\r
- (VOID **)&SmmCommunication\r
- );\r
- if (EFI_ERROR (Status)) {\r
+ SmmCommunication = LockBoxGetSmmCommProtocol ();\r
+ if (SmmCommunication == NULL) {\r
return EFI_NOT_STARTED;\r
}\r
\r
//\r
// Prepare parameter\r
//\r
+ CommBuffer = LockBoxGetSmmCommBuffer ();\r
+ if (CommBuffer == NULL) {\r
+ CommBuffer = &TempCommBuffer[0];\r
+ }\r
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
CommHeader->MessageLength = sizeof(*LockBoxParameterUpdate);\r
//\r
// Send command\r
//\r
- CommSize = sizeof(CommBuffer);\r
+ CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_UPDATE);\r
Status = SmmCommunication->Communicate (\r
SmmCommunication,\r
&CommBuffer[0],\r
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *LockBoxParameterRestore;\r
EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
- UINT8 CommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE)];\r
+ UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE)];\r
+ UINT8 *CommBuffer;\r
UINTN CommSize;\r
\r
DEBUG ((EFI_D_INFO, "SmmLockBoxDxeLib RestoreLockBox - Enter\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- //\r
- // Get needed resource\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiSmmCommunicationProtocolGuid,\r
- NULL,\r
- (VOID **)&SmmCommunication\r
- );\r
- if (EFI_ERROR (Status)) {\r
+ SmmCommunication = LockBoxGetSmmCommProtocol ();\r
+ if (SmmCommunication == NULL) {\r
return EFI_NOT_STARTED;\r
}\r
\r
//\r
// Prepare parameter\r
//\r
+ CommBuffer = LockBoxGetSmmCommBuffer ();\r
+ if (CommBuffer == NULL) {\r
+ CommBuffer = &TempCommBuffer[0];\r
+ }\r
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
CommHeader->MessageLength = sizeof(*LockBoxParameterRestore);\r
//\r
// Send command\r
//\r
- CommSize = sizeof(CommBuffer);\r
+ CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE);\r
Status = SmmCommunication->Communicate (\r
SmmCommunication,\r
&CommBuffer[0],\r
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;\r
EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *LockBoxParameterRestoreAllInPlace;\r
EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
- UINT8 CommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)];\r
+ UINT8 TempCommBuffer[sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)];\r
+ UINT8 *CommBuffer;\r
UINTN CommSize;\r
\r
DEBUG ((EFI_D_INFO, "SmmLockBoxDxeLib RestoreAllLockBoxInPlace - Enter\n"));\r
\r
- //\r
- // Get needed resource\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiSmmCommunicationProtocolGuid,\r
- NULL,\r
- (VOID **)&SmmCommunication\r
- );\r
- if (EFI_ERROR (Status)) {\r
+ SmmCommunication = LockBoxGetSmmCommProtocol ();\r
+ if (SmmCommunication == NULL) {\r
return EFI_NOT_STARTED;\r
}\r
\r
//\r
// Prepare parameter\r
//\r
+ CommBuffer = LockBoxGetSmmCommBuffer ();\r
+ if (CommBuffer == NULL) {\r
+ CommBuffer = &TempCommBuffer[0];\r
+ }\r
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
CopyMem (&CommHeader->HeaderGuid, &gEfiSmmLockBoxCommunicationGuid, sizeof(gEfiSmmLockBoxCommunicationGuid));\r
CommHeader->MessageLength = sizeof(*LockBoxParameterRestoreAllInPlace);\r
//\r
// Send command\r
//\r
- CommSize = sizeof(CommBuffer);\r
+ CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE);\r
Status = SmmCommunication->Communicate (\r
SmmCommunication,\r
&CommBuffer[0],\r