]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add in some features for the thunk layer:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 16 Apr 2008 07:36:51 +0000 (07:36 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 16 Apr 2008 07:36:51 +0000 (07:36 +0000)
1) Handle Framework HII callback
2) Install default Config Access protocol for each IFR form package registered.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5069 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c
new file mode 100644 (file)
index 0000000..8834bd7
--- /dev/null
@@ -0,0 +1,480 @@
+/**@file\r
+  This file contains functions related to Config Access Protocols installed by\r
+  by HII Thunk Modules which is used to thunk UEFI Config Access Callback to \r
+  Framework HII Callback.\r
+  \r
+Copyright (c) 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "HiiDatabase.h"\r
+\r
+HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE ConfigAccessProtocolInstanceTempate = {\r
+  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE,\r
+  {\r
+    ThunkExtractConfig,\r
+    ThunkRouteConfig,\r
+    ThunkCallback\r
+  }, //ConfigAccessProtocol\r
+  NULL, //FrameworkFormCallbackProtocol\r
+  {NULL, NULL} //ConfigAccessStorageListHead\r
+};\r
+\r
+EFI_HII_PACKAGE_HEADER *\r
+GetIfrFormSet (\r
+  IN  CONST EFI_HII_PACKAGES  *Packages\r
+  )\r
+{\r
+  TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+  EFI_HII_PACKAGE_HEADER        *IfrPackage;\r
+  UINTN                         Index;\r
+\r
+  ASSERT (Packages != NULL);\r
+\r
+  IfrPackage = NULL;\r
+\r
+  TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
+  for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
+    //\r
+    // BugBug: The current UEFI HII build tool generate a binary in the format defined in: \r
+    // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
+    // this binary is with same package type. So the returned IfrPackNum and StringPackNum\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
+\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
+        break;\r
+    }\r
+  }\r
+\r
+  return (EFI_HII_PACKAGE_HEADER *) NULL;\r
+}\r
+\r
+EFI_STATUS\r
+GetBufferStorage  (\r
+  IN  CONST EFI_HII_PACKAGE_HEADER *FormSetPackage,\r
+  OUT       LIST_ENTRY             *BufferStorageListHead\r
+  )\r
+{\r
+  UINTN                   OpCodeOffset;\r
+  UINTN                   OpCodeLength;\r
+  UINT8                   *OpCodeData;\r
+  UINT8                   Operand;\r
+  EFI_IFR_VARSTORE        *VarStoreOpCode;\r
+  HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey;\r
+\r
+  OpCodeOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  while (OpCodeOffset < FormSetPackage->Length) {\r
+    OpCodeData = (UINT8 *) FormSetPackage + OpCodeOffset;\r
+\r
+    OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
+    OpCodeOffset += OpCodeLength;\r
+    Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
+\r
+    if (Operand == EFI_IFR_VARSTORE_OP) {\r
+      VarStoreOpCode = (EFI_IFR_VARSTORE *)OpCodeData;\r
+      BufferStorageKey = AllocateZeroPool (sizeof (*BufferStorageKey));\r
+      if (BufferStorageKey == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+      CopyGuid (&BufferStorageKey->Guid, &VarStoreOpCode->Guid);\r
+\r
+      BufferStorageKey->Name = AllocateZeroPool (AsciiStrSize (VarStoreOpCode->Name) * 2);\r
+      AsciiStrToUnicodeStr (VarStoreOpCode->Name, BufferStorageKey->Name);\r
+\r
+      BufferStorageKey->VarStoreId = VarStoreOpCode->VarStoreId;\r
+\r
+      BufferStorageKey->Size = VarStoreOpCode->Size;\r
+      BufferStorageKey->Signature = HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE;\r
+\r
+      InsertTailList (BufferStorageListHead, &BufferStorageKey->List);\r
+    }\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+  \r
+\r
+EFI_STATUS\r
+InstallDefaultUefiConfigAccessProtocol (\r
+  IN  CONST EFI_HII_PACKAGES                         *Packages,\r
+  OUT       EFI_HANDLE                               *Handle,\r
+  IN  OUT   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
+  )\r
+{\r
+  EFI_HII_PACKAGE_HEADER                      *FormSetPackage;\r
+  EFI_STATUS                                  Status;\r
+  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigAccessInstance;\r
+\r
+  Status = HiiLibCreateHiiDriverHandle (Handle);\r
+  ConfigAccessInstance = AllocateCopyPool (\r
+                           sizeof (HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE), \r
+                           &ConfigAccessProtocolInstanceTempate\r
+                           );\r
+  InitializeListHead (&ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
+\r
+  //\r
+  // We assume there is only one formset package in each Forms Package\r
+  //\r
+  FormSetPackage = GetIfrFormSet (Packages);\r
+  Status = GetBufferStorage (FormSetPackage, &ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (ConfigAccessInstance);\r
+    ASSERT (FALSE);\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+          Handle,\r
+          &gEfiHiiConfigAccessProtocolGuid,\r
+          &ConfigAccessInstance->ConfigAccessProtocol,\r
+          NULL\r
+          );\r
+  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool  (ConfigAccessInstance);\r
+    return Status;\r
+  }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+RouteConfigToFrameworkFormCallBack (\r
+  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
+  IN       EFI_FORM_CALLBACK_PROTOCOL                 *FrameworkFormCallBack,\r
+  IN       VOID                                       *Data,\r
+  IN       UINTN                                      DataSize\r
+  )\r
+{\r
+  EFI_STATUS          Status;\r
+  BOOLEAN             ResetRequired;\r
+\r
+  Status = FrameworkFormCallBack->NvWrite (\r
+              FrameworkFormCallBack,  \r
+              BufferStorageKey->Name,\r
+              &BufferStorageKey->Guid,\r
+              EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+              DataSize,\r
+              Data,\r
+              &ResetRequired\r
+              );\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+ExtractConfigFromFrameworkFormCallBack (\r
+  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
+  IN       EFI_FORM_CALLBACK_PROTOCOL                 *FrameworkFormCallBack,\r
+  OUT      VOID                                       **Data,\r
+  OUT      UINTN                                      *DataSize\r
+  )\r
+{\r
+  EFI_STATUS          Status;\r
+\r
+  *DataSize = 0;\r
+  *Data     = NULL;\r
+  \r
+  Status = FrameworkFormCallBack->NvRead (\r
+              FrameworkFormCallBack,  \r
+              BufferStorageKey->Name,\r
+              &BufferStorageKey->Guid,\r
+              NULL,\r
+              DataSize,\r
+              *Data\r
+              );\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    if (BufferStorageKey->Size != *DataSize) {\r
+      ASSERT (FALSE);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
+    *Data = AllocateZeroPool (*DataSize);\r
+    if (Data == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    FrameworkFormCallBack->NvRead (\r
+                  FrameworkFormCallBack,  \r
+                  BufferStorageKey->Name,\r
+                  &BufferStorageKey->Guid,\r
+                  NULL,\r
+                  DataSize,\r
+                  *Data\r
+                  );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+RouteConfigToUefiVariable (\r
+  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
+  IN       VOID                                       *Data,\r
+  IN       UINTN                                      DataSize\r
+  )\r
+{\r
+  return gRT->SetVariable (\r
+                  BufferStorageKey->Name,\r
+                  &BufferStorageKey->Guid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                  DataSize,\r
+                  Data\r
+                  );\r
+  \r
+}\r
+EFI_STATUS\r
+ExtractConfigFromUefiVariable (\r
+  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
+  OUT      VOID                                       **Data,\r
+  OUT      UINTN                                      *DataSize\r
+  )\r
+{\r
+  EFI_STATUS          Status;\r
+\r
+  *DataSize = 0;\r
+  *Data = NULL;\r
+  Status = gRT->GetVariable (\r
+              BufferStorageKey->Name,\r
+              &BufferStorageKey->Guid,\r
+              NULL,\r
+              DataSize,\r
+              *Data\r
+              );\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+\r
+    if (BufferStorageKey->Size != *DataSize) {\r
+      ASSERT (FALSE);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
+    *Data = AllocateZeroPool (*DataSize);\r
+    if (Data == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    Status = gRT->GetVariable (\r
+                BufferStorageKey->Name,\r
+                &BufferStorageKey->Guid,\r
+                NULL,\r
+                DataSize,\r
+                *Data\r
+                );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+ThunkExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  )\r
+{\r
+  EFI_STATUS                                  Status;\r
+  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigaAccessInstance;\r
+  LIST_ENTRY                                  *ListEntry;\r
+  HII_TRHUNK_BUFFER_STORAGE_KEY               *BufferStorageKey;\r
+  VOID                                        *Data;\r
+  UINTN                                       DataSize;\r
+\r
+  Data = NULL;\r
+  ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+\r
+  ListEntry = GetFirstNode (&ConfigaAccessInstance->ConfigAccessBufferStorageListHead);\r
+  if (ListEntry == NULL) {\r
+    ASSERT (FALSE);\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  BufferStorageKey = HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry);\r
+\r
+  if (ConfigaAccessInstance->FrameworkFormCallbackProtocol == NULL ||\r
+      ConfigaAccessInstance->FrameworkFormCallbackProtocol->NvRead == NULL) {\r
+    Status = ExtractConfigFromUefiVariable (\r
+               BufferStorageKey,\r
+               &Data,\r
+               &DataSize\r
+               );\r
+  } else {\r
+    Status = ExtractConfigFromFrameworkFormCallBack (\r
+               BufferStorageKey,\r
+               ConfigaAccessInstance->FrameworkFormCallbackProtocol,\r
+                &Data,\r
+                &DataSize\r
+               );\r
+  }\r
+  \r
+  if (!EFI_ERROR (Status)) {\r
+    Status = mUefiConfigRoutingProtocol->BlockToConfig (\r
+                                            mUefiConfigRoutingProtocol,\r
+                                            Request,\r
+                                            Data,\r
+                                            DataSize,\r
+                                            Results,\r
+                                            Progress\r
+                                            );\r
+  }\r
+\r
+  SafeFreePool (Data);\r
+  return Status;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+ThunkRouteConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
+  )\r
+{\r
+  EFI_STATUS                                  Status;\r
+  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigaAccessInstance;\r
+  LIST_ENTRY                                  *ListEntry;\r
+  HII_TRHUNK_BUFFER_STORAGE_KEY               *BufferStorageKey;\r
+  VOID                                        *Data;\r
+  UINTN                                       DataSize;\r
+  UINTN                                       LastModifiedByteIndex;\r
+\r
+  Data = NULL;\r
+  ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+\r
+  ListEntry = GetFirstNode (&ConfigaAccessInstance->ConfigAccessBufferStorageListHead);\r
+  if (ListEntry == NULL) {\r
+    ASSERT (FALSE);\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  BufferStorageKey = HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry);\r
+\r
+  Data = AllocateZeroPool (BufferStorageKey->Size);\r
+  if (Data == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  Status = mUefiConfigRoutingProtocol->ConfigToBlock (\r
+                                          mUefiConfigRoutingProtocol,\r
+                                          Configuration,\r
+                                          Data,\r
+                                          &LastModifiedByteIndex,\r
+                                          Progress\r
+                                          );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  DataSize = BufferStorageKey->Size;\r
+  if (ConfigaAccessInstance->FrameworkFormCallbackProtocol == NULL ||\r
+      ConfigaAccessInstance->FrameworkFormCallbackProtocol->NvRead == NULL) {\r
+    Status = RouteConfigToUefiVariable (\r
+               BufferStorageKey,\r
+               Data,\r
+               DataSize\r
+               );\r
+  } else {\r
+    Status = RouteConfigToFrameworkFormCallBack (\r
+               BufferStorageKey,\r
+               ConfigaAccessInstance->FrameworkFormCallbackProtocol,\r
+               Data,\r
+               DataSize\r
+               );\r
+  }\r
+\r
+Done:  \r
+  SafeFreePool (Data);\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+ThunkCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  EFI_BROWSER_ACTION                     Action,\r
+  IN  EFI_QUESTION_ID                        QuestionId,\r
+  IN  UINT8                                  Type,\r
+  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  )\r
+{\r
+  EFI_STATUS                                  Status;\r
+  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigaAccessInstance;\r
+  EFI_FORM_CALLBACK_PROTOCOL                  *FrameworkFormCallbackProtocol;\r
+  EFI_HII_CALLBACK_PACKET                     *Packet;\r
+  FRAMEWORK_EFI_IFR_DATA_ARRAY                Data;\r
+  FRAMEWORK_EFI_IFR_DATA_ENTRY                *DataEntry;\r
+  EFI_FORM_CALLBACK                           Callback; \r
+\r
+  ASSERT (This != NULL);\r
+  ASSERT (Value != NULL);\r
+  ASSERT (ActionRequest != NULL);\r
+\r
+  *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+\r
+  ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+\r
+  FrameworkFormCallbackProtocol = ConfigaAccessInstance->FrameworkFormCallbackProtocol;\r
+  if (FrameworkFormCallbackProtocol == NULL) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  Callback = FrameworkFormCallbackProtocol->Callback;\r
+\r
+  Status = Callback (\r
+              FrameworkFormCallbackProtocol,\r
+              QuestionId,\r
+              &Data,\r
+              &Packet\r
+              );\r
+\r
+  //\r
+  // Callback require browser to perform action\r
+  //\r
+  if (Packet != NULL) {\r
+    if (Packet->DataArray.EntryCount  == 1 && Packet->DataArray.NvRamMap == NULL) {\r
+      DataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY));\r
+      switch (DataEntry->Flags) {\r
+        case EXIT_REQUIRED:\r
+          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+          break;\r
+        case SAVE_REQUIRED:\r
+          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+          break;\r
+        case RESET_REQUIRED:\r
+            *ActionRequest = EFI_BROWSER_ACTION_REQUEST_RESET;\r
+            break;\r
+        default:\r
+            *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+            break;  \r
+      }\r
+    }\r
+  }\r
+  \r
+  return Status;\r
+}\r
+\r
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.h
new file mode 100644 (file)
index 0000000..d9abdcc
--- /dev/null
@@ -0,0 +1,62 @@
+/**@file\r
+  This file contains functions related to Config Access Protocols installed by\r
+  by HII Thunk Modules which is used to thunk UEFI Config Access Callback to \r
+  Framework HII Callback.\r
+  \r
+Copyright (c) 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _HII_THUNK_CONFIG_ACCESS_H\r
+#define _HII_THUNK_CONFIG_ACCESS_H\r
+\r
+\r
+EFI_STATUS\r
+InstallDefaultUefiConfigAccessProtocol (\r
+  IN  CONST EFI_HII_PACKAGES                         *Packages,\r
+  OUT       EFI_HANDLE                               *Handle,\r
+  IN  OUT   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+ThunkExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  )\r
+;\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+ThunkRouteConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+ThunkCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  EFI_BROWSER_ACTION                     Action,\r
+  IN  EFI_QUESTION_ID                        QuestionId,\r
+  IN  UINT8                                  Type,\r
+  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  )\r
+;\r
+\r
+#endif\r
+\r
index 0e49e2066b535f5359e638f01c07e6923f154460..6cf81c3f8aedaa59aefe04bb4114ac3cd3f52483 100644 (file)
@@ -122,6 +122,46 @@ HiiGetDefaultImage (
   return EFI_SUCCESS;\r
 }\r
 \r
+EFI_STATUS\r
+ThunkUpdateFormCallBack (\r
+  IN       EFI_HANDLE                                CallbackHandle,\r
+  IN CONST HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry\r
+  )\r
+{\r
+  EFI_STATUS                                Status;\r
+  EFI_FORM_CALLBACK_PROTOCOL                *FrameworkFormCallbackProtocol;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL            *ConfigAccessProtocol;\r
+  EFI_HANDLE                                UefiDriverHandle;\r
+  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigAccessProtocolInstance;\r
+  \r
+  Status = gBS->HandleProtocol (\r
+                   CallbackHandle,\r
+                   &gEfiFormCallbackProtocolGuid,\r
+                   (VOID **) &FrameworkFormCallbackProtocol\r
+                   );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  Status = mUefiHiiDatabaseProtocol->GetPackageListHandle (\r
+                                        mUefiHiiDatabaseProtocol,\r
+                                        HandleMapEntry->UefiHiiHandle,\r
+                                        &UefiDriverHandle\r
+                                        );\r
+  ASSERT_EFI_ERROR (Status);\r
+  Status = gBS->HandleProtocol (\r
+                   UefiDriverHandle,\r
+                   &gEfiHiiConfigAccessProtocolGuid,\r
+                   (VOID **) &ConfigAccessProtocol\r
+                   );\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  ConfigAccessProtocolInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (ConfigAccessProtocol);\r
+  \r
+  ConfigAccessProtocolInstance->FrameworkFormCallbackProtocol = FrameworkFormCallbackProtocol;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -150,5 +190,23 @@ Returns:
 \r
 --*/\r
 {\r
+  EFI_STATUS                                Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+\r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+\r
+  if (HandleMapEntry == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
+  if (Data->FormSetUpdate) {\r
+    Status = ThunkUpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, HandleMapEntry);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
   return EFI_SUCCESS;\r
 }\r
index 38f7a9beb878ca889cf15571dc49490472703250..a0107fa212941c83ad6a26b930261c391441be8d 100644 (file)
   Forms.c\r
   HiiDatabase.h\r
   HiiDatabase.c\r
+  ConfigAccess.c\r
+  ConfigAccess.h\r
   Utility.c\r
   Utility.h\r
-\r
+  \r
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
   IntelFrameworkPkg/IntelFrameworkPkg.dec\r
 \r
 [LibraryClasses]\r
@@ -57,6 +60,7 @@
   DebugLib\r
   BaseLib\r
   HiiLib\r
+  ExtendedHiiLib\r
 \r
 \r
 \r
   gEfiHiiDatabaseProtocolGuid\r
   gEfiHiiStringProtocolGuid\r
   gEfiHiiFontProtocolGuid\r
+  gEfiHiiConfigRoutingProtocolGuid\r
+  gEfiHiiConfigAccessProtocolGuid\r
+  gEfiFormCallbackProtocolGuid\r
 \r
 [Depex]\r
   gEfiHiiImageProtocolGuid AND\r
   gEfiHiiDatabaseProtocolGuid AND\r
   gEfiHiiStringProtocolGuid AND\r
-  gEfiHiiFontProtocolGuid\r
+  gEfiHiiFontProtocolGuid AND\r
+  gEfiHiiConfigRoutingProtocolGuid\r
 \r
index d5ef19c356aeea52e3ba4963e4e28a8a58cd4465..e2e2ded7c3ee20f85360168f56826895f83fa0e1 100644 (file)
@@ -56,10 +56,12 @@ EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {
   },\r
 };\r
 \r
