/** @file\r
\r
-Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2010 - 2019, 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
-of the BSD License which accompanies this distribution. The\r
-full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
@param[in] ImageHandle Image handle of this driver.\r
@param[in] SystemTable A Pointer to the EFI System Table.\r
\r
- @retval EFI_SUCEESS \r
+ @retval EFI_SUCEESS\r
@return Others Some error occurs.\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
SMM_LOCK_BOX_CONTEXT *SmmLockBoxContext;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmConstructor - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmConstructor - Enter\n"));\r
\r
//\r
// Register SmmReadyToLock notification.\r
// Find it. That means some other library instance is already run.\r
// No need to install again, just return.\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - already installed\n"));\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmConstructor - Exit\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - already installed\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmConstructor - Exit\n"));\r
return EFI_SUCCESS;\r
}\r
\r
ASSERT_EFI_ERROR (Status);\r
mSmmConfigurationTableInstalled = TRUE;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - %x\n", (UINTN)&mSmmLockBoxContext));\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib LockBoxDataAddress - %x\n", (UINTN)&mLockBoxQueue));\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmConstructor - Exit\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - %x\n", (UINTN)&mSmmLockBoxContext));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib LockBoxDataAddress - %x\n", (UINTN)&mLockBoxQueue));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmConstructor - Exit\n"));\r
\r
return Status;\r
}\r
{\r
EFI_STATUS Status;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmDestructor in %a module\n", gEfiCallerBaseName));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmDestructor in %a module\n", gEfiCallerBaseName));\r
\r
if (mSmmConfigurationTableInstalled) {\r
Status = gSmst->SmmInstallConfigurationTable (\r
0\r
);\r
ASSERT_EFI_ERROR (Status);\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib uninstall SmmLockBoxCommunication configuration table\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib uninstall SmmLockBoxCommunication configuration table\n"));\r
}\r
\r
if (mSmmLockBoxRegistrationSmmReadyToLock != NULL) {\r
EFI_STATUS Status;\r
LIST_ENTRY *LockBoxQueue;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SaveLockBox - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SaveLockBox - Enter\n"));\r
\r
//\r
// Basic check\r
//\r
if ((Guid == NULL) || (Buffer == NULL) || (Length == 0)) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
LockBox = InternalFindLockBoxByGuid (Guid);\r
if (LockBox != NULL) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_ALREADY_STARTED));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_ALREADY_STARTED));\r
return EFI_ALREADY_STARTED;\r
}\r
\r
);\r
ASSERT_EFI_ERROR (Status);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_OUT_OF_RESOURCES));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_OUT_OF_RESOURCES));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
ASSERT_EFI_ERROR (Status);\r
if (EFI_ERROR (Status)) {\r
gSmst->SmmFreePages (SmramBuffer, EFI_SIZE_TO_PAGES (Length));\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_OUT_OF_RESOURCES));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_OUT_OF_RESOURCES));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
LockBox->SmramBuffer = SmramBuffer;\r
\r
DEBUG ((\r
- EFI_D_INFO,\r
+ DEBUG_INFO,\r
"LockBoxGuid - %g, SmramBuffer - 0x%lx, Length - 0x%lx\n",\r
&LockBox->Guid,\r
LockBox->SmramBuffer,\r
//\r
// Done\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_SUCCESS));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SaveLockBox - Exit (%r)\n", EFI_SUCCESS));\r
return EFI_SUCCESS;\r
}\r
\r
{\r
SMM_LOCK_BOX_DATA *LockBox;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Enter\n"));\r
\r
//\r
// Basic check\r
//\r
if ((Guid == NULL) ||\r
((Attributes & ~(LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE | LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY)) != 0)) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (((Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE) != 0) &&\r
((Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY) != 0)) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
- DEBUG ((EFI_D_INFO, " LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE and LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY\n\n"));\r
- DEBUG ((EFI_D_INFO, " can not be set together\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
+ DEBUG ((DEBUG_INFO, " LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE and LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY\n\n"));\r
+ DEBUG ((DEBUG_INFO, " can not be set together\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
LockBox = InternalFindLockBoxByGuid (Guid);\r
if (LockBox == NULL) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_NOT_FOUND));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_NOT_FOUND));\r
return EFI_NOT_FOUND;\r
}\r
\r
((LockBox->Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY) != 0)) ||\r
(((LockBox->Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE) != 0) &&\r
((Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY) != 0))) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes 0x%lx 0x%lx - Exit (%r)\n", LockBox->Attributes, Attributes, EFI_INVALID_PARAMETER));\r
- DEBUG ((EFI_D_INFO, " LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE and LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY\n\n"));\r
- DEBUG ((EFI_D_INFO, " can not be set together\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes 0x%lx 0x%lx - Exit (%r)\n", LockBox->Attributes, Attributes, EFI_INVALID_PARAMETER));\r
+ DEBUG ((DEBUG_INFO, " LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE and LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY\n\n"));\r
+ DEBUG ((DEBUG_INFO, " can not be set together\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// Done\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_SUCCESS));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib SetLockBoxAttributes - Exit (%r)\n", EFI_SUCCESS));\r
return EFI_SUCCESS;\r
}\r
\r
@retval RETURN_SUCCESS the information is saved successfully.\r
@retval RETURN_INVALID_PARAMETER the Guid is NULL, or Buffer is NULL, or Length is 0.\r
@retval RETURN_NOT_FOUND the requested GUID not found.\r
- @retval RETURN_BUFFER_TOO_SMALL the original buffer to too small to hold new information.\r
+ @retval RETURN_BUFFER_TOO_SMALL for lockbox without attribute LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY,\r
+ the original buffer to too small to hold new information.\r
+ @retval RETURN_OUT_OF_RESOURCES for lockbox with attribute LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY,\r
+ no enough resource to save the information.\r
@retval RETURN_ACCESS_DENIED it is too late to invoke this interface\r
@retval RETURN_NOT_STARTED it is too early to invoke this interface\r
@retval RETURN_UNSUPPORTED the service is not supported by implementaion.\r
)\r
{\r
SMM_LOCK_BOX_DATA *LockBox;\r
+ EFI_PHYSICAL_ADDRESS SmramBuffer;\r
+ EFI_STATUS Status;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib UpdateLockBox - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib UpdateLockBox - Enter\n"));\r
\r
//\r
// Basic check\r
//\r
- if ((Guid == NULL) || (Buffer == NULL) || (Length == 0)) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
+ if ((Guid == NULL) || (Buffer == NULL) || (Length == 0) ||\r
+ (Length > MAX_UINTN - Offset)) {\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
LockBox = InternalFindLockBoxByGuid (Guid);\r
if (LockBox == NULL) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_NOT_FOUND));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_NOT_FOUND));\r
return EFI_NOT_FOUND;\r
}\r
\r
// Update data\r
//\r
if (LockBox->Length < Offset + Length) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_BUFFER_TOO_SMALL));\r
- return EFI_BUFFER_TOO_SMALL;\r
+ if ((LockBox->Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY) != 0) {\r
+ //\r
+ // If 'LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY' attribute is set, enlarge the\r
+ // LockBox.\r
+ //\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "SmmLockBoxSmmLib UpdateLockBox - Origin LockBox too small, enlarge.\n"\r
+ ));\r
+\r
+ if (EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES ((UINTN)LockBox->Length)) < Offset + Length) {\r
+ //\r
+ // In SaveLockBox(), the SMRAM buffer allocated for LockBox is of page\r
+ // granularity. Here, if the required size is larger than the origin size\r
+ // of the pages, allocate new buffer from SMRAM to enlarge the LockBox.\r
+ //\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "SmmLockBoxSmmLib UpdateLockBox - Allocate new buffer to enlarge.\n"\r
+ ));\r
+ Status = gSmst->SmmAllocatePages (\r
+ AllocateAnyPages,\r
+ EfiRuntimeServicesData,\r
+ EFI_SIZE_TO_PAGES (Offset + Length),\r
+ &SmramBuffer\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_OUT_OF_RESOURCES));\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ //\r
+ // Copy origin data to the new SMRAM buffer and wipe the content in the\r
+ // origin SMRAM buffer.\r
+ //\r
+ CopyMem ((VOID *)(UINTN)SmramBuffer, (VOID *)(UINTN)LockBox->SmramBuffer, (UINTN)LockBox->Length);\r
+ ZeroMem ((VOID *)(UINTN)LockBox->SmramBuffer, (UINTN)LockBox->Length);\r
+ gSmst->SmmFreePages (LockBox->SmramBuffer, EFI_SIZE_TO_PAGES ((UINTN)LockBox->Length));\r
+\r
+ LockBox->SmramBuffer = SmramBuffer;\r
+ }\r
+\r
+ //\r
+ // Handle uninitialized content in the LockBox.\r
+ //\r
+ if (Offset > LockBox->Length) {\r
+ ZeroMem (\r
+ (VOID *)((UINTN)LockBox->SmramBuffer + (UINTN)LockBox->Length),\r
+ Offset - (UINTN)LockBox->Length\r
+ );\r
+ }\r
+ LockBox->Length = Offset + Length;\r
+ } else {\r
+ //\r
+ // If 'LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY' attribute is NOT set, return\r
+ // EFI_BUFFER_TOO_SMALL directly.\r
+ //\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_BUFFER_TOO_SMALL));\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
}\r
ASSERT ((UINTN)LockBox->SmramBuffer <= (MAX_ADDRESS - Offset));\r
CopyMem ((VOID *)((UINTN)LockBox->SmramBuffer + Offset), Buffer, Length);\r
//\r
// Done\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_SUCCESS));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib UpdateLockBox - Exit (%r)\n", EFI_SUCCESS));\r
return EFI_SUCCESS;\r
}\r
\r
\r
@retval RETURN_SUCCESS the information is restored successfully.\r
@retval RETURN_INVALID_PARAMETER the Guid is NULL, or one of Buffer and Length is NULL.\r
- @retval RETURN_WRITE_PROTECTED Buffer and Length are NULL, but the LockBox has no \r
+ @retval RETURN_WRITE_PROTECTED Buffer and Length are NULL, but the LockBox has no\r
LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE attribute.\r
@retval RETURN_BUFFER_TOO_SMALL the Length is too small to hold the confidential information.\r
@retval RETURN_NOT_FOUND the requested GUID not found.\r
SMM_LOCK_BOX_DATA *LockBox;\r
VOID *RestoreBuffer;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreLockBox - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreLockBox - Enter\n"));\r
\r
//\r
// Restore this, Buffer and Length MUST be both NULL or both non-NULL\r
if ((Guid == NULL) ||\r
((Buffer == NULL) && (Length != NULL)) ||\r
((Buffer != NULL) && (Length == NULL))) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_INVALID_PARAMETER));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// Not found\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_NOT_FOUND));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_NOT_FOUND));\r
return EFI_NOT_FOUND;\r
}\r
\r
// restore to original buffer\r
//\r
if ((LockBox->Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE) == 0) {\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_WRITE_PROTECTED));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_WRITE_PROTECTED));\r
return EFI_WRITE_PROTECTED;\r
}\r
RestoreBuffer = (VOID *)(UINTN)LockBox->Buffer;\r
// Input buffer is too small to hold all data.\r
//\r
*Length = (UINTN)LockBox->Length;\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_BUFFER_TOO_SMALL));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_BUFFER_TOO_SMALL));\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
*Length = (UINTN)LockBox->Length;\r
//\r
// Done\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_SUCCESS));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreLockBox - Exit (%r)\n", EFI_SUCCESS));\r
return EFI_SUCCESS;\r
}\r
\r
LIST_ENTRY *Link;\r
LIST_ENTRY *LockBoxQueue;\r
\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreAllLockBoxInPlace - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreAllLockBoxInPlace - Enter\n"));\r
\r
LockBoxQueue = InternalGetLockBoxQueue ();\r
ASSERT (LockBoxQueue != NULL);\r
//\r
// Done\r
//\r
- DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib RestoreAllLockBoxInPlace - Exit (%r)\n", EFI_SUCCESS));\r
+ DEBUG ((DEBUG_INFO, "SmmLockBoxSmmLib RestoreAllLockBoxInPlace - Exit (%r)\n", EFI_SUCCESS));\r
return EFI_SUCCESS;\r
}\r
\r