]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / LockBox / SmmLockBox / SmmLockBox.c
index 28d5180e011e51dca7614ec0174e3adcb6998bec..c1e15c596bddd1410b19ba18ec637d6626968a00 100644 (file)
 \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
@@ -38,7 +31,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #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
@@ -51,19 +44,19 @@ BOOLEAN              mLocked = FALSE;
 **/\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
@@ -72,11 +65,17 @@ SmmLockBoxSave (
   // 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
@@ -86,7 +85,7 @@ SmmLockBoxSave (
              (UINTN)TempLockBoxParameterSave.Length\r
              );\r
   LockBoxParameterSave->Header.ReturnStatus = (UINT64)Status;\r
-  return ;\r
+  return;\r
 }\r
 \r
 /**\r
@@ -96,19 +95,19 @@ SmmLockBoxSave (
 **/\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
@@ -121,7 +120,7 @@ SmmLockBoxSetAttributes (
              TempLockBoxParameterSetAttributes.Attributes\r
              );\r
   LockBoxParameterSetAttributes->Header.ReturnStatus = (UINT64)Status;\r
-  return ;\r
+  return;\r
 }\r
 \r
 /**\r
@@ -135,19 +134,19 @@ SmmLockBoxSetAttributes (
 **/\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
@@ -156,11 +155,17 @@ SmmLockBoxUpdate (
   // 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
@@ -171,7 +176,7 @@ SmmLockBoxUpdate (
              (UINTN)TempLockBoxParameterUpdate.Length\r
              );\r
   LockBoxParameterUpdate->Header.ReturnStatus = (UINT64)Status;\r
-  return ;\r
+  return;\r
 }\r
 \r
 /**\r
@@ -185,11 +190,11 @@ SmmLockBoxUpdate (
 **/\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
@@ -197,9 +202,9 @@ SmmLockBoxRestore (
   // 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
@@ -217,12 +222,16 @@ SmmLockBoxRestore (
                (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
@@ -232,14 +241,14 @@ SmmLockBoxRestore (
 **/\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
@@ -267,15 +276,15 @@ SmmLockBoxHandler (
   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
@@ -284,12 +293,13 @@ SmmLockBoxHandler (
   //\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
@@ -302,44 +312,49 @@ SmmLockBoxHandler (
   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
@@ -388,9 +403,9 @@ SmmLockBoxEntryPoint (
   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
@@ -416,12 +431,12 @@ SmmLockBoxEntryPoint (
   // 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