.../Universal/HiiDatabaseDxe/ConfigRouting.c | 22 ++++++++++++++++++ .../Universal/HiiDatabaseDxe/HiiDatabase.h | 23 +++++++++++++++++++ 2 files changed, 45 insertions(+)
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>
---
.../Universal/HiiDatabaseDxe/ConfigRouting.c | 22 ++++++++++++++++++
.../Universal/HiiDatabaseDxe/HiiDatabase.h | 23 +++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
index 2f792d2965..1c6af853b3 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;
@@ -2212,6 +2214,7 @@ ParseIfrData (
SmallestDefaultId = 0xFFFF;
FromOtherDefaultOpcode = FALSE;
QuestionReferBitField = FALSE;
+ IfrEfiVarStoreTmp = NULL;
//
// Go through the form package to parse OpCode one by one.
@@ -2303,6 +2306,17 @@ ParseIfrData (
}
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)) {
//
@@ -2502,9 +2516,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);
}
}
@@ -3192,6 +3210,10 @@ Done:
}
}
+ if (IfrEfiVarStoreTmp != NULL) {
+ FreePool (IfrEfiVarStoreTmp);
+ }
+
return Status;
}
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
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#88319): https://edk2.groups.io/g/devel/message/88319
Mute This Topic: https://groups.io/mt/90172134/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
@Gao, Liming, Any comment about patch V2 ? we need to this patch to fix our issues, Pls help review it.
Thanks,
Lin
-----Original Message-----
From: Chen, Lin Z <lin.z.chen@intel.com>
Sent: Friday, April 1, 2022 2:09 PM
To: Wang, Jian J <jian.j.wang@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>; Bi, Dandan <dandan.bi@intel.com>; Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
Cc: Li, Zhuangzhi <zhuangzhi.li@intel.com>; Zhang, Di <di.zhang@intel.com>; Chen, Lin Z <lin.z.chen@intel.com>
Subject: [PATCH-V2] 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>
---
.../Universal/HiiDatabaseDxe/ConfigRouting.c | 22 ++++++++++++++++++
.../Universal/HiiDatabaseDxe/HiiDatabase.h | 23 +++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
index 2f792d2965..1c6af853b3 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;@@ -2212,6 +2214,7 @@ ParseIfrData (
SmallestDefaultId = 0xFFFF; FromOtherDefaultOpcode = FALSE; QuestionReferBitField = FALSE;+ IfrEfiVarStoreTmp = NULL; // // Go through the form package to parse OpCode one by one.@@ -2303,6 +2306,17 @@ ParseIfrData (
} 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)) { //@@ -2502,9 +2516,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); } }@@ -3192,6 +3210,10 @@ Done:
} } + if (IfrEfiVarStoreTmp != NULL) {+ FreePool (IfrEfiVarStoreTmp);+ }+ return Status; } 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
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#88497): https://edk2.groups.io/g/devel/message/88497
Mute This Topic: https://groups.io/mt/90172134/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
> -----邮件原件-----
> 发件人: Chen Lin Z <lin.z.chen@intel.com>
> 发送时间: 2022年4月1日 14:09
> 收件人: jian.j.wang@intel.com; gaoliming@byosoft.com.cn;
> dandan.bi@intel.com; eric.dong@intel.com; devel@edk2.groups.io
> 抄送: zhuangzhi.li@intel.com; di.zhang@intel.com; Chen Lin Z
> <lin.z.chen@intel.com>
> 主题: [PATCH-V2] 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>
> ---
> .../Universal/HiiDatabaseDxe/ConfigRouting.c | 22 ++++++++++++++++++
> .../Universal/HiiDatabaseDxe/HiiDatabase.h | 23
> +++++++++++++++++++
> 2 files changed, 45 insertions(+)
>
> diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
> b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
> index 2f792d2965..1c6af853b3 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;
>
> @@ -2212,6 +2214,7 @@ ParseIfrData (
> SmallestDefaultId = 0xFFFF;
>
> FromOtherDefaultOpcode = FALSE;
>
> QuestionReferBitField = FALSE;
>
> + IfrEfiVarStoreTmp = NULL;
>
>
>
> //
>
> // Go through the form package to parse OpCode one by one.
>
> @@ -2303,6 +2306,17 @@ ParseIfrData (
> }
>
>
>
> 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)) {
>
> //
>
> @@ -2502,9 +2516,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);
>
> }
>
> }
>
> @@ -3192,6 +3210,10 @@ Done:
> }
>
> }
>
>
>
> + if (IfrEfiVarStoreTmp != NULL) {
>
> + FreePool (IfrEfiVarStoreTmp);
>
> + }
>
> +
>
> return Status;
>
> }
>
>
>
> 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
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#88505): https://edk2.groups.io/g/devel/message/88505
Mute This Topic: https://groups.io/mt/90307119/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2026 Red Hat, Inc.