MdeModulePkg Variable: Abstract InitRealNonVolatileVariableStore

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1323
Merge EmuVariable and Real variable driver.

Abstract InitRealNonVolatileVariableStore from
InitNonVolatileVariableStore.

This patch prepares for adding emulated variable NV mode
support in VariableRuntimeDxe.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao Wu <hao.a.wu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
Tested-by: Julien Grall <julien.grall@arm.com>
Acked-by: Julien Grall <julien.grall@arm.com>
This commit is contained in:
Star Zeng 2019-01-12 15:03:36 +08:00
parent 874c8434d1
commit 701d603f32
1 changed files with 58 additions and 28 deletions

View File

@ -3728,9 +3728,9 @@ GetMaxVariableSize (
} }
/** /**
Init non-volatile variable store. Init real non-volatile variable store.
@param[out] NvFvHeader Output pointer to non-volatile FV header address. @param[out] VariableStoreBase Output pointer to real non-volatile variable store base.
@retval EFI_SUCCESS Function successfully executed. @retval EFI_SUCCESS Function successfully executed.
@retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource. @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource.
@ -3738,16 +3738,13 @@ GetMaxVariableSize (
**/ **/
EFI_STATUS EFI_STATUS
InitNonVolatileVariableStore ( InitRealNonVolatileVariableStore (
OUT EFI_FIRMWARE_VOLUME_HEADER **NvFvHeader OUT EFI_PHYSICAL_ADDRESS *VariableStoreBase
) )
{ {
EFI_FIRMWARE_VOLUME_HEADER *FvHeader; EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
VARIABLE_HEADER *Variable; VARIABLE_STORE_HEADER *VariableStore;
VARIABLE_HEADER *NextVariable; UINT32 VariableStoreLength;
EFI_PHYSICAL_ADDRESS VariableStoreBase;
UINT64 VariableStoreLength;
UINTN VariableSize;
EFI_HOB_GUID_TYPE *GuidHob; EFI_HOB_GUID_TYPE *GuidHob;
EFI_PHYSICAL_ADDRESS NvStorageBase; EFI_PHYSICAL_ADDRESS NvStorageBase;
UINT8 *NvStorageData; UINT8 *NvStorageData;
@ -3777,6 +3774,8 @@ InitNonVolatileVariableStore (
if (NvStorageBase == 0) { if (NvStorageBase == 0) {
NvStorageBase = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageVariableBase); NvStorageBase = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageVariableBase);
} }
ASSERT (NvStorageBase != 0);
// //
// Copy NV storage data to the memory buffer. // Copy NV storage data to the memory buffer.
// //
@ -3826,24 +3825,23 @@ InitNonVolatileVariableStore (
return EFI_VOLUME_CORRUPTED; return EFI_VOLUME_CORRUPTED;
} }
VariableStoreBase = (UINTN) FvHeader + FvHeader->HeaderLength; VariableStore = (VARIABLE_STORE_HEADER *) ((UINTN) FvHeader + FvHeader->HeaderLength);
VariableStoreLength = NvStorageSize - FvHeader->HeaderLength; VariableStoreLength = NvStorageSize - FvHeader->HeaderLength;
ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);
ASSERT (VariableStore->Size == VariableStoreLength);
mNvFvHeaderCache = FvHeader; //
mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase = VariableStoreBase; // Check if the Variable Store header is not corrupted
mNvVariableCache = (VARIABLE_STORE_HEADER *) (UINTN) VariableStoreBase; //
if (GetVariableStoreStatus (mNvVariableCache) != EfiValid) { if (GetVariableStoreStatus (VariableStore) != EfiValid) {
FreePool (NvStorageData); FreePool (NvStorageData);
mNvFvHeaderCache = NULL;
mNvVariableCache = NULL;
DEBUG((EFI_D_ERROR, "Variable Store header is corrupted\n")); DEBUG((EFI_D_ERROR, "Variable Store header is corrupted\n"));
return EFI_VOLUME_CORRUPTED; return EFI_VOLUME_CORRUPTED;
} }
ASSERT(mNvVariableCache->Size == VariableStoreLength);
ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength); mNvFvHeaderCache = FvHeader;
mVariableModuleGlobal->VariableGlobal.AuthFormat = (BOOLEAN)(CompareGuid (&mNvVariableCache->Signature, &gEfiAuthenticatedVariableGuid)); *VariableStoreBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore;
HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize); HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);
MaxUserNvVariableSpaceSize = PcdGet32 (PcdMaxUserNvVariableSpaceSize); MaxUserNvVariableSpaceSize = PcdGet32 (PcdMaxUserNvVariableSpaceSize);
@ -3878,14 +3876,45 @@ InitNonVolatileVariableStore (
// //
ASSERT (GetNonVolatileMaxVariableSize () < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER))); ASSERT (GetNonVolatileMaxVariableSize () < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER)));
return EFI_SUCCESS;
}
/**
Init non-volatile variable store.
@retval EFI_SUCCESS Function successfully executed.
@retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource.
@retval EFI_VOLUME_CORRUPTED Variable Store or Firmware Volume for Variable Store is corrupted.
**/
EFI_STATUS
InitNonVolatileVariableStore (
VOID
)
{
VARIABLE_HEADER *Variable;
VARIABLE_HEADER *NextVariable;
EFI_PHYSICAL_ADDRESS VariableStoreBase;
UINTN VariableSize;
EFI_STATUS Status;
Status = InitRealNonVolatileVariableStore (&VariableStoreBase);
if (EFI_ERROR (Status)) {
return Status;
}
mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase = VariableStoreBase;
mNvVariableCache = (VARIABLE_STORE_HEADER *) (UINTN) VariableStoreBase;
mVariableModuleGlobal->VariableGlobal.AuthFormat = (BOOLEAN)(CompareGuid (&mNvVariableCache->Signature, &gEfiAuthenticatedVariableGuid));
mVariableModuleGlobal->MaxVariableSize = PcdGet32 (PcdMaxVariableSize); mVariableModuleGlobal->MaxVariableSize = PcdGet32 (PcdMaxVariableSize);
mVariableModuleGlobal->MaxAuthVariableSize = ((PcdGet32 (PcdMaxAuthVariableSize) != 0) ? PcdGet32 (PcdMaxAuthVariableSize) : mVariableModuleGlobal->MaxVariableSize); mVariableModuleGlobal->MaxAuthVariableSize = ((PcdGet32 (PcdMaxAuthVariableSize) != 0) ? PcdGet32 (PcdMaxAuthVariableSize) : mVariableModuleGlobal->MaxVariableSize);
// //
// Parse non-volatile variable data and get last variable offset. // Parse non-volatile variable data and get last variable offset.
// //
Variable = GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase); Variable = GetStartPointer (mNvVariableCache);
while (IsValidVariableHeader (Variable, GetEndPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase))) { while (IsValidVariableHeader (Variable, GetEndPointer (mNvVariableCache))) {
NextVariable = GetNextVariablePtr (Variable); NextVariable = GetNextVariablePtr (Variable);
VariableSize = (UINTN) NextVariable - (UINTN) Variable; VariableSize = (UINTN) NextVariable - (UINTN) Variable;
if ((Variable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) { if ((Variable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
@ -3896,9 +3925,8 @@ InitNonVolatileVariableStore (
Variable = NextVariable; Variable = NextVariable;
} }
mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) Variable - (UINTN) VariableStoreBase; mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) Variable - (UINTN) mNvVariableCache;
*NvFvHeader = FvHeader;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -4303,7 +4331,6 @@ VariableCommonInitialize (
VARIABLE_STORE_HEADER *VolatileVariableStore; VARIABLE_STORE_HEADER *VolatileVariableStore;
UINTN ScratchSize; UINTN ScratchSize;
EFI_GUID *VariableGuid; EFI_GUID *VariableGuid;
EFI_FIRMWARE_VOLUME_HEADER *NvFvHeader;
// //
// Allocate runtime memory for variable driver global structure. // Allocate runtime memory for variable driver global structure.
@ -4318,8 +4345,7 @@ VariableCommonInitialize (
// //
// Init non-volatile variable store. // Init non-volatile variable store.
// //
NvFvHeader = NULL; Status = InitNonVolatileVariableStore ();
Status = InitNonVolatileVariableStore (&NvFvHeader);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
FreePool (mVariableModuleGlobal); FreePool (mVariableModuleGlobal);
return Status; return Status;
@ -4347,7 +4373,9 @@ VariableCommonInitialize (
// //
Status = GetHobVariableStore (VariableGuid); Status = GetHobVariableStore (VariableGuid);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
FreePool (NvFvHeader); if (mNvFvHeaderCache != NULL) {
FreePool (mNvFvHeaderCache);
}
FreePool (mVariableModuleGlobal); FreePool (mVariableModuleGlobal);
return Status; return Status;
} }
@ -4366,7 +4394,9 @@ VariableCommonInitialize (
if (mVariableModuleGlobal->VariableGlobal.HobVariableBase != 0) { if (mVariableModuleGlobal->VariableGlobal.HobVariableBase != 0) {
FreePool ((VOID *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase); FreePool ((VOID *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase);
} }
FreePool (NvFvHeader); if (mNvFvHeaderCache != NULL) {
FreePool (mNvFvHeaderCache);
}
FreePool (mVariableModuleGlobal); FreePool (mVariableModuleGlobal);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }