UINTN IfrPackageCount;\r
EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
HII_THUNK_CONTEXT *ThunkContext;\r
+ HII_THUNK_CONTEXT *ThunkContextToRemove;\r
EFI_GUID GuidId;\r
+ EFI_HII_PACKAGE_HEADER *IfrPackage;\r
\r
PackageListHeader = NULL;\r
\r
return EFI_UNSUPPORTED;\r
}\r
\r
+ ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
+ if (ThunkContext == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
+ \r
if (Packages->GuidId == NULL) {\r
//\r
// UEFI HII Database require Package List GUID must be unique.\r
// GUID.\r
//\r
ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
- GenerateRandomGuid (&GuidId);\r
+ IfrPackage = GetIfrPackage (Packages);\r
+ GetFormSetGuid (IfrPackage, &ThunkContext->TagGuid);\r
} else {\r
- ThunkContext = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
+ ThunkContextToRemove = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
\r
if (IfrPackageCount > 0 && \r
StringPackageCount > 0 && \r
- (ThunkContext!= NULL)) {\r
+ (ThunkContextToRemove!= NULL)) {\r
DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));\r
DEBUG((EFI_D_WARN, "This package list should be already registered. Just return successfully.\n"));\r
- HiiRemovePack (This, ThunkContext->FwHiiHandle);\r
+ HiiRemovePack (This, ThunkContextToRemove->FwHiiHandle);\r
}\r
- CopyGuid (&GuidId, Packages->GuidId);\r
+ CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);\r
}\r
\r
- ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
- if (ThunkContext == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
- \r
//\r
- // Record the Package List GUID, it is used as a name for the package list by Framework HII.\r
+ // UEFI HII database does not allow two package list with the same GUID.\r
+ // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
+ // a PackageList with only IFR to a Package list the with String package.\r
//\r
- CopyGuid (&ThunkContext->TagGuid, &GuidId);\r
-\r
- if ((StringPackageCount == 0) && (IfrPackageCount != 0)) {\r
- //\r
- // UEFI HII database does not allow two package list with the same GUID.\r
- // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
- // a PackageList with only IFR to a Package list the with String package.\r
- //\r
- GenerateRandomGuid (&GuidId);\r
- }\r
+ GenerateRandomGuid (&GuidId);\r
\r
//\r
// UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\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
+ CopyGuid (FormSetGuid, &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