]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableSmmRuntimeDxe.c
index d525998ae301a05c43e3eb34b9d6e1a2a977fd5b..4aaeb5ba8806eb323582762f9cce6b0c280c8c3e 100644 (file)
   InitCommunicateBuffer() is really function to check the variable data size.\r
 \r
 Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) Microsoft Corporation.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #include <PiDxe.h>\r
 #include <Protocol/VariableWrite.h>\r
 #include <Protocol/Variable.h>\r
-#include <Protocol/SmmCommunication.h>\r
+#include <Protocol/MmCommunication2.h>\r
 #include <Protocol/SmmVariable.h>\r
 #include <Protocol/VariableLock.h>\r
 #include <Protocol/VarCheck.h>\r
@@ -34,6 +35,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/DebugLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Library/BaseLib.h>\r
+#include <Library/MmUnblockMemoryLib.h>\r
 \r
 #include <Guid/EventGroup.h>\r
 #include <Guid/SmmVariableCommon.h>\r
@@ -41,28 +43,39 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include "PrivilegePolymorphic.h"\r
 #include "VariableParsing.h"\r
 \r
-EFI_HANDLE                       mHandle                    = NULL;\r
-EFI_SMM_VARIABLE_PROTOCOL       *mSmmVariable               = NULL;\r
-EFI_EVENT                        mVirtualAddressChangeEvent = NULL;\r
-EFI_SMM_COMMUNICATION_PROTOCOL  *mSmmCommunication          = NULL;\r
-UINT8                           *mVariableBuffer            = NULL;\r
-UINT8                           *mVariableBufferPhysical    = NULL;\r
-VARIABLE_INFO_ENTRY             *mVariableInfo              = NULL;\r
-VARIABLE_STORE_HEADER           *mVariableRuntimeHobCacheBuffer           = NULL;\r
-VARIABLE_STORE_HEADER           *mVariableRuntimeNvCacheBuffer            = NULL;\r
-VARIABLE_STORE_HEADER           *mVariableRuntimeVolatileCacheBuffer      = NULL;\r
-UINTN                            mVariableBufferSize;\r
-UINTN                            mVariableRuntimeHobCacheBufferSize;\r
-UINTN                            mVariableRuntimeNvCacheBufferSize;\r
-UINTN                            mVariableRuntimeVolatileCacheBufferSize;\r
-UINTN                            mVariableBufferPayloadSize;\r
-BOOLEAN                          mVariableRuntimeCachePendingUpdate;\r
-BOOLEAN                          mVariableRuntimeCacheReadLock;\r
-BOOLEAN                          mVariableAuthFormat;\r
-BOOLEAN                          mHobFlushComplete;\r
-EFI_LOCK                         mVariableServicesLock;\r
-EDKII_VARIABLE_LOCK_PROTOCOL     mVariableLock;\r
-EDKII_VAR_CHECK_PROTOCOL         mVarCheck;\r
+EFI_HANDLE                      mHandle                              = NULL;\r
+EFI_SMM_VARIABLE_PROTOCOL       *mSmmVariable                        = NULL;\r
+EFI_EVENT                       mVirtualAddressChangeEvent           = NULL;\r
+EFI_MM_COMMUNICATION2_PROTOCOL  *mMmCommunication2                   = NULL;\r
+UINT8                           *mVariableBuffer                     = NULL;\r
+UINT8                           *mVariableBufferPhysical             = NULL;\r
+VARIABLE_INFO_ENTRY             *mVariableInfo                       = NULL;\r
+VARIABLE_STORE_HEADER           *mVariableRuntimeHobCacheBuffer      = NULL;\r
+VARIABLE_STORE_HEADER           *mVariableRuntimeNvCacheBuffer       = NULL;\r
+VARIABLE_STORE_HEADER           *mVariableRuntimeVolatileCacheBuffer = NULL;\r
+UINTN                           mVariableBufferSize;\r
+UINTN                           mVariableRuntimeHobCacheBufferSize;\r
+UINTN                           mVariableRuntimeNvCacheBufferSize;\r
+UINTN                           mVariableRuntimeVolatileCacheBufferSize;\r
+UINTN                           mVariableBufferPayloadSize;\r
+BOOLEAN                         mVariableRuntimeCachePendingUpdate;\r
+BOOLEAN                         mVariableRuntimeCacheReadLock;\r
+BOOLEAN                         mVariableAuthFormat;\r
+BOOLEAN                         mHobFlushComplete;\r
+EFI_LOCK                        mVariableServicesLock;\r
+EDKII_VARIABLE_LOCK_PROTOCOL    mVariableLock;\r
+EDKII_VAR_CHECK_PROTOCOL        mVarCheck;\r
+\r
+/**\r
+  The logic to initialize the VariablePolicy engine is in its own file.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+VariablePolicySmmDxeMain (\r
+  IN    EFI_HANDLE        ImageHandle,\r
+  IN    EFI_SYSTEM_TABLE  *SystemTable\r
+  );\r
 \r
 /**\r
   Some Secure Boot Policy Variable may update following other variable changes(SecureBoot follows PK change, etc).\r
@@ -71,7 +84,7 @@ EDKII_VAR_CHECK_PROTOCOL         mVarCheck;
 **/\r
 VOID\r
 EFIAPI\r
