1) Replace MACRO with C functions.
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
This commit is contained in:
@@ -80,27 +80,56 @@ Returns:
|
||||
|
||||
}
|
||||
|
||||
STATIC
|
||||
VARIABLE_HEADER *
|
||||
GetNextVariablePtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
GetStartPointer (
|
||||
IN VARIABLE_STORE_HEADER *VarStoreHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code checks if variable header is valid or not.
|
||||
This code gets the pointer to the first variable memory pointer byte
|
||||
|
||||
Arguments:
|
||||
Variable Pointer to the Variable Header.
|
||||
|
||||
VarStoreHeader Pointer to the Variable Store Header.
|
||||
|
||||
Returns:
|
||||
TRUE Variable header is valid.
|
||||
FALSE Variable header is not valid.
|
||||
|
||||
VARIABLE_HEADER* Pointer to last unavailable Variable Header
|
||||
|
||||
--*/
|
||||
{
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + DATASIZE_OF_VARIABLE (Variable) + GET_PAD_SIZE (DATASIZE_OF_VARIABLE (Variable)));
|
||||
//
|
||||
// The end of variable store
|
||||
//
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);
|
||||
}
|
||||
|
||||
VARIABLE_HEADER *
|
||||
GetEndPointer (
|
||||
IN VARIABLE_STORE_HEADER *VarStoreHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code gets the pointer to the last variable memory pointer byte
|
||||
|
||||
Arguments:
|
||||
|
||||
VarStoreHeader Pointer to the Variable Store Header.
|
||||
|
||||
Returns:
|
||||
|
||||
VARIABLE_HEADER* Pointer to last unavailable Variable Header
|
||||
|
||||
--*/
|
||||
{
|
||||
//
|
||||
// The end of variable store
|
||||
//
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);
|
||||
}
|
||||
|
||||
STATIC
|
||||
@@ -131,6 +160,159 @@ Returns:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
UINTN
|
||||
NameSizeOfVariable (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code gets the size of name of variable.
|
||||
|
||||
Arguments:
|
||||
|
||||
Variable Pointer to the Variable Header.
|
||||
|
||||
Returns:
|
||||
|
||||
UINTN Size of variable in bytes
|
||||
|
||||
--*/
|
||||
{
|
||||
if (Variable->State == (UINT8) (-1) ||
|
||||
Variable->DataSize == (UINT32) -1 ||
|
||||
Variable->NameSize == (UINT32) -1 ||
|
||||
Variable->Attributes == (UINT32) -1) {
|
||||
return 0;
|
||||
}
|
||||
return (UINTN) Variable->NameSize;
|
||||
}
|
||||
|
||||
UINTN
|
||||
DataSizeOfVariable (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code gets the size of name of variable.
|
||||
|
||||
Arguments:
|
||||
|
||||
Variable Pointer to the Variable Header.
|
||||
|
||||
Returns:
|
||||
|
||||
UINTN Size of variable in bytes
|
||||
|
||||
--*/
|
||||
{
|
||||
if (Variable->State == (UINT8) -1 ||
|
||||
Variable->DataSize == (UINT32) -1 ||
|
||||
Variable->NameSize == (UINT32) -1 ||
|
||||
Variable->Attributes == (UINT32) -1) {
|
||||
return 0;
|
||||
}
|
||||
return (UINTN) Variable->DataSize;
|
||||
}
|
||||
|
||||
CHAR16 *
|
||||
GetVariableNamePtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code gets the pointer to the variable name.
|
||||
|
||||
Arguments:
|
||||
|
||||
Variable Pointer to the Variable Header.
|
||||
|
||||
Returns:
|
||||
|
||||
CHAR16* Pointer to Variable Name
|
||||
|
||||
--*/
|
||||
{
|
||||
|
||||
return (CHAR16 *) (Variable + 1);
|
||||
}
|
||||
|
||||
|
||||
UINT8 *
|
||||
GetVariableDataPtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code gets the pointer to the variable data.
|
||||
|
||||
Arguments:
|
||||
|
||||
Variable Pointer to the Variable Header.
|
||||
|
||||
Returns:
|
||||
|
||||
UINT8* Pointer to Variable Data
|
||||
|
||||
--*/
|
||||
{
|
||||
UINTN Value;
|
||||
|
||||
//
|
||||
// Be careful about pad size for alignment
|
||||
//
|
||||
Value = (UINTN) GetVariableNamePtr (Variable);
|
||||
Value += NameSizeOfVariable (Variable);
|
||||
Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));
|
||||
|
||||
return (UINT8 *) Value;
|
||||
}
|
||||
|
||||
VARIABLE_HEADER *
|
||||
GetNextVariablePtr (
|
||||
IN VARIABLE_HEADER *Variable
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
This code gets the pointer to the next variable header.
|
||||
|
||||
Arguments:
|
||||
|
||||
Variable Pointer to the Variable Header.
|
||||
|
||||
Returns:
|
||||
|
||||
VARIABLE_HEADER* Pointer to next variable header.
|
||||
|
||||
--*/
|
||||
{
|
||||
UINTN Value;
|
||||
|
||||
if (!IsValidVariableHeader (Variable)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Value = (UINTN) GetVariableDataPtr (Variable);
|
||||
Value += DataSizeOfVariable (Variable);
|
||||
Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));
|
||||
|
||||
//
|
||||
// Be careful about pad size for alignment
|
||||
//
|
||||
return (VARIABLE_HEADER *) HEADER_ALIGN (Value);
|
||||
}
|
||||
|
||||
|
||||
STATIC
|
||||
VARIABLE_STORE_STATUS
|
||||
EFIAPI
|
||||
@@ -204,6 +386,8 @@ Returns:
|
||||
|
||||
--*/
|
||||
{
|
||||
VOID *Point;
|
||||
|
||||
if (VariableName[0] == 0) {
|
||||
PtrTrack->CurrPtr = Variable;
|
||||
return EFI_SUCCESS;
|
||||
@@ -218,8 +402,9 @@ Returns:
|
||||
(((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&
|
||||
(((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])
|
||||
) {
|
||||
ASSERT (NAMESIZE_OF_VARIABLE (Variable) != 0);
|
||||
if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), NAMESIZE_OF_VARIABLE (Variable))) {
|
||||
ASSERT (NameSizeOfVariable (Variable) != 0);
|
||||
Point = (VOID *) GetVariableNamePtr (Variable);
|
||||
if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {
|
||||
PtrTrack->CurrPtr = Variable;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -288,6 +473,7 @@ Returns:
|
||||
for (Count = 0; Count < IndexTable->Length; Count++)
|
||||
{
|
||||
MaxIndex = GetVariableByIndex (IndexTable, Count);
|
||||
|
||||
if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {
|
||||
PtrTrack->StartPtr = IndexTable->StartPtr;
|
||||
PtrTrack->EndPtr = IndexTable->EndPtr;
|
||||
@@ -323,8 +509,8 @@ Returns:
|
||||
//
|
||||
// Find the variable by walk through non-volatile variable store
|
||||
//
|
||||
IndexTable->StartPtr = (VARIABLE_HEADER *) (VariableStoreHeader + 1);
|
||||
IndexTable->EndPtr = (VARIABLE_HEADER *) ((UINTN) VariableStoreHeader + VariableStoreHeader->Size);
|
||||
IndexTable->StartPtr = GetStartPointer (VariableStoreHeader);
|
||||
IndexTable->EndPtr = GetEndPointer (VariableStoreHeader);
|
||||
|
||||
//
|
||||
// Start Pointers for the variable.
|
||||
@@ -426,9 +612,9 @@ Returns:
|
||||
//
|
||||
// Get data size
|
||||
//
|
||||
VarDataSize = DATASIZE_OF_VARIABLE (Variable.CurrPtr);
|
||||
VarDataSize = DataSizeOfVariable (Variable.CurrPtr);
|
||||
if (*DataSize >= VarDataSize) {
|
||||
(*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize);
|
||||
(*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);
|
||||
|
||||
if (Attributes != NULL) {
|
||||
*Attributes = Variable.CurrPtr->Attributes;
|
||||
@@ -552,11 +738,11 @@ Returns:
|
||||
while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {
|
||||
if (IsValidVariableHeader (Variable.CurrPtr)) {
|
||||
if (Variable.CurrPtr->State == VAR_ADDED) {
|
||||
ASSERT (NAMESIZE_OF_VARIABLE (Variable.CurrPtr) != 0);
|
||||
ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);
|
||||
|
||||
VarNameSize = (UINTN) NAMESIZE_OF_VARIABLE (Variable.CurrPtr);
|
||||
VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);
|
||||
if (VarNameSize <= *VariableNameSize) {
|
||||
(*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize);
|
||||
(*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);
|
||||
|
||||
(*PeiServices)->CopyMem (VendorGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));
|
||||
|
||||
|
Reference in New Issue
Block a user