\r
Abstract:\r
\r
-Revision History\r
+ Provide support functions for variable services.\r
\r
--*/\r
\r
\r
Returns:\r
\r
- EFI STATUS\r
+ EFI_INVALID_PARAMETER - Parameters not valid\r
+ EFI_SUCCESS - Variable store successfully updated\r
\r
--*/\r
{\r
if ((DataPtr + DataSize) >= ((UINTN) ((UINT8 *) VolatileBase + VolatileBase->Size))) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- }\r
- //\r
- // If Volatile Variable just do a simple mem copy.\r
- //\r
- if (Volatile) {\r
+\r
+ //\r
+ // If Volatile Variable just do a simple mem copy.\r
+ //\r
CopyMem ((UINT8 *) ((UINTN) DataPtr), Buffer, DataSize);\r
return EFI_SUCCESS;\r
}\r
&CurrWriteSize,\r
CurrBuffer\r
);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ return Status;\r
} else {\r
Size = (UINT32) (LinearOffset + PtrBlockMapEntry->BlockLength - CurrWritePtr);\r
Status = EfiFvbWriteBlock (\r
UINT32 Instance;\r
EFI_PHYSICAL_ADDRESS FvVolHdr;\r
\r
- EFI_FLASH_MAP_ENTRY_DATA *FlashMapEntryData;\r
+ UINT64 TempVariableStoreHeader;\r
+\r
EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;\r
EFI_FLASH_SUBAREA_ENTRY VariableStoreEntry;\r
UINT64 BaseAddress;\r
UINT64 Length;\r
UINTN Index;\r
UINT8 Data;\r
- EFI_PEI_HOB_POINTERS GuidHob;\r
\r
Status = gBS->AllocatePool (\r
EfiRuntimeServicesData,\r
// Get non volatile varaible store\r
//\r
\r
- FlashMapEntryData = NULL;\r
-\r
- GuidHob.Raw = GetHobList ();\r
- while (NULL != (GuidHob.Raw = GetNextGuidHob (&gEfiFlashMapHobGuid, GuidHob.Raw))) {\r
- FlashMapEntryData = (EFI_FLASH_MAP_ENTRY_DATA *) GET_GUID_HOB_DATA (GuidHob.Guid);\r
-\r
- if (FlashMapEntryData->AreaType == EFI_FLASH_AREA_EFI_VARIABLES) {\r
- break;\r
- }\r
- GuidHob.Raw = GET_NEXT_HOB (GuidHob);\r
- }\r
-\r
- if (NULL == GuidHob.Raw || FlashMapEntryData == NULL) {\r
- gBS->FreePool (mVariableModuleGlobal);\r
- gBS->FreePool (VolatileVariableStore);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Currently only one non-volatile variable store is supported\r
- //\r
- if (FlashMapEntryData->NumEntries != 1) {\r
- gBS->FreePool (mVariableModuleGlobal);\r
- gBS->FreePool (VolatileVariableStore);\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- CopyMem (&VariableStoreEntry, &FlashMapEntryData->Entries[0], sizeof (VariableStoreEntry));\r
-\r
+ TempVariableStoreHeader = (UINT64) PcdGet32 (PcdFlashNvStorageVariableBase);\r
+ VariableStoreEntry.Base = TempVariableStoreHeader + \\r
+ (((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (TempVariableStoreHeader)) -> HeaderLength);\r
+ VariableStoreEntry.Length = (UINT64) PcdGet32 (PcdFlashNvStorageVariableSize) - \\r
+ (((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (TempVariableStoreHeader)) -> HeaderLength);\r
//\r
// Mark the variable storage region of the FLASH as RUNTIME\r
//\r
\r
mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) NextVariable - (UINTN) CurrPtr;\r
\r
+ //\r
+ // Check if the free area is blow a threshold\r
+ //\r
+ if ((((VARIABLE_STORE_HEADER *)((UINTN) CurrPtr))->Size - mVariableModuleGlobal->NonVolatileLastVariableOffset) < VARIABLE_RECLAIM_THRESHOLD) {\r
+ Status = Reclaim (\r
+ mVariableModuleGlobal->VariableBase[Physical].NonVolatileVariableBase,\r
+ &mVariableModuleGlobal->NonVolatileLastVariableOffset,\r
+ FALSE\r
+ );\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ gBS->FreePool (mVariableModuleGlobal);\r
+ gBS->FreePool (VolatileVariableStore);\r
+ return Status;\r
+ }\r
+\r
//\r
// Check if the free area is really free.\r
//\r