]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Patch includes:
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 24 Nov 2011 08:47:57 +0000 (08:47 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 24 Nov 2011 08:47:57 +0000 (08:47 +0000)
1. Support get default value for ref opcode logic.
2. Correct the sample for ref opcode with default value.
3. Refine logic about processing device path info in ref value.
Signed-off-by: ydong10
Reviewed-by: lgao4
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12774 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr
MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
MdeModulePkg/Universal/SetupBrowserDxe/Ui.c

index 03ae667e7c1b85a942bf343347ee9d8c5bc0968f..ab4703eb8219d5cd4ed802cc1884b8f15761a31a 100644 (file)
@@ -645,11 +645,12 @@ formset
       prompt  = STRING_TOKEN(STR_GOTO_DYNAMIC3),\r
       help    = STRING_TOKEN(STR_GOTO_DYNAMIC3_HELP),\r
       flags   = INTERACTIVE,\r
-      key     = 0x1248;\r
+      key     = 0x1248,\r
       //\r
       // Set the defult value, format is QuestionId; FormId; FormsetGuid; Device Path String Token\r
       //\r
       default = 0;0;ZERO_GUID;STRING_TOKEN(STR_NULL_STRING),  \r
+    ;                                                         // goto opcode end flag.\r
 \r
     goto \r
       prompt  = STRING_TOKEN(STR_GOTO_DYNAMIC4),\r
index 7cc71e2476e97c0a422518bd1f53864a364b02f3..356b730bedaeb8dec8e3f9e9049c95be130bf8fb 100644 (file)
@@ -661,7 +661,7 @@ InsertDefaultValue (
         //\r
         // Update the default value array in BlockData.\r
         //\r
-        DefaultValueArray->Value = DefaultValueData->Value;\r
+        CopyMem (&DefaultValueArray->Value, &DefaultValueData->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
         DefaultValueArray->Type  = DefaultValueData->Type;\r
         DefaultValueArray->Cleaned = DefaultValueData->Cleaned;\r
       }\r
@@ -990,6 +990,7 @@ ParseIfrData (
   EFI_IFR_VARSTORE_EFI     *IfrEfiVarStore;\r
   EFI_IFR_OP_HEADER        *IfrOpHdr;\r
   EFI_IFR_ONE_OF           *IfrOneOf;\r
+  EFI_IFR_REF4             *IfrRef;\r
   EFI_IFR_ONE_OF_OPTION    *IfrOneOfOption;\r
   EFI_IFR_DEFAULT          *IfrDefault;\r
   EFI_IFR_ORDERED_LIST     *IfrOrderedList;\r
@@ -1178,6 +1179,65 @@ ParseIfrData (
       }\r
       break;\r
 \r
+    case EFI_IFR_REF_OP:\r
+      //\r
+      // Ref question is not in IFR Form. This IFR form is not valid. \r
+      //\r
+      if (VarStorageData->Size == 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
+      //\r
+      // Check whether this question is for the requested varstore.\r
+      //\r
+      IfrRef = (EFI_IFR_REF4 *) IfrOpHdr;\r
+      if (IfrRef->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+        break;\r
+      }\r
+      \r
+      //\r
+      // Get Offset/Width by Question header.\r
+      //\r
+      VarOffset = IfrRef->Question.VarStoreInfo.VarOffset;\r
+      VarWidth  = (UINT16) (sizeof (EFI_HII_REF));\r
+      //\r
+      // Check whether this question is in requested block array.\r
+      //\r
+      if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {\r
+        //\r
+        // This question is not in the requested string. Skip it.\r
+        //\r
+        break;\r
+      }\r
+\r
+      //\r
+      // Check this var question is in the var storage \r
+      //\r
+      if ((VarOffset + VarWidth) > VarStorageData->Size) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
+      \r
+      //\r
+      // Set Block Data\r
+      //\r
+      BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));\r
+      if (BlockData == NULL) {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+        goto Done;\r
+      }\r
+      BlockData->Offset     = VarOffset;\r
+      BlockData->Width      = VarWidth;\r
+      BlockData->QuestionId = IfrRef->Question.QuestionId;\r
+      BlockData->OpCode     = IfrOpHdr->OpCode;\r
+      BlockData->Scope      = IfrOpHdr->Scope;\r
+      InitializeListHead (&BlockData->DefaultValueEntry);\r
+      //\r
+      // Add Block Data into VarStorageData BlockEntry\r
+      //\r
+      InsertBlockData (&VarStorageData->BlockEntry, &BlockData);\r
+      break;\r
+\r
     case EFI_IFR_ONE_OF_OP:\r
     case EFI_IFR_NUMERIC_OP:\r
       //\r
@@ -1253,19 +1313,19 @@ ParseIfrData (
         DefaultData.Type        = DefaultValueFromDefault;\r
         switch (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE) {\r
         case EFI_IFR_NUMERIC_SIZE_1:\r
-          DefaultData.Value = (UINT64) IfrOneOf->data.u8.MinValue;\r
+          DefaultData.Value.u8 = IfrOneOf->data.u8.MinValue;\r
           break;\r
   \r
         case EFI_IFR_NUMERIC_SIZE_2:\r
-          CopyMem (&DefaultData.Value, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
+          CopyMem (&DefaultData.Value.u16, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
           break;\r
   \r
         case EFI_IFR_NUMERIC_SIZE_4:\r
-          CopyMem (&DefaultData.Value, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
+          CopyMem (&DefaultData.Value.u32, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
           break;\r
   \r
         case EFI_IFR_NUMERIC_SIZE_8:\r
-          CopyMem (&DefaultData.Value, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
+          CopyMem (&DefaultData.Value.u64, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
           break;\r
         }\r
         //\r
@@ -1404,14 +1464,14 @@ ParseIfrData (
         //\r
         // When flag is set, defautl value is TRUE.\r
         //\r
-        DefaultData.Type     = DefaultValueFromFlag;\r
-        DefaultData.Value    = 1;\r
+        DefaultData.Type    = DefaultValueFromFlag;\r
+        DefaultData.Value.b = TRUE;\r
       } else {\r
         //\r
         // When flag is not set, defautl value is FASLE.\r
         //\r
-        DefaultData.Type     = DefaultValueFromDefault;\r
-        DefaultData.Value    = 0;\r
+        DefaultData.Type    = DefaultValueFromDefault;\r
+        DefaultData.Value.b = FALSE;\r
       }\r
       //\r
       // Add DefaultValue into current BlockData\r
@@ -1430,14 +1490,14 @@ ParseIfrData (
         //\r
         // When flag is set, defautl value is TRUE.\r
         //\r
-        DefaultData.Type     = DefaultValueFromFlag;\r
-        DefaultData.Value    = 1;\r
+        DefaultData.Type    = DefaultValueFromFlag;\r
+        DefaultData.Value.b = TRUE;\r
       } else {\r
         //\r
         // When flag is not set, defautl value is FASLE.\r
         //\r
-        DefaultData.Type     = DefaultValueFromDefault;        \r
-        DefaultData.Value    = 0;\r
+        DefaultData.Type    = DefaultValueFromDefault;        \r
+        DefaultData.Value.b = FALSE;\r
       }\r
       //\r
       // Add DefaultValue into current BlockData\r
@@ -1665,7 +1725,7 @@ ParseIfrData (
         // Prepare new DefaultValue\r
         //\r
         DefaultData.Type  = DefaultValueFromFlag;\r
-        DefaultData.Value = IfrOneOfOption->Value.u64;\r
+        CopyMem (&DefaultData.Value.u64, &IfrOneOfOption->Value.u64, sizeof (UINT64));\r
         if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) {\r
           DefaultData.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
           InsertDefaultValue (BlockData, &DefaultData);\r
@@ -1690,7 +1750,7 @@ ParseIfrData (
         // Prepare new DefaultValue\r
         //        \r
         DefaultData.Type        = DefaultValueFromDefault;\r
-        DefaultData.Value       = IfrOneOfOption->Value.u64;        \r
+        CopyMem (&DefaultData.Value.u64, &IfrOneOfOption->Value.u64, sizeof (UINT64));      \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
@@ -1726,7 +1786,7 @@ ParseIfrData (
       //\r
       DefaultData.Type        = DefaultValueFromOpcode;\r
       DefaultData.DefaultId   = VarDefaultId;\r
-      DefaultData.Value       = IfrDefault->Value.u64;  \r
+      CopyMem (&DefaultData.Value, &IfrDefault->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
       \r
       // If the value field is expression, set the cleaned flag.\r
       if (IfrDefault->Type ==  EFI_IFR_TYPE_OTHER) {\r
index b0944abb1b5c7c00d79555bd695cc6a4cbfbb7e3..455dac3533f5660cf039520aa52150a36d632660 100644 (file)
@@ -96,7 +96,7 @@ typedef struct {
                                      // TRUE  Cleaned, the value can't be used\r
                                      // FALSE Not cleaned, the value can  be used.\r
   UINT16              DefaultId;\r
-  UINT64              Value;\r
+  EFI_IFR_TYPE_VALUE  Value;\r
 } IFR_DEFAULT_DATA;\r
 \r
 //\r
index 0be50263dd150481d761b7b78954564719de6508..ebe8fae2cc4391812cc948a29cb2f25f1719dd20 100644 (file)
@@ -1891,6 +1891,7 @@ ProcessGotoOpCode (
   )\r
 {\r
   CHAR16                          *StringPtr;\r
+  UINTN                           StringLen;\r
   UINTN                           BufferSize;\r
   EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
   CHAR16                          TemStr[2];\r
@@ -1905,8 +1906,23 @@ ProcessGotoOpCode (
   \r
   Status = EFI_SUCCESS;\r
   UpdateFormInfo = TRUE;\r
+  StringPtr = NULL;\r
+  StringLen = 0;\r
 \r
+  //\r
+  // Prepare the device path check, get the device path info first.\r
+  //\r
   if (Statement->HiiValue.Value.ref.DevicePath != 0) {\r
+    StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
+    if (StringPtr != NULL) {\r
+      StringLen = StrLen (StringPtr);\r
+    }\r
+  }\r
+\r
+  //\r
+  // Check whether the device path string is a valid string.\r
+  //\r
+  if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL && StringLen != 0) {\r
     if (Selection->Form->ModalForm) {\r
       return Status;\r
     }\r
@@ -1914,16 +1930,6 @@ ProcessGotoOpCode (
     // Goto another Hii Package list\r
     //\r
     Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
-    StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
-    if (StringPtr == NULL) {\r
-      //\r
-      // No device path string not found, exit\r
-      //\r
-      Selection->Action = UI_ACTION_EXIT;\r
-      Selection->Statement = NULL;\r
-      return Status;\r
-    }\r
     BufferSize = StrLen (StringPtr) / 2;\r
     DevicePath = AllocatePool (BufferSize);\r
     ASSERT (DevicePath != NULL);\r
@@ -1947,8 +1953,11 @@ ProcessGotoOpCode (
         DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
       }\r
     }\r
+    FreePool (StringPtr);\r
 \r
     Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
+    FreePool (DevicePath);\r
+\r
     if (Selection->Handle == NULL) {\r
       //\r
       // If target Hii Handle not found, exit\r
@@ -1958,9 +1967,6 @@ ProcessGotoOpCode (
       return Status;\r
     }\r
 \r
-    FreePool (StringPtr);\r
-    FreePool (DevicePath);\r
-\r
     CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
     Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
     Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r