Move ConfigHdr from browser_storage to Formset_storage, avoid device path lost for drivers.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16680 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Parser for IFR binary encoding.
|
||||
|
||||
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@ -320,20 +320,20 @@ CreateExpression (
|
||||
EFI_STATUS
|
||||
InitializeConfigHdr (
|
||||
IN FORM_BROWSER_FORMSET *FormSet,
|
||||
IN OUT BROWSER_STORAGE *Storage
|
||||
IN OUT FORMSET_STORAGE *Storage
|
||||
)
|
||||
{
|
||||
CHAR16 *Name;
|
||||
|
||||
if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||
|
||||
Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
|
||||
Name = Storage->Name;
|
||||
if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||
|
||||
Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
|
||||
Name = Storage->BrowserStorage->Name;
|
||||
} else {
|
||||
Name = NULL;
|
||||
}
|
||||
|
||||
Storage->ConfigHdr = HiiConstructConfigHdr (
|
||||
&Storage->Guid,
|
||||
&Storage->BrowserStorage->Guid,
|
||||
Name,
|
||||
FormSet->DriverHandle
|
||||
);
|
||||
@ -559,29 +559,108 @@ CreateStorage (
|
||||
}
|
||||
|
||||
BrowserStorage->HiiHandle = FormSet->HiiHandle;
|
||||
InitializeConfigHdr (FormSet, BrowserStorage);
|
||||
|
||||
BrowserStorage->Initialized = FALSE;
|
||||
} else {
|
||||
if ((StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) &&
|
||||
(FormSet->DriverHandle != NULL) &&
|
||||
(!IsDevicePathExist (BrowserStorage->ConfigHdr))) {
|
||||
//
|
||||
// If this storage not has device path info but new formset has,
|
||||
// update the device path info.
|
||||
//
|
||||
FreePool (BrowserStorage->ConfigHdr);
|
||||
InitializeConfigHdr (FormSet, BrowserStorage);
|
||||
}
|
||||
}
|
||||
|
||||
Storage->BrowserStorage = BrowserStorage;
|
||||
Storage->ConfigRequest = AllocateCopyPool (StrSize (BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);
|
||||
InitializeConfigHdr (FormSet, Storage);
|
||||
Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);
|
||||
Storage->SpareStrLen = 0;
|
||||
|
||||
return Storage;
|
||||
}
|
||||
|
||||
/**
|
||||
Get Formset_storage base on the input varstoreid info.
|
||||
|
||||
@param FormSet Pointer of the current FormSet.
|
||||
@param VarStoreId Varstore ID info.
|
||||
|
||||
@return Pointer to a FORMSET_STORAGE data structure.
|
||||
|
||||
**/
|
||||
FORMSET_STORAGE *
|
||||
GetFstStgFromVarId (
|
||||
IN FORM_BROWSER_FORMSET *FormSet,
|
||||
IN EFI_VARSTORE_ID VarStoreId
|
||||
)
|
||||
{
|
||||
FORMSET_STORAGE *FormsetStorage;
|
||||
LIST_ENTRY *Link;
|
||||
BOOLEAN Found;
|
||||
|
||||
Found = FALSE;
|
||||
FormsetStorage = NULL;
|
||||
//
|
||||
// Find Formset Storage for this Question
|
||||
//
|
||||
Link = GetFirstNode (&FormSet->StorageListHead);
|
||||
while (!IsNull (&FormSet->StorageListHead, Link)) {
|
||||
FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);
|
||||
|
||||
if (FormsetStorage->VarStoreId == VarStoreId) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
Link = GetNextNode (&FormSet->StorageListHead, Link);
|
||||
}
|
||||
|
||||
return Found ? FormsetStorage : NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
Get Formset_storage base on the input browser storage.
|
||||
|
||||
More than one formsets may share the same browser storage,
|
||||
this function just get the first formset storage which
|
||||
share the browser storage.
|
||||
|
||||
@param Storage browser storage info.
|
||||
|
||||
@return Pointer to a FORMSET_STORAGE data structure.
|
||||
|
||||
|
||||
**/
|
||||
FORMSET_STORAGE *
|
||||
GetFstStgFromBrsStg (
|
||||
IN BROWSER_STORAGE *Storage
|
||||
)
|
||||
{
|
||||
FORMSET_STORAGE *FormsetStorage;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *FormsetLink;
|
||||
FORM_BROWSER_FORMSET *FormSet;
|
||||
BOOLEAN Found;
|
||||
|
||||
Found = FALSE;
|
||||
FormsetStorage = NULL;
|
||||
|
||||
FormsetLink = GetFirstNode (&gBrowserFormSetList);
|
||||
while (!IsNull (&gBrowserFormSetList, FormsetLink)) {
|
||||
FormSet = FORM_BROWSER_FORMSET_FROM_LINK (FormsetLink);
|
||||
FormsetLink = GetNextNode (&gBrowserFormSetList, FormsetLink);
|
||||
|
||||
Link = GetFirstNode (&FormSet->StorageListHead);
|
||||
while (!IsNull (&FormSet->StorageListHead, Link)) {
|
||||
FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);
|
||||
Link = GetNextNode (&FormSet->StorageListHead, Link);
|
||||
|
||||
if (FormsetStorage->BrowserStorage == Storage) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Found ? FormsetStorage : NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>
|
||||
|
||||
@ -651,17 +730,7 @@ InitializeRequestElement (
|
||||
//
|
||||
// Find Formset Storage for this Question
|
||||
//
|
||||
FormsetStorage = NULL;
|
||||
Link = GetFirstNode (&FormSet->StorageListHead);
|
||||
while (!IsNull (&FormSet->StorageListHead, Link)) {
|
||||
FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);
|
||||
|
||||
if (FormsetStorage->VarStoreId == Question->VarStoreId) {
|
||||
break;
|
||||
}
|
||||
|
||||
Link = GetNextNode (&FormSet->StorageListHead, Link);
|
||||
}
|
||||
FormsetStorage = GetFstStgFromVarId(FormSet, Question->VarStoreId);
|
||||
ASSERT (FormsetStorage != NULL);
|
||||
|
||||
//
|
||||
@ -695,7 +764,7 @@ InitializeRequestElement (
|
||||
while (!IsNull (&Form->ConfigRequestHead, Link)) {
|
||||
ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);
|
||||
|
||||
if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {
|
||||
if (ConfigInfo != NULL && ConfigInfo->Storage == FormsetStorage->BrowserStorage) {
|
||||
Find = TRUE;
|
||||
break;
|
||||
}
|
||||
@ -707,10 +776,10 @@ InitializeRequestElement (
|
||||
ConfigInfo = AllocateZeroPool(sizeof (FORM_BROWSER_CONFIG_REQUEST));
|
||||
ASSERT (ConfigInfo != NULL);
|
||||
ConfigInfo->Signature = FORM_BROWSER_CONFIG_REQUEST_SIGNATURE;
|
||||
ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);
|
||||
ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (FormsetStorage->ConfigHdr), FormsetStorage->ConfigHdr);
|
||||
ASSERT (ConfigInfo->ConfigRequest != NULL);
|
||||
ConfigInfo->SpareStrLen = 0;
|
||||
ConfigInfo->Storage = Storage;
|
||||
ConfigInfo->Storage = FormsetStorage->BrowserStorage;
|
||||
InsertTailList(&Form->ConfigRequestHead, &ConfigInfo->Link);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user