-RecordSecureBootPolicyVarData(\r
+RecordSecureBootPolicyVarData (\r
   VOID\r
   );\r
 \r
@@ -89,7 +102,7 @@ RecordSecureBootPolicyVarData(
 **/\r
 VOID\r
 AcquireLockOnlyAtBootTime (\r
-  IN EFI_LOCK                             *Lock\r
+  IN EFI_LOCK  *Lock\r
   )\r
 {\r
   if (!EfiAtRuntime ()) {\r
@@ -111,7 +124,7 @@ AcquireLockOnlyAtBootTime (
 **/\r
 VOID\r
 ReleaseLockOnlyAtBootTime (\r
-  IN EFI_LOCK                             *Lock\r
+  IN EFI_LOCK  *Lock\r
   )\r
 {\r
   if (!EfiAtRuntime ()) {\r
@@ -148,39 +161,55 @@ AtRuntime (
 **/\r
 EFI_STATUS\r
 InitVariableCache (\r
-  OUT    VARIABLE_STORE_HEADER   **VariableCacheBuffer,\r
-  IN OUT UINTN                   *TotalVariableCacheSize\r
+  OUT    VARIABLE_STORE_HEADER  **VariableCacheBuffer,\r
+  IN OUT UINTN                  *TotalVariableCacheSize\r
   )\r
 {\r
-  VARIABLE_STORE_HEADER   *VariableCacheStorePtr;\r
+  VARIABLE_STORE_HEADER  *VariableCacheStorePtr;\r
+  EFI_STATUS             Status;\r
 \r
   if (TotalVariableCacheSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+\r
   if (*TotalVariableCacheSize == 0) {\r
     return EFI_SUCCESS;\r
   }\r
-  if (VariableCacheBuffer == NULL || *TotalVariableCacheSize < sizeof (VARIABLE_STORE_HEADER)) {\r
+\r
+  if ((VariableCacheBuffer == NULL) || (*TotalVariableCacheSize < sizeof (VARIABLE_STORE_HEADER))) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+\r
   *TotalVariableCacheSize = ALIGN_VALUE (*TotalVariableCacheSize, sizeof (UINT32));\r
 \r
   //\r
   // Allocate NV Storage Cache and initialize it to all 1's (like an erased FV)\r
   //\r
-  *VariableCacheBuffer =  (VARIABLE_STORE_HEADER *) AllocateRuntimePages (\r
-                            EFI_SIZE_TO_PAGES (*TotalVariableCacheSize)\r
-                            );\r
+  *VariableCacheBuffer =  (VARIABLE_STORE_HEADER *)AllocateRuntimePages (\r
+                                                     EFI_SIZE_TO_PAGES (*TotalVariableCacheSize)\r
+                                                     );\r
   if (*VariableCacheBuffer == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+\r
+  //\r
+  // Request to unblock the newly allocated cache region to be accessible from inside MM\r
+  //\r
+  Status = MmUnblockMemoryRequest (\r
+             (EFI_PHYSICAL_ADDRESS)(UINTN)*VariableCacheBuffer,\r
+             EFI_SIZE_TO_PAGES (*TotalVariableCacheSize)\r
+             );\r
+  if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
   VariableCacheStorePtr = *VariableCacheBuffer;\r
-  SetMem32 ((VOID *) VariableCacheStorePtr, *TotalVariableCacheSize, (UINT32) 0xFFFFFFFF);\r
+  SetMem32 ((VOID *)VariableCacheStorePtr, *TotalVariableCacheSize, (UINT32)0xFFFFFFFF);\r
 \r
-  ZeroMem ((VOID *) VariableCacheStorePtr, sizeof (VARIABLE_STORE_HEADER));\r
-  VariableCacheStorePtr->Size    = (UINT32) *TotalVariableCacheSize;\r
-  VariableCacheStorePtr->Format  = VARIABLE_STORE_FORMATTED;\r
-  VariableCacheStorePtr->State   = VARIABLE_STORE_HEALTHY;\r
+  ZeroMem ((VOID *)VariableCacheStorePtr, sizeof (VARIABLE_STORE_HEADER));\r
+  VariableCacheStorePtr->Size   = (UINT32)*TotalVariableCacheSize;\r
+  VariableCacheStorePtr->Format = VARIABLE_STORE_FORMATTED;\r
+  VariableCacheStorePtr->State  = VARIABLE_STORE_HEALTHY;\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -204,24 +233,23 @@ InitVariableCache (
 **/\r
 EFI_STATUS\r
 InitCommunicateBuffer (\r
-  OUT     VOID                              **DataPtr OPTIONAL,\r
-  IN      UINTN                             DataSize,\r
-  IN      UINTN                             Function\r
+  OUT     VOID   **DataPtr OPTIONAL,\r
+  IN      UINTN  DataSize,\r
+  IN      UINTN  Function\r
   )\r
 {\r
-  EFI_SMM_COMMUNICATE_HEADER                *SmmCommunicateHeader;\r
-  SMM_VARIABLE_COMMUNICATE_HEADER           *SmmVariableFunctionHeader;\r
-\r
+  EFI_MM_COMMUNICATE_HEADER        *SmmCommunicateHeader;\r
+  SMM_VARIABLE_COMMUNICATE_HEADER  *SmmVariableFunctionHeader;\r
 \r
   if (DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE > mVariableBufferSize) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) mVariableBuffer;\r
+  SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer;\r
   CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
   SmmCommunicateHeader->MessageLength = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;\r
 \r
-  SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+  SmmVariableFunctionHeader           = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
   SmmVariableFunctionHeader->Function = Function;\r
   if (DataPtr != NULL) {\r
     *DataPtr = SmmVariableFunctionHeader->Data;\r
@@ -230,7 +258,6 @@ InitCommunicateBuffer (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Send the data in communicate buffer to SMM.\r
 \r
@@ -242,21 +269,26 @@ InitCommunicateBuffer (
 **/\r
 EFI_STATUS\r
 SendCommunicateBuffer (\r
-  IN      UINTN                             DataSize\r
+  IN      UINTN  DataSize\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  UINTN                                     CommSize;\r
-  EFI_SMM_COMMUNICATE_HEADER                *SmmCommunicateHeader;\r
-  SMM_VARIABLE_COMMUNICATE_HEADER           *SmmVariableFunctionHeader;\r
+  EFI_STATUS                       Status;\r
+  UINTN                            CommSize;\r
+  EFI_MM_COMMUNICATE_HEADER        *SmmCommunicateHeader;\r
+  SMM_VARIABLE_COMMUNICATE_HEADER  *SmmVariableFunctionHeader;\r
 \r
   CommSize = DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;\r
-  Status = mSmmCommunication->Communicate (mSmmCommunication, mVariableBufferPhysical, &CommSize);\r
+  Status   = mMmCommunication2->Communicate (\r
+                                  mMmCommunication2,\r
+                                  mVariableBufferPhysical,\r
+                                  mVariableBuffer,\r
+                                  &CommSize\r
+                                  );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  SmmCommunicateHeader      = (EFI_SMM_COMMUNICATE_HEADER *) mVariableBuffer;\r
+  SmmCommunicateHeader      = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer;\r
   SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
-  return  SmmVariableFunctionHeader->ReturnStatus;\r
+  return SmmVariableFunctionHeader->ReturnStatus;\r
 }\r
 \r
 /**\r
@@ -277,17 +309,17 @@ SendCommunicateBuffer (
 EFI_STATUS\r
 EFIAPI\r
 VariableLockRequestToLock (\r
-  IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This,\r
-  IN       CHAR16                       *VariableName,\r
-  IN       EFI_GUID                     *VendorGuid\r
+  IN CONST EDKII_VARIABLE_LOCK_PROTOCOL  *This,\r
+  IN       CHAR16                        *VariableName,\r
+  IN       EFI_GUID                      *VendorGuid\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  UINTN                                     VariableNameSize;\r
-  UINTN                                     PayloadSize;\r
-  SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE    *VariableToLock;\r
+  EFI_STATUS                              Status;\r
+  UINTN                                   VariableNameSize;\r
+  UINTN                                   PayloadSize;\r
+  SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE  *VariableToLock;\r
 \r
-  if (VariableName == NULL || VariableName[0] == 0 || VendorGuid == NULL) {\r
+  if ((VariableName == NULL) || (VariableName[0] == 0) || (VendorGuid == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -301,17 +333,18 @@ VariableLockRequestToLock (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+  AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
 \r
   //\r
   // Init the communicate buffer. The buffer data size is:\r
   // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
   //\r
   PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE, Name) + VariableNameSize;\r
-  Status = InitCommunicateBuffer ((VOID **) &VariableToLock, PayloadSize, SMM_VARIABLE_FUNCTION_LOCK_VARIABLE);\r
+  Status      = InitCommunicateBuffer ((VOID **)&VariableToLock, PayloadSize, SMM_VARIABLE_FUNCTION_LOCK_VARIABLE);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (VariableToLock != NULL);\r
 \r
   CopyGuid (&VariableToLock->Guid, VendorGuid);\r
@@ -345,7 +378,7 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 VarCheckRegisterSetVariableCheckHandler (\r
-  IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER   Handler\r
+  IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER  Handler\r
   )\r
 {\r
   return EFI_UNSUPPORTED;\r
@@ -369,17 +402,17 @@ VarCheckRegisterSetVariableCheckHandler (
 EFI_STATUS\r
 EFIAPI\r
 VarCheckVariablePropertySet (\r
-  IN CHAR16                         *Name,\r
-  IN EFI_GUID                       *Guid,\r
-  IN VAR_CHECK_VARIABLE_PROPERTY    *VariableProperty\r
+  IN CHAR16                       *Name,\r
+  IN EFI_GUID                     *Guid,\r
+  IN VAR_CHECK_VARIABLE_PROPERTY  *VariableProperty\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  UINTN                                     VariableNameSize;\r
-  UINTN                                     PayloadSize;\r
-  SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY *CommVariableProperty;\r
+  EFI_STATUS                                            Status;\r
+  UINTN                                                 VariableNameSize;\r
+  UINTN                                                 PayloadSize;\r
+  SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY  *CommVariableProperty;\r
 \r
-  if (Name == NULL || Name[0] == 0 || Guid == NULL) {\r
+  if ((Name == NULL) || (Name[0] == 0) || (Guid == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -391,7 +424,7 @@ VarCheckVariablePropertySet (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  VariableNameSize = StrSize (Name);\r
+  VariableNameSize     = StrSize (Name);\r
   CommVariableProperty = NULL;\r
 \r
   //\r
@@ -408,10 +441,11 @@ VarCheckVariablePropertySet (
   // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
   //\r
   PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) + VariableNameSize;\r
-  Status = InitCommunicateBuffer ((VOID **) &CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET);\r
+  Status      = InitCommunicateBuffer ((VOID **)&CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (CommVariableProperty != NULL);\r
 \r
   CopyGuid (&CommVariableProperty->Guid, Guid);\r
@@ -444,17 +478,17 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 VarCheckVariablePropertyGet (\r
-  IN CHAR16                         *Name,\r
-  IN EFI_GUID                       *Guid,\r
-  OUT VAR_CHECK_VARIABLE_PROPERTY   *VariableProperty\r
+  IN CHAR16                        *Name,\r
+  IN EFI_GUID                      *Guid,\r
+  OUT VAR_CHECK_VARIABLE_PROPERTY  *VariableProperty\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  UINTN                                     VariableNameSize;\r
-  UINTN                                     PayloadSize;\r
-  SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY *CommVariableProperty;\r
+  EFI_STATUS                                            Status;\r
+  UINTN                                                 VariableNameSize;\r
+  UINTN                                                 PayloadSize;\r
+  SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY  *CommVariableProperty;\r
 \r
-  if (Name == NULL || Name[0] == 0 || Guid == NULL) {\r
+  if ((Name == NULL) || (Name[0] == 0) || (Guid == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -462,7 +496,7 @@ VarCheckVariablePropertyGet (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  VariableNameSize = StrSize (Name);\r
+  VariableNameSize     = StrSize (Name);\r
   CommVariableProperty = NULL;\r
 \r
   //\r
@@ -479,10 +513,11 @@ VarCheckVariablePropertyGet (
   // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
   //\r
   PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) + VariableNameSize;\r
-  Status = InitCommunicateBuffer ((VOID **) &CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET);\r
+  Status      = InitCommunicateBuffer ((VOID **)&CommVariableProperty, PayloadSize, SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (CommVariableProperty != NULL);\r
 \r
   CopyGuid (&CommVariableProperty->Guid, Guid);\r
@@ -538,15 +573,17 @@ CheckForRuntimeCacheSync (
   if (mVariableRuntimeCachePendingUpdate) {\r
     SyncRuntimeCache ();\r
   }\r
+\r
   ASSERT (!mVariableRuntimeCachePendingUpdate);\r
 \r
   //\r
   // The HOB variable data may have finished being flushed in the runtime cache sync update\r
   //\r
-  if (mHobFlushComplete && mVariableRuntimeHobCacheBuffer != NULL) {\r
+  if (mHobFlushComplete && (mVariableRuntimeHobCacheBuffer != NULL)) {\r
     if (!EfiAtRuntime ()) {\r
       FreePages (mVariableRuntimeHobCacheBuffer, EFI_SIZE_TO_PAGES (mVariableRuntimeHobCacheBufferSize));\r
     }\r
+\r
     mVariableRuntimeHobCacheBuffer = NULL;\r
   }\r
 }\r
@@ -571,11 +608,11 @@ CheckForRuntimeCacheSync (
 **/\r
 EFI_STATUS\r
 FindVariableInRuntimeCache (\r
-  IN      CHAR16                            *VariableName,\r
-  IN      EFI_GUID                          *VendorGuid,\r
-  OUT     UINT32                            *Attributes OPTIONAL,\r
-  IN OUT  UINTN                             *DataSize,\r
-  OUT     VOID                              *Data OPTIONAL\r
+  IN      CHAR16    *VariableName,\r
+  IN      EFI_GUID  *VendorGuid,\r
+  OUT     UINT32    *Attributes OPTIONAL,\r
+  IN OUT  UINTN     *DataSize,\r
+  OUT     VOID      *Data OPTIONAL\r
   )\r
 {\r
   EFI_STATUS              Status;\r
@@ -586,10 +623,12 @@ FindVariableInRuntimeCache (
 \r
   Status = EFI_NOT_FOUND;\r
 \r
-  if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
+  if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  ZeroMem (&RtPtrTrack, sizeof (RtPtrTrack));\r
+\r
   //\r
   // The UEFI specification restricts Runtime Services callers from invoking the same or certain other Runtime Service\r
   // functions prior to completion and return from a previous Runtime Service call. These restrictions prevent\r
@@ -611,14 +650,14 @@ FindVariableInRuntimeCache (
     VariableStoreList[VariableStoreTypeHob]      = mVariableRuntimeHobCacheBuffer;\r
     VariableStoreList[VariableStoreTypeNv]       = mVariableRuntimeNvCacheBuffer;\r
 \r
-    for (StoreType = (VARIABLE_STORE_TYPE) 0; StoreType < VariableStoreTypeMax; StoreType++) {\r
+    for (StoreType = (VARIABLE_STORE_TYPE)0; StoreType < VariableStoreTypeMax; StoreType++) {\r
       if (VariableStoreList[StoreType] == NULL) {\r
         continue;\r
       }\r
 \r
       RtPtrTrack.StartPtr = GetStartPointer (VariableStoreList[StoreType]);\r
-      RtPtrTrack.EndPtr   = GetEndPointer   (VariableStoreList[StoreType]);\r
-      RtPtrTrack.Volatile = (BOOLEAN) (StoreType == VariableStoreTypeVolatile);\r
+      RtPtrTrack.EndPtr   = GetEndPointer (VariableStoreList[StoreType]);\r
+      RtPtrTrack.Volatile = (BOOLEAN)(StoreType == VariableStoreTypeVolatile);\r
 \r
       Status = FindVariableEx (VariableName, VendorGuid, FALSE, &RtPtrTrack, mVariableAuthFormat);\r
       if (!EFI_ERROR (Status)) {\r
@@ -640,10 +679,6 @@ FindVariableInRuntimeCache (
         }\r
 \r
         CopyMem (Data, GetVariableDataPtr (RtPtrTrack.CurrPtr, mVariableAuthFormat), TempDataSize);\r
-        if (Attributes != NULL) {\r
-          *Attributes = RtPtrTrack.CurrPtr->Attributes;\r
-        }\r
-\r
         *DataSize = TempDataSize;\r
 \r
         UpdateVariableInfo (VariableName, VendorGuid, RtPtrTrack.Volatile, TRUE, FALSE, FALSE, TRUE, &mVariableInfo);\r
@@ -652,13 +687,19 @@ FindVariableInRuntimeCache (
         goto Done;\r
       } else {\r
         *DataSize = TempDataSize;\r
-        Status = EFI_BUFFER_TOO_SMALL;\r
+        Status    = EFI_BUFFER_TOO_SMALL;\r
         goto Done;\r
       }\r
     }\r
   }\r
 \r
 Done:\r
+  if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) {\r
+    if ((Attributes != NULL) && (RtPtrTrack.CurrPtr != NULL)) {\r
+      *Attributes = RtPtrTrack.CurrPtr->Attributes;\r
+    }\r
+  }\r
+\r
   mVariableRuntimeCacheReadLock = FALSE;\r
 \r
   return Status;\r
@@ -684,11 +725,11 @@ Done:
 **/\r
 EFI_STATUS\r
 FindVariableInSmm (\r
-  IN      CHAR16                            *VariableName,\r
-  IN      EFI_GUID                          *VendorGuid,\r
-  OUT     UINT32                            *Attributes OPTIONAL,\r
-  IN OUT  UINTN                             *DataSize,\r
-  OUT     VOID                              *Data OPTIONAL\r
+  IN      CHAR16    *VariableName,\r
+  IN      EFI_GUID  *VendorGuid,\r
+  OUT     UINT32    *Attributes OPTIONAL,\r
+  IN OUT  UINTN     *DataSize,\r
+  OUT     VOID      *Data OPTIONAL\r
   )\r
 {\r
   EFI_STATUS                                Status;\r
@@ -697,13 +738,13 @@ FindVariableInSmm (
   UINTN                                     TempDataSize;\r
   UINTN                                     VariableNameSize;\r
 \r
-  if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
+  if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  TempDataSize          = *DataSize;\r
-  VariableNameSize      = StrSize (VariableName);\r
-  SmmVariableHeader     = NULL;\r
+  TempDataSize      = *DataSize;\r
+  VariableNameSize  = StrSize (VariableName);\r
+  SmmVariableHeader = NULL;\r
 \r
   //\r
   // If VariableName exceeds SMM payload limit. Return failure\r
@@ -722,22 +763,25 @@ FindVariableInSmm (
     //\r
     TempDataSize = mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) - VariableNameSize;\r
   }\r
+\r
   PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + VariableNameSize + TempDataSize;\r
 \r
-  Status = InitCommunicateBuffer ((VOID **) &SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_GET_VARIABLE);\r
+  Status = InitCommunicateBuffer ((VOID **)&SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_GET_VARIABLE);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (SmmVariableHeader != NULL);\r
 \r
   CopyGuid (&SmmVariableHeader->Guid, VendorGuid);\r
-  SmmVariableHeader->DataSize   = TempDataSize;\r
-  SmmVariableHeader->NameSize   = VariableNameSize;\r
+  SmmVariableHeader->DataSize = TempDataSize;\r
+  SmmVariableHeader->NameSize = VariableNameSize;\r
   if (Attributes == NULL) {\r
     SmmVariableHeader->Attributes = 0;\r
   } else {\r
     SmmVariableHeader->Attributes = *Attributes;\r
   }\r
+\r
   CopyMem (SmmVariableHeader->Name, VariableName, SmmVariableHeader->NameSize);\r
 \r
   //\r
@@ -748,13 +792,14 @@ FindVariableInSmm (
   //\r
   // Get data from SMM.\r
   //\r
-  if (Status == EFI_SUCCESS || Status == EFI_BUFFER_TOO_SMALL) {\r
+  if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) {\r
     //\r
     // SMM CommBuffer DataSize can be a trimed value\r
     // Only update DataSize when needed\r
     //\r
     *DataSize = SmmVariableHeader->DataSize;\r
   }\r
+\r
   if (Attributes != NULL) {\r
     *Attributes = SmmVariableHeader->Attributes;\r
   }\r
@@ -795,18 +840,19 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 RuntimeServiceGetVariable (\r
-  IN      CHAR16                            *VariableName,\r
-  IN      EFI_GUID                          *VendorGuid,\r
-  OUT     UINT32                            *Attributes OPTIONAL,\r
-  IN OUT  UINTN                             *DataSize,\r
-  OUT     VOID                              *Data\r
+  IN      CHAR16    *VariableName,\r
+  IN      EFI_GUID  *VendorGuid,\r
+  OUT     UINT32    *Attributes OPTIONAL,\r
+  IN OUT  UINTN     *DataSize,\r
+  OUT     VOID      *Data\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
+  EFI_STATUS  Status;\r
 \r
-  if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
+  if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+\r
   if (VariableName[0] == 0) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -817,6 +863,7 @@ RuntimeServiceGetVariable (
   } else {\r
     Status = FindVariableInSmm (VariableName, VendorGuid, Attributes, DataSize, Data);\r
   }\r
+\r
   ReleaseLockOnlyAtBootTime (&mVariableServicesLock);\r
 \r
   return Status;\r
@@ -837,15 +884,15 @@ RuntimeServiceGetVariable (
 **/\r
 EFI_STATUS\r
 GetNextVariableNameInRuntimeCache (\r
-  IN OUT  UINTN                             *VariableNameSize,\r
-  IN OUT  CHAR16                            *VariableName,\r
-  IN OUT  EFI_GUID                          *VendorGuid\r
+  IN OUT  UINTN     *VariableNameSize,\r
+  IN OUT  CHAR16    *VariableName,\r
+  IN OUT  EFI_GUID  *VendorGuid\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  UINTN                   VarNameSize;\r
-  VARIABLE_HEADER         *VariablePtr;\r
-  VARIABLE_STORE_HEADER   *VariableStoreHeader[VariableStoreTypeMax];\r
+  EFI_STATUS             Status;\r
+  UINTN                  VarNameSize;\r
+  VARIABLE_HEADER        *VariablePtr;\r
+  VARIABLE_STORE_HEADER  *VariableStoreHeader[VariableStoreTypeMax];\r
 \r
   Status = EFI_NOT_FOUND;\r
 \r
@@ -891,6 +938,7 @@ GetNextVariableNameInRuntimeCache (
       *VariableNameSize = VarNameSize;\r
     }\r
   }\r
+\r
   mVariableRuntimeCacheReadLock = FALSE;\r
 \r
   return Status;\r
@@ -911,19 +959,19 @@ GetNextVariableNameInRuntimeCache (
 **/\r
 EFI_STATUS\r
 GetNextVariableNameInSmm (\r
-  IN OUT  UINTN                             *VariableNameSize,\r
-  IN OUT  CHAR16                            *VariableName,\r
-  IN OUT  EFI_GUID                          *VendorGuid\r
+  IN OUT  UINTN     *VariableNameSize,\r
+  IN OUT  CHAR16    *VariableName,\r
+  IN OUT  EFI_GUID  *VendorGuid\r
   )\r
 {\r
-  EFI_STATUS                                      Status;\r
-  UINTN                                           PayloadSize;\r
-  SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME *SmmGetNextVariableName;\r
-  UINTN                                           OutVariableNameSize;\r
-  UINTN                                           InVariableNameSize;\r
-\r
-  OutVariableNameSize   = *VariableNameSize;\r
-  InVariableNameSize    = StrSize (VariableName);\r
+  EFI_STATUS                                       Status;\r
+  UINTN                                            PayloadSize;\r
+  SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME  *SmmGetNextVariableName;\r
+  UINTN                                            OutVariableNameSize;\r
+  UINTN                                            InVariableNameSize;\r
+\r
+  OutVariableNameSize    = *VariableNameSize;\r
+  InVariableNameSize     = StrSize (VariableName);\r
   SmmGetNextVariableName = NULL;\r
 \r
   //\r
@@ -943,6 +991,7 @@ GetNextVariableNameInSmm (
     //\r
     OutVariableNameSize = mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME, Name);\r
   }\r
+\r
   //\r
   // Payload should be Guid + NameSize + MAX of Input & Output buffer\r
   //\r
@@ -952,6 +1001,7 @@ GetNextVariableNameInSmm (
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (SmmGetNextVariableName != NULL);\r
 \r
   //\r
@@ -965,7 +1015,7 @@ GetNextVariableNameInSmm (
   //\r
   CopyMem (SmmGetNextVariableName->Name, VariableName, InVariableNameSize);\r
   if (OutVariableNameSize > InVariableNameSize) {\r
-    ZeroMem ((UINT8 *) SmmGetNextVariableName->Name + InVariableNameSize, OutVariableNameSize - InVariableNameSize);\r
+    ZeroMem ((UINT8 *)SmmGetNextVariableName->Name + InVariableNameSize, OutVariableNameSize - InVariableNameSize);\r
   }\r
 \r
   //\r
@@ -976,13 +1026,14 @@ GetNextVariableNameInSmm (
   //\r
   // Get data from SMM.\r
   //\r
-  if (Status == EFI_SUCCESS || Status == EFI_BUFFER_TOO_SMALL) {\r
+  if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) {\r
     //\r
     // SMM CommBuffer NameSize can be a trimed value\r
     // Only update VariableNameSize when needed\r
     //\r
     *VariableNameSize = SmmGetNextVariableName->NameSize;\r
   }\r
+\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
@@ -1010,17 +1061,17 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 RuntimeServiceGetNextVariableName (\r
-  IN OUT  UINTN                             *VariableNameSize,\r
-  IN OUT  CHAR16                            *VariableName,\r
-  IN OUT  EFI_GUID                          *VendorGuid\r
+  IN OUT  UINTN     *VariableNameSize,\r
+  IN OUT  CHAR16    *VariableName,\r
+  IN OUT  EFI_GUID  *VendorGuid\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  UINTN                   MaxLen;\r
+  EFI_STATUS  Status;\r
+  UINTN       MaxLen;\r
 \r
   Status = EFI_NOT_FOUND;\r
 \r
-  if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
+  if ((VariableNameSize == NULL) || (VariableName == NULL) || (VendorGuid == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1042,6 +1093,7 @@ RuntimeServiceGetNextVariableName (
   } else {\r
     Status = GetNextVariableNameInSmm (VariableNameSize, VariableName, VendorGuid);\r
   }\r
+\r
   ReleaseLockOnlyAtBootTime (&mVariableServicesLock);\r
 \r
   return Status;\r
@@ -1070,11 +1122,11 @@ RuntimeServiceGetNextVariableName (
 EFI_STATUS\r
 EFIAPI\r
 RuntimeServiceSetVariable (\r
-  IN CHAR16                                 *VariableName,\r
-  IN EFI_GUID                               *VendorGuid,\r
-  IN UINT32                                 Attributes,\r
-  IN UINTN                                  DataSize,\r
-  IN VOID                                   *Data\r
+  IN CHAR16    *VariableName,\r
+  IN EFI_GUID  *VendorGuid,\r
+  IN UINT32    Attributes,\r
+  IN UINTN     DataSize,\r
+  IN VOID      *Data\r
   )\r
 {\r
   EFI_STATUS                                Status;\r
@@ -1085,44 +1137,46 @@ RuntimeServiceSetVariable (
   //\r
   // Check input parameters.\r
   //\r
-  if (VariableName == NULL || VariableName[0] == 0 || VendorGuid == NULL) {\r
+  if ((VariableName == NULL) || (VariableName[0] == 0) || (VendorGuid == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (DataSize != 0 && Data == NULL) {\r
+  if ((DataSize != 0) && (Data == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  VariableNameSize      = StrSize (VariableName);\r
-  SmmVariableHeader     = NULL;\r
+  VariableNameSize  = StrSize (VariableName);\r
+  SmmVariableHeader = NULL;\r
 \r
   //\r
   // If VariableName or DataSize exceeds SMM payload limit. Return failure\r
   //\r
   if ((VariableNameSize > mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name)) ||\r
-      (DataSize > mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) - VariableNameSize)){\r
+      (DataSize > mVariableBufferPayloadSize - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) - VariableNameSize))\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+  AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
 \r
   //\r
   // Init the communicate buffer. The buffer data size is:\r
   // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize.\r
   //\r
   PayloadSize = OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + VariableNameSize + DataSize;\r
-  Status = InitCommunicateBuffer ((VOID **)&SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_SET_VARIABLE);\r
+  Status      = InitCommunicateBuffer ((VOID **)&SmmVariableHeader, PayloadSize, SMM_VARIABLE_FUNCTION_SET_VARIABLE);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (SmmVariableHeader != NULL);\r
 \r
-  CopyGuid ((EFI_GUID *) &SmmVariableHeader->Guid, VendorGuid);\r
+  CopyGuid ((EFI_GUID *)&SmmVariableHeader->Guid, VendorGuid);\r
   SmmVariableHeader->DataSize   = DataSize;\r
   SmmVariableHeader->NameSize   = VariableNameSize;\r
   SmmVariableHeader->Attributes = Attributes;\r
   CopyMem (SmmVariableHeader->Name, VariableName, SmmVariableHeader->NameSize);\r
-  CopyMem ((UINT8 *) SmmVariableHeader->Name + SmmVariableHeader->NameSize, Data, DataSize);\r
+  CopyMem ((UINT8 *)SmmVariableHeader->Name + SmmVariableHeader->NameSize, Data, DataSize);\r
 \r
   //\r
   // Send data to SMM.\r
@@ -1140,10 +1194,10 @@ Done:
         );\r
     }\r
   }\r
+\r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   This code returns information about the EFI variables.\r
 \r
@@ -1164,36 +1218,37 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 RuntimeServiceQueryVariableInfo (\r
-  IN  UINT32                                Attributes,\r
-  OUT UINT64                                *MaximumVariableStorageSize,\r
-  OUT UINT64                                *RemainingVariableStorageSize,\r
-  OUT UINT64                                *MaximumVariableSize\r
+  IN  UINT32  Attributes,\r
+  OUT UINT64  *MaximumVariableStorageSize,\r
+  OUT UINT64  *RemainingVariableStorageSize,\r
+  OUT UINT64  *MaximumVariableSize\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  UINTN                                     PayloadSize;\r
-  SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO *SmmQueryVariableInfo;\r
+  EFI_STATUS                                    Status;\r
+  UINTN                                         PayloadSize;\r
+  SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO  *SmmQueryVariableInfo;\r
 \r
   SmmQueryVariableInfo = NULL;\r
 \r
-  if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {\r
+  if ((MaximumVariableStorageSize == NULL) || (RemainingVariableStorageSize == NULL) || (MaximumVariableSize == NULL) || (Attributes == 0)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+  AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
 \r
   //\r
   // Init the communicate buffer. The buffer data size is:\r
   // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize;\r
   //\r
   PayloadSize = sizeof (SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO);\r
-  Status = InitCommunicateBuffer ((VOID **)&SmmQueryVariableInfo, PayloadSize, SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO);\r
+  Status      = InitCommunicateBuffer ((VOID **)&SmmQueryVariableInfo, PayloadSize, SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
+\r
   ASSERT (SmmQueryVariableInfo != NULL);\r
 \r
-  SmmQueryVariableInfo->Attributes  = Attributes;\r
+  SmmQueryVariableInfo->Attributes = Attributes;\r
 \r
   //\r
   // Send data to SMM.\r
@@ -1215,7 +1270,6 @@ Done:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Exit Boot Services Event notification handler.\r
 \r
@@ -1228,8 +1282,8 @@ Done:
 VOID\r
 EFIAPI\r
 OnExitBootServices (\r
-  IN      EFI_EVENT                         Event,\r
-  IN      VOID                              *Context\r
+  IN      EFI_EVENT  Event,\r
+  IN      VOID       *Context\r
   )\r
 {\r
   //\r
@@ -1244,7 +1298,6 @@ OnExitBootServices (
   SendCommunicateBuffer (0);\r
 }\r
 \r
-\r
 /**\r
   On Ready To Boot Services Event notification handler.\r
 \r
@@ -1257,8 +1310,8 @@ OnExitBootServices (
 VOID\r
 EFIAPI\r
 OnReadyToBoot (\r
-  IN      EFI_EVENT                         Event,\r
-  IN      VOID                              *Context\r
+  IN      EFI_EVENT  Event,\r
+  IN      VOID       *Context\r
   )\r
 {\r
   //\r
@@ -1286,7 +1339,6 @@ OnReadyToBoot (
   gBS->CloseEvent (Event);\r
 }\r
 \r
-\r
 /**\r
   Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
 \r
@@ -1300,15 +1352,15 @@ OnReadyToBoot (
 VOID\r
 EFIAPI\r
 VariableAddressChangeEvent (\r
-  IN EFI_EVENT                              Event,\r
-  IN VOID                                   *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  EfiConvertPointer (0x0, (VOID **) &mVariableBuffer);\r
-  EfiConvertPointer (0x0, (VOID **) &mSmmCommunication);\r
-  EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **) &mVariableRuntimeHobCacheBuffer);\r
-  EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **) &mVariableRuntimeNvCacheBuffer);\r
-  EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **) &mVariableRuntimeVolatileCacheBuffer);\r
+  EfiConvertPointer (0x0, (VOID **)&mVariableBuffer);\r
+  EfiConvertPointer (0x0, (VOID **)&mMmCommunication2);\r
+  EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRuntimeHobCacheBuffer);\r
+  EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRuntimeNvCacheBuffer);\r
+  EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRuntimeVolatileCacheBuffer);\r
 }\r
 \r
 /**\r
@@ -1323,48 +1375,48 @@ VariableAddressChangeEvent (
 EFI_STATUS\r
 EFIAPI\r
 GetVariablePayloadSize (\r
-  OUT UINTN                         *VariablePayloadSize\r
+  OUT UINTN  *VariablePayloadSize\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *SmmGetPayloadSize;\r
-  EFI_SMM_COMMUNICATE_HEADER                *SmmCommunicateHeader;\r
-  SMM_VARIABLE_COMMUNICATE_HEADER           *SmmVariableFunctionHeader;\r
-  UINTN                                     CommSize;\r
-  UINT8                                     *CommBuffer;\r
+  EFI_STATUS                                 Status;\r
+  SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE  *SmmGetPayloadSize;\r
+  EFI_MM_COMMUNICATE_HEADER                  *SmmCommunicateHeader;\r
+  SMM_VARIABLE_COMMUNICATE_HEADER            *SmmVariableFunctionHeader;\r
+  UINTN                                      CommSize;\r
+  UINT8                                      *CommBuffer;\r
 \r
   SmmGetPayloadSize = NULL;\r
-  CommBuffer = NULL;\r
+  CommBuffer        = NULL;\r
 \r
-  if(VariablePayloadSize == NULL) {\r
+  if (VariablePayloadSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AcquireLockOnlyAtBootTime(&mVariableServicesLock);\r
+  AcquireLockOnlyAtBootTime (&mVariableServicesLock);\r
 \r
   //\r
   // Init the communicate buffer. The buffer data size is:\r
   // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
   //\r
-  CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
+  CommSize   = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
   CommBuffer = AllocateZeroPool (CommSize);\r
   if (CommBuffer == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
-  SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+  SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer;\r
   CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
   SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE);\r
 \r
-  SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+  SmmVariableFunctionHeader           = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
   SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE;\r
-  SmmGetPayloadSize = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *) SmmVariableFunctionHeader->Data;\r
+  SmmGetPayloadSize                   = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *)SmmVariableFunctionHeader->Data;\r
 \r
   //\r
   // Send data to SMM.\r
   //\r
-  Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+  Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = SmmVariableFunctionHeader->ReturnStatus;\r
@@ -1381,6 +1433,7 @@ Done:
   if (CommBuffer != NULL) {\r
     FreePool (CommBuffer);\r
   }\r
+\r
   ReleaseLockOnlyAtBootTime (&mVariableServicesLock);\r
   return Status;\r
 }\r
@@ -1401,23 +1454,23 @@ Done:
 **/\r
 EFI_STATUS\r
 GetRuntimeCacheInfo (\r
-  OUT UINTN                         *TotalHobStorageSize,\r
-  OUT UINTN                         *TotalNvStorageSize,\r
-  OUT UINTN                         *TotalVolatileStorageSize,\r
-  OUT BOOLEAN                       *AuthenticatedVariableUsage\r
+  OUT UINTN    *TotalHobStorageSize,\r
+  OUT UINTN    *TotalNvStorageSize,\r
+  OUT UINTN    *TotalVolatileStorageSize,\r
+  OUT BOOLEAN  *AuthenticatedVariableUsage\r
   )\r
 {\r
-  EFI_STATUS                                          Status;\r
-  SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO     *SmmGetRuntimeCacheInfo;\r
-  EFI_SMM_COMMUNICATE_HEADER                          *SmmCommunicateHeader;\r
-  SMM_VARIABLE_COMMUNICATE_HEADER                     *SmmVariableFunctionHeader;\r
-  UINTN                                               CommSize;\r
-  UINT8                                               *CommBuffer;\r
+  EFI_STATUS                                       Status;\r
+  SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO  *SmmGetRuntimeCacheInfo;\r
+  EFI_MM_COMMUNICATE_HEADER                        *SmmCommunicateHeader;\r
+  SMM_VARIABLE_COMMUNICATE_HEADER                  *SmmVariableFunctionHeader;\r
+  UINTN                                            CommSize;\r
+  UINT8                                            *CommBuffer;\r
 \r
   SmmGetRuntimeCacheInfo = NULL;\r
-  CommBuffer = mVariableBuffer;\r
+  CommBuffer             = mVariableBuffer;\r
 \r
-  if (TotalHobStorageSize == NULL || TotalNvStorageSize == NULL || TotalVolatileStorageSize == NULL || AuthenticatedVariableUsage == NULL) {\r
+  if ((TotalHobStorageSize == NULL) || (TotalNvStorageSize == NULL) || (TotalVolatileStorageSize == NULL) || (AuthenticatedVariableUsage == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1430,18 +1483,18 @@ GetRuntimeCacheInfo (
   CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO);\r
   ZeroMem (CommBuffer, CommSize);\r
 \r
-  SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+  SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer;\r
   CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
   SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO);\r
 \r
-  SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+  SmmVariableFunctionHeader           = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
   SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO;\r
-  SmmGetRuntimeCacheInfo = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *) SmmVariableFunctionHeader->Data;\r
+  SmmGetRuntimeCacheInfo              = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *)SmmVariableFunctionHeader->Data;\r
 \r
   //\r
   // Send data to SMM.\r
   //\r
-  Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+  Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize);\r
   ASSERT_EFI_ERROR (Status);\r
   if (CommSize <= SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) {\r
     Status = EFI_BAD_BUFFER_SIZE;\r
@@ -1456,9 +1509,9 @@ GetRuntimeCacheInfo (
   //\r
   // Get data from SMM.\r
   //\r
-  *TotalHobStorageSize = SmmGetRuntimeCacheInfo->TotalHobStorageSize;\r
-  *TotalNvStorageSize = SmmGetRuntimeCacheInfo->TotalNvStorageSize;\r
-  *TotalVolatileStorageSize = SmmGetRuntimeCacheInfo->TotalVolatileStorageSize;\r
+  *TotalHobStorageSize        = SmmGetRuntimeCacheInfo->TotalHobStorageSize;\r
+  *TotalNvStorageSize         = SmmGetRuntimeCacheInfo->TotalNvStorageSize;\r
+  *TotalVolatileStorageSize   = SmmGetRuntimeCacheInfo->TotalVolatileStorageSize;\r
   *AuthenticatedVariableUsage = SmmGetRuntimeCacheInfo->AuthenticatedVariableUsage;\r
 \r
 Done:\r
@@ -1480,15 +1533,15 @@ SendRuntimeVariableCacheContextToSmm (
   VOID\r
   )\r
 {\r
-  EFI_STATUS                                                Status;\r
-  SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT   *SmmRuntimeVarCacheContext;\r
-  EFI_SMM_COMMUNICATE_HEADER                                *SmmCommunicateHeader;\r
-  SMM_VARIABLE_COMMUNICATE_HEADER                           *SmmVariableFunctionHeader;\r
-  UINTN                                                     CommSize;\r
-  UINT8                                                     *CommBuffer;\r
+  EFI_STATUS                                               Status;\r
+  SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT  *SmmRuntimeVarCacheContext;\r
+  EFI_MM_COMMUNICATE_HEADER                                *SmmCommunicateHeader;\r
+  SMM_VARIABLE_COMMUNICATE_HEADER                          *SmmVariableFunctionHeader;\r
+  UINTN                                                    CommSize;\r
+  UINT8                                                    *CommBuffer;\r
 \r
   SmmRuntimeVarCacheContext = NULL;\r
-  CommBuffer = mVariableBuffer;\r
+  CommBuffer                = mVariableBuffer;\r
 \r
   if (CommBuffer == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -1503,25 +1556,53 @@ SendRuntimeVariableCacheContextToSmm (
   CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT);\r
   ZeroMem (CommBuffer, CommSize);\r
 \r
-  SmmCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+  SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer;\r
   CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);\r
   SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT);\r
 \r
-  SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) SmmCommunicateHeader->Data;\r
+  SmmVariableFunctionHeader           = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data;\r
   SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT;\r
-  SmmRuntimeVarCacheContext = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *) SmmVariableFunctionHeader->Data;\r
+  SmmRuntimeVarCacheContext           = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *)SmmVariableFunctionHeader->Data;\r
 \r
-  SmmRuntimeVarCacheContext->RuntimeHobCache = mVariableRuntimeHobCacheBuffer;\r
+  SmmRuntimeVarCacheContext->RuntimeHobCache      = mVariableRuntimeHobCacheBuffer;\r
   SmmRuntimeVarCacheContext->RuntimeVolatileCache = mVariableRuntimeVolatileCacheBuffer;\r
-  SmmRuntimeVarCacheContext->RuntimeNvCache = mVariableRuntimeNvCacheBuffer;\r
-  SmmRuntimeVarCacheContext->PendingUpdate = &mVariableRuntimeCachePendingUpdate;\r
-  SmmRuntimeVarCacheContext->ReadLock = &mVariableRuntimeCacheReadLock;\r
-  SmmRuntimeVarCacheContext->HobFlushComplete = &mHobFlushComplete;\r
+  SmmRuntimeVarCacheContext->RuntimeNvCache       = mVariableRuntimeNvCacheBuffer;\r
+  SmmRuntimeVarCacheContext->PendingUpdate        = &mVariableRuntimeCachePendingUpdate;\r
+  SmmRuntimeVarCacheContext->ReadLock             = &mVariableRuntimeCacheReadLock;\r
+  SmmRuntimeVarCacheContext->HobFlushComplete     = &mHobFlushComplete;\r
+\r
+  //\r
+  // Request to unblock this region to be accessible from inside MM environment\r
+  // These fields "should" be all on the same page, but just to be on the safe side...\r
+  //\r
+  Status = MmUnblockMemoryRequest (\r
+             (EFI_PHYSICAL_ADDRESS)ALIGN_VALUE ((UINTN)SmmRuntimeVarCacheContext->PendingUpdate - EFI_PAGE_SIZE + 1, EFI_PAGE_SIZE),\r
+             EFI_SIZE_TO_PAGES (sizeof (mVariableRuntimeCachePendingUpdate))\r
+             );\r
+  if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  Status = MmUnblockMemoryRequest (\r
+             (EFI_PHYSICAL_ADDRESS)ALIGN_VALUE ((UINTN)SmmRuntimeVarCacheContext->ReadLock - EFI_PAGE_SIZE + 1, EFI_PAGE_SIZE),\r
+             EFI_SIZE_TO_PAGES (sizeof (mVariableRuntimeCacheReadLock))\r
+             );\r
+  if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  Status = MmUnblockMemoryRequest (\r
+             (EFI_PHYSICAL_ADDRESS)ALIGN_VALUE ((UINTN)SmmRuntimeVarCacheContext->HobFlushComplete - EFI_PAGE_SIZE + 1, EFI_PAGE_SIZE),\r
+             EFI_SIZE_TO_PAGES (sizeof (mHobFlushComplete))\r
+             );\r
+  if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
 \r
   //\r
   // Send data to SMM.\r
   //\r
-  Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+  Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize);\r
   ASSERT_EFI_ERROR (Status);\r
   if (CommSize <= SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) {\r
     Status = EFI_BAD_BUFFER_SIZE;\r
@@ -1548,18 +1629,18 @@ Done:
 VOID\r
 EFIAPI\r
 SmmVariableReady (\r
-  IN  EFI_EVENT                             Event,\r
-  IN  VOID                                  *Context\r
+  IN  EFI_EVENT  Event,\r
+  IN  VOID       *Context\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
+  EFI_STATUS  Status;\r
 \r
-  Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &mSmmVariable);\r
+  Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)&mSmmVariable);\r
   if (EFI_ERROR (Status)) {\r
     return;\r
   }\r
 \r
-  Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
+  Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
@@ -1567,8 +1648,8 @@ SmmVariableReady (
   //\r
   Status = GetVariablePayloadSize (&mVariableBufferPayloadSize);\r
   ASSERT_EFI_ERROR (Status);\r
-  mVariableBufferSize  = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + mVariableBufferPayloadSize;\r
-  mVariableBuffer      = AllocateRuntimePool (mVariableBufferSize);\r
+  mVariableBufferSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + mVariableBufferPayloadSize;\r
+  mVariableBuffer     = AllocateRuntimePool (mVariableBufferSize);\r
   ASSERT (mVariableBuffer != NULL);\r
 \r
   //\r
@@ -1601,12 +1682,14 @@ SmmVariableReady (
           }\r
         }\r
       }\r
+\r
       if (EFI_ERROR (Status)) {\r
-        mVariableRuntimeHobCacheBuffer = NULL;\r
-        mVariableRuntimeNvCacheBuffer = NULL;\r
+        mVariableRuntimeHobCacheBuffer      = NULL;\r
+        mVariableRuntimeNvCacheBuffer       = NULL;\r
         mVariableRuntimeVolatileCacheBuffer = NULL;\r
       }\r
     }\r
+\r
     ASSERT_EFI_ERROR (Status);\r
   } else {\r
     DEBUG ((DEBUG_INFO, "Variable driver runtime cache is disabled.\n"));\r
@@ -1629,29 +1712,28 @@ SmmVariableReady (
   ASSERT_EFI_ERROR (Status);\r
 \r
   mVariableLock.RequestToLock = VariableLockRequestToLock;\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &mHandle,\r
-                  &gEdkiiVariableLockProtocolGuid,\r
-                  &mVariableLock,\r
-                  NULL\r
-                  );\r
+  Status                      = gBS->InstallMultipleProtocolInterfaces (\r
+                                       &mHandle,\r
+                                       &gEdkiiVariableLockProtocolGuid,\r
+                                       &mVariableLock,\r
+                                       NULL\r
+                                       );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   mVarCheck.RegisterSetVariableCheckHandler = VarCheckRegisterSetVariableCheckHandler;\r
-  mVarCheck.VariablePropertySet = VarCheckVariablePropertySet;\r
-  mVarCheck.VariablePropertyGet = VarCheckVariablePropertyGet;\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &mHandle,\r
-                  &gEdkiiVarCheckProtocolGuid,\r
-                  &mVarCheck,\r
-                  NULL\r
-                  );\r
+  mVarCheck.VariablePropertySet             = VarCheckVariablePropertySet;\r
+  mVarCheck.VariablePropertyGet             = VarCheckVariablePropertyGet;\r
+  Status                                    = gBS->InstallMultipleProtocolInterfaces (\r
+                                                     &mHandle,\r
+                                                     &gEdkiiVarCheckProtocolGuid,\r
+                                                     &mVarCheck,\r
+                                                     NULL\r
+                                                     );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   gBS->CloseEvent (Event);\r
 }\r
 \r
-\r
 /**\r
   SMM Non-Volatile variable write service is ready notify event handler.\r
 \r
@@ -1662,17 +1744,17 @@ SmmVariableReady (
 VOID\r
 EFIAPI\r
 SmmVariableWriteReady (\r
-  IN  EFI_EVENT                             Event,\r
-  IN  VOID                                  *Context\r
+  IN  EFI_EVENT  Event,\r
+  IN  VOID       *Context\r
   )\r
 {\r
-  EFI_STATUS                                Status;\r
-  VOID                                      *ProtocolOps;\r
+  EFI_STATUS  Status;\r
+  VOID        *ProtocolOps;\r
 \r
   //\r
   // Check whether the protocol is installed or not.\r
   //\r
-  Status = gBS->LocateProtocol (&gSmmVariableWriteGuid, NULL, (VOID **) &ProtocolOps);\r
+  Status = gBS->LocateProtocol (&gSmmVariableWriteGuid, NULL, (VOID **)&ProtocolOps);\r
   if (EFI_ERROR (Status)) {\r
     return;\r
   }\r
@@ -1681,7 +1763,7 @@ SmmVariableWriteReady (
   // Some Secure Boot Policy Var (SecureBoot, etc) updates following other\r
   // Secure Boot Policy Variable change.  Record their initial value.\r
   //\r
-  RecordSecureBootPolicyVarData();\r
+  RecordSecureBootPolicyVarData ();\r
 \r
   Status = gBS->InstallProtocolInterface (\r
                   &mHandle,\r
@@ -1694,7 +1776,6 @@ SmmVariableWriteReady (
   gBS->CloseEvent (Event);\r
 }\r
 \r
-\r
 /**\r
   Variable Driver main entry point. The Variable driver places the 4 EFI\r
   runtime services in the EFI System Table and installs arch protocols\r
@@ -1710,15 +1791,15 @@ SmmVariableWriteReady (
 EFI_STATUS\r
 EFIAPI\r
 VariableSmmRuntimeInitialize (\r
-  IN EFI_HANDLE                             ImageHandle,\r
-  IN EFI_SYSTEM_TABLE                       *SystemTable\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  VOID                                      *SmmVariableRegistration;\r
-  VOID                                      *SmmVariableWriteRegistration;\r
-  EFI_EVENT                                 OnReadyToBootEvent;\r
-  EFI_EVENT                                 ExitBootServiceEvent;\r
-  EFI_EVENT                                 LegacyBootEvent;\r
+  VOID       *SmmVariableRegistration;\r
+  VOID       *SmmVariableWriteRegistration;\r
+  EFI_EVENT  OnReadyToBootEvent;\r
+  EFI_EVENT  ExitBootServiceEvent;\r
+  EFI_EVENT  LegacyBootEvent;\r
 \r
   EfiInitializeLock (&mVariableServicesLock, TPL_NOTIFY);\r
 \r
@@ -1770,7 +1851,7 @@ VariableSmmRuntimeInitialize (
   // Register the event to inform SMM variable that it is at runtime for legacy boot.\r
   // Reuse OnExitBootServices() here.\r
   //\r
-  EfiCreateEventLegacyBootEx(\r
+  EfiCreateEventLegacyBootEx (\r
     TPL_NOTIFY,\r
     OnExitBootServices,\r
     NULL,\r
@@ -1789,6 +1870,8 @@ VariableSmmRuntimeInitialize (
          &mVirtualAddressChangeEvent\r
          );\r
 \r
+  // Initialize the VariablePolicy protocol and engine.\r
+  VariablePolicySmmDxeMain (ImageHandle, SystemTable);\r
+\r
   return EFI_SUCCESS;\r
 }\r
-\r