MdeModulePkg/Variable: Parameterize VARIABLE_INFO_ENTRY buffer

UpdateVariableInfo () currently accepts parameters regarding updates
to be made to a global variable of type VARIABLE_INFO_ENTRY. This
change passes the structure by pointer to UpdateVariableInfo ()
so structures other than the fixed global variable can be updated.

Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Michael Kubacki <michael.a.kubacki@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
Michael Kubacki 2019-09-27 15:08:09 -07:00
parent f8ff4cca7c
commit 8d53adbee9
3 changed files with 39 additions and 34 deletions

View File

@ -1641,7 +1641,7 @@ UpdateVariable (
// go to delete this variable in variable HOB and // go to delete this variable in variable HOB and
// try to flush other variables from HOB to flash. // try to flush other variables from HOB to flash.
// //
UpdateVariableInfo (VariableName, VendorGuid, FALSE, FALSE, FALSE, TRUE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, FALSE, FALSE, FALSE, TRUE, FALSE, &gVariableInfo);
FlushHobVariableToFlash (VariableName, VendorGuid); FlushHobVariableToFlash (VariableName, VendorGuid);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -1758,7 +1758,7 @@ UpdateVariable (
&State &State
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, FALSE, TRUE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, FALSE, TRUE, FALSE, &gVariableInfo);
if (!Variable->Volatile) { if (!Variable->Volatile) {
CacheVariable->CurrPtr->State = State; CacheVariable->CurrPtr->State = State;
FlushHobVariableToFlash (VariableName, VendorGuid); FlushHobVariableToFlash (VariableName, VendorGuid);
@ -1777,7 +1777,7 @@ UpdateVariable (
// //
// Variable content unchanged and no need to update timestamp, just return. // Variable content unchanged and no need to update timestamp, just return.
// //
UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, TRUE, FALSE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, TRUE, FALSE, FALSE, &gVariableInfo);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
goto Done; goto Done;
} else if ((CacheVariable->CurrPtr->State == VAR_ADDED) || } else if ((CacheVariable->CurrPtr->State == VAR_ADDED) ||
@ -2006,7 +2006,7 @@ UpdateVariable (
CacheVariable->CurrPtr = (VARIABLE_HEADER *)((UINTN) CacheVariable->StartPtr + ((UINTN) Variable->CurrPtr - (UINTN) Variable->StartPtr)); CacheVariable->CurrPtr = (VARIABLE_HEADER *)((UINTN) CacheVariable->StartPtr + ((UINTN) Variable->CurrPtr - (UINTN) Variable->StartPtr));
CacheVariable->InDeletedTransitionPtr = NULL; CacheVariable->InDeletedTransitionPtr = NULL;
} }
UpdateVariableInfo (VariableName, VendorGuid, FALSE, FALSE, TRUE, FALSE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, FALSE, FALSE, TRUE, FALSE, FALSE, &gVariableInfo);
FlushHobVariableToFlash (VariableName, VendorGuid); FlushHobVariableToFlash (VariableName, VendorGuid);
} else { } else {
if (IsCommonUserVariable && ((VarSize + mVariableModuleGlobal->CommonUserVariableTotalSize) > mVariableModuleGlobal->CommonMaxUserVariableSpace)) { if (IsCommonUserVariable && ((VarSize + mVariableModuleGlobal->CommonUserVariableTotalSize) > mVariableModuleGlobal->CommonMaxUserVariableSpace)) {
@ -2156,7 +2156,7 @@ UpdateVariable (
CacheVariable->CurrPtr = (VARIABLE_HEADER *)((UINTN) CacheVariable->StartPtr + ((UINTN) Variable->CurrPtr - (UINTN) Variable->StartPtr)); CacheVariable->CurrPtr = (VARIABLE_HEADER *)((UINTN) CacheVariable->StartPtr + ((UINTN) Variable->CurrPtr - (UINTN) Variable->StartPtr));
CacheVariable->InDeletedTransitionPtr = NULL; CacheVariable->InDeletedTransitionPtr = NULL;
} }
UpdateVariableInfo (VariableName, VendorGuid, TRUE, FALSE, TRUE, FALSE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, TRUE, FALSE, TRUE, FALSE, FALSE, &gVariableInfo);
} }
goto Done; goto Done;
} }
@ -2227,7 +2227,7 @@ UpdateVariable (
} }
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
UpdateVariableInfo (VariableName, VendorGuid, Volatile, FALSE, TRUE, FALSE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, Volatile, FALSE, TRUE, FALSE, FALSE, &gVariableInfo);
if (!Volatile) { if (!Volatile) {
FlushHobVariableToFlash (VariableName, VendorGuid); FlushHobVariableToFlash (VariableName, VendorGuid);
} }
@ -2306,7 +2306,7 @@ VariableServiceGetVariable (
} }
*DataSize = VarDataSize; *DataSize = VarDataSize;
UpdateVariableInfo (VariableName, VendorGuid, Variable.Volatile, TRUE, FALSE, FALSE, FALSE); UpdateVariableInfo (VariableName, VendorGuid, Variable.Volatile, TRUE, FALSE, FALSE, FALSE, &gVariableInfo);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
goto Done; goto Done;

