]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
Correct CompareGuid function
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Utility.c
index 9e41487778f2304022e5e354ea0f6f0ba611640c..4934b2b3f46b3e6a034a671478dbea4137b7c62c 100644 (file)
@@ -21,29 +21,6 @@ EFI_GUID  gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;
 EFI_GUID  gTianoHiiIfrGuid              = EFI_IFR_TIANO_GUID;\r
 \r
 \r
-EFI_GUID *\r
-GetGuidOfFirstFormset (\r
-  CONST EFI_HII_FORM_PACKAGE * FormPackage\r
-) \r
-{\r
-  UINT8                   *StartOfNextPackage;\r
-  EFI_IFR_OP_HEADER       *OpCodeData;\r
-\r
-  StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length;\r
-  OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1);\r
-\r
-  while ((UINT8 *) OpCodeData < StartOfNextPackage) {\r
-    if (OpCodeData->OpCode == EFI_IFR_FORM_SET_OP) {\r
-      return AllocateCopyPool (sizeof(EFI_GUID), &(((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
-    }\r
-    OpCodeData = (EFI_IFR_OP_HEADER *) ((UINT8 *) OpCodeData + OpCodeData->Length);\r
-  }\r
-\r
-  ASSERT (FALSE);\r
-\r
-  return NULL;\r
-}\r
-\r
 EFI_HII_HANDLE\r
 FwHiiHandleToUefiHiiHandle (\r
   IN CONST HII_THUNK_PRIVATE_DATA      *Private,\r
@@ -113,8 +90,8 @@ UefiHiiHandleToThunkContext (
   return NULL;\r
 }\r
 \r
-EFI_HII_HANDLE *\r
-TagGuidToUefiHiiHandle (\r
+HII_THUNK_CONTEXT *\r
+TagGuidToIfrPackThunkContext (\r
   IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN CONST EFI_GUID                   *Guid\r
   )\r
@@ -128,7 +105,7 @@ TagGuidToUefiHiiHandle (
     ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
     if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
-      return ThunkContext->UefiHiiHandle;\r
+      return ThunkContext;\r
     }\r
 \r
     Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
@@ -239,6 +216,173 @@ GetOneOfOptionMapEntryListHead (
   return NULL;\r
 }\r
 \r
+EFI_HII_PACKAGE_HEADER *\r
+GetIfrPackage (\r
+  IN CONST EFI_HII_PACKAGES               *Packages\r
+  )\r
+{\r
+  UINTN                         Index;\r
+  TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+\r
+  ASSERT (Packages != NULL);\r
+\r
+  TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
+  \r
+  for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
+    //\r
+    // The current UEFI HII build tool generate a binary in the format defined by \r
+    // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
+    // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
+    // may not be the exact number of valid package number in the binary generated \r
+    // by HII Build tool.\r
+    //\r
+    switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
+      case EFI_HII_PACKAGE_FORM:\r
+        return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
+        break;\r
+      case EFI_HII_PACKAGE_STRINGS:\r
+      case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
+        break;\r
+\r
+      //\r
+      // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
+      //\r
+      case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
+      case EFI_HII_PACKAGE_FONTS:\r
+      case EFI_HII_PACKAGE_IMAGES:\r
+      default:\r
+        ASSERT (FALSE);\r
+        return NULL;\r
+        break;\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+VOID\r
+GetFormSetGuid (\r
+  IN  EFI_HII_PACKAGE_HEADER  *Package,\r
+  OUT EFI_GUID                *FormSetGuid\r
+  )\r
+{\r
+  UINTN                         Offset;\r
+  EFI_IFR_OP_HEADER             *OpCode;\r
+  EFI_IFR_FORM_SET              *FormSet;\r
+\r
+  Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  while (Offset < Package->Length) {\r
+    OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+    switch (OpCode->OpCode) {\r
+    case EFI_IFR_FORM_SET_OP:\r
+      FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+      CopyGuid (FormSetGuid, (EFI_GUID *)(VOID *)&FormSet->Guid);\r
+      return;\r
+      \r
+      default:\r
+        break;\r
+      \r
+    }\r
+    Offset += OpCode->Length;\r
+  }\r
+\r
+  //\r
+  // A proper IFR must have a formset opcode.\r
+  //\r
+  ASSERT (FALSE);\r
+\r
+}\r
+\r
+\r
+VOID\r
+GetAttributesOfFirstFormSet (\r
+  IN    OUT HII_THUNK_CONTEXT  *ThunkContext\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_HII_PACKAGE_LIST_HEADER   *List;\r
+  EFI_HII_PACKAGE_HEADER        *Package;\r
+  UINTN                         Size;\r
+  EFI_IFR_OP_HEADER             *OpCode;\r
+  UINTN                         Offset;\r
+  EFI_IFR_GUID_CLASS            *Class;\r
+  EFI_IFR_FORM_SET              *FormSet;\r
+  EFI_IFR_GUID_SUBCLASS         *SubClass;\r
+\r
+  Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // There must be at least one EFI_HII_PACKAGE_FORM in the package list.\r
+  //\r
+  ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1);\r
+\r
+  //\r
+  // Skip the package list header.\r
+  //\r
+  Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
+\r
+  while (Package->Type != EFI_HII_PACKAGE_END) {\r
+\r
+    if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
+\r
+      //\r
+      // Skip the package header\r
+      //\r
+      Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+      while (Offset < Package->Length) {\r
+        OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+        switch (OpCode->OpCode) {\r
+        case EFI_IFR_FORM_SET_OP:\r
+          FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+          ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
+          ThunkContext->FormSetHelp  = FormSet->Help;\r
+          break;\r
+          \r
+\r
+        case EFI_IFR_GUID_OP:\r
+          Class = (EFI_IFR_GUID_CLASS*) OpCode;\r
+          if (CompareGuid ((EFI_GUID *)(VOID *)&Class->Guid, &gTianoHiiIfrGuid)) {\r
+            Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
+\r
+            switch (Class->ExtendOpCode) {\r
+              case EFI_IFR_EXTEND_OP_CLASS:\r
+                ThunkContext->FormSetClass = Class->Class;\r
+                break;\r
+              case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+                SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+                ThunkContext->FormSetSubClass = SubClass->SubClass;\r
+                break;\r
+\r
+              default:\r
+                break;\r
+            }\r
+          }\r
+          break;\r
+          \r
+        default:\r
+          break;\r
+        \r
+        }\r
+\r
+        Offset += OpCode->Length;\r
+      }\r
+      //\r
+      // The attributes of first FormSet is ready now.\r
+      //\r
+      FreePool (List);\r
+      return;\r
+      \r
+      break;\r
+    }\r
+\r
+    Package = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) Package + Package->Length);\r
+  }\r
+\r
+}\r
+\r
 \r
 EFI_STATUS\r
 CreateQuestionIdMap (\r
@@ -262,6 +406,14 @@ CreateQuestionIdMap (
   ONE_OF_OPTION_MAP             *OneOfOptionMap;\r
   ONE_OF_OPTION_MAP_ENTRY       *OneOfOptionMapEntry;\r
   EFI_IFR_GUID_CLASS            *Class;\r
+  EFI_IFR_GUID_SUBCLASS         *SubClass;\r
+  UINT8                         OneOfType;\r
+  EFI_IFR_ONE_OF                *OneOfOpcode;\r
+\r
+  //\r
+  // Set to a invalid value.\r
+  //\r
+  OneOfType = (UINT8) -1;\r
   \r
 \r
   Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
@@ -336,11 +488,16 @@ CreateQuestionIdMap (
             InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
           }\r
 \r
+          if (OpCode->OpCode == EFI_IFR_ONE_OF_OP) {\r
+            OneOfOpcode = (EFI_IFR_ONE_OF *) OpCode;\r
+            OneOfType   = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
+          }\r
+\r
           break;\r
        \r
         case EFI_IFR_GUID_OP:\r
           OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
-          if (CompareGuid (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid)) {\r
+          if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid)) {\r
             if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
               OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
               if (OneOfOptinMapEntryListHead == NULL) {\r
@@ -349,7 +506,12 @@ CreateQuestionIdMap (
 \r
                 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
                 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
-                OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+\r
+                //\r
+                // Make sure OneOfType is initialized.\r
+                //\r
+                ASSERT (OneOfType != (UINT8) -1);\r
+                OneOfOptionMap->ValueType = OneOfType;\r
                 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
                 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
                 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
@@ -363,7 +525,7 @@ CreateQuestionIdMap (
               \r
               InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
             }\r
-          }else if (CompareGuid (&OptionMap->Guid, &gTianoHiiIfrGuid)) {\r
+         } else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &gTianoHiiIfrGuid)) {\r
             Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
 \r
             switch (Class->ExtendOpCode) {\r
@@ -371,7 +533,8 @@ CreateQuestionIdMap (
                 ThunkContext->FormSetClass = Class->Class;\r
                 break;\r
               case EFI_IFR_EXTEND_OP_SUBCLASS:\r
-                ThunkContext->FormSetSubClass = ((EFI_IFR_GUID_SUBCLASS *) Class)->SubClass;\r
+                SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+                ThunkContext->FormSetSubClass = SubClass->SubClass;\r
                 break;\r
 \r
               default:\r
@@ -489,7 +652,7 @@ DestroyQuestionIdMap (
     while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
       Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
       \r
-      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
 \r
       RemoveEntryList (Link2);\r
 \r
@@ -519,7 +682,7 @@ DestoryOneOfOptionMap (
     while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
       Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
       \r
-      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
 \r
       RemoveEntryList (Link2);\r
 \r