diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c index 6cf81c3f8a..7b3aa64d77 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c @@ -163,6 +163,128 @@ ThunkUpdateFormCallBack ( return EFI_SUCCESS; } +#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000 + +EFI_STATUS +AppendToUpdateBuffer ( + IN CONST UINT8 *OpCodeBuf, + IN UINTN BufSize, + OUT EFI_HII_UPDATE_DATA *UefiData + ) +{ + UINT8 * NewBuff; + + if (UefiData->Offset + BufSize > UefiData->BufferSize) { + NewBuff = AllocateCopyPool (UefiData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiData->Data); + if (NewBuff == NULL) { + return EFI_OUT_OF_RESOURCES; + } + UefiData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL; + FreePool (UefiData->Data); + UefiData->Data = NewBuff; + } + + CopyMem (UefiData->Data + UefiData->Offset, OpCodeBuf, BufSize); + UefiData->Offset += BufSize; + + return EFI_SUCCESS; +} + +EFI_STATUS +Framework2UefiCreateSubtitleOpCode ( + IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwSubTitle, + OUT EFI_HII_UPDATE_DATA *UefiData + ) +{ + EFI_IFR_SUBTITLE USubTitle; + + ZeroMem (&USubTitle, sizeof(USubTitle)); + + USubTitle.Header.OpCode = EFI_IFR_SUBTITLE_OP; + USubTitle.Header.Length = sizeof (EFI_IFR_SUBTITLE); + + USubTitle.Statement.Prompt = FwSubTitle->SubTitle; + + return AppendToUpdateBuffer ((UINT8 *)&USubTitle, sizeof(EFI_IFR_SUBTITLE), UefiData); +} + +EFI_STATUS +Framework2UefiCreateTextOpCode ( + IN CONST FRAMEWORK_EFI_IFR_TEXT *FwText, + OUT EFI_HII_UPDATE_DATA *UefiData + ) +{ + EFI_IFR_TEXT UText; + + ZeroMem (&UText, sizeof(UText)); + + UText.Header.OpCode = EFI_IFR_TEXT_OP; + UText.Header.Length = sizeof (EFI_IFR_TEXT); + + UText.Statement.Help = FwText->Help; + + UText.Statement.Prompt = FwText->Text; + UText.TextTwo = FwText->TextTwo; + + return AppendToUpdateBuffer ((UINT8 *) &UText, sizeof(EFI_IFR_TEXT), UefiData); +} + + +EFI_STATUS +ThunkFrameworkUpdateDataToUefiUpdateData ( + IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data, + IN BOOLEAN AddData, + OUT EFI_HII_UPDATE_DATA **UefiData + ) +{ + FRAMEWORK_EFI_IFR_OP_HEADER *FrameworkOpcodeBuffer; + EFI_HII_UPDATE_DATA *UefiUpdateDataBuffer; + UINTN Index; + EFI_STATUS Status; + + UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA)); + if (UefiUpdateDataBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL); + if (UefiUpdateDataBuffer->Data == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL; + UefiUpdateDataBuffer->Offset = 0; + + FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data; + + for (Index = 0; Index < Data->DataCount; Index++) { + switch (FrameworkOpcodeBuffer->OpCode) { + case FRAMEWORK_EFI_IFR_SUBTITLE_OP: + Status = Framework2UefiCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); + break; + + case FRAMEWORK_EFI_IFR_TEXT_OP: + Status = Framework2UefiCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); + break; + + default: + ASSERT (FALSE); + return EFI_UNSUPPORTED; + } + + if (EFI_ERROR (Status)) { + FreePool (UefiUpdateDataBuffer->Data); + FreePool (UefiUpdateDataBuffer); + return Status; + } + + FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length); + } + + *UefiData = UefiUpdateDataBuffer; + + return EFI_SUCCESS; +} EFI_STATUS EFIAPI HiiUpdateForm ( @@ -170,7 +292,7 @@ HiiUpdateForm ( IN FRAMEWORK_EFI_HII_HANDLE Handle, IN EFI_FORM_LABEL Label, IN BOOLEAN AddData, - IN EFI_HII_UPDATE_DATA *Data + IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data ) /*++ @@ -193,6 +315,10 @@ Returns: EFI_STATUS Status; EFI_HII_THUNK_PRIVATE_DATA *Private; HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry; + EFI_HII_UPDATE_DATA *UefiHiiUpdateData; + EFI_HII_HANDLE UefiHiiHandle; + + Status = EFI_SUCCESS; Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This); @@ -208,5 +334,30 @@ Returns: return Status; } } - return EFI_SUCCESS; + + if (Data->DataCount != 0) { + if (HandleMapEntry->IsPackageListWithOnlyStringPackages) { + UefiHiiHandle = TagGuidToUefiIfrHiiHandle (Private, &HandleMapEntry->TagGuid); + + if (UefiHiiHandle == NULL) { + return EFI_INVALID_PARAMETER; + } + } else { + UefiHiiHandle = HandleMapEntry->UefiHiiHandle; + } + + UefiHiiUpdateData = NULL; + + ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData); + + Status = IfrLibUpdateForm (UefiHiiHandle, NULL, 0, Label, AddData, UefiHiiUpdateData); + ASSERT_EFI_ERROR (Status); + + if (UefiHiiUpdateData != NULL) { + SafeFreePool (UefiHiiUpdateData->Data); + SafeFreePool (UefiHiiUpdateData); + } + } + + return Status; } diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf index a0107fa212..e90fe65d9c 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf @@ -61,8 +61,8 @@ BaseLib HiiLib ExtendedHiiLib - - + IfrSupportLib + ExtendedIfrSupportLib [Protocols] gEfiHiiProtocolGuid diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h index 9934e3c281..662f8b04e8 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h @@ -42,10 +42,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include -#include +//#include #include #include +// +// There are some type redefinitions between Framework Ifr Support Library and +// UEFI HII Ifr Support Library. We undefine the duplicated Framework definition here +// so that the duplicated definitions in UEFI HII Ifr can be defined. +// In this Thunk Module, we will access all Framework definition with "FRAMEWORK_" prefix. +// +#undef IFR_OPTION +#undef EFI_HII_UPDATE_DATA + +#include +#include + // // Macros // @@ -55,10 +67,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // Typedef // +#pragma pack (push, 1) typedef struct { UINT32 BinaryLength; EFI_HII_PACKAGE_HEADER PackageHeader; } TIANO_AUTOGEN_PACKAGES_HEADER; +#pragma pack (pop) #define EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, EFI_HII_THUNK_PRIVATE_DATA, Hii, EFI_HII_THUNK_DRIVER_DATA_SIGNATURE) #define EFI_HII_THUNK_DRIVER_DATA_SIGNATURE EFI_SIGNATURE_32 ('H', 'i', 'I', 'T') @@ -319,7 +333,7 @@ HiiUpdateForm ( IN FRAMEWORK_EFI_HII_HANDLE Handle, IN EFI_FORM_LABEL Label, IN BOOLEAN AddData, - IN EFI_HII_UPDATE_DATA *Data + IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data ) ; diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c index d5f108d749..da0378f1ac 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c @@ -215,7 +215,10 @@ PrepareUefiPackageListFromFrameworkHiiPackages ( for (Index = 0; Index < NumberOfPackages; Index++) { CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->BinaryLength, sizeof (UINT32)); - PackageListLength += PackageLength; + // + //TIANO_AUTOGEN_PACKAGES_HEADER.BinaryLength include the BinaryLength itself. + // + PackageListLength += (PackageLength - sizeof(UINT32)); } // @@ -482,27 +485,41 @@ Returns: { EFI_STATUS Status; EFI_HII_THUNK_PRIVATE_DATA *Private; - LIST_ENTRY *ListEntry; HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry; + EFI_DEVICE_PATH_PROTOCOL *Path; Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This); - for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink; - ListEntry != &Private->HiiThunkHandleMappingDBListHead; - ListEntry = ListEntry->ForwardLink - ) { - HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry); + HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle); - if (Handle == HandleMapEntry->FrameworkHiiHandle) { - Status = mUefiHiiDatabaseProtocol->RemovePackageList ( - mUefiHiiDatabaseProtocol, - HandleMapEntry->UefiHiiHandle - ); - ASSERT_EFI_ERROR (Status); + if (HandleMapEntry->UefiHiiHandle != NULL) { + Status = mUefiHiiDatabaseProtocol->RemovePackageList ( + mUefiHiiDatabaseProtocol, + HandleMapEntry->UefiHiiHandle + ); + ASSERT_EFI_ERROR (Status); - RemoveEntryList (ListEntry); - return Status; + Status = gBS->HandleProtocol ( + HandleMapEntry->UefiHiiHandle, + &gEfiDevicePathProtocolGuid, + &Path + ); + + if (!EFI_ERROR (Status)) { + Status = gBS->UninstallProtocolInterface ( + HandleMapEntry->UefiHiiHandle, + &gEfiDevicePathProtocolGuid, + Path + ); + if (!EFI_ERROR (Status)) { + FreePool (Path); + } } + + RemoveEntryList (&HandleMapEntry->List); + + FreePool (HandleMapEntry); + return Status; } return EFI_NOT_FOUND; diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c index 75294c7e59..bc5e1ce126 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c @@ -45,22 +45,15 @@ FrameworkHiiHandleToUefiHiiHandle ( IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle ) { - LIST_ENTRY *ListEntry; HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry; ASSERT (FrameworkHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0); ASSERT (Private != NULL); - for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink; - ListEntry != &Private->HiiThunkHandleMappingDBListHead; - ListEntry = ListEntry->ForwardLink - ) { + HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, FrameworkHiiHandle); - HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry); - - if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) { - return HandleMapEntry->UefiHiiHandle; - } + if (HandleMapEntry != NULL) { + return HandleMapEntry->UefiHiiHandle; } return (EFI_HII_HANDLE) NULL; @@ -90,3 +83,32 @@ FrameworkHiiHandleToMapDatabaseEntry ( return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL; } + +EFI_HII_HANDLE * +TagGuidToUefiIfrHiiHandle ( + IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private, + IN CONST EFI_GUID *Guid + ) +{ + LIST_ENTRY *ListEntry; + HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry; + + for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink; + ListEntry != &Private->HiiThunkHandleMappingDBListHead; + ListEntry = ListEntry->ForwardLink + ) { + HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry); + + if (CompareGuid (Guid, &HandleMapEntry->TagGuid) && HandleMapEntry->DoesPackageListImportStringPackages) { + return HandleMapEntry->UefiHiiHandle; + } + } + + return (EFI_HII_HANDLE *) NULL; + +} + + + + + diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h index 9b5a9bfb23..7426edfb9d 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h @@ -46,4 +46,12 @@ FrameworkHiiHandleToMapDatabaseEntry ( ) ; + +EFI_HII_HANDLE * +TagGuidToUefiIfrHiiHandle ( + IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private, + IN CONST EFI_GUID *Guid + ) +; + #endif