]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
MdeModulePkg/Variable: Add RT GetVariable() cache support
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / Variable.c
index 0bd2f22e1a6bb745aee9cd3b391be4f7c6741046..29d6aca993805adcdb56f728e49b4afa56a7bb51 100644 (file)
@@ -25,6 +25,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include "Variable.h"\r
 #include "VariableNonVolatile.h"\r
 #include "VariableParsing.h"\r
+#include "VariableRuntimeCache.h"\r
 \r
 VARIABLE_MODULE_GLOBAL  *mVariableModuleGlobal;\r
 \r
@@ -332,6 +333,12 @@ RecordVarErrorFlag (
       // Update the data in NV cache.\r
       //\r
       *VarErrFlag = TempFlag;\r
+      Status =  SynchronizeRuntimeVariableCache (\r
+                  &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache,\r
+                  (UINTN) VarErrFlag - (UINTN) mNvVariableCache + (UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase,\r
+                  sizeof (TempFlag)\r
+                  );\r
+      ASSERT_EFI_ERROR (Status);\r
     }\r
   }\r
 }\r
@@ -766,12 +773,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
@@ -1614,6 +1633,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
@@ -2275,6 +2295,23 @@ UpdateVariable (
   }\r
 \r
 Done:\r
+  if (!EFI_ERROR (Status)) {\r
+    if (Variable->Volatile) {\r
+      VolatileCacheInstance = &(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache);\r
+    } else {\r
+      VolatileCacheInstance = &(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache);\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
@@ -3200,6 +3237,14 @@ FlushHobVariableToFlash (
         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
@@ -3210,6 +3255,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