\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
\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
\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
(((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
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
//\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
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
#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
// 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
\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
\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
\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
(((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
//\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
//\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
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
#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
}\r
\r
\r
-\r
BOOLEAN\r
IsValidVariableHeader (\r
IN VARIABLE_HEADER *Variable\r
//\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
//\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
//\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
// 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
// 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
// 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
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
// 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
goto Done;\r
}\r
\r
- *NonVolatileOffset = *NonVolatileOffset + VarSize;\r
+ *NonVolatileOffset = HEADER_ALIGN (*NonVolatileOffset + VarSize);\r
\r
} else {\r
//\r
goto Done;\r
}\r
\r
- *VolatileOffset = *VolatileOffset + VarSize;\r
+ *VolatileOffset = HEADER_ALIGN (*VolatileOffset + VarSize);\r
}\r
//\r
// Mark the old variable as deleted\r
//\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
// 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
//\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
#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