]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/HiiDatabase: Fix Setup numeric default value incorrect issue
authorChen, Lin Z <lin.z.chen@intel.com>
Fri, 1 Apr 2022 06:09:05 +0000 (14:09 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 8 Apr 2022 02:08:35 +0000 (02:08 +0000)
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>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h

index 2f792d296530a2a3b4f5739dd60c8c51329bc6d0..5ae6189a2843ce6fa386cc05a0717c71433f2191 100644 (file)
@@ -2171,6 +2171,7 @@ ParseIfrData (
   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
@@ -2187,6 +2188,7 @@ ParseIfrData (
   IFR_BLOCK_DATA               *BlockData;\r
   CHAR16                       *VarStoreName;\r
   UINTN                        NameSize;\r
+  UINTN                        NvDefaultStoreSize;\r
   UINT16                       VarWidth;\r
   UINT16                       VarDefaultId;\r
   BOOLEAN                      FirstOneOfOption;\r
@@ -2212,6 +2214,7 @@ ParseIfrData (
   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
@@ -2303,6 +2306,18 @@ ParseIfrData (
         }\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
@@ -2502,9 +2517,14 @@ ParseIfrData (
           //\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
@@ -3192,6 +3212,10 @@ Done:
     }\r
   }\r
 \r
+  if (IfrEfiVarStoreTmp != NULL) {\r
+    FreePool (IfrEfiVarStoreTmp);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
index c4ca6ad6eee8860437b817f725d06b534ebf44e0..421c293cfcc3dfe47d1ba44f3f87f36bb5b920e6 100644 (file)
@@ -2308,6 +2308,29 @@ HiiGetConfigRespInfo (
   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