UINTN PackageOffset;\r
EFI_IFR_VARSTORE *IfrVarStore;\r
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
+ EFI_IFR_VARSTORE_EFI *IfrEfiVarStoreTmp;\r
EFI_IFR_OP_HEADER *IfrOpHdr;\r
EFI_IFR_ONE_OF *IfrOneOf;\r
EFI_IFR_REF4 *IfrRef;\r
IFR_BLOCK_DATA *BlockData;\r
CHAR16 *VarStoreName;\r
UINTN NameSize;\r
+ UINTN NvDefaultStoreSize;\r
UINT16 VarWidth;\r
UINT16 VarDefaultId;\r
BOOLEAN FirstOneOfOption;\r
SmallestDefaultId = 0xFFFF;\r
FromOtherDefaultOpcode = FALSE;\r
QuestionReferBitField = FALSE;\r
+ IfrEfiVarStoreTmp = NULL;\r
\r
//\r
// Go through the form package to parse OpCode one by one.\r
}\r
\r
AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);\r
+ if (IfrEfiVarStoreTmp != NULL) {\r
+ FreePool (IfrEfiVarStoreTmp);\r
+ }\r
+\r
+ IfrEfiVarStoreTmp = AllocatePool (IfrEfiVarStore->Header.Length + AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name));\r
+ if (IfrEfiVarStoreTmp == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+\r
+ CopyMem (IfrEfiVarStoreTmp, IfrEfiVarStore, IfrEfiVarStore->Header.Length);\r
+ AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, (CHAR16 *)&(IfrEfiVarStoreTmp->Name[0]), AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
\r
if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {\r
//\r
//\r
// Set default value base on the DefaultId list get from IFR data.\r
//\r
+ NvDefaultStoreSize = PcdGetSize (PcdNvStoreDefaultValueBuffer);\r
for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {\r
DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry);\r
DefaultData.DefaultId = DefaultDataPtr->DefaultId;\r
+ if (NvDefaultStoreSize > sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER)) {\r
+ FindQuestionDefaultSetting (DefaultData.DefaultId, IfrEfiVarStoreTmp, &(IfrOneOf->Question), &DefaultData.Value, VarWidth, QuestionReferBitField);\r
+ }\r
+\r
InsertDefaultValue (BlockData, &DefaultData);\r
}\r
}\r
}\r
}\r
\r
+ if (IfrEfiVarStoreTmp != NULL) {\r
+ FreePool (IfrEfiVarStoreTmp);\r
+ }\r
+\r
return Status;\r
}\r
\r
IN CONST EFI_HII_DATABASE_PROTOCOL *This\r
);\r
\r
+/**\r
+ Find question default value from PcdNvStoreDefaultValueBuffer\r
+\r
+ @param DefaultId Default store ID\r
+ @param EfiVarStore Point to EFI VarStore header\r
+ @param IfrQuestionHdr Point to Question header\r
+ @param ValueBuffer Point to Buffer includes the found default setting\r
+ @param Width Width of the default value\r
+ @param BitFieldQuestion Whether the Question is stored in Bit field.\r
+\r
+ @retval EFI_SUCCESS Question default value is found.\r
+ @retval EFI_NOT_FOUND Question default value is not found.\r
+**/\r
+EFI_STATUS\r
+FindQuestionDefaultSetting (\r
+ IN UINT16 DefaultId,\r
+ IN EFI_IFR_VARSTORE_EFI *EfiVarStore,\r
+ IN EFI_IFR_QUESTION_HEADER *IfrQuestionHdr,\r
+ OUT VOID *ValueBuffer,\r
+ IN UINTN Width,\r
+ IN BOOLEAN BitFieldQuestion\r
+ );\r
+\r
//\r
// Global variables\r
//\r