]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Align the header of variable from 1 to 4, which can avoid the size of variable conten...
authoryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 10 Jan 2008 04:26:13 +0000 (04:26 +0000)
committeryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 10 Jan 2008 04:26:13 +0000 (04:26 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4543 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/VariablePei/Variable.c
IntelFrameworkModulePkg/Universal/VariablePei/Variable.h
MdeModulePkg/Include/VariableFormat.h
MdeModulePkg/Universal/Variable/Pei/Variable.c
MdeModulePkg/Universal/Variable/Pei/Variable.h
MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h

index 46c898609a85760168fe6a4b499b0f154e6dd0cf..e050fbcf9d3f3edea3a43744ee5a813e370f0082 100644 (file)
@@ -80,6 +80,59 @@ Returns:
 \r
 }\r
 \r
+\r
+UINT32\r
+NameSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->NameSize;\r
+}\r
+\r
+UINT32\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->DataSize;\r
+}\r
+\r
+UINT32\r
+AttributesOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->Attributes;\r
+}\r
+\r
 STATIC\r
 VARIABLE_HEADER *\r
 GetNextVariablePtr (\r
@@ -100,7 +153,7 @@ Returns:
 \r
 --*/\r
 {\r
-  return (VARIABLE_HEADER *) ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize));\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + DataSizeOfVariable (Variable) + GET_PAD_SIZE (DataSizeOfVariable (Variable)));\r
 }\r
 \r
 STATIC\r
@@ -124,10 +177,7 @@ Returns:
 \r
 --*/\r
 {\r
-  if (Variable == NULL ||\r
-      Variable->StartId != VARIABLE_DATA ||\r
-      (sizeof (VARIABLE_HEADER) + Variable->DataSize + Variable->NameSize) > MAX_VARIABLE_SIZE\r
-      ) {\r
+  if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
     return FALSE;\r
   }\r
 \r
@@ -221,7 +271,8 @@ Returns:
         (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
         (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
         ) {\r
-      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), Variable->NameSize)) {\r
+      ASSERT (NameSizeOfVariable (Variable) != 0);\r
+      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), NameSizeOfVariable (Variable))) {\r
         PtrTrack->CurrPtr = Variable;\r
         return EFI_SUCCESS;\r
       }\r
