]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Replace MACRO with C functions.
authoryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 14 Jan 2008 06:35:23 +0000 (06:35 +0000)
committeryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 14 Jan 2008 06:35:23 +0000 (06:35 +0000)
2) Add HEADER_VALID_ONLY state of variable, which represents only the header is valid and the data/name is stale. This may be caused by incomplete data updating. Adding the state helps to check whether the header is valid. If variable header is valid, then we must skip the data of variable with the valid size. If the header is invalid, we should only skip the header of variable.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4555 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 3751845fbf998851a8083574cc4eb6d1595e08ea..72d8fd1252ec61096e403b567449e71cbb11b70d 100644 (file)
@@ -80,27 +80,56 @@ Returns:
 \r
 }\r
 \r
-STATIC\r
 VARIABLE_HEADER *\r
-GetNextVariablePtr (\r
-  IN VARIABLE_HEADER  *Variable\r
+GetStartPointer (\r
+  IN VARIABLE_STORE_HEADER       *VarStoreHeader\r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
-  This code checks if variable header is valid or not.\r
+  This code gets the pointer to the first variable memory pointer byte\r
 \r
 Arguments:\r
-  Variable       Pointer to the Variable Header.\r
+\r
+  VarStoreHeader        Pointer to the Variable Store Header.\r
 \r
 Returns:\r
-  TRUE            Variable header is valid.\r
-  FALSE           Variable header is not valid.\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
-  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + DATASIZE_OF_VARIABLE (Variable) + GET_PAD_SIZE (DATASIZE_OF_VARIABLE (Variable)));\r
+  //\r
+  // The end of variable store\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
 }\r
 \r
 STATIC\r
@@ -131,6 +160,159 @@ Returns:
   return TRUE;\r
 }\r
 \r
+\r
+UINTN\r
+NameSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8) (-1) ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->NameSize;\r
+}\r
+\r
+UINTN\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8)  -1 ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->DataSize;\r
+}\r
+\r
+CHAR16 *\r
+GetVariableNamePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable name.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  CHAR16*              Pointer to Variable Name\r
+\r
+--*/\r
+{\r
+\r
+  return (CHAR16 *) (Variable + 1);\r
+}\r
+\r
+\r
+UINT8 *\r
+GetVariableDataPtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable data.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINT8*              Pointer to Variable Data\r
+\r
+--*/\r
+{\r
+  UINTN Value;\r
+  \r
+  //\r
+  // Be careful about pad size for alignment\r
+  //\r
+  Value =  (UINTN) GetVariableNamePtr (Variable);\r
+  Value += NameSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));\r
+\r
+  return (UINT8 *) Value;\r
+}\r
+\r
+VARIABLE_HEADER *\r
+GetNextVariablePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the next variable header.\r
+\r
+Arguments:\r
+\r
+  Variable              Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  VARIABLE_HEADER*      Pointer to next variable header.\r
+\r
+--*/\r
+{\r
+  UINTN Value;\r
+\r
+  if (!IsValidVariableHeader (Variable)) {\r
+    return NULL;\r
+  }\r
+\r
+  Value =  (UINTN) GetVariableDataPtr (Variable);\r
+  Value += DataSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));\r
+\r
+  //\r
+  // Be careful about pad size for alignment\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (Value);\r
+}\r
+\r
+\r
 STATIC\r
 VARIABLE_STORE_STATUS\r
 EFIAPI\r
