]> git.proxmox.com Git - mirror_edk2.git/commitdiff
If there are variables in the VAR_ADDED state that are identical to the variable...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 11 Oct 2008 23:44:40 +0000 (23:44 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 11 Oct 2008 23:44:40 +0000 (23:44 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6104 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c

index 2571167d89abc1b2e3b726821f2ba46d1164a606..b5741785b25de990c0d18c9ed6d7074e7ddd9415 100644 (file)
@@ -656,26 +656,47 @@ Returns:
   //\r
 \r
   //\r
-  // Reinstall all ADDED variables\r
+  // Reinstall all ADDED variables as long as they are not identical to Updating Variable\r
   // \r
   Variable = GetStartPointer (VariableStoreHeader);\r
   while (IsValidVariableHeader (Variable)) {\r
     NextVariable = GetNextVariablePtr (Variable);\r
     if (Variable->State == VAR_ADDED) {\r
+      if (UpdatingVariable != NULL) {\r
+        if (UpdatingVariable == Variable) {\r
+          Variable = NextVariable;\r
+          continue;\r
+        }\r
+        if (CompareGuid (&Variable->VendorGuid, &UpdatingVariable->VendorGuid)    &&\r
+            NameSizeOfVariable(Variable) == NameSizeOfVariable (UpdatingVariable) &&\r
+            CompareMem (GetVariableNamePtr (Variable), GetVariableNamePtr (UpdatingVariable), NameSizeOfVariable (Variable)) == 0 ) {\r
+          Variable = NextVariable;\r
+          continue;\r
+        }\r
+      }\r
       VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
       CopyMem (CurrPtr, (UINT8 *) Variable, VariableSize);\r
       CurrPtr += VariableSize;\r
     }\r
-\r
     Variable = NextVariable;\r
   }\r
+\r
+  //\r
+  // Reinstall the variable being updated if it is not NULL\r
+  //\r
+  if (UpdatingVariable != NULL) {\r
+    VariableSize = (UINTN)(GetNextVariablePtr (UpdatingVariable)) - (UINTN)UpdatingVariable;\r
+    CopyMem (CurrPtr, (UINT8 *) UpdatingVariable, VariableSize);\r
+    CurrPtr += VariableSize;\r
+  }\r
+\r
   //\r
   // Reinstall all in delete transition variables\r
   // \r
   Variable      = GetStartPointer (VariableStoreHeader);\r
   while (IsValidVariableHeader (Variable)) {\r
     NextVariable = GetNextVariablePtr (Variable);\r
-    if (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
+    if (Variable != UpdatingVariable && Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
 \r
       //\r
       // Buffer has cached all ADDED variable. \r
@@ -693,12 +714,7 @@ Returns:
            ) {\r
           Point0 = (VOID *) GetVariableNamePtr (AddedVariable);\r
           Point1 = (VOID *) GetVariableNamePtr (Variable);\r
-          if (!CompareMem (\r
-                Point0,\r
-                Point1,\r
-                NameSizeOfVariable (AddedVariable)\r
-                )\r
-             ) {\r
+          if (CompareMem (Point0, Point1, NameSizeOfVariable (AddedVariable)) == 0) {\r
             FoundAdded = TRUE;\r
             break;\r
           }\r
@@ -706,11 +722,12 @@ Returns:
         AddedVariable = NextAddedVariable;\r
       }\r
       if (!FoundAdded) {\r
+        //\r
+        // Promote VAR_IN_DELETED_TRANSITION to VAR_ADDED\r
+        //\r
         VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
         CopyMem (CurrPtr, (UINT8 *) Variable, VariableSize);\r
-        if (Variable != UpdatingVariable) {\r
-          ((VARIABLE_HEADER *) CurrPtr)->State = VAR_ADDED;\r
-        }\r
+        ((VARIABLE_HEADER *) CurrPtr)->State = VAR_ADDED;\r
         CurrPtr += VariableSize;\r
       }\r
     }\r