VariableServiceSetVariable() should also check authenticate data to avoid buffer overflow,\r
integer overflow. It should also check attribute to avoid authentication bypass.\r
\r
-Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2015-2018 Hewlett Packard Enterprise Development LP<BR>\r
+Copyright (c) Microsoft Corporation.<BR>\r
+\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "Variable.h"\r
+#include "VariableNonVolatile.h"\r
#include "VariableParsing.h"\r
+#include "VariableRuntimeCache.h"\r
\r
VARIABLE_MODULE_GLOBAL *mVariableModuleGlobal;\r
\r
FALSE\r
);\r
if (!EFI_ERROR (Status)) {\r
- VarErrFlag = (VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr);\r
+ VarErrFlag = (VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
TempFlag = *VarErrFlag;\r
TempFlag &= Flag;\r
if (TempFlag == *VarErrFlag) {\r
// Update the data in NV cache.\r
//\r
*VarErrFlag = TempFlag;\r
+ Status = SynchronizeRuntimeVariableCache (\r
+ &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache,\r
+ 0,\r
+ mNvVariableCache->Size\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
}\r
}\r
FALSE\r
);\r
if (!EFI_ERROR (Status)) {\r
- VarErrFlag = *((VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr));\r
+ VarErrFlag = *((VAR_ERROR_FLAG *) GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat));\r
if (VarErrFlag == Flag) {\r
return;\r
}\r
// then no need to check if the variable is user variable or not specially.\r
//\r
if (mEndOfDxe && (mVariableModuleGlobal->CommonMaxUserVariableSpace != mVariableModuleGlobal->CommonVariableSpace)) {\r
- if (VarCheckLibVariablePropertyGet (GetVariableNamePtr (Variable), GetVendorGuidPtr (Variable), &Property) == EFI_NOT_FOUND) {\r
+ if (VarCheckLibVariablePropertyGet (\r
+ GetVariableNamePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+ GetVendorGuidPtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+ &Property\r
+ ) == EFI_NOT_FOUND) {\r
return TRUE;\r
}\r
}\r
if (mEndOfDxe && (mVariableModuleGlobal->CommonMaxUserVariableSpace != mVariableModuleGlobal->CommonVariableSpace)) {\r
Variable = GetStartPointer (mNvVariableCache);\r
while (IsValidVariableHeader (Variable, GetEndPointer (mNvVariableCache))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
+ NextVariable = GetNextVariablePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
- if (VarCheckLibVariablePropertyGet (GetVariableNamePtr (Variable), GetVendorGuidPtr (Variable), &Property) == EFI_NOT_FOUND) {\r
+ if (VarCheckLibVariablePropertyGet (\r
+ GetVariableNamePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+ GetVendorGuidPtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+ &Property\r
+ ) == EFI_NOT_FOUND) {\r
//\r
// No property, it is user variable.\r
//\r
UINTN HwErrVariableTotalSize;\r
VARIABLE_HEADER *UpdatingVariable;\r
VARIABLE_HEADER *UpdatingInDeletedTransition;\r
+ BOOLEAN AuthFormat;\r
\r
+ AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
UpdatingVariable = NULL;\r
UpdatingInDeletedTransition = NULL;\r
if (UpdatingPtrTrack != NULL) {\r
MaximumBufferSize = sizeof (VARIABLE_STORE_HEADER);\r
\r
while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
+ NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
if ((Variable->State == VAR_ADDED || Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) &&\r
Variable != UpdatingVariable &&\r
Variable != UpdatingInDeletedTransition\r
//\r
Variable = GetStartPointer (VariableStoreHeader);\r
while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
+ NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
if (Variable != UpdatingVariable && Variable->State == VAR_ADDED) {\r
VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
CopyMem (CurrPtr, (UINT8 *) Variable, VariableSize);\r
//\r
Variable = GetStartPointer (VariableStoreHeader);\r
while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
+ NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
if (Variable != UpdatingVariable && Variable != UpdatingInDeletedTransition && Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
\r
//\r
FoundAdded = FALSE;\r
AddedVariable = GetStartPointer ((VARIABLE_STORE_HEADER *) ValidBuffer);\r
while (IsValidVariableHeader (AddedVariable, GetEndPointer ((VARIABLE_STORE_HEADER *) ValidBuffer))) {\r
- NextAddedVariable = GetNextVariablePtr (AddedVariable);\r
- NameSize = NameSizeOfVariable (AddedVariable);\r
- if (CompareGuid (GetVendorGuidPtr (AddedVariable), GetVendorGuidPtr (Variable)) &&\r
- NameSize == NameSizeOfVariable (Variable)\r
- ) {\r
- Point0 = (VOID *) GetVariableNamePtr (AddedVariable);\r
- Point1 = (VOID *) GetVariableNamePtr (Variable);\r
+ NextAddedVariable = GetNextVariablePtr (AddedVariable, AuthFormat);\r
+ NameSize = NameSizeOfVariable (AddedVariable, AuthFormat);\r
+ if (CompareGuid (\r
+ GetVendorGuidPtr (AddedVariable, AuthFormat),\r
+ GetVendorGuidPtr (Variable, AuthFormat)\r
+ ) && NameSize == NameSizeOfVariable (Variable, AuthFormat)) {\r
+ Point0 = (VOID *) GetVariableNamePtr (AddedVariable, AuthFormat);\r
+ Point1 = (VOID *) GetVariableNamePtr (Variable, AuthFormat);\r
if (CompareMem (Point0, Point1, NameSize) == 0) {\r
FoundAdded = TRUE;\r
break;\r
mVariableModuleGlobal->CommonUserVariableTotalSize = 0;\r
Variable = GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase);\r
while (IsValidVariableHeader (Variable, GetEndPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
+ NextVariable = GetNextVariablePtr (Variable, AuthFormat);\r
VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
mVariableModuleGlobal->HwErrVariableTotalSize += VariableSize;\r
\r
Done:\r
if (IsVolatile || mVariableModuleGlobal->VariableGlobal.EmuNvMode) {\r
+ Status = SynchronizeRuntimeVariableCache (\r
+ &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache,\r
+ 0,\r
+ VariableStoreHeader->Size\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
FreePool (ValidBuffer);\r
} else {\r
//\r
// For NV variable reclaim, we use mNvVariableCache as the buffer, so copy the data back.\r
//\r
- CopyMem (mNvVariableCache, (UINT8 *)(UINTN)VariableBase, VariableStoreHeader->Size);\r
+ CopyMem (mNvVariableCache, (UINT8 *) (UINTN) VariableBase, VariableStoreHeader->Size);\r
+ Status = SynchronizeRuntimeVariableCache (\r
+ &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache,\r
+ 0,\r
+ VariableStoreHeader->Size\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
\r
return Status;\r
PtrTrack->EndPtr = GetEndPointer (VariableStoreHeader[Type]);\r
PtrTrack->Volatile = (BOOLEAN) (Type == VariableStoreTypeVolatile);\r
\r
- Status = FindVariableEx (VariableName, VendorGuid, IgnoreRtCheck, PtrTrack);\r
+ Status = FindVariableEx (\r
+ VariableName,\r
+ VendorGuid,\r
+ IgnoreRtCheck,\r
+ PtrTrack,\r
+ mVariableModuleGlobal->VariableGlobal.AuthFormat\r
+ );\r
if (!EFI_ERROR (Status)) {\r
return Status;\r
}\r
VarNameSize += GET_PAD_SIZE (VarNameSize);\r
VarDataSize = VariableEntry->VariableSize;\r
VarDataSize += GET_PAD_SIZE (VarDataSize);\r
- VariableEntry->VariableSize = HEADER_ALIGN (GetVariableHeaderSize () + VarNameSize + VarDataSize);\r
+ VariableEntry->VariableSize = HEADER_ALIGN (\r
+ GetVariableHeaderSize (\r
+ mVariableModuleGlobal->VariableGlobal.AuthFormat\r
+ ) + VarNameSize + VarDataSize\r
+ );\r
\r
TotalNeededSize += VariableEntry->VariableSize;\r
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);\r
VariableEntry->Name,\r
VariableEntry->Guid,\r
FALSE,\r
- &VariablePtrTrack\r
+ &VariablePtrTrack,\r
+ mVariableModuleGlobal->VariableGlobal.AuthFormat\r
);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Get size of Variable[Index].\r
//\r
- NextVariable = GetNextVariablePtr (VariablePtrTrack.CurrPtr);\r
+ NextVariable = GetNextVariablePtr (VariablePtrTrack.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
OriginalVarSize = (UINTN) NextVariable - (UINTN) VariablePtrTrack.CurrPtr;\r
//\r
// Add the original size of Variable[Index] to remaining variable storage size.\r
// Update Lang\r
//\r
VariableName = EFI_PLATFORM_LANG_VARIABLE_NAME;\r
- Data = GetVariableDataPtr (Variable.CurrPtr);\r
- DataSize = DataSizeOfVariable (Variable.CurrPtr);\r
+ Data = GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
+ DataSize = DataSizeOfVariable (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
} else {\r
Status = FindVariable (EFI_LANG_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (!EFI_ERROR (Status)) {\r
// Update PlatformLang\r
//\r
VariableName = EFI_LANG_VARIABLE_NAME;\r
- Data = GetVariableDataPtr (Variable.CurrPtr);\r
- DataSize = DataSizeOfVariable (Variable.CurrPtr);\r
+ Data = GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
+ DataSize = DataSizeOfVariable (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
} else {\r
//\r
// Neither PlatformLang nor Lang is set, directly return\r
VARIABLE_POINTER_TRACK *Variable;\r
VARIABLE_POINTER_TRACK NvVariable;\r
VARIABLE_STORE_HEADER *VariableStoreHeader;\r
+ VARIABLE_RUNTIME_CACHE *VolatileCacheInstance;\r
UINT8 *BufferForMerge;\r
UINTN MergedBufSize;\r
BOOLEAN DataReady;\r
BOOLEAN IsCommonVariable;\r
BOOLEAN IsCommonUserVariable;\r
AUTHENTICATED_VARIABLE_HEADER *AuthVariable;\r
+ BOOLEAN AuthFormat;\r
\r
if (mVariableModuleGlobal->FvbInstance == NULL && !mVariableModuleGlobal->VariableGlobal.EmuNvMode) {\r
//\r
}\r
}\r
\r
+ AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
+\r
//\r
// Check if CacheVariable points to the variable in variable HOB.\r
// If yes, let CacheVariable points to the variable in NV variable cache.\r
CacheVariable->StartPtr = GetStartPointer (mNvVariableCache);\r
CacheVariable->EndPtr = GetEndPointer (mNvVariableCache);\r
CacheVariable->Volatile = FALSE;\r
- Status = FindVariableEx (VariableName, VendorGuid, FALSE, CacheVariable);\r
+ Status = FindVariableEx (VariableName, VendorGuid, FALSE, CacheVariable, AuthFormat);\r
if (CacheVariable->CurrPtr == NULL || EFI_ERROR (Status)) {\r
//\r
// There is no matched variable in NV variable cache.\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 (DataSizeOfVariable (CacheVariable->CurrPtr) == DataSize &&\r
- (CompareMem (Data, GetVariableDataPtr (CacheVariable->CurrPtr), DataSize) == 0) &&\r
+ if (DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) == DataSize &&\r
+ (CompareMem (Data, GetVariableDataPtr (CacheVariable->CurrPtr, AuthFormat), DataSize) == 0) &&\r
((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) &&\r
(TimeStamp == NULL)) {\r
//\r
// NOTE: From 0 to DataOffset of NextVariable is reserved for Variable Header and Name.\r
// From DataOffset of NextVariable is to save the existing variable data.\r
//\r
- DataOffset = GetVariableDataOffset (CacheVariable->CurrPtr);\r
+ DataOffset = GetVariableDataOffset (CacheVariable->CurrPtr, AuthFormat);\r
BufferForMerge = (UINT8 *) ((UINTN) NextVariable + DataOffset);\r
- CopyMem (BufferForMerge, (UINT8 *) ((UINTN) CacheVariable->CurrPtr + DataOffset), DataSizeOfVariable (CacheVariable->CurrPtr));\r
+ CopyMem (\r
+ BufferForMerge,\r
+ (UINT8 *) ((UINTN) CacheVariable->CurrPtr + DataOffset),\r
+ DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat)\r
+ );\r
\r
//\r
// Set Max Auth/Non-Volatile/Volatile Variable Data Size as default MaxDataSize.\r
MaxDataSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) - DataOffset;\r
}\r
\r
- if (DataSizeOfVariable (CacheVariable->CurrPtr) + DataSize > MaxDataSize) {\r
+ if (DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) + DataSize > MaxDataSize) {\r
//\r
// Existing data size + new data size exceed maximum variable size limitation.\r
//\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
- CopyMem ((UINT8*) ((UINTN) BufferForMerge + DataSizeOfVariable (CacheVariable->CurrPtr)), Data, DataSize);\r
- MergedBufSize = DataSizeOfVariable (CacheVariable->CurrPtr) + DataSize;\r
+ CopyMem (\r
+ (UINT8*) (\r
+ (UINTN) BufferForMerge + DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat)\r
+ ),\r
+ Data,\r
+ DataSize\r
+ );\r
+ MergedBufSize = DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) +\r
+ DataSize;\r
\r
//\r
// BufferForMerge(from DataOffset of NextVariable) has included the merged existing and new data.\r
//\r
NextVariable->Attributes = Attributes & (~EFI_VARIABLE_APPEND_WRITE);\r
\r
- VarNameOffset = GetVariableHeaderSize ();\r
+ VarNameOffset = GetVariableHeaderSize (AuthFormat);\r
VarNameSize = StrSize (VariableName);\r
CopyMem (\r
(UINT8 *) ((UINTN) NextVariable + VarNameOffset),\r
);\r
}\r
\r
- CopyMem (GetVendorGuidPtr (NextVariable), VendorGuid, sizeof (EFI_GUID));\r
+ CopyMem (\r
+ GetVendorGuidPtr (NextVariable, AuthFormat),\r
+ VendorGuid,\r
+ sizeof (EFI_GUID)\r
+ );\r
//\r
// There will be pad bytes after Data, the NextVariable->NameSize and\r
// NextVariable->DataSize should not include pad size so that variable\r
// service can get actual size in GetVariable.\r
//\r
- SetNameSizeOfVariable (NextVariable, VarNameSize);\r
- SetDataSizeOfVariable (NextVariable, DataSize);\r
+ SetNameSizeOfVariable (NextVariable, VarNameSize, AuthFormat);\r
+ SetDataSizeOfVariable (NextVariable, DataSize, AuthFormat);\r
\r
//\r
// The actual size of the variable that stores in storage should\r
TRUE,\r
Fvb,\r
mVariableModuleGlobal->NonVolatileLastVariableOffset,\r
- (UINT32) GetVariableHeaderSize (),\r
+ (UINT32) GetVariableHeaderSize (AuthFormat),\r
(UINT8 *) NextVariable\r
);\r
\r
FALSE,\r
TRUE,\r
Fvb,\r
- mVariableModuleGlobal->NonVolatileLastVariableOffset + GetVariableHeaderSize (),\r
- (UINT32) (VarSize - GetVariableHeaderSize ()),\r
- (UINT8 *) NextVariable + GetVariableHeaderSize ()\r
+ mVariableModuleGlobal->NonVolatileLastVariableOffset + GetVariableHeaderSize (AuthFormat),\r
+ (UINT32) (VarSize - GetVariableHeaderSize (AuthFormat)),\r
+ (UINT8 *) NextVariable + GetVariableHeaderSize (AuthFormat)\r
);\r
\r
if (EFI_ERROR (Status)) {\r
}\r
\r
Done:\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Variable->CurrPtr != NULL && !Variable->Volatile) || (Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
+ VolatileCacheInstance = &(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache);\r
+ } else {\r
+ VolatileCacheInstance = &(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache);\r
+ }\r
+\r
+ if (VolatileCacheInstance->Store != NULL) {\r
+ Status = SynchronizeRuntimeVariableCache (\r
+ VolatileCacheInstance,\r
+ 0,\r
+ VolatileCacheInstance->Store->Size\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+ }\r
+\r
return Status;\r
}\r
\r
//\r
// Get data size\r
//\r
- VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
+ VarDataSize = DataSizeOfVariable (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
ASSERT (VarDataSize != 0);\r
\r
if (*DataSize >= VarDataSize) {\r
goto Done;\r
}\r
\r
- CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
- if (Attributes != NULL) {\r
- *Attributes = Variable.CurrPtr->Attributes;\r
- }\r
+ CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat), VarDataSize);\r
\r
*DataSize = VarDataSize;\r
UpdateVariableInfo (VariableName, VendorGuid, Variable.Volatile, TRUE, FALSE, FALSE, FALSE, &gVariableInfo);\r
}\r
\r
Done:\r
+ if (Status == EFI_SUCCESS || Status == EFI_BUFFER_TOO_SMALL) {\r
+ if (Attributes != NULL && Variable.CurrPtr != NULL) {\r
+ *Attributes = Variable.CurrPtr->Attributes;\r
+ }\r
+ }\r
ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
return Status;\r
}\r
EFI_STATUS Status;\r
UINTN MaxLen;\r
UINTN VarNameSize;\r
+ BOOLEAN AuthFormat;\r
VARIABLE_HEADER *VariablePtr;\r
VARIABLE_STORE_HEADER *VariableStoreHeader[VariableStoreTypeMax];\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
+\r
//\r
// Calculate the possible maximum length of name string, including the Null terminator.\r
//\r
VariableStoreHeader[VariableStoreTypeHob] = (VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase;\r
VariableStoreHeader[VariableStoreTypeNv] = mNvVariableCache;\r
\r
- Status = VariableServiceGetNextVariableInternal (VariableName, VendorGuid, VariableStoreHeader, &VariablePtr);\r
+ Status = VariableServiceGetNextVariableInternal (\r
+ VariableName,\r
+ VendorGuid,\r
+ VariableStoreHeader,\r
+ &VariablePtr,\r
+ AuthFormat\r
+ );\r
if (!EFI_ERROR (Status)) {\r
- VarNameSize = NameSizeOfVariable (VariablePtr);\r
+ VarNameSize = NameSizeOfVariable (VariablePtr, AuthFormat);\r
ASSERT (VarNameSize != 0);\r
if (VarNameSize <= *VariableNameSize) {\r
- CopyMem (VariableName, GetVariableNamePtr (VariablePtr), VarNameSize);\r
- CopyMem (VendorGuid, GetVendorGuidPtr (VariablePtr), sizeof (EFI_GUID));\r
+ CopyMem (\r
+ VariableName,\r
+ GetVariableNamePtr (VariablePtr, AuthFormat),\r
+ VarNameSize\r
+ );\r
+ CopyMem (\r
+ VendorGuid,\r
+ GetVendorGuidPtr (VariablePtr, AuthFormat),\r
+ sizeof (EFI_GUID)\r
+ );\r
Status = EFI_SUCCESS;\r
} else {\r
Status = EFI_BUFFER_TOO_SMALL;\r
VARIABLE_HEADER *NextVariable;\r
EFI_PHYSICAL_ADDRESS Point;\r
UINTN PayloadSize;\r
+ BOOLEAN AuthFormat;\r
+\r
+ AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
\r
//\r
// Check input parameters.\r
// bytes for HwErrRec#### variable.\r
//\r
if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
- if (StrSize (VariableName) + PayloadSize > PcdGet32 (PcdMaxHardwareErrorVariableSize) - GetVariableHeaderSize ()) {\r
+ if (StrSize (VariableName) + PayloadSize >\r
+ PcdGet32 (PcdMaxHardwareErrorVariableSize) - GetVariableHeaderSize (AuthFormat)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
} else {\r
// the DataSize is limited to maximum size of Max(Auth|Volatile)VariableSize bytes.\r
//\r
if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {\r
- if (StrSize (VariableName) + PayloadSize > mVariableModuleGlobal->MaxAuthVariableSize - GetVariableHeaderSize ()) {\r
+ if (StrSize (VariableName) + PayloadSize >\r
+ mVariableModuleGlobal->MaxAuthVariableSize -\r
+ GetVariableHeaderSize (AuthFormat)) {\r
DEBUG ((DEBUG_ERROR,\r
"%a: Failed to set variable '%s' with Guid %g\n",\r
__FUNCTION__, VariableName, VendorGuid));\r
"MaxAuthVariableSize(0x%x) - HeaderSize(0x%x)\n",\r
StrSize (VariableName), PayloadSize,\r
mVariableModuleGlobal->MaxAuthVariableSize,\r
- GetVariableHeaderSize ()\r
+ GetVariableHeaderSize (AuthFormat)\r
));\r
return EFI_INVALID_PARAMETER;\r
}\r
} else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
- if (StrSize (VariableName) + PayloadSize > mVariableModuleGlobal->MaxVariableSize - GetVariableHeaderSize ()) {\r
+ if (StrSize (VariableName) + PayloadSize >\r
+ mVariableModuleGlobal->MaxVariableSize - GetVariableHeaderSize (AuthFormat)) {\r
DEBUG ((DEBUG_ERROR,\r
"%a: Failed to set variable '%s' with Guid %g\n",\r
__FUNCTION__, VariableName, VendorGuid));\r
"MaxVariableSize(0x%x) - HeaderSize(0x%x)\n",\r
StrSize (VariableName), PayloadSize,\r
mVariableModuleGlobal->MaxVariableSize,\r
- GetVariableHeaderSize ()\r
+ GetVariableHeaderSize (AuthFormat)\r
));\r
return EFI_INVALID_PARAMETER;\r
}\r
} else {\r
- if (StrSize (VariableName) + PayloadSize > mVariableModuleGlobal->MaxVolatileVariableSize - GetVariableHeaderSize ()) {\r
+ if (StrSize (VariableName) + PayloadSize >\r
+ mVariableModuleGlobal->MaxVolatileVariableSize - GetVariableHeaderSize (AuthFormat)) {\r
DEBUG ((DEBUG_ERROR,\r
"%a: Failed to set variable '%s' with Guid %g\n",\r
__FUNCTION__, VariableName, VendorGuid));\r
"MaxVolatileVariableSize(0x%x) - HeaderSize(0x%x)\n",\r
StrSize (VariableName), PayloadSize,\r
mVariableModuleGlobal->MaxVolatileVariableSize,\r
- GetVariableHeaderSize ()\r
+ GetVariableHeaderSize (AuthFormat)\r
));\r
return EFI_INVALID_PARAMETER;\r
}\r
//\r
NextVariable = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point);\r
while (IsValidVariableHeader (NextVariable, GetEndPointer ((VARIABLE_STORE_HEADER *) (UINTN) Point))) {\r
- NextVariable = GetNextVariablePtr (NextVariable);\r
+ NextVariable = GetNextVariablePtr (NextVariable, AuthFormat);\r
}\r
mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) NextVariable - (UINTN) Point;\r
}\r
//\r
if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {\r
*MaximumVariableStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
- *MaximumVariableSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) - GetVariableHeaderSize ();\r
+ *MaximumVariableSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) -\r
+ GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
} else {\r
if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
if (AtRuntime ()) {\r
// Let *MaximumVariableSize be Max(Auth|Volatile)VariableSize with the exception of the variable header size.\r
//\r
if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {\r
- *MaximumVariableSize = mVariableModuleGlobal->MaxAuthVariableSize - GetVariableHeaderSize ();\r
+ *MaximumVariableSize = mVariableModuleGlobal->MaxAuthVariableSize -\r
+ GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
} else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
- *MaximumVariableSize = mVariableModuleGlobal->MaxVariableSize - GetVariableHeaderSize ();\r
+ *MaximumVariableSize = mVariableModuleGlobal->MaxVariableSize -\r
+ GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
} else {\r
- *MaximumVariableSize = mVariableModuleGlobal->MaxVolatileVariableSize - GetVariableHeaderSize ();\r
+ *MaximumVariableSize = mVariableModuleGlobal->MaxVolatileVariableSize -\r
+ GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
}\r
}\r
\r
// Now walk through the related variable store.\r
//\r
while (IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
+ NextVariable = GetNextVariablePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
VariableSize = (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Variable;\r
\r
if (AtRuntime ()) {\r
VariablePtrTrack.StartPtr = GetStartPointer (VariableStoreHeader);\r
VariablePtrTrack.EndPtr = GetEndPointer (VariableStoreHeader);\r
Status = FindVariableEx (\r
- GetVariableNamePtr (Variable),\r
- GetVendorGuidPtr (Variable),\r
+ GetVariableNamePtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+ GetVendorGuidPtr (Variable, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
FALSE,\r
- &VariablePtrTrack\r
+ &VariablePtrTrack,\r
+ mVariableModuleGlobal->VariableGlobal.AuthFormat\r
);\r
if (!EFI_ERROR (Status) && VariablePtrTrack.CurrPtr->State != VAR_ADDED) {\r
if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
}\r
}\r
\r
- if (*RemainingVariableStorageSize < GetVariableHeaderSize ()) {\r
+ if (*RemainingVariableStorageSize < GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat)) {\r
*MaximumVariableSize = 0;\r
- } else if ((*RemainingVariableStorageSize - GetVariableHeaderSize ()) < *MaximumVariableSize) {\r
- *MaximumVariableSize = *RemainingVariableStorageSize - GetVariableHeaderSize ();\r
+ } else if ((*RemainingVariableStorageSize - GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat)) <\r
+ *MaximumVariableSize\r
+ ) {\r
+ *MaximumVariableSize = *RemainingVariableStorageSize -\r
+ GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
}\r
\r
return EFI_SUCCESS;\r
}\r
}\r
\r
-/**\r
- Get non-volatile maximum variable size.\r
-\r
- @return Non-volatile maximum variable size.\r
-\r
-**/\r
-UINTN\r
-GetNonVolatileMaxVariableSize (\r
- VOID\r
- )\r
-{\r
- if (PcdGet32 (PcdHwErrStorageSize) != 0) {\r
- return MAX (MAX (PcdGet32 (PcdMaxVariableSize), PcdGet32 (PcdMaxAuthVariableSize)),\r
- PcdGet32 (PcdMaxHardwareErrorVariableSize));\r
- } else {\r
- return MAX (PcdGet32 (PcdMaxVariableSize), PcdGet32 (PcdMaxAuthVariableSize));\r
- }\r
-}\r
-\r
/**\r
Get maximum variable size, covering both non-volatile and volatile variables.\r
\r
return MaxVariableSize;\r
}\r
\r
-/**\r
- Init real non-volatile variable store.\r
-\r
- @param[out] VariableStoreBase Output pointer to real non-volatile variable store base.\r
-\r
- @retval EFI_SUCCESS Function successfully executed.\r
- @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource.\r
- @retval EFI_VOLUME_CORRUPTED Variable Store or Firmware Volume for Variable Store is corrupted.\r
-\r
-**/\r
-EFI_STATUS\r
-InitRealNonVolatileVariableStore (\r
- OUT EFI_PHYSICAL_ADDRESS *VariableStoreBase\r
- )\r
-{\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
- VARIABLE_STORE_HEADER *VariableStore;\r
- UINT32 VariableStoreLength;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
- EFI_PHYSICAL_ADDRESS NvStorageBase;\r
- UINT8 *NvStorageData;\r
- UINT32 NvStorageSize;\r
- FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *FtwLastWriteData;\r
- UINT32 BackUpOffset;\r
- UINT32 BackUpSize;\r
- UINT32 HwErrStorageSize;\r
- UINT32 MaxUserNvVariableSpaceSize;\r
- UINT32 BoottimeReservedNvVariableSpaceSize;\r
- EFI_STATUS Status;\r
- VOID *FtwProtocol;\r
-\r
- mVariableModuleGlobal->FvbInstance = NULL;\r
-\r
- //\r
- // Allocate runtime memory used for a memory copy of the FLASH region.\r
- // Keep the memory and the FLASH in sync as updates occur.\r
- //\r
- NvStorageSize = PcdGet32 (PcdFlashNvStorageVariableSize);\r
- NvStorageData = AllocateRuntimeZeroPool (NvStorageSize);\r
- if (NvStorageData == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NvStorageBase = NV_STORAGE_VARIABLE_BASE;\r
- ASSERT (NvStorageBase != 0);\r
-\r
- //\r
- // Copy NV storage data to the memory buffer.\r
- //\r
- CopyMem (NvStorageData, (UINT8 *) (UINTN) NvStorageBase, NvStorageSize);\r
-\r
- Status = GetFtwProtocol ((VOID **)&FtwProtocol);\r
- //\r
- // If FTW protocol has been installed, no need to check FTW last write data hob.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Check the FTW last write data hob.\r
- //\r
- GuidHob = GetFirstGuidHob (&gEdkiiFaultTolerantWriteGuid);\r
- if (GuidHob != NULL) {\r
- FtwLastWriteData = (FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *) GET_GUID_HOB_DATA (GuidHob);\r
- if (FtwLastWriteData->TargetAddress == NvStorageBase) {\r
- DEBUG ((EFI_D_INFO, "Variable: NV storage is backed up in spare block: 0x%x\n", (UINTN) FtwLastWriteData->SpareAddress));\r
- //\r
- // Copy the backed up NV storage data to the memory buffer from spare block.\r
- //\r
- CopyMem (NvStorageData, (UINT8 *) (UINTN) (FtwLastWriteData->SpareAddress), NvStorageSize);\r
- } else if ((FtwLastWriteData->TargetAddress > NvStorageBase) &&\r
- (FtwLastWriteData->TargetAddress < (NvStorageBase + NvStorageSize))) {\r
- //\r
- // Flash NV storage from the Offset is backed up in spare block.\r
- //\r
- BackUpOffset = (UINT32) (FtwLastWriteData->TargetAddress - NvStorageBase);\r
- BackUpSize = NvStorageSize - BackUpOffset;\r
- DEBUG ((EFI_D_INFO, "Variable: High partial NV storage from offset: %x is backed up in spare block: 0x%x\n", BackUpOffset, (UINTN) FtwLastWriteData->SpareAddress));\r
- //\r
- // Copy the partial backed up NV storage data to the memory buffer from spare block.\r
- //\r
- CopyMem (NvStorageData + BackUpOffset, (UINT8 *) (UINTN) FtwLastWriteData->SpareAddress, BackUpSize);\r
- }\r
- }\r
- }\r
-\r
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) NvStorageData;\r
-\r
- //\r
- // Check if the Firmware Volume is not corrupted\r
- //\r
- if ((FvHeader->Signature != EFI_FVH_SIGNATURE) || (!CompareGuid (&gEfiSystemNvDataFvGuid, &FvHeader->FileSystemGuid))) {\r
- FreePool (NvStorageData);\r
- DEBUG ((EFI_D_ERROR, "Firmware Volume for Variable Store is corrupted\n"));\r
- return EFI_VOLUME_CORRUPTED;\r
- }\r
-\r
- VariableStore = (VARIABLE_STORE_HEADER *) ((UINTN) FvHeader + FvHeader->HeaderLength);\r
- VariableStoreLength = NvStorageSize - FvHeader->HeaderLength;\r
- ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);\r
- ASSERT (VariableStore->Size == VariableStoreLength);\r
-\r
- //\r
- // Check if the Variable Store header is not corrupted\r
- //\r
- if (GetVariableStoreStatus (VariableStore) != EfiValid) {\r
- FreePool (NvStorageData);\r
- DEBUG((EFI_D_ERROR, "Variable Store header is corrupted\n"));\r
- return EFI_VOLUME_CORRUPTED;\r
- }\r
-\r
- mNvFvHeaderCache = FvHeader;\r
-\r
- *VariableStoreBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore;\r
-\r
- HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
- MaxUserNvVariableSpaceSize = PcdGet32 (PcdMaxUserNvVariableSpaceSize);\r
- BoottimeReservedNvVariableSpaceSize = PcdGet32 (PcdBoottimeReservedNvVariableSpaceSize);\r
-\r
- //\r
- // Note that in EdkII variable driver implementation, Hardware Error Record type variable\r
- // is stored with common variable in the same NV region. So the platform integrator should\r
- // ensure that the value of PcdHwErrStorageSize is less than the value of\r
- // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)).\r
- //\r
- ASSERT (HwErrStorageSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));\r
- //\r
- // Ensure that the value of PcdMaxUserNvVariableSpaceSize is less than the value of\r
- // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)) - PcdGet32 (PcdHwErrStorageSize).\r
- //\r
- ASSERT (MaxUserNvVariableSpaceSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize));\r
- //\r
- // Ensure that the value of PcdBoottimeReservedNvVariableSpaceSize is less than the value of\r
- // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)) - PcdGet32 (PcdHwErrStorageSize).\r
- //\r
- ASSERT (BoottimeReservedNvVariableSpaceSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize));\r
-\r
- mVariableModuleGlobal->CommonVariableSpace = ((UINTN) VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize);\r
- mVariableModuleGlobal->CommonMaxUserVariableSpace = ((MaxUserNvVariableSpaceSize != 0) ? MaxUserNvVariableSpaceSize : mVariableModuleGlobal->CommonVariableSpace);\r
- mVariableModuleGlobal->CommonRuntimeVariableSpace = mVariableModuleGlobal->CommonVariableSpace - BoottimeReservedNvVariableSpaceSize;\r
-\r
- DEBUG ((EFI_D_INFO, "Variable driver common space: 0x%x 0x%x 0x%x\n", mVariableModuleGlobal->CommonVariableSpace, mVariableModuleGlobal->CommonMaxUserVariableSpace, mVariableModuleGlobal->CommonRuntimeVariableSpace));\r
-\r
- //\r
- // The max NV variable size should be < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)).\r
- //\r
- ASSERT (GetNonVolatileMaxVariableSize () < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Init emulated non-volatile variable store.\r
-\r
- @param[out] VariableStoreBase Output pointer to emulated non-volatile variable store base.\r
-\r
- @retval EFI_SUCCESS Function successfully executed.\r
- @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource.\r
-\r
-**/\r
-EFI_STATUS\r
-InitEmuNonVolatileVariableStore (\r
- EFI_PHYSICAL_ADDRESS *VariableStoreBase\r
- )\r
-{\r
- VARIABLE_STORE_HEADER *VariableStore;\r
- UINT32 VariableStoreLength;\r
- BOOLEAN FullyInitializeStore;\r
- UINT32 HwErrStorageSize;\r
-\r
- FullyInitializeStore = TRUE;\r
-\r
- VariableStoreLength = PcdGet32 (PcdVariableStoreSize);\r
- ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);\r
-\r
- //\r
- // Allocate memory for variable store.\r
- //\r
- if (PcdGet64 (PcdEmuVariableNvStoreReserved) == 0) {\r
- VariableStore = (VARIABLE_STORE_HEADER *) AllocateRuntimePool (VariableStoreLength);\r
- if (VariableStore == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- } else {\r
- //\r
- // A memory location has been reserved for the NV variable store. Certain\r
- // platforms may be able to preserve a memory range across system resets,\r
- // thereby providing better NV variable emulation.\r
- //\r
- VariableStore =\r
- (VARIABLE_STORE_HEADER *)(VOID*)(UINTN)\r
- PcdGet64 (PcdEmuVariableNvStoreReserved);\r
- if ((VariableStore->Size == VariableStoreLength) &&\r
- (CompareGuid (&VariableStore->Signature, &gEfiAuthenticatedVariableGuid) ||\r
- CompareGuid (&VariableStore->Signature, &gEfiVariableGuid)) &&\r
- (VariableStore->Format == VARIABLE_STORE_FORMATTED) &&\r
- (VariableStore->State == VARIABLE_STORE_HEALTHY)) {\r
- DEBUG((\r
- DEBUG_INFO,\r
- "Variable Store reserved at %p appears to be valid\n",\r
- VariableStore\r
- ));\r
- FullyInitializeStore = FALSE;\r
- }\r
- }\r
-\r
- if (FullyInitializeStore) {\r
- SetMem (VariableStore, VariableStoreLength, 0xff);\r
- //\r
- // Use gEfiAuthenticatedVariableGuid for potential auth variable support.\r
- //\r
- CopyGuid (&VariableStore->Signature, &gEfiAuthenticatedVariableGuid);\r
- VariableStore->Size = VariableStoreLength;\r
- VariableStore->Format = VARIABLE_STORE_FORMATTED;\r
- VariableStore->State = VARIABLE_STORE_HEALTHY;\r
- VariableStore->Reserved = 0;\r
- VariableStore->Reserved1 = 0;\r
- }\r
-\r
- *VariableStoreBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore;\r
-\r
- HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);\r
-\r
- //\r
- // Note that in EdkII variable driver implementation, Hardware Error Record type variable\r
- // is stored with common variable in the same NV region. So the platform integrator should\r
- // ensure that the value of PcdHwErrStorageSize is less than the value of\r
- // (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)).\r
- //\r
- ASSERT (HwErrStorageSize < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));\r
-\r
- mVariableModuleGlobal->CommonVariableSpace = ((UINTN) VariableStoreLength - sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize);\r
- mVariableModuleGlobal->CommonMaxUserVariableSpace = mVariableModuleGlobal->CommonVariableSpace;\r
- mVariableModuleGlobal->CommonRuntimeVariableSpace = mVariableModuleGlobal->CommonVariableSpace;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Init non-volatile variable store.\r
-\r
- @retval EFI_SUCCESS Function successfully executed.\r
- @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource.\r
- @retval EFI_VOLUME_CORRUPTED Variable Store or Firmware Volume for Variable Store is corrupted.\r
-\r
-**/\r
-EFI_STATUS\r
-InitNonVolatileVariableStore (\r
- VOID\r
- )\r
-{\r
- VARIABLE_HEADER *Variable;\r
- VARIABLE_HEADER *NextVariable;\r
- EFI_PHYSICAL_ADDRESS VariableStoreBase;\r
- UINTN VariableSize;\r
- EFI_STATUS Status;\r
-\r
- if (PcdGetBool (PcdEmuVariableNvModeEnable)) {\r
- Status = InitEmuNonVolatileVariableStore (&VariableStoreBase);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- mVariableModuleGlobal->VariableGlobal.EmuNvMode = TRUE;\r
- DEBUG ((DEBUG_INFO, "Variable driver will work at emulated non-volatile variable mode!\n"));\r
- } else {\r
- Status = InitRealNonVolatileVariableStore (&VariableStoreBase);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- mVariableModuleGlobal->VariableGlobal.EmuNvMode = FALSE;\r
- }\r
-\r
- mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase = VariableStoreBase;\r
- mNvVariableCache = (VARIABLE_STORE_HEADER *) (UINTN) VariableStoreBase;\r
- mVariableModuleGlobal->VariableGlobal.AuthFormat = (BOOLEAN)(CompareGuid (&mNvVariableCache->Signature, &gEfiAuthenticatedVariableGuid));\r
-\r
- mVariableModuleGlobal->MaxVariableSize = PcdGet32 (PcdMaxVariableSize);\r
- mVariableModuleGlobal->MaxAuthVariableSize = ((PcdGet32 (PcdMaxAuthVariableSize) != 0) ? PcdGet32 (PcdMaxAuthVariableSize) : mVariableModuleGlobal->MaxVariableSize);\r
-\r
- //\r
- // Parse non-volatile variable data and get last variable offset.\r
- //\r
- Variable = GetStartPointer (mNvVariableCache);\r
- while (IsValidVariableHeader (Variable, GetEndPointer (mNvVariableCache))) {\r
- NextVariable = GetNextVariablePtr (Variable);\r
- VariableSize = (UINTN) NextVariable - (UINTN) Variable;\r
- if ((Variable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {\r
- mVariableModuleGlobal->HwErrVariableTotalSize += VariableSize;\r
- } else {\r
- mVariableModuleGlobal->CommonVariableTotalSize += VariableSize;\r
- }\r
-\r
- Variable = NextVariable;\r
- }\r
- mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) Variable - (UINTN) mNvVariableCache;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
/**\r
Flush the HOB variable to flash.\r
\r
VOID *VariableData;\r
VARIABLE_POINTER_TRACK VariablePtrTrack;\r
BOOLEAN ErrorFlag;\r
+ BOOLEAN AuthFormat;\r
\r
ErrorFlag = FALSE;\r
+ AuthFormat = mVariableModuleGlobal->VariableGlobal.AuthFormat;\r
\r
//\r
// Flush the HOB variable to flash.\r
mVariableModuleGlobal->VariableGlobal.HobVariableBase = 0;\r
for ( Variable = GetStartPointer (VariableStoreHeader)\r
; IsValidVariableHeader (Variable, GetEndPointer (VariableStoreHeader))\r
- ; Variable = GetNextVariablePtr (Variable)\r
+ ; Variable = GetNextVariablePtr (Variable, AuthFormat)\r
) {\r
if (Variable->State != VAR_ADDED) {\r
//\r
}\r
ASSERT ((Variable->Attributes & EFI_VARIABLE_NON_VOLATILE) != 0);\r
if (VendorGuid == NULL || VariableName == NULL ||\r
- !CompareGuid (VendorGuid, GetVendorGuidPtr (Variable)) ||\r
- StrCmp (VariableName, GetVariableNamePtr (Variable)) != 0) {\r
- VariableData = GetVariableDataPtr (Variable);\r
- FindVariable (GetVariableNamePtr (Variable), GetVendorGuidPtr (Variable), &VariablePtrTrack, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
+ !CompareGuid (VendorGuid, GetVendorGuidPtr (Variable, AuthFormat)) ||\r
+ StrCmp (VariableName, GetVariableNamePtr (Variable, AuthFormat)) != 0) {\r
+ VariableData = GetVariableDataPtr (Variable, AuthFormat);\r
+ FindVariable (\r
+ GetVariableNamePtr (Variable, AuthFormat),\r
+ GetVendorGuidPtr (Variable, AuthFormat),\r
+ &VariablePtrTrack,\r
+ &mVariableModuleGlobal->VariableGlobal, FALSE\r
+ );\r
Status = UpdateVariable (\r
- GetVariableNamePtr (Variable),\r
- GetVendorGuidPtr (Variable),\r
+ GetVariableNamePtr (Variable, AuthFormat),\r
+ GetVendorGuidPtr (Variable, AuthFormat),\r
VariableData,\r
- DataSizeOfVariable (Variable),\r
+ DataSizeOfVariable (Variable, AuthFormat),\r
Variable->Attributes,\r
0,\r
0,\r
&VariablePtrTrack,\r
NULL\r
);\r
- DEBUG ((EFI_D_INFO, "Variable driver flush the HOB variable to flash: %g %s %r\n", GetVendorGuidPtr (Variable), GetVariableNamePtr (Variable), Status));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "Variable driver flush the HOB variable to flash: %g %s %r\n",\r
+ GetVendorGuidPtr (Variable, AuthFormat),\r
+ GetVariableNamePtr (Variable, AuthFormat),\r
+ Status\r
+ ));\r
} else {\r
//\r
// The updated or deleted variable is matched with this HOB variable.\r
// If set variable successful, or the updated or deleted variable is matched with the HOB variable,\r
// set the HOB variable to DELETED state in local.\r
//\r
- DEBUG ((EFI_D_INFO, "Variable driver set the HOB variable to DELETED state in local: %g %s\n", GetVendorGuidPtr (Variable), GetVariableNamePtr (Variable)));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "Variable driver set the HOB variable to DELETED state in local: %g %s\n",\r
+ GetVendorGuidPtr (Variable, AuthFormat),\r
+ GetVariableNamePtr (Variable, AuthFormat)\r
+ ));\r
Variable->State &= VAR_DELETED;\r
} else {\r
ErrorFlag = TRUE;\r
}\r
}\r
+ if (mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeHobCache.Store != NULL) {\r
+ Status = SynchronizeRuntimeVariableCache (\r
+ &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeHobCache,\r
+ 0,\r
+ mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeHobCache.Store->Size\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
if (ErrorFlag) {\r
//\r
// We still have HOB variable(s) not flushed in flash.\r
// All HOB variables have been flushed in flash.\r
//\r
DEBUG ((EFI_D_INFO, "Variable driver: all HOB variables have been flushed in flash.\n"));\r
+ if (mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.HobFlushComplete != NULL) {\r
+ *(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.HobFlushComplete) = TRUE;\r
+ }\r
if (!AtRuntime ()) {\r
FreePool ((VOID *) VariableStoreHeader);\r
}\r
// Authenticated variable initialize.\r
//\r
mAuthContextIn.StructSize = sizeof (AUTH_VAR_LIB_CONTEXT_IN);\r
- mAuthContextIn.MaxAuthVariableSize = mVariableModuleGlobal->MaxAuthVariableSize - GetVariableHeaderSize ();\r
+ mAuthContextIn.MaxAuthVariableSize = mVariableModuleGlobal->MaxAuthVariableSize -\r
+ GetVariableHeaderSize (mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
Status = AuthVariableLibInitialize (&mAuthContextIn, &mAuthContextOut);\r
if (!EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_INFO, "Variable driver will work with auth variable support!\n"));\r
AuthVarStroageSize += StartPtr->NameSize + GET_PAD_SIZE (StartPtr->NameSize);\r
AuthVarStroageSize += StartPtr->DataSize + GET_PAD_SIZE (StartPtr->DataSize);\r
}\r
- StartPtr = GetNextVariablePtr (StartPtr);\r
+ StartPtr = GetNextVariablePtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
}\r
\r
//\r
// Copy Variable Name\r
//\r
NextPtr = (UINT8 *) (AuthStartPtr + 1);\r
- CopyMem (NextPtr, GetVariableNamePtr (StartPtr), AuthStartPtr->NameSize);\r
+ CopyMem (\r
+ NextPtr,\r
+ GetVariableNamePtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat),\r
+ AuthStartPtr->NameSize\r
+ );\r
//\r
// Copy Variable Data\r
//\r
NextPtr = NextPtr + AuthStartPtr->NameSize + GET_PAD_SIZE (AuthStartPtr->NameSize);\r
- CopyMem (NextPtr, GetVariableDataPtr (StartPtr), AuthStartPtr->DataSize);\r
+ CopyMem (NextPtr, GetVariableDataPtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat), AuthStartPtr->DataSize);\r
//\r
// Go to next variable\r
//\r
AuthStartPtr = (AUTHENTICATED_VARIABLE_HEADER *) (NextPtr + AuthStartPtr->DataSize + GET_PAD_SIZE (AuthStartPtr->DataSize));\r
}\r
- StartPtr = GetNextVariablePtr (StartPtr);\r
+ StartPtr = GetNextVariablePtr (StartPtr, mVariableModuleGlobal->VariableGlobal.AuthFormat);\r
}\r
//\r
// Update Auth Storage Header\r