public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH] Fix Setup numeric default value incorrect issue
@ 2022-03-28 13:26 Chen Lin Z
  2022-03-31  7:28 ` Chen Lin Z
  0 siblings, 1 reply; 4+ messages in thread
From: Chen Lin Z @ 2022-03-28 13:26 UTC (permalink / raw)
  To: jian.j.wang, gaoliming, dandan.bi, eric.dong, devel
  Cc: zhuangzhi.li, di.zhang, 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@intel.com>
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
---
 .../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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fix Setup numeric default value incorrect issue
  2022-03-28 13:26 [PATCH] Fix Setup numeric default value incorrect issue Chen Lin Z
@ 2022-03-31  7:28 ` Chen Lin Z
  2022-04-01  2:00   ` 回复: " gaoliming
  0 siblings, 1 reply; 4+ messages in thread
From: Chen Lin Z @ 2022-03-31  7:28 UTC (permalink / raw)
  To: Wang, Jian J, Gao, Liming, Bi, Dandan, Dong, Eric,
	devel@edk2.groups.io
  Cc: Li, Zhuangzhi, Zhang, Di

Hi All,

  Any comments about patch ?

Thanks,
Lin

-----Original Message-----
From: Chen, Lin Z <lin.z.chen@intel.com> 
Sent: Monday, March 28, 2022 9:27 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] 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  | 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* 回复: [PATCH] Fix Setup numeric default value incorrect issue
  2022-03-31  7:28 ` Chen Lin Z
@ 2022-04-01  2:00   ` gaoliming
  2022-04-01  2:17     ` Chen Lin Z
  0 siblings, 1 reply; 4+ messages in thread
From: gaoliming @ 2022-04-01  2:00 UTC (permalink / raw)
  To: 'Chen, Lin Z', 'Wang, Jian J',
	'Bi, Dandan', 'Dong, Eric', devel
  Cc: 'Li, Zhuangzhi', 'Zhang, Di'

Lin:
 Thanks for your fix. This is the real issue for numeric opcode. I have one
comment here. The allocated IfrEfiVarStoreTmp is required to be free. 

Thanks
Liming
> -----邮件原件-----
> 发件人: Chen, Lin Z <lin.z.chen@intel.com>
> 发送时间: 2022年3月31日 15:29
> 收件人: 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
> 抄送: Li, Zhuangzhi <zhuangzhi.li@intel.com>; Zhang, Di
<di.zhang@intel.com>
> 主题: RE: [PATCH] Fix Setup numeric default value incorrect issue
> 
> Hi All,
> 
>   Any comments about patch ?
> 
> Thanks,
> Lin
> 
> -----Original Message-----
> From: Chen, Lin Z <lin.z.chen@intel.com>
> Sent: Monday, March 28, 2022 9:27 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] 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  | 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




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fix Setup numeric default value incorrect issue
  2022-04-01  2:00   ` 回复: " gaoliming
@ 2022-04-01  2:17     ` Chen Lin Z
  0 siblings, 0 replies; 4+ messages in thread
From: Chen Lin Z @ 2022-04-01  2:17 UTC (permalink / raw)
  To: Gao, Liming, Wang, Jian J, Bi, Dandan, Dong, Eric,
	devel@edk2.groups.io
  Cc: Li, Zhuangzhi, Zhang, Di

OK, I'll update patch.

Thanks,
Lin

-----Original Message-----
From: gaoliming <gaoliming@byosoft.com.cn> 
Sent: Friday, April 1, 2022 10:01 AM
To: Chen, Lin Z <lin.z.chen@intel.com>; Wang, Jian J <jian.j.wang@intel.com>; 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>
Subject: 回复: [PATCH] Fix Setup numeric default value incorrect issue

Lin:
 Thanks for your fix. This is the real issue for numeric opcode. I have one comment here. The allocated IfrEfiVarStoreTmp is required to be free. 

Thanks
Liming
> -----邮件原件-----
> 发件人: Chen, Lin Z <lin.z.chen@intel.com>
> 发送时间: 2022年3月31日 15:29
> 收件人: 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
> 抄送: Li, Zhuangzhi <zhuangzhi.li@intel.com>; Zhang, Di
<di.zhang@intel.com>
> 主题: RE: [PATCH] Fix Setup numeric default value incorrect issue
> 
> Hi All,
> 
>   Any comments about patch ?
> 
> Thanks,
> Lin
> 
> -----Original Message-----
> From: Chen, Lin Z <lin.z.chen@intel.com>
> Sent: Monday, March 28, 2022 9:27 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] 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  | 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




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-04-01  2:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-03-28 13:26 [PATCH] Fix Setup numeric default value incorrect issue Chen Lin Z
2022-03-31  7:28 ` Chen Lin Z
2022-04-01  2:00   ` 回复: " gaoliming
2022-04-01  2:17     ` Chen Lin Z

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox