mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/HiiDatabase: Fix Setup numeric default value incorrect issue
When default/manufacturing flag get removed from numeric varid, it can't get default value from StructurePcd in 'UpdateDefaultSettingInFormPackage' function since there is no EFI_IFR_DEFAULT_OP opcode in IFR file. Add a chance to get numeric default value from StructurePcd in the case that numeric minimum value will be used as default value. Signed-off-by: Chen Lin Z <lin.z.chen@intel.com> Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
parent
a298a84478
commit
94f905b3bf
|
@ -2171,6 +2171,7 @@ ParseIfrData (
|
||||||
UINTN PackageOffset;
|
UINTN PackageOffset;
|
||||||
EFI_IFR_VARSTORE *IfrVarStore;
|
EFI_IFR_VARSTORE *IfrVarStore;
|
||||||
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
|
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
|
||||||
|
EFI_IFR_VARSTORE_EFI *IfrEfiVarStoreTmp;
|
||||||
EFI_IFR_OP_HEADER *IfrOpHdr;
|
EFI_IFR_OP_HEADER *IfrOpHdr;
|
||||||
EFI_IFR_ONE_OF *IfrOneOf;
|
EFI_IFR_ONE_OF *IfrOneOf;
|
||||||
EFI_IFR_REF4 *IfrRef;
|
EFI_IFR_REF4 *IfrRef;
|
||||||
|
@ -2187,6 +2188,7 @@ ParseIfrData (
|
||||||
IFR_BLOCK_DATA *BlockData;
|
IFR_BLOCK_DATA *BlockData;
|
||||||
CHAR16 *VarStoreName;
|
CHAR16 *VarStoreName;
|
||||||
UINTN NameSize;
|
UINTN NameSize;
|
||||||
|
UINTN NvDefaultStoreSize;
|
||||||
UINT16 VarWidth;
|
UINT16 VarWidth;
|
||||||
UINT16 VarDefaultId;
|
UINT16 VarDefaultId;
|
||||||
BOOLEAN FirstOneOfOption;
|
BOOLEAN FirstOneOfOption;
|
||||||
|
@ -2212,6 +2214,7 @@ ParseIfrData (
|
||||||
SmallestDefaultId = 0xFFFF;
|
SmallestDefaultId = 0xFFFF;
|
||||||
FromOtherDefaultOpcode = FALSE;
|
FromOtherDefaultOpcode = FALSE;
|
||||||
QuestionReferBitField = FALSE;
|
QuestionReferBitField = FALSE;
|
||||||
|
IfrEfiVarStoreTmp = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Go through the form package to parse OpCode one by one.
|
// Go through the form package to parse OpCode one by one.
|
||||||
|
@ -2303,6 +2306,18 @@ ParseIfrData (
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);
|
AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);
|
||||||
|
if (IfrEfiVarStoreTmp != NULL) {
|
||||||
|
FreePool (IfrEfiVarStoreTmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
IfrEfiVarStoreTmp = AllocatePool (IfrEfiVarStore->Header.Length + AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name));
|
||||||
|
if (IfrEfiVarStoreTmp == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyMem (IfrEfiVarStoreTmp, IfrEfiVarStore, IfrEfiVarStore->Header.Length);
|
||||||
|
AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, (CHAR16 *)&(IfrEfiVarStoreTmp->Name[0]), AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));
|
||||||
|
|
||||||
if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {
|
if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {
|
||||||
//
|
//
|
||||||
|
@ -2502,9 +2517,14 @@ ParseIfrData (
|
||||||
//
|
//
|
||||||
// Set default value base on the DefaultId list get from IFR data.
|
// Set default value base on the DefaultId list get from IFR data.
|
||||||
//
|
//
|
||||||
|
NvDefaultStoreSize = PcdGetSize (PcdNvStoreDefaultValueBuffer);
|
||||||
for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
|
for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
|
||||||
DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry);
|
DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry);
|
||||||
DefaultData.DefaultId = DefaultDataPtr->DefaultId;
|
DefaultData.DefaultId = DefaultDataPtr->DefaultId;
|
||||||
|
if (NvDefaultStoreSize > sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER)) {
|
||||||
|
FindQuestionDefaultSetting (DefaultData.DefaultId, IfrEfiVarStoreTmp, &(IfrOneOf->Question), &DefaultData.Value, VarWidth, QuestionReferBitField);
|
||||||
|
}
|
||||||
|
|
||||||
InsertDefaultValue (BlockData, &DefaultData);
|
InsertDefaultValue (BlockData, &DefaultData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3192,6 +3212,10 @@ Done:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IfrEfiVarStoreTmp != NULL) {
|
||||||
|
FreePool (IfrEfiVarStoreTmp);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2308,6 +2308,29 @@ HiiGetConfigRespInfo (
|
||||||
IN CONST EFI_HII_DATABASE_PROTOCOL *This
|
IN CONST EFI_HII_DATABASE_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Find question default value from PcdNvStoreDefaultValueBuffer
|
||||||
|
|
||||||
|
@param DefaultId Default store ID
|
||||||
|
@param EfiVarStore Point to EFI VarStore header
|
||||||
|
@param IfrQuestionHdr Point to Question header
|
||||||
|
@param ValueBuffer Point to Buffer includes the found default setting
|
||||||
|
@param Width Width of the default value
|
||||||
|
@param BitFieldQuestion Whether the Question is stored in Bit field.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Question default value is found.
|
||||||
|
@retval EFI_NOT_FOUND Question default value is not found.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
FindQuestionDefaultSetting (
|
||||||
|
IN UINT16 DefaultId,
|
||||||
|
IN EFI_IFR_VARSTORE_EFI *EfiVarStore,
|
||||||
|
IN EFI_IFR_QUESTION_HEADER *IfrQuestionHdr,
|
||||||
|
OUT VOID *ValueBuffer,
|
||||||
|
IN UINTN Width,
|
||||||
|
IN BOOLEAN BitFieldQuestion
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global variables
|
// Global variables
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue