[edk2-devel] [PATCH-V2] Fix Setup numeric default value incorrect issue

Chen Lin Z posted 1 patch 2 years ago
Failed in applying to current master (apply log)
.../Universal/HiiDatabaseDxe/ConfigRouting.c  | 22 ++++++++++++++++++
.../Universal/HiiDatabaseDxe/HiiDatabase.h    | 23 +++++++++++++++++++
2 files changed, 45 insertions(+)
[edk2-devel] [PATCH-V2] Fix Setup numeric default value incorrect issue
Posted by Chen Lin Z 2 years ago
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]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH-V2] Fix Setup numeric default value incorrect issue
Posted by Chen Lin Z 2 years ago
@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]
-=-=-=-=-=-=-=-=-=-=-=-
[edk2-devel] 回复: [PATCH-V2] Fix Setup numeric default value incorrect issue
Posted by gaoliming 2 years ago
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]
-=-=-=-=-=-=-=-=-=-=-=-