]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
MdeModulePkg Variable: Return GetVariable() attr if EFI_BUFFER_TOO_SMALL
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / Variable.c
index 5cc12c2ae083dd6c6477aa0371ad9c569dcbd6a4..1e71fc642c763571a493ca0cd28e73f6ed5c6186 100644 (file)
   VariableServiceSetVariable() should also check authenticate data to avoid buffer overflow,\r
   integer overflow. It should also check attribute to avoid authentication bypass.\r
 \r
-Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>\r
 (C) Copyright 2015-2018 Hewlett Packard Enterprise Development LP<BR>\r
+Copyright (c) Microsoft Corporation.<BR>\r
+\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "Variable.h"\r
+#include "VariableNonVolatile.h"\r
 #include "VariableParsing.h"\r
+#include "VariableRuntimeCache.h"\r
 \r
 VARIABLE_MODULE_GLOBAL  *mVariableModuleGlobal;\r
 \r
@@ -311,7 +315,7 @@ RecordVarErrorFlag (
              FALSE\r
              );\r
   if (!EFI_ERROR (Status)) {\r
-    VarErrFlag = (VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr);\r
+    VarErrFlag = (VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     TempFlag = *VarErrFlag;\r
     TempFlag &= Flag;\r
     if (TempFlag == *VarErrFlag) {\r
@@ -331,6 +335,12 @@ RecordVarErrorFlag (
       // Update the data in NV cache.\r
       //\r
       *VarErrFlag = TempFlag;\r
+      Status =  SynchronizeRuntimeVariableCache (\r
+                  &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache,\r
+                  0,\r
+                  mNvVariableCache->Size\r
+                  );\r
+      ASSERT_EFI_ERROR (Status);\r
     }\r
   }\r
 }\r
@@ -369,7 +379,7 @@ InitializeVarErrorFlag (
              FALSE\r
              );\r
   if (!EFI_ERROR (Status)) {\r
-    VarErrFlag = *((VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr));\r
+    VarErrFlag = *((VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat));\r
     if (VarErrFlag == Flag) {\r
       return;\r
     }\r
@@ -410,7 +420,11 @@ IsUserVariable (
   // then no need to check if the variable is user variable or not specially.\r
   //\r
   if (mEndOfDxe && (mVariableModuleGlobal->CommonMaxUserVariableSpace != mVariableModuleGlobal->CommonVariableSpace)) {\r
-    if (VarCheckLibVariablePropertyGet (GetVariableNamePtr (Variable), GetVendorGuidPtr (Variable), &Property) == EFI_NOT_FOUND) {\r
+    if (VarCheckLibVariablePropertyGet (\r
+          GetVariableNamePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+          GetVendorGuidPtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+          &Property\r
+          ) == EFI_NOT_FOUND) {\r
       return TRUE;\r
     }\r
   }\r
@@ -439,10 +453,14 @@ CalculateCommonUserVariableTotalSize (
   if (mEndOfDxe && (mVariableModuleGlobal->CommonMaxUserVariableSpace != mVariableModuleGlobal->CommonVariableSpace)) {\r
     Variable = GetStartPointer (mNvVariableCache);\r
     while (IsValidVariableHeader (Variable, GetEndPointer (mNvVariableCache))) {\r
-      NextVariable = GetNextVariablePtr (Variable);\r
+      NextVariable = GetNextVariablePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
       VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
       if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
-        if (VarCheckLibVariablePropertyGet (GetVariableNamePtr (Variable), GetVendorGuidPtr (Variable), &Property) == EFI_NOT_FOUND) {\r
+        if (VarCheckLibVariablePropertyGet (\r
+              GetVariableNamePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+              GetVendorGuidPtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+              &Property\r
+              ) == EFI_NOT_FOUND) {\r
           //\r
           // No property, it is user variable.\r
           //\r
@@ -518,7 +536,9 @@ Reclaim (
   UINTN                 HwErrVariableTotalSize;\r
   VARIABLE_HEADER       *UpdatingVariable;\r
   VARIABLE_HEADER       *UpdatingInDeletedTransition;\r
+  BOOLEAN               AuthFormat;\r
 \r
+  AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
   UpdatingVariable = NULL;\r
   UpdatingInDeletedTransition = NULL;\r
   if (UpdatingPtrTrack != NULL) {\r
@@ -540,7 +560,7 @@ Reclaim (
     MaximumBufferSize = sizeof (VARIABLE_STORE_HEADER);\r
 \r
     while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
-      NextVariable = GetNextVariablePtr (Variable);\r
+      NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
       if ((Variable->State == VAR_ADDED || Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) &&\r
           Variable != UpdatingVariable &&\r
           Variable != UpdatingInDeletedTransition\r
@@ -590,7 +610,7 @@ Reclaim (
   //\r
   Variable = GetStartPointer (VariableStoreHeader);\r
   while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
-    NextVariable = GetNextVariablePtr (Variable);\r
+    NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
     if (Variable != UpdatingVariable && Variable->State == VAR_ADDED) {\r
       VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
       CopyMem (CurrPtr, (UINT8 *) Variable, VariableSize);\r
@@ -612,7 +632,7 @@ Reclaim (
   //\r
   Variable = GetStartPointer (VariableStoreHeader);\r
   while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
-    NextVariable = GetNextVariablePtr (Variable);\r
+    NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
     if (Variable != UpdatingVariable && Variable != UpdatingInDeletedTransition && Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
 \r
       //\r
@@ -624,13 +644,14 @@ Reclaim (
       FoundAdded = FALSE;\r
       AddedVariable = GetStartPointer ((VARIABLE_STORE_HEADER *) ValidBuffer);\r
       while (IsValidVariableHeader (AddedVariable, GetEndPointer ((VARIABLE_STORE_HEADER *) ValidBuffer))) {\r
-        NextAddedVariable = GetNextVariablePtr (AddedVariable);\r
-        NameSize = NameSizeOfVariable (AddedVariable);\r
-        if (CompareGuid (GetVendorGuidPtr (AddedVariable), GetVendorGuidPtr (Variable)) &&\r
-            NameSize == NameSizeOfVariable (Variable)\r
-           ) {\r
-          Point0 = (VOID *) GetVariableNamePtr (AddedVariable);\r
-          Point1 = (VOID *) GetVariableNamePtr (Variable);\r
+        NextAddedVariable = GetNextVariablePtr (AddedVariable, AuthFormat);\r
+        NameSize = NameSizeOfVariable (AddedVariable, AuthFormat);\r
+        if (CompareGuid (\r
+              GetVendorGuidPtr (AddedVariable, AuthFormat),\r
+              GetVendorGuidPtr (Variable, AuthFormat)\r
+            ) && NameSize == NameSizeOfVariable (Variable, AuthFormat)) {\r
+          Point0 = (VOID *) GetVariableNamePtr (AddedVariable, AuthFormat);\r
+          Point1 = (VOID *) GetVariableNamePtr (Variable, AuthFormat);\r
           if (CompareMem (Point0, Point1, NameSize) == 0) {\r
             FoundAdded = TRUE;\r
             break;\r
@@ -735,7 +756,7 @@ Reclaim (
       mVariableModuleGlobal->CommonUserVariableTotalSize = 0;\r
       Variable = GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase);\r
       while (IsValidVariableHeader (Variable, GetEndPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase))) {\r
-        NextVariable = GetNextVariablePtr (Variable);\r
+        NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
         VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
         if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
           mVariableModuleGlobal->HwErrVariableTotalSize += VariableSize;\r
@@ -754,12 +775,24 @@ Reclaim (
 \r
 Done:\r
   if (IsVolatile || mVariableModuleGlobal->VariableGlobal.EmuNvMode) {\r
+    Status =  SynchronizeRuntimeVariableCache (\r
+                &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache,\r
+                0,\r
+                VariableStoreHeader->Size\r
+                );\r
+    ASSERT_EFI_ERROR (Status);\r
     FreePool (ValidBuffer);\r
   } else {\r
     //\r
     // For NV variable reclaim, we use mNvVariableCache as the buffer, so copy the data back.\r
     //\r
-    CopyMem (mNvVariableCache, (UINT8 *)(UINTN)VariableBase, VariableStoreHeader->Size);\r
+    CopyMem (mNvVariableCache, (UINT8 *) (UINTN) VariableBase, VariableStoreHeader->Size);\r
+    Status =  SynchronizeRuntimeVariableCache (\r
+                &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache,\r
+                0,\r
+                VariableStoreHeader->Size\r
+                );\r
+    ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
   return Status;\r
@@ -829,7 +862,13 @@ FindVariable (
     PtrTrack->EndPtr   = GetEndPointer   (VariableStoreHeader[Type]);\r
     PtrTrack->Volatile = (BOOLEAN) (Type == VariableStoreTypeVolatile);\r
 \r
-    Status = FindVariableEx (VariableName, VendorGuid, IgnoreRtCheck, PtrTrack);\r
+    Status =  FindVariableEx (\r
+                VariableName,\r
+                VendorGuid,\r
+                IgnoreRtCheck,\r
+                PtrTrack,\r
+                mVariableModuleGlobal->VariableGlobal.AuthFormat\r
+                );\r
     if (!EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -1199,7 +1238,11 @@ CheckRemainingSpaceForConsistencyInternal (
     VarNameSize += GET_PAD_SIZE (VarNameSize);\r
     VarDataSize  = VariableEntry->VariableSize;\r
     VarDataSize += GET_PAD_SIZE (VarDataSize);\r
-    VariableEntry->VariableSize = HEADER_ALIGN (GetVariableHeaderSize () + VarNameSize + VarDataSize);\r
+    VariableEntry->VariableSize = HEADER_ALIGN (\r
+                                    GetVariableHeaderSize (\r
+                                      mVariableModuleGlobal->VariableGlobal.AuthFormat\r
+                                      ) + VarNameSize + VarDataSize\r
+                                    );\r
 \r
     TotalNeededSize += VariableEntry->VariableSize;\r
     VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);\r
@@ -1232,13 +1275,14 @@ CheckRemainingSpaceForConsistencyInternal (
                VariableEntry->Name,\r
                VariableEntry->Guid,\r
                FALSE,\r
-               &VariablePtrTrack\r
+               &VariablePtrTrack,\r
+               mVariableModuleGlobal->VariableGlobal.AuthFormat\r
                );\r
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Get size of Variable[Index].\r
       //\r
-      NextVariable = GetNextVariablePtr (VariablePtrTrack.CurrPtr);\r
+      NextVariable = GetNextVariablePtr (VariablePtrTrack.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
       OriginalVarSize = (UINTN) NextVariable - (UINTN) VariablePtrTrack.CurrPtr;\r
       //\r
       // Add the original size of Variable[Index] to remaining variable storage size.\r
@@ -1410,8 +1454,8 @@ AutoUpdateLangVariable (
       // Update Lang\r
       //\r
       VariableName = EFI_PLATFORM_LANG_VARIABLE_NAME;\r
-      Data         = GetVariableDataPtr (Variable.CurrPtr);\r
-      DataSize     = DataSizeOfVariable (Variable.CurrPtr);\r
+      Data         = GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
+      DataSize     = DataSizeOfVariable (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     } else {\r
       Status = FindVariable (EFI_LANG_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
       if (!EFI_ERROR (Status)) {\r
@@ -1419,8 +1463,8 @@ AutoUpdateLangVariable (
         // Update PlatformLang\r
         //\r
         VariableName = EFI_LANG_VARIABLE_NAME;\r
-        Data         = GetVariableDataPtr (Variable.CurrPtr);\r
-        DataSize     = DataSizeOfVariable (Variable.CurrPtr);\r
+        Data         = GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
+        DataSize     = DataSizeOfVariable (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
       } else {\r
         //\r
         // Neither PlatformLang nor Lang is set, directly return\r
@@ -1591,6 +1635,7 @@ UpdateVariable (
   VARIABLE_POINTER_TRACK              *Variable;\r
   VARIABLE_POINTER_TRACK              NvVariable;\r
   VARIABLE_STORE_HEADER               *VariableStoreHeader;\r
+  VARIABLE_RUNTIME_CACHE              *VolatileCacheInstance;\r
   UINT8                               *BufferForMerge;\r
   UINTN                               MergedBufSize;\r
   BOOLEAN                             DataReady;\r
@@ -1598,6 +1643,7 @@ UpdateVariable (
   BOOLEAN                             IsCommonVariable;\r
   BOOLEAN                             IsCommonUserVariable;\r
   AUTHENTICATED_VARIABLE_HEADER       *AuthVariable;\r
+  BOOLEAN                             AuthFormat;\r
 \r
   if (mVariableModuleGlobal->FvbInstance == NULL && !mVariableModuleGlobal->VariableGlobal.EmuNvMode) {\r
     //\r
@@ -1619,6 +1665,8 @@ UpdateVariable (
     }\r
   }\r
 \r
+  AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
+\r
   //\r
   // Check if CacheVariable points to the variable in variable HOB.\r
   // If yes, let CacheVariable points to the variable in NV variable cache.\r
@@ -1630,7 +1678,7 @@ UpdateVariable (
     CacheVariable->StartPtr = GetStartPointer (mNvVariableCache);\r
     CacheVariable->EndPtr   = GetEndPointer   (mNvVariableCache);\r
     CacheVariable->Volatile = FALSE;\r
-    Status = FindVariableEx (VariableName, VendorGuid, FALSE, CacheVariable);\r
+    Status = FindVariableEx (VariableName, VendorGuid, FALSE, CacheVariable, AuthFormat);\r
     if (CacheVariable->CurrPtr == NULL || EFI_ERROR (Status)) {\r
       //\r
       // There is no matched variable in NV variable cache.\r
@@ -1770,8 +1818,8 @@ UpdateVariable (
     // If the variable is marked valid, and the same data has been passed in,\r
     // then return to the caller immediately.\r
     //\r
-    if (DataSizeOfVariable (CacheVariable->CurrPtr) == DataSize &&\r
-        (CompareMem (Data, GetVariableDataPtr (CacheVariable->CurrPtr), DataSize) == 0) &&\r
+    if (DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) == DataSize &&\r
+        (CompareMem (Data, GetVariableDataPtr (CacheVariable->CurrPtr, AuthFormat), DataSize) == 0) &&\r
         ((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) &&\r
         (TimeStamp == NULL)) {\r
       //\r
@@ -1791,9 +1839,13 @@ UpdateVariable (
         // NOTE: From 0 to DataOffset of NextVariable is reserved for Variable Header and Name.\r
         // From DataOffset of NextVariable is to save the existing variable data.\r
         //\r
-        DataOffset = GetVariableDataOffset (CacheVariable->CurrPtr);\r
+        DataOffset = GetVariableDataOffset (CacheVariable->CurrPtr, AuthFormat);\r
         BufferForMerge = (UINT8 *) ((UINTN) NextVariable + DataOffset);\r
-        CopyMem (BufferForMerge, (UINT8 *) ((UINTN) CacheVariable->CurrPtr + DataOffset), DataSizeOfVariable (CacheVariable->CurrPtr));\r
+        CopyMem (\r
+          BufferForMerge,\r
+          (UINT8 *) ((UINTN) CacheVariable->CurrPtr + DataOffset),\r
+          DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat)\r
+          );\r
 \r
         //\r
         // Set Max Auth/Non-Volatile/Volatile Variable Data Size as default MaxDataSize.\r
@@ -1814,15 +1866,22 @@ UpdateVariable (
           MaxDataSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) - DataOffset;\r
         }\r
 \r
-        if (DataSizeOfVariable (CacheVariable->CurrPtr) + DataSize > MaxDataSize) {\r
+        if (DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) + DataSize > MaxDataSize) {\r
           //\r
           // Existing data size + new data size exceed maximum variable size limitation.\r
           //\r
           Status = EFI_INVALID_PARAMETER;\r
           goto Done;\r
         }\r
-        CopyMem ((UINT8*) ((UINTN) BufferForMerge + DataSizeOfVariable (CacheVariable->CurrPtr)), Data, DataSize);\r
-        MergedBufSize = DataSizeOfVariable (CacheVariable->CurrPtr) + DataSize;\r
+        CopyMem (\r
+          (UINT8*) (\r
+            (UINTN) BufferForMerge + DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat)\r
+            ),\r
+          Data,\r
+          DataSize\r
+          );\r
+        MergedBufSize = DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) +\r
+                          DataSize;\r
 \r
         //\r
         // BufferForMerge(from DataOffset of NextVariable) has included the merged existing and new data.\r
@@ -1925,7 +1984,7 @@ UpdateVariable (
   //\r
   NextVariable->Attributes  = Attributes & (~EFI_VARIABLE_APPEND_WRITE);\r
 \r
-  VarNameOffset                 = GetVariableHeaderSize ();\r
+  VarNameOffset                 = GetVariableHeaderSize (AuthFormat);\r
   VarNameSize                   = StrSize (VariableName);\r
   CopyMem (\r
     (UINT8 *) ((UINTN) NextVariable + VarNameOffset),\r
@@ -1946,14 +2005,18 @@ UpdateVariable (
       );\r
   }\r
 \r
-  CopyMem (GetVendorGuidPtr (NextVariable), VendorGuid, sizeof (EFI_GUID));\r
+  CopyMem (\r
+    GetVendorGuidPtr (NextVariable, AuthFormat),\r
+    VendorGuid,\r
+    sizeof (EFI_GUID)\r
+    );\r
   //\r
   // There will be pad bytes after Data, the NextVariable->NameSize and\r
   // NextVariable->DataSize should not include pad size so that variable\r
   // service can get actual size in GetVariable.\r
   //\r
-  SetNameSizeOfVariable (NextVariable, VarNameSize);\r
-  SetDataSizeOfVariable (NextVariable, DataSize);\r
+  SetNameSizeOfVariable (NextVariable, VarNameSize, AuthFormat);\r
+  SetDataSizeOfVariable (NextVariable, DataSize, AuthFormat);\r
 \r
   //\r
   // The actual size of the variable that stores in storage should\r
@@ -2036,7 +2099,7 @@ UpdateVariable (
                  TRUE,\r
                  Fvb,\r
                  mVariableModuleGlobal->NonVolatileLastVariableOffset,\r
-                 (UINT32) GetVariableHeaderSize (),\r
+                 (UINT32) GetVariableHeaderSize (AuthFormat),\r
                  (UINT8 *) NextVariable\r
                  );\r
 \r
@@ -2069,9 +2132,9 @@ UpdateVariable (
                  FALSE,\r
                  TRUE,\r
                  Fvb,\r
-                 mVariableModuleGlobal->NonVolatileLastVariableOffset + GetVariableHeaderSize (),\r
-                 (UINT32) (VarSize - GetVariableHeaderSize ()),\r
-                 (UINT8 *) NextVariable + GetVariableHeaderSize ()\r
+                 mVariableModuleGlobal->NonVolatileLastVariableOffset + GetVariableHeaderSize (AuthFormat),\r
+                 (UINT32) (VarSize - GetVariableHeaderSize (AuthFormat)),\r
+                 (UINT8 *) NextVariable + GetVariableHeaderSize (AuthFormat)\r
                  );\r
 \r
       if (EFI_ERROR (Status)) {\r
@@ -2234,6 +2297,23 @@ UpdateVariable (
   }\r
 \r
 Done:\r
+  if (!EFI_ERROR (Status)) {\r
+    if ((Variable->CurrPtr != NULL && !Variable->Volatile) || (Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
+      VolatileCacheInstance = &(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache);\r
+    } else {\r
+      VolatileCacheInstance = &(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache);\r
+    }\r
+\r
+    if (VolatileCacheInstance->Store != NULL) {\r
+      Status =  SynchronizeRuntimeVariableCache (\r
+                  VolatileCacheInstance,\r
+                  0,\r
+                  VolatileCacheInstance->Store->Size\r
+                  );\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
@@ -2291,7 +2371,7 @@ VariableServiceGetVariable (
   //\r
   // Get data size\r
   //\r
-  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
   ASSERT (VarDataSize != 0);\r
 \r
   if (*DataSize >= VarDataSize) {\r
@@ -2300,10 +2380,7 @@ VariableServiceGetVariable (
       goto Done;\r
     }\r
 \r
-    CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
-    if (Attributes != NULL) {\r
-      *Attributes = Variable.CurrPtr->Attributes;\r
-    }\r
+    CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat), VarDataSize);\r
 \r
     *DataSize = VarDataSize;\r
     UpdateVariableInfo (VariableName, VendorGuid, Variable.Volatile, TRUE, FALSE, FALSE, FALSE, &gVariableInfo);\r
@@ -2317,6 +2394,11 @@ VariableServiceGetVariable (
   }\r
 \r
 Done:\r
+  if (Status == EFI_SUCCESS || Status == EFI_BUFFER_TOO_SMALL) {\r
+    if (Attributes != NULL && Variable.CurrPtr != NULL) {\r
+      *Attributes = Variable.CurrPtr->Attributes;\r
+    }\r
+  }\r
   ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
   return Status;\r
 }\r
@@ -2357,6 +2439,7 @@ VariableServiceGetNextVariableName (
   EFI_STATUS              Status;\r
   UINTN                   MaxLen;\r
   UINTN                   VarNameSize;\r
+  BOOLEAN                 AuthFormat;\r
   VARIABLE_HEADER         *VariablePtr;\r
   VARIABLE_STORE_HEADER   *VariableStoreHeader[VariableStoreTypeMax];\r
 \r
@@ -2364,6 +2447,8 @@ VariableServiceGetNextVariableName (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
+\r
   //\r
   // Calculate the possible maximum length of name string, including the Null terminator.\r
   //\r
@@ -2387,13 +2472,27 @@ VariableServiceGetNextVariableName (
   VariableStoreHeader[VariableStoreTypeHob]      = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase;\r
   VariableStoreHeader[VariableStoreTypeNv]       = mNvVariableCache;\r
 \r
-  Status = VariableServiceGetNextVariableInternal (VariableName, VendorGuid, VariableStoreHeader, &VariablePtr);\r
+  Status =  VariableServiceGetNextVariableInternal (\r
+              VariableName,\r
+              VendorGuid,\r
+              VariableStoreHeader,\r
+              &VariablePtr,\r
+              AuthFormat\r
+              );\r
   if (!EFI_ERROR (Status)) {\r
-    VarNameSize = NameSizeOfVariable (VariablePtr);\r
+    VarNameSize = NameSizeOfVariable (VariablePtr, AuthFormat);\r
     ASSERT (VarNameSize != 0);\r
     if (VarNameSize <= *VariableNameSize) {\r
-      CopyMem (VariableName, GetVariableNamePtr (VariablePtr), VarNameSize);\r
-      CopyMem (VendorGuid, GetVendorGuidPtr (VariablePtr), sizeof (EFI_GUID));\r
+      CopyMem (\r
+        VariableName,\r
+        GetVariableNamePtr (VariablePtr, AuthFormat),\r
+        VarNameSize\r
+        );\r
+      CopyMem (\r
+        VendorGuid,\r
+        GetVendorGuidPtr (VariablePtr, AuthFormat),\r
+        sizeof (EFI_GUID)\r
+        );\r
       Status = EFI_SUCCESS;\r
     } else {\r
       Status = EFI_BUFFER_TOO_SMALL;\r
@@ -2446,6 +2545,9 @@ VariableServiceSetVariable (
   VARIABLE_HEADER                     *NextVariable;\r
   EFI_PHYSICAL_ADDRESS                Point;\r
   UINTN                               PayloadSize;\r
+  BOOLEAN                             AuthFormat;\r
+\r
+  AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
 \r
   //\r
   // Check input parameters.\r
@@ -2544,7 +2646,8 @@ VariableServiceSetVariable (
   //  bytes for HwErrRec#### variable.\r
   //\r
   if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
-    if (StrSize (VariableName) + PayloadSize > PcdGet32 (PcdMaxHardwareErrorVariableSize) - GetVariableHeaderSize ()) {\r
+    if (StrSize (VariableName) + PayloadSize >\r
+        PcdGet32 (PcdMaxHardwareErrorVariableSize) - GetVariableHeaderSize (AuthFormat)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   } else {\r
@@ -2553,7 +2656,9 @@ VariableServiceSetVariable (
     //  the DataSize is limited to maximum size of Max(Auth|Volatile)VariableSize bytes.\r
     //\r
     if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {\r
-      if (StrSize (VariableName) + PayloadSize > mVariableModuleGlobal->MaxAuthVariableSize - GetVariableHeaderSize ()) {\r
+      if (StrSize (VariableName) + PayloadSize >\r
+          mVariableModuleGlobal->MaxAuthVariableSize -\r
+          GetVariableHeaderSize (AuthFormat)) {\r
         DEBUG ((DEBUG_ERROR,\r
           "%a: Failed to set variable '%s' with Guid %g\n",\r
           __FUNCTION__, VariableName, VendorGuid));\r
@@ -2562,12 +2667,13 @@ VariableServiceSetVariable (
           "MaxAuthVariableSize(0x%x) - HeaderSize(0x%x)\n",\r
           StrSize (VariableName), PayloadSize,\r
           mVariableModuleGlobal->MaxAuthVariableSize,\r
-          GetVariableHeaderSize ()\r
+          GetVariableHeaderSize (AuthFormat)\r
           ));\r
         return EFI_INVALID_PARAMETER;\r
       }\r
     } else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
-      if (StrSize (VariableName) + PayloadSize > mVariableModuleGlobal->MaxVariableSize - GetVariableHeaderSize ()) {\r
+      if (StrSize (VariableName) + PayloadSize >\r
+          mVariableModuleGlobal->MaxVariableSize - GetVariableHeaderSize (AuthFormat)) {\r
         DEBUG ((DEBUG_ERROR,\r
           "%a: Failed to set variable '%s' with Guid %g\n",\r
           __FUNCTION__, VariableName, VendorGuid));\r
@@ -2576,12 +2682,13 @@ VariableServiceSetVariable (
           "MaxVariableSize(0x%x) - HeaderSize(0x%x)\n",\r
           StrSize (VariableName), PayloadSize,\r
           mVariableModuleGlobal->MaxVariableSize,\r
-          GetVariableHeaderSize ()\r
+          GetVariableHeaderSize (AuthFormat)\r
           ));\r
         return EFI_INVALID_PARAMETER;\r
       }\r
     } else {\r
-      if (StrSize (VariableName) + PayloadSize > mVariableModuleGlobal->MaxVolatileVariableSize - GetVariableHeaderSize ()) {\r
+      if (StrSize (VariableName) + PayloadSize >\r
+          mVariableModuleGlobal->MaxVolatileVariableSize - GetVariableHeaderSize (AuthFormat)) {\r
         DEBUG ((DEBUG_ERROR,\r
           "%a: Failed to set variable '%s' with Guid %g\n",\r
           __FUNCTION__, VariableName, VendorGuid));\r
@@ -2590,7 +2697,7 @@ VariableServiceSetVariable (
           "MaxVolatileVariableSize(0x%x) - HeaderSize(0x%x)\n",\r
           StrSize (VariableName), PayloadSize,\r
           mVariableModuleGlobal->MaxVolatileVariableSize,\r
-          GetVariableHeaderSize ()\r
+          GetVariableHeaderSize (AuthFormat)\r
           ));\r
         return EFI_INVALID_PARAMETER;\r
       }\r
@@ -2629,7 +2736,7 @@ VariableServiceSetVariable (
     //\r
     NextVariable  = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point);\r
     while (IsValidVariableHeader (NextVariable, GetEndPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point))) {\r
-      NextVariable = GetNextVariablePtr (NextVariable);\r
+      NextVariable = GetNextVariablePtr (NextVariable, AuthFormat);\r
     }\r
     mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) NextVariable - (UINTN) Point;\r
   }\r
@@ -2754,7 +2861,8 @@ VariableServiceQueryVariableInfoInternal (
   //\r
   if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {\r
     *MaximumVariableStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
-    *MaximumVariableSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) - GetVariableHeaderSize ();\r
+    *MaximumVariableSize =  PcdGet32 (PcdMaxHardwareErrorVariableSize) -\r
+                              GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
   } else {\r
     if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
       if (AtRuntime ()) {\r
@@ -2768,11 +2876,14 @@ VariableServiceQueryVariableInfoInternal (
     // Let *MaximumVariableSize be Max(Auth|Volatile)VariableSize with the exception of the variable header size.\r
     //\r
     if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {\r
-      *MaximumVariableSize = mVariableModuleGlobal->MaxAuthVariableSize - GetVariableHeaderSize ();\r
+      *MaximumVariableSize =  mVariableModuleGlobal->MaxAuthVariableSize -\r
+                                GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     } else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
-      *MaximumVariableSize = mVariableModuleGlobal->MaxVariableSize - GetVariableHeaderSize ();\r
+      *MaximumVariableSize =  mVariableModuleGlobal->MaxVariableSize -\r
+                                GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     } else {\r
-      *MaximumVariableSize = mVariableModuleGlobal->MaxVolatileVariableSize - GetVariableHeaderSize ();\r
+      *MaximumVariableSize =   mVariableModuleGlobal->MaxVolatileVariableSize -\r
+                                GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     }\r
   }\r
 \r
@@ -2785,7 +2896,7 @@ VariableServiceQueryVariableInfoInternal (
   // Now walk through the related variable store.\r
   //\r
   while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
-    NextVariable = GetNextVariablePtr (Variable);\r
+    NextVariable = GetNextVariablePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     VariableSize = (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Variable;\r
 \r
     if (AtRuntime ()) {\r
@@ -2820,10 +2931,11 @@ VariableServiceQueryVariableInfoInternal (
         VariablePtrTrack.StartPtr = GetStartPointer (VariableStoreHeader);\r
         VariablePtrTrack.EndPtr   = GetEndPointer   (VariableStoreHeader);\r
         Status = FindVariableEx (\r
-                   GetVariableNamePtr (Variable),\r
-                   GetVendorGuidPtr (Variable),\r
+                   GetVariableNamePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+                   GetVendorGuidPtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
                    FALSE,\r
-                   &VariablePtrTrack\r
+                   &VariablePtrTrack,\r
+                   mVariableModuleGlobal->VariableGlobal.AuthFormat\r
                    );\r
         if (!EFI_ERROR (Status) && VariablePtrTrack.CurrPtr->State != VAR_ADDED) {\r
           if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
@@ -2851,10 +2963,13 @@ VariableServiceQueryVariableInfoInternal (
     }\r
   }\r
 \r
-  if (*RemainingVariableStorageSize < GetVariableHeaderSize ()) {\r
+  if (*RemainingVariableStorageSize < GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat)) {\r
     *MaximumVariableSize = 0;\r
-  } else if ((*RemainingVariableStorageSize - GetVariableHeaderSize ()) < *MaximumVariableSize) {\r
-    *MaximumVariableSize = *RemainingVariableStorageSize - GetVariableHeaderSize ();\r
+  } else if ((*RemainingVariableStorageSize - GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat)) <\r
+              *MaximumVariableSize\r
+              ) {\r
+    *MaximumVariableSize = *RemainingVariableStorageSize -\r
+                             GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -3006,25 +3121,6 @@ ReclaimForOS(
   }\r
 }\r
 \r
-/**\r
-  Get non-volatile maximum variable size.\r
-\r
-  @return Non-volatile maximum variable size.\r
-\r
-**/\r
-UINTN\r
-GetNonVolatileMaxVariableSize (\r
-  VOID\r
-  )\r
-{\r
-  if (PcdGet32 (PcdHwErrStorageSize) != 0) {\r
-    return MAX (MAX (PcdGet32 (PcdMaxVariableSize), PcdGet32 (PcdMaxAuthVariableSize)),\r
-                PcdGet32 (PcdMaxHardwareErrorVariableSize));\r
-  } else {\r
-    return MAX (PcdGet32 (PcdMaxVariableSize), PcdGet32 (PcdMaxAuthVariableSize));\r
-  }\r
-}\r
-\r
 /**\r
   Get maximum variable size, covering both non-volatile and volatile variables.\r
 \r
@@ -3049,303 +3145,6 @@ GetMaxVariableSize (
   return MaxVariableSize;\r
 }\r
 \r
-/**\r
-  Init real non-volatile variable store.\r
-\r
-  @param[out] VariableStoreBase Output pointer to real non-volatile variable store base.\r
-\r
-  @retval EFI_SUCCESS           Function successfully executed.\r
-  @retval EFI_OUT_OF_RESOURCES  Fail to allocate enough memory resource.\r
-  @retval EFI_VOLUME_CORRUPTED  Variable Store or Firmware Volume for Variable Store is corrupted.\r
-\r
-**/\r
-EFI_STATUS\r
-InitRealNonVolatileVariableStore (\r
-  OUT EFI_PHYSICAL_ADDRESS              *VariableStoreBase\r
-  )\r
-{\r
-  EFI_FIRMWARE_VOLUME_HEADER            *FvHeader;\r
-  VARIABLE_STORE_HEADER                 *VariableStore;\r
-  UINT32                                VariableStoreLength;\r
-  EFI_HOB_GUID_TYPE                     *GuidHob;\r
-  EFI_PHYSICAL_ADDRESS                  NvStorageBase;\r
-  UINT8                                 *NvStorageData;\r
-  UINT32                                NvStorageSize;\r
-  FAULT_TOLERANT_WRITE_LAST_WRITE_DATA  *FtwLastWriteData;\r
-  UINT32                                BackUpOffset;\r
-  UINT32                                BackUpSize;\r
-  UINT32                                HwErrStorageSize;\r
-  UINT32                                MaxUserNvVariableSpaceSize;\r
-  UINT32                                BoottimeReservedNvVariableSpaceSize;\r
-  EFI_STATUS                            Status;\r
-  VOID                                  *FtwProtocol;\r
-\r
-  mVariableModuleGlobal->FvbInstance = NULL;\r
-\r
-  //\r
-  // Allocate runtime memory used for a memory copy of the FLASH region.\r
-  // Keep the memory and the FLASH in sync as updates occur.\r
-  //\r
-  NvStorageSize = PcdGet32 (PcdFlashNvStorageVariableSize);\r
-  NvStorageData = AllocateRuntimeZeroPool (NvStorageSize);\r
-  if (NvStorageData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NvStorageBase = NV_STORAGE_VARIABLE_BASE;\r
-  ASSERT (NvStorageBase != 0);\r
-\r
-  //\r
-  // Copy NV storage data to the memory buffer.\r
-  //\r
-  CopyMem (NvStorageData, (UINT8 *) (UINTN) NvStorageBase, NvStorageSize);\r
-\r
-  Status = GetFtwProtocol ((VOID **)&FtwProtocol);\r
-  //\r
-  // If FTW protocol has been installed, no need to check FTW last write data hob.\r
-  //\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Check the FTW last write data hob.\r
-    //\r
-    GuidHob = GetFirstGuidHob (&gEdkiiFaultTolerantWriteGuid);\r
-    if (GuidHob != NULL) {\r
-      FtwLastWriteData = (FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *) GET_GUID_HOB_DATA (GuidHob);\r
-      if (FtwLastWriteData->TargetAddress == NvStorageBase) {\r
-        DEBUG ((EFI_D_INFO, "Variable: NV storage is backed up in spare block: 0x%x\n", (UINTN) FtwLastWriteData->SpareAddress));\r
-        //\r
-        // Copy the backed up NV storage data to the memory buffer from spare block.\r
-        //\r
-        CopyMem (NvStorageData, (UINT8 *) (UINTN) (FtwLastWriteData->SpareAddress), NvStorageSize);\r
-      } else if ((FtwLastWriteData->TargetAddress > NvStorageBase) &&\r
-                 (FtwLastWriteData->TargetAddress < (NvStorageBase + NvStorageSize))) {\r
-        //\r
-        // Flash NV storage from the Offset is backed up in spare block.\r
-        //\r
-        BackUpOffset = (UINT32) (FtwLastWriteData->TargetAddress - NvStorageBase);\r
-        BackUpSize = NvStorageSize - BackUpOffset;\r
-        DEBUG ((EFI_D_INFO, "Variable: High partial NV storage from offset: %x is backed up in spare block: 0x%x\n", BackUpOffset, (UINTN) FtwLastWriteData->SpareAddress));\r
-        //\r
-        // Copy the partial backed up NV storage data to the memory buffer from spare block.\r
-        //\r
-        CopyMem (NvStorageData + BackUpOffset, (UINT8 *) (UINTN) FtwLastWriteData->SpareAddress, BackUpSize);\r
-      }\r
-    }\r
-  }\r
-\r
-  FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) NvStorageData;\r
-\r
-  //\r
-  // Check if the Firmware Volume is not corrupted\r
-  //\r
-  if ((FvHeader->Signature != EFI_FVH_SIGNATURE) || (!CompareGuid (&gEfiSystemNvDataFvGuid, &FvHeader->FileSystemGuid))) {\r
-    FreePool (NvStorageData);\r
-    DEBUG ((EFI_D_ERROR, "Firmware Volume for Variable Store is corrupted\n"));\r
-    return EFI_VOLUME_CORRUPTED;\r
-  }\r
-\r
-  VariableStore = (VARIABLE_STORE_HEADER *) ((UINTN) FvHeader + FvHeader->HeaderLength);\r
-  VariableStoreLength = NvStorageSize - FvHeader->HeaderLength;\r
-  ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);\r
-  ASSERT (VariableStore->Size == VariableStoreLength);\r
-\r
-  //\r
-  // Check if the Variable Store header is not corrupted\r
-  //\r
-  if (GetVariableStoreStatus (VariableStore) != EfiValid) {\r
-    FreePool (NvStorageData);\r
-    DEBUG((EFI_D_ERROR, "Variable Store header is corrupted\n"));\r
-    return EFI_VOLUME_CORRUPTED;\r
-  }\r
-\r
-  mNvFvHeaderCache = FvHeader;\r
-\r
-  *VariableStoreBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore;\r
-\r
-  HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
-  MaxUserNvVariableSpaceSize = PcdGet32 (PcdMaxUserNvVariableSpaceSize);\r
-  BoottimeReservedNvVariableSpaceSize = PcdGet32 (PcdBoottimeReservedNvVariableSpaceSize);\r
-\r
-  //\r
-  // Note that in EdkII variable driver implementation, Hardware Error Record type variable\r
-  // is stored with common variable in the same NV region. So the platform integrator should\r
-  // ensure that the value of PcdHwErrStorageSize is less than the value of\r
-  // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)).\r
-  //\r
-  ASSERT (HwErrStorageSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));\r
-  //\r
-  // Ensure that the value of PcdMaxUserNvVariableSpaceSize is less than the value of\r
-  // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)) - PcdGet32 (PcdHwErrStorageSize).\r
-  //\r
-  ASSERT (MaxUserNvVariableSpaceSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize));\r
-  //\r
-  // Ensure that the value of PcdBoottimeReservedNvVariableSpaceSize is less than the value of\r
-  // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)) - PcdGet32 (PcdHwErrStorageSize).\r
-  //\r
-  ASSERT (BoottimeReservedNvVariableSpaceSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize));\r
-\r
-  mVariableModuleGlobal->CommonVariableSpace = ((UINTN) VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize);\r
-  mVariableModuleGlobal->CommonMaxUserVariableSpace = ((MaxUserNvVariableSpaceSize != 0) ? MaxUserNvVariableSpaceSize : mVariableModuleGlobal->CommonVariableSpace);\r
-  mVariableModuleGlobal->CommonRuntimeVariableSpace = mVariableModuleGlobal->CommonVariableSpace - BoottimeReservedNvVariableSpaceSize;\r
-\r
-  DEBUG ((EFI_D_INFO, "Variable driver common space: 0x%x 0x%x 0x%x\n", mVariableModuleGlobal->CommonVariableSpace, mVariableModuleGlobal->CommonMaxUserVariableSpace, mVariableModuleGlobal->CommonRuntimeVariableSpace));\r
-\r
-  //\r
-  // The max NV variable size should be < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)).\r
-  //\r
-  ASSERT (GetNonVolatileMaxVariableSize () < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Init emulated non-volatile variable store.\r
-\r
-  @param[out] VariableStoreBase Output pointer to emulated non-volatile variable store base.\r
-\r
-  @retval EFI_SUCCESS           Function successfully executed.\r
-  @retval EFI_OUT_OF_RESOURCES  Fail to allocate enough memory resource.\r
-\r
-**/\r
-EFI_STATUS\r
-InitEmuNonVolatileVariableStore (\r
-  EFI_PHYSICAL_ADDRESS  *VariableStoreBase\r
-  )\r
-{\r
-  VARIABLE_STORE_HEADER *VariableStore;\r
-  UINT32                VariableStoreLength;\r
-  BOOLEAN               FullyInitializeStore;\r
-  UINT32                HwErrStorageSize;\r
-\r
-  FullyInitializeStore = TRUE;\r
-\r
-  VariableStoreLength = PcdGet32 (PcdVariableStoreSize);\r
-  ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);\r
-\r
-  //\r
-  // Allocate memory for variable store.\r
-  //\r
-  if (PcdGet64 (PcdEmuVariableNvStoreReserved) == 0) {\r
-    VariableStore = (VARIABLE_STORE_HEADER *) AllocateRuntimePool (VariableStoreLength);\r
-    if (VariableStore == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-  } else {\r
-    //\r
-    // A memory location has been reserved for the NV variable store.  Certain\r
-    // platforms may be able to preserve a memory range across system resets,\r
-    // thereby providing better NV variable emulation.\r
-    //\r
-    VariableStore =\r
-      (VARIABLE_STORE_HEADER *)(VOID*)(UINTN)\r
-        PcdGet64 (PcdEmuVariableNvStoreReserved);\r
-    if ((VariableStore->Size == VariableStoreLength) &&\r
-        (CompareGuid (&VariableStore->Signature, &gEfiAuthenticatedVariableGuid) ||\r
-         CompareGuid (&VariableStore->Signature, &gEfiVariableGuid)) &&\r
-        (VariableStore->Format == VARIABLE_STORE_FORMATTED) &&\r
-        (VariableStore->State == VARIABLE_STORE_HEALTHY)) {\r
-      DEBUG((\r
-        DEBUG_INFO,\r
-        "Variable Store reserved at %p appears to be valid\n",\r
-        VariableStore\r
-        ));\r
-      FullyInitializeStore = FALSE;\r
-    }\r
-  }\r
-\r
-  if (FullyInitializeStore) {\r
-    SetMem (VariableStore, VariableStoreLength, 0xff);\r
-    //\r
-    // Use gEfiAuthenticatedVariableGuid for potential auth variable support.\r
-    //\r
-    CopyGuid (&VariableStore->Signature, &gEfiAuthenticatedVariableGuid);\r
-    VariableStore->Size       = VariableStoreLength;\r
-    VariableStore->Format     = VARIABLE_STORE_FORMATTED;\r
-    VariableStore->State      = VARIABLE_STORE_HEALTHY;\r
-    VariableStore->Reserved   = 0;\r
-    VariableStore->Reserved1  = 0;\r
-  }\r
-\r
-  *VariableStoreBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore;\r
-\r
-  HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
-\r
-  //\r
-  // Note that in EdkII variable driver implementation, Hardware Error Record type variable\r
-  // is stored with common variable in the same NV region. So the platform integrator should\r
-  // ensure that the value of PcdHwErrStorageSize is less than the value of\r
-  // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)).\r
-  //\r
-  ASSERT (HwErrStorageSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));\r
-\r
-  mVariableModuleGlobal->CommonVariableSpace = ((UINTN) VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize);\r
-  mVariableModuleGlobal->CommonMaxUserVariableSpace = mVariableModuleGlobal->CommonVariableSpace;\r
-  mVariableModuleGlobal->CommonRuntimeVariableSpace = mVariableModuleGlobal->CommonVariableSpace;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Init non-volatile variable store.\r
-\r
-  @retval EFI_SUCCESS           Function successfully executed.\r
-  @retval EFI_OUT_OF_RESOURCES  Fail to allocate enough memory resource.\r
-  @retval EFI_VOLUME_CORRUPTED  Variable Store or Firmware Volume for Variable Store is corrupted.\r
-\r
-**/\r
-EFI_STATUS\r
-InitNonVolatileVariableStore (\r
-  VOID\r
-  )\r
-{\r
-  VARIABLE_HEADER                       *Variable;\r
-  VARIABLE_HEADER                       *NextVariable;\r
-  EFI_PHYSICAL_ADDRESS                  VariableStoreBase;\r
-  UINTN                                 VariableSize;\r
-  EFI_STATUS                            Status;\r
-\r
-  if (PcdGetBool (PcdEmuVariableNvModeEnable)) {\r
-    Status = InitEmuNonVolatileVariableStore (&VariableStoreBase);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-    mVariableModuleGlobal->VariableGlobal.EmuNvMode = TRUE;\r
-    DEBUG ((DEBUG_INFO, "Variable driver will work at emulated non-volatile variable mode!\n"));\r
-  } else {\r
-    Status = InitRealNonVolatileVariableStore (&VariableStoreBase);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-    mVariableModuleGlobal->VariableGlobal.EmuNvMode = FALSE;\r
-  }\r
-\r
-  mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase = VariableStoreBase;\r
-  mNvVariableCache = (VARIABLE_STORE_HEADER *) (UINTN) VariableStoreBase;\r
-  mVariableModuleGlobal->VariableGlobal.AuthFormat = (BOOLEAN)(CompareGuid (&mNvVariableCache->Signature, &gEfiAuthenticatedVariableGuid));\r
-\r
-  mVariableModuleGlobal->MaxVariableSize = PcdGet32 (PcdMaxVariableSize);\r
-  mVariableModuleGlobal->MaxAuthVariableSize = ((PcdGet32 (PcdMaxAuthVariableSize) != 0) ? PcdGet32 (PcdMaxAuthVariableSize) : mVariableModuleGlobal->MaxVariableSize);\r
-\r
-  //\r
-  // Parse non-volatile variable data and get last variable offset.\r
-  //\r
-  Variable  = GetStartPointer (mNvVariableCache);\r
-  while (IsValidVariableHeader (Variable, GetEndPointer (mNvVariableCache))) {\r
-    NextVariable = GetNextVariablePtr (Variable);\r
-    VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
-    if ((Variable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {\r
-      mVariableModuleGlobal->HwErrVariableTotalSize += VariableSize;\r
-    } else {\r
-      mVariableModuleGlobal->CommonVariableTotalSize += VariableSize;\r
-    }\r
-\r
-    Variable = NextVariable;\r
-  }\r
-  mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) Variable - (UINTN) mNvVariableCache;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 /**\r
   Flush the HOB variable to flash.\r
 \r
@@ -3365,8 +3164,10 @@ FlushHobVariableToFlash (
   VOID                          *VariableData;\r
   VARIABLE_POINTER_TRACK        VariablePtrTrack;\r
   BOOLEAN                       ErrorFlag;\r
+  BOOLEAN                       AuthFormat;\r
 \r
   ErrorFlag = FALSE;\r
+  AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
 \r
   //\r
   // Flush the HOB variable to flash.\r
@@ -3379,7 +3180,7 @@ FlushHobVariableToFlash (
     mVariableModuleGlobal->VariableGlobal.HobVariableBase = 0;\r
     for ( Variable = GetStartPointer (VariableStoreHeader)\r
         ; IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))\r
-        ; Variable = GetNextVariablePtr (Variable)\r
+        ; Variable = GetNextVariablePtr (Variable, AuthFormat)\r
         ) {\r
       if (Variable->State != VAR_ADDED) {\r
         //\r
@@ -3389,22 +3190,33 @@ FlushHobVariableToFlash (
       }\r
       ASSERT ((Variable->Attributes & EFI_VARIABLE_NON_VOLATILE) != 0);\r
       if (VendorGuid == NULL || VariableName == NULL ||\r
-          !CompareGuid (VendorGuid, GetVendorGuidPtr (Variable)) ||\r
-          StrCmp (VariableName, GetVariableNamePtr (Variable)) != 0) {\r
-        VariableData = GetVariableDataPtr (Variable);\r
-        FindVariable (GetVariableNamePtr (Variable), GetVendorGuidPtr (Variable), &VariablePtrTrack, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
+          !CompareGuid (VendorGuid, GetVendorGuidPtr (Variable, AuthFormat)) ||\r
+          StrCmp (VariableName, GetVariableNamePtr (Variable, AuthFormat)) != 0) {\r
+        VariableData = GetVariableDataPtr (Variable, AuthFormat);\r
+        FindVariable (\r
+          GetVariableNamePtr (Variable, AuthFormat),\r
+          GetVendorGuidPtr (Variable, AuthFormat),\r
+          &VariablePtrTrack,\r
+          &mVariableModuleGlobal->VariableGlobal, FALSE\r
+          );\r
         Status = UpdateVariable (\r
-                   GetVariableNamePtr (Variable),\r
-                   GetVendorGuidPtr (Variable),\r
+                   GetVariableNamePtr (Variable, AuthFormat),\r
+                   GetVendorGuidPtr (Variable, AuthFormat),\r
                    VariableData,\r
-                   DataSizeOfVariable (Variable),\r
+                   DataSizeOfVariable (Variable, AuthFormat),\r
                    Variable->Attributes,\r
                    0,\r
                    0,\r
                    &VariablePtrTrack,\r
                    NULL\r
                  );\r
-        DEBUG ((EFI_D_INFO, "Variable driver flush the HOB variable to flash: %g %s %r\n", GetVendorGuidPtr (Variable), GetVariableNamePtr (Variable), Status));\r
+        DEBUG ((\r
+          DEBUG_INFO,\r
+          "Variable driver flush the HOB variable to flash: %g %s %r\n",\r
+          GetVendorGuidPtr (Variable, AuthFormat),\r
+          GetVariableNamePtr (Variable, AuthFormat),\r
+          Status\r
+          ));\r
       } else {\r
         //\r
         // The updated or deleted variable is matched with this HOB variable.\r
@@ -3418,12 +3230,25 @@ FlushHobVariableToFlash (
         // If set variable successful, or the updated or deleted variable is matched with the HOB variable,\r
         // set the HOB variable to DELETED state in local.\r
         //\r
-        DEBUG ((EFI_D_INFO, "Variable driver set the HOB variable to DELETED state in local: %g %s\n", GetVendorGuidPtr (Variable), GetVariableNamePtr (Variable)));\r
+        DEBUG ((\r
+          DEBUG_INFO,\r
+          "Variable driver set the HOB variable to DELETED state in local: %g %s\n",\r
+          GetVendorGuidPtr (Variable, AuthFormat),\r
+          GetVariableNamePtr (Variable, AuthFormat)\r
+          ));\r
         Variable->State &= VAR_DELETED;\r
       } else {\r
         ErrorFlag = TRUE;\r
       }\r
     }\r
+    if (mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeHobCache.Store != NULL) {\r
+      Status =  SynchronizeRuntimeVariableCache (\r
+                  &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeHobCache,\r
+                  0,\r
+                  mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeHobCache.Store->Size\r
+                  );\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
     if (ErrorFlag) {\r
       //\r
       // We still have HOB variable(s) not flushed in flash.\r
@@ -3434,6 +3259,9 @@ FlushHobVariableToFlash (
       // All HOB variables have been flushed in flash.\r
       //\r
       DEBUG ((EFI_D_INFO, "Variable driver: all HOB variables have been flushed in flash.\n"));\r
+      if (mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.HobFlushComplete != NULL) {\r
+        *(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.HobFlushComplete) = TRUE;\r
+      }\r
       if (!AtRuntime ()) {\r
         FreePool ((VOID *) VariableStoreHeader);\r
       }\r
@@ -3495,7 +3323,8 @@ VariableWriteServiceInitialize (
     // Authenticated variable initialize.\r
     //\r
     mAuthContextIn.StructSize = sizeof (AUTH_VAR_LIB_CONTEXT_IN);\r
-    mAuthContextIn.MaxAuthVariableSize = mVariableModuleGlobal->MaxAuthVariableSize - GetVariableHeaderSize ();\r
+    mAuthContextIn.MaxAuthVariableSize =  mVariableModuleGlobal->MaxAuthVariableSize -\r
+                                            GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
     Status = AuthVariableLibInitialize (&mAuthContextIn, &mAuthContextOut);\r
     if (!EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_INFO, "Variable driver will work with auth variable support!\n"));\r
@@ -3574,7 +3403,7 @@ ConvertNormalVarStorageToAuthVarStorage (
       AuthVarStroageSize += StartPtr->NameSize + GET_PAD_SIZE (StartPtr->NameSize);\r
       AuthVarStroageSize += StartPtr->DataSize + GET_PAD_SIZE (StartPtr->DataSize);\r
     }\r
-    StartPtr  = GetNextVariablePtr (StartPtr);\r
+    StartPtr  = GetNextVariablePtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
   }\r
 \r
   //\r
@@ -3608,18 +3437,22 @@ ConvertNormalVarStorageToAuthVarStorage (
       // Copy Variable Name\r
       //\r
       NextPtr = (UINT8 *) (AuthStartPtr + 1);\r
-      CopyMem (NextPtr, GetVariableNamePtr (StartPtr), AuthStartPtr->NameSize);\r
+      CopyMem (\r
+        NextPtr,\r
+        GetVariableNamePtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+        AuthStartPtr->NameSize\r
+        );\r
       //\r
       // Copy Variable Data\r
       //\r
       NextPtr = NextPtr + AuthStartPtr->NameSize + GET_PAD_SIZE (AuthStartPtr->NameSize);\r
-      CopyMem (NextPtr, GetVariableDataPtr (StartPtr), AuthStartPtr->DataSize);\r
+      CopyMem (NextPtr, GetVariableDataPtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat), AuthStartPtr->DataSize);\r
       //\r
       // Go to next variable\r
       //\r
       AuthStartPtr = (AUTHENTICATED_VARIABLE_HEADER *) (NextPtr + AuthStartPtr->DataSize + GET_PAD_SIZE (AuthStartPtr->DataSize));\r
     }\r
-    StartPtr = GetNextVariablePtr (StartPtr);\r
+    StartPtr = GetNextVariablePtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
   }\r
   //\r
   // Update Auth Storage Header\r