\r
Copyright (c) 2010 - 2018, 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
#include <Protocol/LockBox.h>\r
#include <Guid/SmmLockBox.h>\r
\r
-BOOLEAN mLocked = FALSE;\r
+BOOLEAN mLocked = FALSE;\r
\r
/**\r
Dispatch function for SMM lock box save.\r
**/\r
VOID\r
SmmLockBoxSave (\r
- IN EFI_SMM_LOCK_BOX_PARAMETER_SAVE *LockBoxParameterSave\r
+ IN EFI_SMM_LOCK_BOX_PARAMETER_SAVE *LockBoxParameterSave\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_LOCK_BOX_PARAMETER_SAVE TempLockBoxParameterSave;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_LOCK_BOX_PARAMETER_SAVE TempLockBoxParameterSave;\r
\r
//\r
// Sanity check\r
//\r
if (mLocked) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Locked!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Locked!\n"));\r
LockBoxParameterSave->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED;\r
- return ;\r
+ return;\r
}\r
\r
CopyMem (&TempLockBoxParameterSave, LockBoxParameterSave, sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SAVE));\r
// Sanity check\r
//\r
if (!SmmIsBufferOutsideSmmValid ((UINTN)TempLockBoxParameterSave.Buffer, (UINTN)TempLockBoxParameterSave.Length)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Save address in SMRAM or buffer overflow!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Save address in SMRAM or buffer overflow!\n"));\r
LockBoxParameterSave->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED;\r
- return ;\r
+ return;\r
}\r
\r
+ //\r
+ // The SpeculationBarrier() call here is to ensure the above range check for\r
+ // the CommBuffer have been completed before calling into SaveLockBox().\r
+ //\r
+ SpeculationBarrier ();\r
+\r
//\r
// Save data\r
//\r
(UINTN)TempLockBoxParameterSave.Length\r
);\r
LockBoxParameterSave->Header.ReturnStatus = (UINT64)Status;\r
- return ;\r
+ return;\r
}\r
\r
/**\r
**/\r
VOID\r
SmmLockBoxSetAttributes (\r
- IN EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *LockBoxParameterSetAttributes\r
+ IN EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *LockBoxParameterSetAttributes\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES TempLockBoxParameterSetAttributes;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES TempLockBoxParameterSetAttributes;\r
\r
//\r
// Sanity check\r
//\r
if (mLocked) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Locked!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Locked!\n"));\r
LockBoxParameterSetAttributes->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED;\r
- return ;\r
+ return;\r
}\r
\r
CopyMem (&TempLockBoxParameterSetAttributes, LockBoxParameterSetAttributes, sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES));\r
TempLockBoxParameterSetAttributes.Attributes\r
);\r
LockBoxParameterSetAttributes->Header.ReturnStatus = (UINT64)Status;\r
- return ;\r
+ return;\r
}\r
\r
/**\r
**/\r
VOID\r
SmmLockBoxUpdate (\r
- IN EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *LockBoxParameterUpdate\r
+ IN EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *LockBoxParameterUpdate\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_LOCK_BOX_PARAMETER_UPDATE TempLockBoxParameterUpdate;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_LOCK_BOX_PARAMETER_UPDATE TempLockBoxParameterUpdate;\r
\r
//\r
// Sanity check\r
//\r
if (mLocked) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Locked!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Locked!\n"));\r
LockBoxParameterUpdate->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED;\r
- return ;\r
+ return;\r
}\r
\r
CopyMem (&TempLockBoxParameterUpdate, LockBoxParameterUpdate, sizeof (EFI_SMM_LOCK_BOX_PARAMETER_UPDATE));\r
// Sanity check\r
//\r
if (!SmmIsBufferOutsideSmmValid ((UINTN)TempLockBoxParameterUpdate.Buffer, (UINTN)TempLockBoxParameterUpdate.Length)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Update address in SMRAM or buffer overflow!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Update address in SMRAM or buffer overflow!\n"));\r
LockBoxParameterUpdate->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED;\r
- return ;\r
+ return;\r
}\r
\r
+ //\r
+ // The SpeculationBarrier() call here is to ensure the above range check for\r
+ // the CommBuffer have been completed before calling into UpdateLockBox().\r
+ //\r
+ SpeculationBarrier ();\r
+\r
//\r
// Update data\r
//\r
(UINTN)TempLockBoxParameterUpdate.Length\r
);\r
LockBoxParameterUpdate->Header.ReturnStatus = (UINT64)Status;\r
- return ;\r
+ return;\r
}\r
\r
/**\r
**/\r
VOID\r
SmmLockBoxRestore (\r
- IN EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *LockBoxParameterRestore\r
+ IN EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *LockBoxParameterRestore\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_LOCK_BOX_PARAMETER_RESTORE TempLockBoxParameterRestore;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_LOCK_BOX_PARAMETER_RESTORE TempLockBoxParameterRestore;\r
\r
CopyMem (&TempLockBoxParameterRestore, LockBoxParameterRestore, sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE));\r
\r
// Sanity check\r
//\r
if (!SmmIsBufferOutsideSmmValid ((UINTN)TempLockBoxParameterRestore.Buffer, (UINTN)TempLockBoxParameterRestore.Length)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Restore address in SMRAM or buffer overflow!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Restore address in SMRAM or buffer overflow!\n"));\r
LockBoxParameterRestore->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED;\r
- return ;\r
+ return;\r
}\r
\r
//\r
(VOID *)(UINTN)TempLockBoxParameterRestore.Buffer,\r
(UINTN *)&TempLockBoxParameterRestore.Length\r
);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ if ((Status == EFI_BUFFER_TOO_SMALL) || (Status == EFI_SUCCESS)) {\r
+ //\r
+ // Return the actual Length value.\r
+ //\r
LockBoxParameterRestore->Length = TempLockBoxParameterRestore.Length;\r
}\r
}\r
+\r
LockBoxParameterRestore->Header.ReturnStatus = (UINT64)Status;\r
- return ;\r
+ return;\r
}\r
\r
/**\r
**/\r
VOID\r
SmmLockBoxRestoreAllInPlace (\r
- IN EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *LockBoxParameterRestoreAllInPlace\r
+ IN EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *LockBoxParameterRestoreAllInPlace\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
- Status = RestoreAllLockBoxInPlace ();\r
+ Status = RestoreAllLockBoxInPlace ();\r
LockBoxParameterRestoreAllInPlace->Header.ReturnStatus = (UINT64)Status;\r
- return ;\r
+ return;\r
}\r
\r
/**\r
IN OUT UINTN *CommBufferSize OPTIONAL\r
)\r
{\r
- EFI_SMM_LOCK_BOX_PARAMETER_HEADER *LockBoxParameterHeader;\r
- UINTN TempCommBufferSize;\r
+ EFI_SMM_LOCK_BOX_PARAMETER_HEADER *LockBoxParameterHeader;\r
+ UINTN TempCommBufferSize;\r
\r
DEBUG ((DEBUG_INFO, "SmmLockBox SmmLockBoxHandler Enter\n"));\r
\r
//\r
// If input is invalid, stop processing this SMI\r
//\r
- if (CommBuffer == NULL || CommBufferSize == NULL) {\r
+ if ((CommBuffer == NULL) || (CommBufferSize == NULL)) {\r
return EFI_SUCCESS;\r
}\r
\r
//\r
// Sanity check\r
//\r
- if (TempCommBufferSize < sizeof(EFI_SMM_LOCK_BOX_PARAMETER_HEADER)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer Size invalid!\n"));\r
+ if (TempCommBufferSize < sizeof (EFI_SMM_LOCK_BOX_PARAMETER_HEADER)) {\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer Size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
+\r
if (!SmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer in SMRAM or overflow!\n"));\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer in SMRAM or overflow!\n"));\r
return EFI_SUCCESS;\r
}\r
\r
DEBUG ((DEBUG_INFO, "SmmLockBox Command - %x\n", (UINTN)LockBoxParameterHeader->Command));\r
\r
switch (LockBoxParameterHeader->Command) {\r
- case EFI_SMM_LOCK_BOX_COMMAND_SAVE:\r
- if (TempCommBufferSize < sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SAVE)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer Size for SAVE invalid!\n"));\r
+ case EFI_SMM_LOCK_BOX_COMMAND_SAVE:\r
+ if (TempCommBufferSize < sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SAVE)) {\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer Size for SAVE invalid!\n"));\r
+ break;\r
+ }\r
+\r
+ SmmLockBoxSave ((EFI_SMM_LOCK_BOX_PARAMETER_SAVE *)(UINTN)LockBoxParameterHeader);\r
break;\r
- }\r
- SmmLockBoxSave ((EFI_SMM_LOCK_BOX_PARAMETER_SAVE *)(UINTN)LockBoxParameterHeader);\r
- break;\r
- case EFI_SMM_LOCK_BOX_COMMAND_UPDATE:\r
- if (TempCommBufferSize < sizeof(EFI_SMM_LOCK_BOX_PARAMETER_UPDATE)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer Size for UPDATE invalid!\n"));\r
+ case EFI_SMM_LOCK_BOX_COMMAND_UPDATE:\r
+ if (TempCommBufferSize < sizeof (EFI_SMM_LOCK_BOX_PARAMETER_UPDATE)) {\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer Size for UPDATE invalid!\n"));\r
+ break;\r
+ }\r
+\r
+ SmmLockBoxUpdate ((EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *)(UINTN)LockBoxParameterHeader);\r
break;\r
- }\r
- SmmLockBoxUpdate ((EFI_SMM_LOCK_BOX_PARAMETER_UPDATE *)(UINTN)LockBoxParameterHeader);\r
- break;\r
- case EFI_SMM_LOCK_BOX_COMMAND_RESTORE:\r
- if (TempCommBufferSize < sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer Size for RESTORE invalid!\n"));\r
+ case EFI_SMM_LOCK_BOX_COMMAND_RESTORE:\r
+ if (TempCommBufferSize < sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE)) {\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer Size for RESTORE invalid!\n"));\r
+ break;\r
+ }\r
+\r
+ SmmLockBoxRestore ((EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *)(UINTN)LockBoxParameterHeader);\r
break;\r
- }\r
- SmmLockBoxRestore ((EFI_SMM_LOCK_BOX_PARAMETER_RESTORE *)(UINTN)LockBoxParameterHeader);\r
- break;\r
- case EFI_SMM_LOCK_BOX_COMMAND_SET_ATTRIBUTES:\r
- if (TempCommBufferSize < sizeof(EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer Size for SET_ATTRIBUTES invalid!\n"));\r
+ case EFI_SMM_LOCK_BOX_COMMAND_SET_ATTRIBUTES:\r
+ if (TempCommBufferSize < sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES)) {\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer Size for SET_ATTRIBUTES invalid!\n"));\r
+ break;\r
+ }\r
+\r
+ SmmLockBoxSetAttributes ((EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *)(UINTN)LockBoxParameterHeader);\r
break;\r
- }\r
- SmmLockBoxSetAttributes ((EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES *)(UINTN)LockBoxParameterHeader);\r
- break;\r
- case EFI_SMM_LOCK_BOX_COMMAND_RESTORE_ALL_IN_PLACE:\r
- if (TempCommBufferSize < sizeof(EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)) {\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command Buffer Size for RESTORE_ALL_IN_PLACE invalid!\n"));\r
+ case EFI_SMM_LOCK_BOX_COMMAND_RESTORE_ALL_IN_PLACE:\r
+ if (TempCommBufferSize < sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)) {\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command Buffer Size for RESTORE_ALL_IN_PLACE invalid!\n"));\r
+ break;\r
+ }\r
+\r
+ SmmLockBoxRestoreAllInPlace ((EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *)(UINTN)LockBoxParameterHeader);\r
+ break;\r
+ default:\r
+ DEBUG ((DEBUG_ERROR, "SmmLockBox Command invalid!\n"));\r
break;\r
- }\r
- SmmLockBoxRestoreAllInPlace ((EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE *)(UINTN)LockBoxParameterHeader);\r
- break;\r
- default:\r
- DEBUG ((EFI_D_ERROR, "SmmLockBox Command invalid!\n"));\r
- break;\r
}\r
\r
LockBoxParameterHeader->Command = (UINT32)-1;\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HANDLE DispatchHandle;\r
- VOID *Registration;\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE DispatchHandle;\r
+ VOID *Registration;\r
\r
//\r
// Register LockBox communication handler\r
// Install NULL to DXE data base as notify\r
//\r
ImageHandle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &ImageHandle,\r
- &gEfiLockBoxProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- NULL\r
- );\r
+ Status = gBS->InstallProtocolInterface (\r
+ &ImageHandle,\r
+ &gEfiLockBoxProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ NULL\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
return Status;\r