@@ -290,7 +341,6 @@ Returns:
     for (Count = 0; Count < IndexTable->Length; Count++)\r
     {\r
       MaxIndex = GetVariableByIndex (IndexTable, Count);\r
-\r
       if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {\r
         PtrTrack->StartPtr  = IndexTable->StartPtr;\r
         PtrTrack->EndPtr    = IndexTable->EndPtr;\r
@@ -429,7 +479,7 @@ Returns:
   //\r
   // Get data size\r
   //\r
-  VarDataSize = Variable.CurrPtr->DataSize;\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   if (*DataSize >= VarDataSize) {\r
     (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);\r
 \r
@@ -555,7 +605,9 @@ Returns:
   while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
     if (IsValidVariableHeader (Variable.CurrPtr)) {\r
       if (Variable.CurrPtr->State == VAR_ADDED) {\r
-        VarNameSize = (UINTN) Variable.CurrPtr->NameSize;\r
+        ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
+\r
+        VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
         if (VarNameSize <= *VariableNameSize) {\r
           (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);\r
 \r
index cc82b0fd5c840bb9d130dcab8e57df9013585e12..aeb49bca80f4f4c9729de4d3c54d07bff1cbee2c 100644 (file)
@@ -42,10 +42,12 @@ Abstract:
 #define GET_PAD_SIZE(a) (((~a) + 1) & (ALIGNMENT - 1))\r
 #endif\r
 \r
+#define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))\r
+\r
 #define GET_VARIABLE_NAME_PTR(a)  (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER))\r
 \r
 #define GET_VARIABLE_DATA_PTR(a) \\r
-  (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (a) + (a)->NameSize + GET_PAD_SIZE ((a)->NameSize))\r
+  (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (a) + NameSizeOfVariable(a) + GET_PAD_SIZE (NameSizeOfVariable(a) ))\r
 \r
 typedef struct {\r
   VARIABLE_HEADER *CurrPtr;\r
index c660134f0db534cf530389e27b3501879a5a7fa6..431f01bbb5b17ed3e83843860fb60c09c476ce13 100644 (file)
 // 8 is for IPF archtecture.\r
 //\r
 #if defined (MDE_CPU_IPF)\r
-#define ALIGNMENT  8\r
+#define ALIGNMENT         8\r
 #else\r
-#define ALIGNMENT  1\r
+#define ALIGNMENT         1\r
 #endif\r
 \r
+#define HEADER_ALIGNMENT  4\r
+\r
 //\r
 // Variable Store Status\r
 //\r
index 779a108ba123aab7e1e7ec75aedb50c4d91fae4c..ce79499746799fde4de1e4d740f369b0b1b3674e 100644 (file)
@@ -68,6 +68,111 @@ Returns:
 \r
 }\r
 \r
+VARIABLE_HEADER *\r
+GetStartPointer (\r
+  IN VARIABLE_STORE_HEADER       *VarStoreHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the first variable memory pointer byte\r
+\r
+Arguments:\r
+\r
+  VarStoreHeader        Pointer to the Variable Store Header.\r
+\r
+Returns:\r
+\r
+  VARIABLE_HEADER*      Pointer to last unavailable Variable Header\r
+\r
+--*/\r
+{\r
+  //\r
+  // The end of variable store\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);\r
+}\r
+\r
+VARIABLE_HEADER *\r
+GetEndPointer (\r
+  IN VARIABLE_STORE_HEADER       *VarStoreHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the last variable memory pointer byte\r
+\r
+Arguments:\r
+\r
+  VarStoreHeader        Pointer to the Variable Store Header.\r
+\r
+Returns:\r
+\r
+  VARIABLE_HEADER*      Pointer to last unavailable Variable Header\r
+\r
+--*/\r
+{\r
+  //\r
+  // The end of variable store\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
+}\r
+\r
+UINT32\r
+NameSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->NameSize;\r
+}\r
+\r
+UINT32\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->DataSize;\r
+}\r
+\r
+UINT32\r
+AttributesOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+{\r
+\r
+  //\r
+  // Check whether the header is valid fully;\r
+  // Tricky: The unprogramed data in FLASH equals 0xff.\r
+  // \r
+  if (Variable->DataSize == (UINT32) -1 || \r
+      Variable->Attributes == (UINT32) -1 || \r
+      Variable->NameSize == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return Variable->Attributes;\r
+}\r
+\r
+\r
 STATIC\r
 VARIABLE_HEADER *\r
 GetNextVariablePtr (\r
@@ -88,7 +193,7 @@ Returns:
 \r
 --*/\r
 {\r
-  return (VARIABLE_HEADER *) ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize));\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + DataSizeOfVariable (Variable) + GET_PAD_SIZE (DataSizeOfVariable (Variable)));\r
 }\r
 \r
 STATIC\r
@@ -112,10 +217,7 @@ Returns:
 \r
 --*/\r
 {\r
-  if (Variable == NULL ||\r
-      Variable->StartId != VARIABLE_DATA ||\r
-      (sizeof (VARIABLE_HEADER) + Variable->DataSize + Variable->NameSize) > MAX_VARIABLE_SIZE\r
-      ) {\r
+  if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
     return FALSE;\r
   }\r
 \r
@@ -209,7 +311,8 @@ Returns:
         (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
         (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
         ) {\r
-      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), Variable->NameSize)) {\r
+      ASSERT (NameSizeOfVariable (Variable) != 0);\r
+      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), NameSizeOfVariable (Variable))) {\r
         PtrTrack->CurrPtr = Variable;\r
         return EFI_SUCCESS;\r
       }\r
@@ -314,8 +417,8 @@ Returns:
       //\r
       // Find the variable by walk through non-volatile variable store\r
       //\r
-      IndexTable->StartPtr  = (VARIABLE_HEADER *) (VariableStoreHeader + 1);\r
-      IndexTable->EndPtr    = (VARIABLE_HEADER *) ((UINTN) VariableStoreHeader + VariableStoreHeader->Size);\r
+      IndexTable->StartPtr  = GetStartPointer (VariableStoreHeader);\r
+      IndexTable->EndPtr    = GetEndPointer (VariableStoreHeader);\r
 \r
       //\r
       // Start Pointers for the variable.\r
@@ -418,7 +521,7 @@ Returns:
   //\r
   // Get data size\r
   //\r
-  VarDataSize = Variable.CurrPtr->DataSize;\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   if (*DataSize >= VarDataSize) {\r
     (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);\r
 \r
@@ -494,7 +597,9 @@ Returns:
   while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
     if (IsValidVariableHeader (Variable.CurrPtr)) {\r
       if (Variable.CurrPtr->State == VAR_ADDED) {\r
-        VarNameSize = (UINTN) Variable.CurrPtr->NameSize;\r
+        ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
+\r
+        VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
         if (VarNameSize <= *VariableNameSize) {\r
           (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);\r
 \r
index 7155cda73c0a76f523d0adf2a797ad08876c0ab4..751f8bf84366f1d60c75b9bac94372dd958ac392 100644 (file)
@@ -41,10 +41,12 @@ Abstract:
 #define GET_PAD_SIZE(a) (((~a) + 1) & (ALIGNMENT - 1))\r
 #endif\r
 \r
+#define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))\r
+\r
 #define GET_VARIABLE_NAME_PTR(a)  (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER))\r
 \r
 #define GET_VARIABLE_DATA_PTR(a) \\r
-  (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (a) + (a)->NameSize + GET_PAD_SIZE ((a)->NameSize))\r
+  (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (a) + NameSizeOfVariable(a) + GET_PAD_SIZE (NameSizeOfVariable(a)))\r
 \r
 typedef struct {\r
   VARIABLE_HEADER *CurrPtr;\r
index 8b90bd5799f82eec3ab546513dd5edb944426751..e1fec9d62c6e31a3828ddc9bd68ca29e99dcfa8f 100644 (file)
@@ -152,7 +152,6 @@ UpdateVariableInfo (
 }\r
 \r
 \r
-\r
 BOOLEAN\r
 IsValidVariableHeader (\r
   IN  VARIABLE_HEADER   *Variable\r
@@ -475,9 +474,34 @@ Returns:
   //\r
   // Be careful about pad size for alignment\r
   //\r
-  return (VARIABLE_HEADER *) ((UINTN) GetVariableDataPtr (Variable) + DataSizeOfVariable (Variable) + GET_PAD_SIZE (DataSizeOfVariable (Variable)));\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (((UINTN) GetVariableDataPtr (Variable) + DataSizeOfVariable (Variable) + GET_PAD_SIZE (DataSizeOfVariable (Variable))));\r
 }\r
 \r
+VARIABLE_HEADER *\r
+GetStartPointer (\r
+  IN VARIABLE_STORE_HEADER       *VarStoreHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the first variable memory pointer byte\r
+\r
+Arguments:\r
+\r
+  VarStoreHeader        Pointer to the Variable Store Header.\r
+\r
+Returns:\r
+\r
+  VARIABLE_HEADER*      Pointer to last unavailable Variable Header\r
+\r
+--*/\r
+{\r
+  //\r
+  // The end of variable store\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);\r
+}\r
 \r
 VARIABLE_HEADER *\r
 GetEndPointer (\r
@@ -502,7 +526,7 @@ Returns:
   //\r
   // The end of variable store\r
   //\r
-  return (VARIABLE_HEADER *) ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
 }\r
 \r
 \r
@@ -545,8 +569,7 @@ Returns:
   //\r
   // Start Pointers for the variable.\r
   //\r
-  Variable        = (VARIABLE_HEADER *) (VariableStoreHeader + 1);\r
-\r
+  Variable        = GetStartPointer (VariableStoreHeader);\r
   ValidBufferSize = sizeof (VARIABLE_STORE_HEADER);\r
 \r
   while (IsValidVariableHeader (Variable)) {\r
@@ -572,12 +595,12 @@ Returns:
   // Copy variable store header\r
   //\r
   CopyMem (CurrPtr, VariableStoreHeader, sizeof (VARIABLE_STORE_HEADER));\r
-  CurrPtr += sizeof (VARIABLE_STORE_HEADER);\r
+  CurrPtr = (UINT8 *) GetStartPointer (VariableStoreHeader);\r
 \r
   //\r
   // Start Pointers for the variable.\r
   //\r
-  Variable = (VARIABLE_HEADER *) (VariableStoreHeader + 1);\r
+  Variable = GetStartPointer (VariableStoreHeader);\r
 \r
   while (IsValidVariableHeader (Variable)) {\r
     NextVariable = GetNextVariablePtr (Variable);\r
@@ -791,8 +814,8 @@ Returns:
   // Start Pointers for the variable.\r
   // Actual Data Pointer where data can be written.\r
   //\r
-  Variable[0] = (VARIABLE_HEADER *) (VariableStoreHeader[0] + 1);\r
-  Variable[1] = (VARIABLE_HEADER *) (VariableStoreHeader[1] + 1);\r
+  Variable[0] = GetStartPointer (VariableStoreHeader[0]);\r
+  Variable[1] = GetStartPointer (VariableStoreHeader[1]);\r
 \r
   if (VariableName[0] != 0 && VendorGuid == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -801,7 +824,7 @@ Returns:
   // Find the variable by walk through volatile and then non-volatile variable store\r
   //\r
   for (Index = 0; Index < 2; Index++) {\r
-    PtrTrack->StartPtr  = (VARIABLE_HEADER *) (VariableStoreHeader[Index] + 1);\r
+    PtrTrack->StartPtr  = GetStartPointer (VariableStoreHeader[Index]);\r
     PtrTrack->EndPtr    = GetEndPointer (VariableStoreHeader[Index]);\r
 \r
     while (IsValidVariableHeader (Variable[Index]) && (Variable[Index] <= GetEndPointer (VariableStoreHeader[Index]))) {\r
@@ -987,8 +1010,8 @@ RuntimeServiceGetNextVariableName (
     if (Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL) {\r
       Variable.Volatile = (BOOLEAN) (Variable.Volatile ^ ((BOOLEAN) 0x1));\r
       if (!Variable.Volatile) {\r
-        Variable.StartPtr = (VARIABLE_HEADER *) ((UINTN) (mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase + sizeof (VARIABLE_STORE_HEADER)));\r
-        Variable.EndPtr = (VARIABLE_HEADER *) GetEndPointer ((VARIABLE_STORE_HEADER *) ((UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase));\r
+        Variable.StartPtr = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase);\r
+        Variable.EndPtr   = GetEndPointer ((VARIABLE_STORE_HEADER *) ((UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase));\r
       } else {\r
         Status = EFI_NOT_FOUND;\r
         goto Done;\r
@@ -1135,16 +1158,11 @@ RuntimeServiceSetVariable (
   // Consider reentrant in MCA/INIT/NMI. It needs be reupdated;\r
   //\r
   if (1 < InterlockedIncrement (&mVariableModuleGlobal->VariableGlobal.ReentrantState)) {\r
-    {\r
-      volatile int tt = 1;\r
-      while (tt) {\r
-      }\r
-    }\r
     Point = mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase;;\r
     //\r
     // Parse non-volatile variable data and get last variable offset\r
     //\r
-    NextVariable  = (VARIABLE_HEADER *) (UINTN) (Point + sizeof (VARIABLE_STORE_HEADER));\r
+    NextVariable  = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point);\r
     while (IsValidVariableHeader (NextVariable)) {\r
       NextVariable = GetNextVariablePtr (NextVariable);\r
     }\r
@@ -1399,7 +1417,7 @@ RuntimeServiceSetVariable (
       goto Done;\r
     }\r
 \r
-    *NonVolatileOffset = *NonVolatileOffset + VarSize;\r
+    *NonVolatileOffset = HEADER_ALIGN (*NonVolatileOffset + VarSize);\r
 \r
   } else {\r
     //\r
@@ -1444,7 +1462,7 @@ RuntimeServiceSetVariable (
       goto Done;\r
     }\r
 \r
-    *VolatileOffset = *VolatileOffset + VarSize;\r
+    *VolatileOffset = HEADER_ALIGN (*VolatileOffset + VarSize);\r
   }\r
   //\r
   // Mark the old variable as deleted\r
@@ -1580,7 +1598,7 @@ RuntimeServiceQueryVariableInfo (
   //\r
   // Point to the starting address of the variables.\r
   //\r
-  Variable = (VARIABLE_HEADER *) (VariableStoreHeader + 1);\r
+  Variable = GetStartPointer (VariableStoreHeader);\r
 \r
   //\r
   // Now walk through the related variable store.\r
@@ -1684,7 +1702,7 @@ Returns:
   //  Variable Specific Data\r
   //\r
   mVariableModuleGlobal->VariableGlobal.VolatileVariableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VolatileVariableStore;\r
-  mVariableModuleGlobal->VolatileLastVariableOffset = sizeof (VARIABLE_STORE_HEADER);\r
+  mVariableModuleGlobal->VolatileLastVariableOffset = (UINTN) GetStartPointer (VolatileVariableStore) - (UINTN) VolatileVariableStore;\r
 \r
   VolatileVariableStore->Signature                  = VARIABLE_STORE_SIGNATURE;\r
   VolatileVariableStore->Size                       = VARIABLE_STORE_SIZE;\r
@@ -1780,7 +1798,7 @@ Returns:
     //\r
     // Parse non-volatile variable data and get last variable offset\r
     //\r
-    NextVariable  = (VARIABLE_HEADER *) (CurrPtr + sizeof (VARIABLE_STORE_HEADER));\r
+    NextVariable  = GetStartPointer ((VARIABLE_STORE_HEADER *) CurrPtr);\r
     Status        = EFI_SUCCESS;\r
 \r
     while (IsValidVariableHeader (NextVariable)) {\r
index 2661313b9d8a026b32fe9114c82d234216e675ff..b756fc6454bfa6d4628246764e3760b6f3610c1c 100644 (file)
@@ -57,6 +57,8 @@ Abstract:
 #define GET_PAD_SIZE(a) (((~a) + 1) & (ALIGNMENT - 1))\r
 #endif\r
 \r
+#define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))\r
+\r
 #define GET_VARIABLE_NAME_PTR(a)  (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER))\r
 \r
 \r