@@ -204,6 +386,8 @@ Returns:
 \r
 --*/\r
 {\r
+  VOID  *Point;\r
+\r
   if (VariableName[0] == 0) {\r
     PtrTrack->CurrPtr = Variable;\r
     return EFI_SUCCESS;\r
@@ -218,8 +402,9 @@ Returns:
         (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
         (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
         ) {\r
-      ASSERT (NAMESIZE_OF_VARIABLE (Variable) != 0);\r
-      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), NAMESIZE_OF_VARIABLE (Variable))) {\r
+      ASSERT (NameSizeOfVariable (Variable) != 0);\r
+      Point = (VOID *) GetVariableNamePtr (Variable);\r
+      if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
         PtrTrack->CurrPtr = Variable;\r
         return EFI_SUCCESS;\r
       }\r
@@ -288,6 +473,7 @@ 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
@@ -323,8 +509,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
@@ -426,9 +612,9 @@ Returns:
   //\r
   // Get data size\r
   //\r
-  VarDataSize = DATASIZE_OF_VARIABLE (Variable.CurrPtr);\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   if (*DataSize >= VarDataSize) {\r
-    (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);\r
+    (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
 \r
     if (Attributes != NULL) {\r
       *Attributes = Variable.CurrPtr->Attributes;\r
@@ -552,11 +738,11 @@ Returns:
   while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
     if (IsValidVariableHeader (Variable.CurrPtr)) {\r
       if (Variable.CurrPtr->State == VAR_ADDED) {\r
-        ASSERT (NAMESIZE_OF_VARIABLE (Variable.CurrPtr) != 0);\r
+        ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
 \r
-        VarNameSize = (UINTN) NAMESIZE_OF_VARIABLE (Variable.CurrPtr);\r
+        VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
         if (VarNameSize <= *VariableNameSize) {\r
-          (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);\r
+          (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
 \r
           (*PeiServices)->CopyMem (VendorGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
 \r
index 2f586c6f4ac99da333e57bb65d8293c4490927ca..0e37be5292bb31d9dd34c61cedb8d42759f6cafb 100644 (file)
@@ -44,27 +44,6 @@ Abstract:
 \r
 #define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))\r
 \r
-#define NAMESIZE_OF_VARIABLE(Variable)  \\r
-          ((((Variable)->DataSize == (UINT32) -1) || \\r
-          ((Variable)->Attributes == (UINT32) -1) || \\r
-          ((Variable)->NameSize == (UINT32) -1)) ? \\r
-          0 : \\r
-          (Variable)->NameSize \\r
-          )\r
-\r
-#define DATASIZE_OF_VARIABLE(Variable)  \\r
-          ((((Variable)->DataSize == (UINT32) -1) || \\r
-          ((Variable)->Attributes == (UINT32) -1) || \\r
-          ((Variable)->NameSize == (UINT32) -1)) ? \\r
-          0 : \\r
-          (Variable)->DataSize \\r
-          )\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) + NAMESIZE_OF_VARIABLE(a) + GET_PAD_SIZE (NAMESIZE_OF_VARIABLE(a)))\r
-\r
 typedef struct {\r
   VARIABLE_HEADER *CurrPtr;\r
   VARIABLE_HEADER *EndPtr;\r
index 431f01bbb5b17ed3e83843860fb60c09c476ce13..bdc33ecb5427efd4e5f22c4ce19821e30f3ca575 100644 (file)
@@ -60,7 +60,9 @@ typedef enum {
 //\r
 #define VAR_IN_DELETED_TRANSITION     0xfe  // Variable is in obsolete transistion\r
 #define VAR_DELETED                   0xfd  // Variable is obsolete\r
-#define VAR_ADDED                     0x7f  // Variable has been completely added\r
+#define VAR_HEADER_VALID_ONLY         0x7f  // Variable header has been valid\r
+#define VAR_ADDED                     0x3f  // Variable has been completely added\r
+                                            // \r
 #define IS_VARIABLE_STATE(_c, _Mask)  (BOOLEAN) (((~_c) & (~_Mask)) != 0)\r
 \r
 #pragma pack(1)\r
index d1165e1fe599af6407e76e8e14a9d1e08dd46b92..92e690724d539e88868f8accb5a4a64383f20669 100644 (file)
@@ -121,9 +121,10 @@ Returns:
 }\r
 \r
 STATIC\r
-VARIABLE_HEADER *\r
-GetNextVariablePtr (\r
-  IN VARIABLE_HEADER  *Variable\r
+BOOLEAN\r
+EFIAPI\r
+IsValidVariableHeader (\r
+  IN  VARIABLE_HEADER   *Variable\r
   )\r
 /*++\r
 \r
@@ -132,7 +133,7 @@ Routine Description:
   This code checks if variable header is valid or not.\r
 \r
 Arguments:\r
-  Variable       Pointer to the Variable Header.\r
+  Variable              Pointer to the Variable Header.\r
 \r
 Returns:\r
   TRUE            Variable header is valid.\r
@@ -140,37 +141,166 @@ Returns:
 \r
 --*/\r
 {\r
-  return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + DATASIZE_OF_VARIABLE (Variable) + GET_PAD_SIZE (DATASIZE_OF_VARIABLE (Variable)));\r
+  if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
 }\r
 \r
-STATIC\r
-BOOLEAN\r
-EFIAPI\r
-IsValidVariableHeader (\r
+\r
+UINTN\r
+NameSizeOfVariable (\r
   IN  VARIABLE_HEADER   *Variable\r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
-  This code checks if variable header is valid or not.\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8) (-1) ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->NameSize;\r
+}\r
+\r
+UINTN\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8)  -1 ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->DataSize;\r
+}\r
+\r
+CHAR16 *\r
+GetVariableNamePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable name.\r
 \r
 Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  CHAR16*              Pointer to Variable Name\r
+\r
+--*/\r
+{\r
+\r
+  return (CHAR16 *) (Variable + 1);\r
+}\r
+\r
+\r
+UINT8 *\r
+GetVariableDataPtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable data.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINT8*              Pointer to Variable Data\r
+\r
+--*/\r
+{\r
+  UINTN Value;\r
+  \r
+  //\r
+  // Be careful about pad size for alignment\r
+  //\r
+  Value =  (UINTN) GetVariableNamePtr (Variable);\r
+  Value += NameSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));\r
+\r
+  return (UINT8 *) Value;\r
+}\r
+\r
+VARIABLE_HEADER *\r
+GetNextVariablePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the next variable header.\r
+\r
+Arguments:\r
+\r
   Variable              Pointer to the Variable Header.\r
 \r
 Returns:\r
-  TRUE            Variable header is valid.\r
-  FALSE           Variable header is not valid.\r
+\r
+  VARIABLE_HEADER*      Pointer to next variable header.\r
 \r
 --*/\r
 {\r
-  if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
-    return FALSE;\r
+  UINTN Value;\r
+\r
+  if (!IsValidVariableHeader (Variable)) {\r
+    return NULL;\r
   }\r
 \r
-  return TRUE;\r
+  Value =  (UINTN) GetVariableDataPtr (Variable);\r
+  Value += DataSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));\r
+\r
+  //\r
+  // Be careful about pad size for alignment\r
+  //\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (Value);\r
 }\r
 \r
+\r
 STATIC\r
 VARIABLE_STORE_STATUS\r
 EFIAPI\r
@@ -244,6 +374,8 @@ Returns:
 \r
 --*/\r
 {\r
+  VOID  *Point;\r
+\r
   if (VariableName[0] == 0) {\r
     PtrTrack->CurrPtr = Variable;\r
     return EFI_SUCCESS;\r
@@ -258,8 +390,9 @@ Returns:
         (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
         (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
         ) {\r
-      ASSERT (NAMESIZE_OF_VARIABLE (Variable) != 0);\r
-      if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), NAMESIZE_OF_VARIABLE (Variable))) {\r
+      ASSERT (NameSizeOfVariable (Variable) != 0);\r
+      Point = (VOID *) GetVariableNamePtr (Variable);\r
+      if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
         PtrTrack->CurrPtr = Variable;\r
         return EFI_SUCCESS;\r
       }\r
@@ -468,9 +601,9 @@ Returns:
   //\r
   // Get data size\r
   //\r
-  VarDataSize = DATASIZE_OF_VARIABLE (Variable.CurrPtr);\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   if (*DataSize >= VarDataSize) {\r
-    (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);\r
+    (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
 \r
     if (Attributes != NULL) {\r
       *Attributes = Variable.CurrPtr->Attributes;\r
@@ -544,11 +677,11 @@ Returns:
   while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
     if (IsValidVariableHeader (Variable.CurrPtr)) {\r
       if (Variable.CurrPtr->State == VAR_ADDED) {\r
-        ASSERT (NAMESIZE_OF_VARIABLE (Variable.CurrPtr) != 0);\r
+        ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
 \r
-        VarNameSize = (UINTN) NAMESIZE_OF_VARIABLE (Variable.CurrPtr);\r
+        VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
         if (VarNameSize <= *VariableNameSize) {\r
-          (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);\r
+          (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
 \r
           (*PeiServices)->CopyMem (VariableGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
 \r
index 73e1b7afdb4fc00c36a8f3338047f6663f17b473..965f722f38fbb5d897e7ff6d4b786c897bbf226b 100644 (file)
@@ -43,27 +43,6 @@ Abstract:
 \r
 #define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))\r
 \r
-#define NAMESIZE_OF_VARIABLE(Variable)  \\r
-          ((((Variable)->DataSize == (UINT32) -1) || \\r
-          ((Variable)->Attributes == (UINT32) -1) || \\r
-          ((Variable)->NameSize == (UINT32) -1)) ? \\r
-          0 : \\r
-          (Variable)->NameSize \\r
-          )\r
-\r
-#define DATASIZE_OF_VARIABLE(Variable)  \\r
-          ((((Variable)->DataSize == (UINT32) -1) || \\r
-          ((Variable)->Attributes == (UINT32) -1) || \\r
-          ((Variable)->NameSize == (UINT32) -1)) ? \\r
-          0 : \\r
-          (Variable)->DataSize \\r
-          )\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) + NAMESIZE_OF_VARIABLE(a) + GET_PAD_SIZE (NAMESIZE_OF_VARIABLE(a)))\r
-\r
 typedef struct {\r
   VARIABLE_HEADER *CurrPtr;\r
   VARIABLE_HEADER *EndPtr;\r
index d7cb0cd71c1908c79f726b3732c4918a0b98c9cd..9ff417230a90616e2fb1f0fb862e8feabcff31f1 100644 (file)
@@ -367,6 +367,89 @@ Returns:
   }\r
 }\r
 \r
+\r
+UINTN\r
+NameSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8) (-1) ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->NameSize;\r
+}\r
+\r
+UINTN\r
+DataSizeOfVariable (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the size of name of variable.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  UINTN               Size of variable in bytes\r
+\r
+--*/\r
+{\r
+  if (Variable->State    == (UINT8)  -1 ||\r
+      Variable->DataSize == (UINT32) -1 ||\r
+      Variable->NameSize == (UINT32) -1 ||\r
+      Variable->Attributes == (UINT32) -1) {\r
+    return 0;\r
+  }\r
+  return (UINTN) Variable->DataSize;\r
+}\r
+\r
+CHAR16 *\r
+GetVariableNamePtr (\r
+  IN  VARIABLE_HEADER   *Variable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This code gets the pointer to the variable name.\r
+\r
+Arguments:\r
+\r
+  Variable            Pointer to the Variable Header.\r
+\r
+Returns:\r
+\r
+  CHAR16*              Pointer to Variable Name\r
+\r
+--*/\r
+{\r
+\r
+  return (CHAR16 *) (Variable + 1);\r
+}\r
+\r
 UINT8 *\r
 GetVariableDataPtr (\r
   IN  VARIABLE_HEADER   *Variable\r
@@ -387,10 +470,16 @@ Returns:
 \r
 --*/\r
 {\r
+  UINTN Value;\r
+  \r
   //\r
   // Be careful about pad size for alignment\r
   //\r
-  return (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (Variable) + NAMESIZE_OF_VARIABLE (Variable) + GET_PAD_SIZE (NAMESIZE_OF_VARIABLE (Variable)));\r
+  Value =  (UINTN) GetVariableNamePtr (Variable);\r
+  Value += NameSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));\r
+\r
+  return (UINT8 *) Value;\r
 }\r
 \r
 \r
@@ -414,13 +503,20 @@ Returns:
 \r
 --*/\r
 {\r
+  UINTN Value;\r
+\r
   if (!IsValidVariableHeader (Variable)) {\r
     return NULL;\r
   }\r
+\r
+  Value =  (UINTN) GetVariableDataPtr (Variable);\r
+  Value += DataSizeOfVariable (Variable);\r
+  Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));\r
+\r
   //\r
   // Be careful about pad size for alignment\r
   //\r
-  return (VARIABLE_HEADER *) HEADER_ALIGN (((UINTN) GetVariableDataPtr (Variable) + DATASIZE_OF_VARIABLE (Variable) + GET_PAD_SIZE (DATASIZE_OF_VARIABLE (Variable))));\r
+  return (VARIABLE_HEADER *) HEADER_ALIGN (Value);\r
 }\r
 \r
 VARIABLE_HEADER *\r
@@ -747,6 +843,7 @@ Returns:
   VARIABLE_HEADER       *Variable[2];\r
   VARIABLE_STORE_HEADER *VariableStoreHeader[2];\r
   UINTN                 Index;\r
+  VOID                  *Point;\r
 \r
   //\r
   // 0: Volatile, 1: Non-Volatile\r
@@ -782,8 +879,10 @@ Returns:
             return EFI_SUCCESS;\r
           } else {\r
             if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) {\r
-              ASSERT (NAMESIZE_OF_VARIABLE (Variable[Index]) != 0);\r
-              if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable[Index]), NAMESIZE_OF_VARIABLE (Variable[Index]))) {\r
+              Point = (VOID *) GetVariableNamePtr (Variable[Index]);\r
+\r
+              ASSERT (NameSizeOfVariable (Variable[Index]) != 0);\r
+              if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable[Index]))) {\r
                 PtrTrack->CurrPtr   = Variable[Index];\r
                 PtrTrack->Volatile  = (BOOLEAN)(Index == 0);\r
                 return EFI_SUCCESS;\r
@@ -866,7 +965,7 @@ RuntimeServiceGetVariable (
   //\r
   // Get data size\r
   //\r
-  VarDataSize = DATASIZE_OF_VARIABLE (Variable.CurrPtr);\r
+  VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
   ASSERT (VarDataSize != 0);\r
 \r
   if (*DataSize >= VarDataSize) {\r
@@ -973,13 +1072,13 @@ RuntimeServiceGetNextVariableName (
     //\r
     if (IsValidVariableHeader (Variable.CurrPtr) && Variable.CurrPtr->State == VAR_ADDED) {\r
       if (!(EfiAtRuntime () && !(Variable.CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS))) {\r
-        VarNameSize = NAMESIZE_OF_VARIABLE (Variable.CurrPtr);\r
+        VarNameSize = NameSizeOfVariable (Variable.CurrPtr);\r
         ASSERT (VarNameSize != 0);\r
 \r
         if (VarNameSize <= *VariableNameSize) {\r
           CopyMem (\r
             VariableName,\r
-            GET_VARIABLE_NAME_PTR (Variable.CurrPtr),\r
+            GetVariableNamePtr (Variable.CurrPtr),\r
             VarNameSize\r
             );\r
           CopyMem (\r
@@ -1174,7 +1273,7 @@ RuntimeServiceSetVariable (
     // If the variable is marked valid and the same data has been passed in\r
     // then return to the caller immediately.\r
     //\r
-    if (DATASIZE_OF_VARIABLE (Variable.CurrPtr) == DataSize &&\r
+    if (DataSizeOfVariable (Variable.CurrPtr) == DataSize &&\r
         (CompareMem (Data, GetVariableDataPtr (Variable.CurrPtr), DataSize) == 0)) {\r
       \r
       UpdateVariableInfo (VariableName, VendorGuid, Volatile, FALSE, TRUE, FALSE, FALSE);\r
@@ -1310,8 +1409,9 @@ RuntimeServiceSetVariable (
     //\r
     // Three steps\r
     // 1. Write variable header\r
-    // 2. Write variable data\r
-    // 3. Set variable state to valid\r
+    // 2. Set variable state to header valid  \r
+    // 3. Write variable data\r
+    // 4. Set variable state to valid\r
     //\r
     //\r
     // Step 1:\r
@@ -1329,9 +1429,27 @@ RuntimeServiceSetVariable (
     if (EFI_ERROR (Status)) {\r
       goto Done;\r
     }\r
+\r
     //\r
     // Step 2:\r
     //\r
+    NextVariable->State = VAR_HEADER_VALID_ONLY;\r
+    Status = UpdateVariableStore (\r
+               &mVariableModuleGlobal->VariableGlobal,\r
+               FALSE,\r
+               TRUE,\r
+               Instance,\r
+               *NonVolatileOffset,\r
+               sizeof (VARIABLE_HEADER),\r
+               (UINT8 *) NextVariable\r
+               );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+    //\r
+    // Step 3:\r
+    //\r
     Status = UpdateVariableStore (\r
                &mVariableModuleGlobal->VariableGlobal,\r
                FALSE,\r
@@ -1346,7 +1464,7 @@ RuntimeServiceSetVariable (
       goto Done;\r
     }\r
     //\r
-    // Step 3:\r
+    // Step 4:\r
     //\r
     NextVariable->State = VAR_ADDED;\r
     Status = UpdateVariableStore (\r
index 09a184d478cc2fff61ba7327043db8e3281537b8..f8a4e058f59d1b899bebfc0f537598f9d7fb41ad 100644 (file)
@@ -59,24 +59,6 @@ Abstract:
 \r
 #define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))\r
 \r
-#define NAMESIZE_OF_VARIABLE(Variable)  \\r
-          ((((Variable)->DataSize == (UINT32) -1) || \\r
-          ((Variable)->Attributes == (UINT32) -1) || \\r
-          ((Variable)->NameSize == (UINT32) -1)) ? \\r
-          0 : \\r
-          (Variable)->NameSize \\r
-          )\r
-\r
-#define DATASIZE_OF_VARIABLE(Variable)  \\r
-          ((((Variable)->DataSize == (UINT32) -1) || \\r
-          ((Variable)->Attributes == (UINT32) -1) || \\r
-          ((Variable)->NameSize == (UINT32) -1)) ? \\r
-          0 : \\r
-          (Variable)->DataSize \\r
-          )\r
-\r
-#define GET_VARIABLE_NAME_PTR(a)  (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER))\r
-\r
 \r
 typedef struct {\r
   VARIABLE_HEADER *CurrPtr;\r