Date
1 - 2 of 2
[PATCH] Fix Setup numeric default value incorrect issue
Chen Lin Z
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@...> Signed-off-by: Dandan Bi <dandan.bi@...> --- .../Universal/HiiDatabaseDxe/ConfigRouting.c | 14 +++++++++++ .../Universal/HiiDatabaseDxe/HiiDatabase.h | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeMod= ulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 2f792d2965..8bfa0f4bf1 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -2171,6 +2171,7 @@ ParseIfrData ( UINTN PackageOffset;=0D EFI_IFR_VARSTORE *IfrVarStore;=0D EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;=0D + EFI_IFR_VARSTORE_EFI *IfrEfiVarStoreTmp;=0D EFI_IFR_OP_HEADER *IfrOpHdr;=0D EFI_IFR_ONE_OF *IfrOneOf;=0D EFI_IFR_REF4 *IfrRef;=0D @@ -2187,6 +2188,7 @@ ParseIfrData ( IFR_BLOCK_DATA *BlockData;=0D CHAR16 *VarStoreName;=0D UINTN NameSize;=0D + UINTN NvDefaultStoreSize;=0D UINT16 VarWidth;=0D UINT16 VarDefaultId;=0D BOOLEAN FirstOneOfOption;=0D @@ -2303,6 +2305,14 @@ ParseIfrData ( }=0D =0D AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName= , NameSize);=0D + IfrEfiVarStoreTmp =3D AllocatePool (IfrEfiVarStore->Header.Length = + AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name));=0D + if (IfrEfiVarStoreTmp =3D=3D NULL) {=0D + Status =3D EFI_OUT_OF_RESOURCES;=0D + goto Done;=0D + }=0D +=0D + CopyMem (IfrEfiVarStoreTmp, IfrEfiVarStore, IfrEfiVarStore->Header= .Length);=0D + AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, (CHAR16 *)&(= IfrEfiVarStoreTmp->Name[0]), AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) *= sizeof (CHAR16));=0D =0D if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr= )) {=0D //=0D @@ -2502,9 +2512,13 @@ ParseIfrData ( //=0D // Set default value base on the DefaultId list get from IFR dat= a.=0D //=0D + NvDefaultStoreSize =3D PcdGetSize (PcdNvStoreDefaultValueBuffer)= ;=0D for (LinkData =3D DefaultIdArray->Entry.ForwardLink; LinkData != =3D &DefaultIdArray->Entry; LinkData =3D LinkData->ForwardLink) {=0D DefaultDataPtr =3D BASE_CR (LinkData, IFR_DEFAULT_DATA,= Entry);=0D DefaultData.DefaultId =3D DefaultDataPtr->DefaultId;=0D + if (NvDefaultStoreSize > sizeof (PCD_NV_STORE_DEFAULT_BUFFER_H= EADER)) {=0D + FindQuestionDefaultSetting (DefaultData.DefaultId, IfrEfiVar= StoreTmp, &(IfrOneOf->Question), &DefaultData.Value, VarWidth, QuestionRefe= rBitField);=0D + }=0D InsertDefaultValue (BlockData, &DefaultData);=0D }=0D }=0D diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h b/MdeModul= ePkg/Universal/HiiDatabaseDxe/HiiDatabase.h index c4ca6ad6ee..421c293cfc 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h @@ -2308,6 +2308,29 @@ HiiGetConfigRespInfo ( IN CONST EFI_HII_DATABASE_PROTOCOL *This=0D );=0D =0D +/**=0D + Find question default value from PcdNvStoreDefaultValueBuffer=0D +=0D + @param DefaultId Default store ID=0D + @param EfiVarStore Point to EFI VarStore header=0D + @param IfrQuestionHdr Point to Question header=0D + @param ValueBuffer Point to Buffer includes the found default set= ting=0D + @param Width Width of the default value=0D + @param BitFieldQuestion Whether the Question is stored in Bit field.=0D +=0D + @retval EFI_SUCCESS Question default value is found.=0D + @retval EFI_NOT_FOUND Question default value is not found.=0D +**/=0D +EFI_STATUS=0D +FindQuestionDefaultSetting (=0D + IN UINT16 DefaultId,=0D + IN EFI_IFR_VARSTORE_EFI *EfiVarStore,=0D + IN EFI_IFR_QUESTION_HEADER *IfrQuestionHdr,=0D + OUT VOID *ValueBuffer,=0D + IN UINTN Width,=0D + IN BOOLEAN BitFieldQuestion=0D + );=0D +=0D //=0D // Global variables=0D //=0D --=20 2.25.1 |
|
Chen Lin Z
Hi All,
toggle quoted message
Show quoted text
Any comments about patch ? Thanks, Lin -----Original Message-----
From: Chen, Lin Z <lin.z.chen@...> Sent: Monday, March 28, 2022 9:27 PM To: Wang, Jian J <jian.j.wang@...>; Gao, Liming <gaoliming@...>; Bi, Dandan <dandan.bi@...>; Dong, Eric <eric.dong@...>; devel@edk2.groups.io Cc: Li, Zhuangzhi <zhuangzhi.li@...>; Zhang, Di <di.zhang@...>; Chen, Lin Z <lin.z.chen@...> Subject: [PATCH] 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@...> Signed-off-by: Dandan Bi <dandan.bi@...> --- .../Universal/HiiDatabaseDxe/ConfigRouting.c | 14 +++++++++++ .../Universal/HiiDatabaseDxe/HiiDatabase.h | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 2f792d2965..8bfa0f4bf1 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -2171,6 +2171,7 @@ ParseIfrData ( UINTN PackageOffset; EFI_IFR_VARSTORE *IfrVarStore; EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;+ EFI_IFR_VARSTORE_EFI *IfrEfiVarStoreTmp; EFI_IFR_OP_HEADER *IfrOpHdr; EFI_IFR_ONE_OF *IfrOneOf; EFI_IFR_REF4 *IfrRef;@@ -2187,6 +2188,7 @@ ParseIfrData ( IFR_BLOCK_DATA *BlockData; CHAR16 *VarStoreName; UINTN NameSize;+ UINTN NvDefaultStoreSize; UINT16 VarWidth; UINT16 VarDefaultId; BOOLEAN FirstOneOfOption;@@ -2303,6 +2305,14 @@ ParseIfrData ( } AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);+ 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)) { //@@ -2502,9 +2512,13 @@ ParseIfrData ( // // 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) { DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry); 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); } }diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h index c4ca6ad6ee..421c293cfc 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h @@ -2308,6 +2308,29 @@ HiiGetConfigRespInfo ( 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 //-- 2.25.1 |
|