-EFI_HII_DATABASE_PROTOCOL *mUefiHiiDatabaseProtocol;\r
-EFI_HII_FONT_PROTOCOL     *mUefiHiiFontProtocol;\r
-EFI_HII_IMAGE_PROTOCOL    *mUefiHiiImageProtocol;\r
-EFI_HII_STRING_PROTOCOL   *mUefiStringProtocol;\r
+CONST EFI_HII_DATABASE_PROTOCOL            *mUefiHiiDatabaseProtocol;\r
+CONST EFI_HII_FONT_PROTOCOL                *mUefiHiiFontProtocol;\r
+CONST EFI_HII_IMAGE_PROTOCOL               *mUefiHiiImageProtocol;\r
+CONST EFI_HII_STRING_PROTOCOL              *mUefiStringProtocol;\r
+CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mUefiConfigRoutingProtocol;\r
+\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -119,6 +121,13 @@ Returns:
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiConfigRoutingProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &mUefiConfigRoutingProtocol\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   //\r
   // Install protocol interface\r
   //\r
index dd07afd06a782afeeae3f65b7be1fa65de85f8ca..9934e3c2812f355769df689cd8f2f08fd97eada1 100644 (file)
@@ -44,6 +44,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/FrameworkIfrSupportLib.h>\r
 #include <Library/HiiLib.h>\r