View File

@ -667,6 +667,7 @@ Done:
@param[in] Write TRUE if SetVariable() was called. @param[in] Write TRUE if SetVariable() was called.
@param[in] Delete TRUE if deleted via SetVariable(). @param[in] Delete TRUE if deleted via SetVariable().
@param[in] Cache TRUE for a cache hit. @param[in] Cache TRUE for a cache hit.
@param[in,out] VariableInfo Pointer to a pointer of VARIABLE_INFO_ENTRY structures.
**/ **/
VOID VOID
@ -677,35 +678,38 @@ UpdateVariableInfo (
IN BOOLEAN Read, IN BOOLEAN Read,
IN BOOLEAN Write, IN BOOLEAN Write,
IN BOOLEAN Delete, IN BOOLEAN Delete,
IN BOOLEAN Cache IN BOOLEAN Cache,
IN OUT VARIABLE_INFO_ENTRY **VariableInfo
) )
{ {
VARIABLE_INFO_ENTRY *Entry; VARIABLE_INFO_ENTRY *Entry;
if (FeaturePcdGet (PcdVariableCollectStatistics)) { if (FeaturePcdGet (PcdVariableCollectStatistics)) {
if (VariableName == NULL || VendorGuid == NULL || VariableInfo == NULL) {
return;
}
if (AtRuntime ()) { if (AtRuntime ()) {
// Don't collect statistics at runtime. // Don't collect statistics at runtime.
return; return;
} }
if (gVariableInfo == NULL) { if (*VariableInfo == NULL) {
// //
// On the first call allocate a entry and place a pointer to it in // On the first call allocate a entry and place a pointer to it in
// the EFI System Table. // the EFI System Table.
// //
gVariableInfo = AllocateZeroPool (sizeof (VARIABLE_INFO_ENTRY)); *VariableInfo = AllocateZeroPool (sizeof (VARIABLE_INFO_ENTRY));
ASSERT (gVariableInfo != NULL); ASSERT (*VariableInfo != NULL);
CopyGuid (&gVariableInfo->VendorGuid, VendorGuid); CopyGuid (&(*VariableInfo)->VendorGuid, VendorGuid);
gVariableInfo->Name = AllocateZeroPool (StrSize (VariableName)); (*VariableInfo)->Name = AllocateZeroPool (StrSize (VariableName));
ASSERT (gVariableInfo->Name != NULL); ASSERT ((*VariableInfo)->Name != NULL);
StrCpyS (gVariableInfo->Name, StrSize(VariableName)/sizeof(CHAR16), VariableName); StrCpyS ((*VariableInfo)->Name, StrSize(VariableName)/sizeof(CHAR16), VariableName);
gVariableInfo->Volatile = Volatile; (*VariableInfo)->Volatile = Volatile;
} }
for (Entry = gVariableInfo; Entry != NULL; Entry = Entry->Next) { for (Entry = (*VariableInfo); Entry != NULL; Entry = Entry->Next) {
if (CompareGuid (VendorGuid, &Entry->VendorGuid)) { if (CompareGuid (VendorGuid, &Entry->VendorGuid)) {
if (StrCmp (VariableName, Entry->Name) == 0) { if (StrCmp (VariableName, Entry->Name) == 0) {
if (Read) { if (Read) {
@ -739,7 +743,6 @@ UpdateVariableInfo (
StrCpyS (Entry->Next->Name, StrSize(VariableName)/sizeof(CHAR16), VariableName); StrCpyS (Entry->Next->Name, StrSize(VariableName)/sizeof(CHAR16), VariableName);
Entry->Next->Volatile = Volatile; Entry->Next->Volatile = Volatile;
} }
} }
} }
} }

View File

@ -293,6 +293,7 @@ VariableServiceGetNextVariableInternal (
@param[in] Write TRUE if SetVariable() was called. @param[in] Write TRUE if SetVariable() was called.
@param[in] Delete TRUE if deleted via SetVariable(). @param[in] Delete TRUE if deleted via SetVariable().
@param[in] Cache TRUE for a cache hit. @param[in] Cache TRUE for a cache hit.
@param[in,out] VariableInfo Pointer to a pointer of VARIABLE_INFO_ENTRY structures.
**/ **/
VOID VOID
@ -303,7 +304,8 @@ UpdateVariableInfo (
IN BOOLEAN Read, IN BOOLEAN Read,
IN BOOLEAN Write, IN BOOLEAN Write,
IN BOOLEAN Delete, IN BOOLEAN Delete,
IN BOOLEAN Cache IN BOOLEAN Cache,
IN OUT VARIABLE_INFO_ENTRY **VariableInfo
); );
#endif #endif