}\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
\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
\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
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
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
//\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
//\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
// 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
//\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
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
goto Done;\r
}\r
//\r
- // Step 3:\r
+ // Step 4:\r
//\r
NextVariable->State = VAR_ADDED;\r
Status = UpdateVariableStore (\r