+#include <Library/ExtendedHiiLib.h>\r
 \r
 //\r
 // Macros\r
@@ -106,17 +107,37 @@ typedef struct {
   // other package list with IsPackageListWithOnlyStringPackages is TRUE.\r
   //\r
   BOOLEAN                    DoesPackageListImportStringPackages;\r
-  EFI_HII_PACKAGE_LIST_HEADER *ImportedUefiStringPackageListHeader; //Only valid if DoesPackageListImportStringPackages is true.\r
-\r
+  \r
 } HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY;\r
 \r
+#define HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE              EFI_SIGNATURE_32 ('H', 'T', 's', 'k')\r
+#define HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY(Record) CR(Record, HII_TRHUNK_BUFFER_STORAGE_KEY, List, HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE)\r
+typedef struct {\r
+  LIST_ENTRY List;\r
+  UINT32     Signature;\r
+  EFI_GUID   Guid;\r
+  CHAR16     *Name;\r
+  UINTN      Size;\r
+  UINT16     VarStoreId;\r
+} HII_TRHUNK_BUFFER_STORAGE_KEY;\r
+\r
+#define HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE            EFI_SIGNATURE_32 ('H', 'T', 'c', 'a')\r
+#define HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL(Record) CR(Record, HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE, ConfigAccessProtocol, HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE)\r
+typedef struct {\r
+  UINT32                         Signature;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccessProtocol;\r
+  EFI_FORM_CALLBACK_PROTOCOL     *FrameworkFormCallbackProtocol;\r
+  LIST_ENTRY                     ConfigAccessBufferStorageListHead;\r
+} HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE;\r
+\r
 //\r
 // Extern Variables\r
 //\r
-extern EFI_HII_DATABASE_PROTOCOL *mUefiHiiDatabaseProtocol;\r
-extern EFI_HII_FONT_PROTOCOL     *mUefiHiiFontProtocol;\r
-extern EFI_HII_IMAGE_PROTOCOL    *mUefiHiiImageProtocol;\r
-extern EFI_HII_STRING_PROTOCOL   *mUefiStringProtocol;\r
+extern CONST EFI_HII_DATABASE_PROTOCOL            *mUefiHiiDatabaseProtocol;\r
+extern CONST EFI_HII_FONT_PROTOCOL                *mUefiHiiFontProtocol;\r
+extern CONST EFI_HII_IMAGE_PROTOCOL               *mUefiHiiImageProtocol;\r
+extern CONST EFI_HII_STRING_PROTOCOL              *mUefiStringProtocol;\r
+extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mUefiConfigRoutingProtocol;\r
 \r
 //\r
 // Prototypes\r
@@ -319,5 +340,6 @@ HiiCompareLanguage (
 ;\r
 \r
 #include "Utility.h"\r
+#include "ConfigAccess.h"\r
 \r
 #endif\r
index 2a1407c366f59de8ee0747b1a0a824263f66858a..d5f108d749842ca3966377e0fcfa2126f3165354 100644 (file)
@@ -307,15 +307,6 @@ FindAndAddStringPackageToIfrPackageList(
 \r
 }\r
 \r
-EFI_STATUS\r
-InstallDefaultUefiConfigAccessProtocol (\r
-  IN  EFI_HII_PACKAGES            *Packages,\r
-  OUT EFI_HANDLE                  *Handle\r
-  )\r
-{\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 EFI_STATUS\r
 UefiRegisterPackageList(\r
   EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
@@ -358,7 +349,7 @@ UefiRegisterPackageList(
   // that Setup Utility will load the Buffer Storage\r
   //\r
   if (IfrPackNum != 0) {\r
-    InstallDefaultUefiConfigAccessProtocol (Packages, &UefiHiiDriverHandle);\r
+    InstallDefaultUefiConfigAccessProtocol (Packages, &UefiHiiDriverHandle, HandleMappingEntry);\r
   }\r
   UefiPackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, GuidId);\r
   Status = mUefiHiiDatabaseProtocol->NewPackageList (\r
index 001efa2e141d864c064ce2e3dabd7a56622026af..37be9d212e1eb608125e6659dd15be6b7c27ec07 100644 (file)
@@ -66,3 +66,27 @@ FrameworkHiiHandleToUefiHiiHandle (
   return (EFI_HII_HANDLE) NULL;\r
 }\r
 \r
+\r
+HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
+FrameworkHiiHandleToMapDatabaseEntry (\r
+  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\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 (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
+      return HandleMapEntry;\r
+    }\r
+  }\r
+\r
+  return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
+}\r
+\r
index a0a3be39343fc02ccd94f5259bd9d25de74cc6f8..9b5a9bfb23c3f6564f5012ed6a058143447fd1a5 100644 (file)
@@ -38,4 +38,12 @@ FrameworkHiiHandleToUefiHiiHandle (
   IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\r
   )\r
 ;\r
+\r
+HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
+FrameworkHiiHandleToMapDatabaseEntry (\r
+  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\r
+  )\r
+;\r
+\r
 #endif\r