]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add in Thunking function for Dynamic Code creation. Only support Text and Subtitle...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 17 Apr 2008 13:28:36 +0000 (13:28 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 17 Apr 2008 13:28:36 +0000 (13:28 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5082 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

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