mirror of https://github.com/acidanthera/audk.git
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:
parent
874c8434d1
commit
701d603f32
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue