summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-04-17 13:28:36 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-04-17 13:28:36 +0000
commit99a83b4c44791cf3abc426f498699e36a76e5fc6 (patch)
tree5e4db861464321d6958b94761acbfb81330b68d1 /EdkCompatibilityPkg
parentdd4047a51c56bae1080b357330ed99dcd286c766 (diff)
downloadedk2-platforms-99a83b4c44791cf3abc426f498699e36a76e5fc6.tar.xz
Add in Thunking function for Dynamic Code creation. Only support Text and Subtitle for now).
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5082 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkCompatibilityPkg')
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c155
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf4
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h18
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c49
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c42
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h8
6 files changed, 244 insertions, 32 deletions
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,11 +42,23 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/FrameworkIfrSupportLib.h>
+//#include <Library/FrameworkIfrSupportLib.h>
#include <Library/HiiLib.h>
#include <Library/ExtendedHiiLib.h>
//
+// 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 <Library/IfrSupportLib.h>
+#include <Library/ExtendedIfrSupportLib.h>
+
+//
// 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);
-
- RemoveEntryList (ListEntry);
- return Status;
+ if (HandleMapEntry->UefiHiiHandle != NULL) {
+ Status = mUefiHiiDatabaseProtocol->RemovePackageList (
+ mUefiHiiDatabaseProtocol,
+ HandleMapEntry->UefiHiiHandle
+ );
+ ASSERT_EFI_ERROR (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