\r
\r
#include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
\r
EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
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
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
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
\r
}\r
\r
-BOOLEAN\r
-IsFrameworkHiiDatabaseHandleDepleted (\r
- IN CONST HII_THUNK_PRIVATE_DATA *Private\r
- )\r
-{\r
- return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
-}\r
-\r
-EFI_STATUS\r
-AssignFrameworkHiiHandle (\r
- IN OUT HII_THUNK_PRIVATE_DATA *Private,\r
- IN BOOLEAN FromFwHiiNewPack,\r
- OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
- )\r
-{\r
- ASSERT (Handle != NULL);\r
-\r
- if (FromFwHiiNewPack) {\r
\r
- *Handle = Private->StaticHiiHandle;\r
- Private->StaticHiiHandle += 1;\r
-\r
- if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- } else {\r
-\r
- *Handle = Private->StaticPureUefiHiiHandle;\r
- Private->StaticPureUefiHiiHandle -= 1;\r
- \r
- if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
+VOID\r
DestroyThunkContextForUefiHiiHandle (\r
IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
ASSERT (ThunkContext != NULL);\r
\r
- ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));\r
- ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));\r
- \r
- RemoveEntryList (&ThunkContext->Link);\r
-\r
- FreePool (ThunkContext);\r
- \r
- return EFI_SUCCESS;\r
+ DestroyThunkContext (ThunkContext);\r
}\r
\r
\r
**/\r
HII_THUNK_CONTEXT *\r
CreateThunkContextForUefiHiiHandle (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
)\r
{\r
\r
ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
\r
- Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);\r
+ Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
if (EFI_ERROR (Status)) {\r
return NULL;\r
}\r
InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
\r
- InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
-\r
return ThunkContext;\r
}\r
\r
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
+ CopyMem (FormSetGuid, &FormSet->Guid, sizeof (EFI_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 (CompareMem (&Class->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\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
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
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 (CompareMem (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid, sizeof (EFI_GUID)) == 0) {\r
if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
if (OneOfOptinMapEntryListHead == NULL) {\r
\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
\r
InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
}\r
- }else if (CompareGuid (&OptionMap->Guid, &gTianoHiiIfrGuid)) {\r
+ } else if (CompareMem (&OptionMap->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
\r
switch (Class->ExtendOpCode) {\r
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
}\r
\r
\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN UINTN StringPackageCount,\r
+ IN UINTN IfrPackageCount\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
+ ASSERT (ThunkContext != NULL);\r
+ \r
+ ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+ ThunkContext->IfrPackageCount = IfrPackageCount;\r
+ ThunkContext->StringPackageCount = StringPackageCount;\r
+ Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+ InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+\r
+ return ThunkContext;\r
+ \r
+}\r
+\r
+VOID\r
+DestroyThunkContext (\r
+ IN HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+{\r
+ ASSERT (ThunkContext != NULL);\r
+\r
+ FreeHiiHandle (ThunkContext->FwHiiHandle);\r
+\r
+ DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
+\r
+ DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+ RemoveEntryList (&ThunkContext->Link);\r
+\r
+ FreePool (ThunkContext);\r
+}\r
+\r
+\r
+VOID\r
+DestroyQuestionIdMap (\r
+ IN LIST_ENTRY *QuestionIdMapListHead\r
+ )\r
+{\r
+ QUESTION_ID_MAP *IdMap;\r
+ QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+\r
+ while (!IsListEmpty (QuestionIdMapListHead)) {\r
+ Link = GetFirstNode (QuestionIdMapListHead);\r
+ \r
+ IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
+ Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
+ \r
+ IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (IdMapEntry);\r
+ }\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (IdMap);\r
+ }\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+ IN LIST_ENTRY *OneOfOptionMapListHead\r
+ )\r
+{\r
+ ONE_OF_OPTION_MAP *Map;\r
+ ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+\r
+ while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+ Link = GetFirstNode (OneOfOptionMapListHead);\r
+ \r
+ Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+ Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
+ \r
+ MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (MapEntry);\r
+ }\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (Map);\r
+ }\r
+}\r
+\r
+\r
+\r
+\r