]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseEntry.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / HiiDatabaseEntry.c
index 6583f6b6547713ad4f72b0c0af2ccf5235fbbaa9..bbf437bbb9b436428d3eb33eee0fa5ed2d45e309 100644 (file)
@@ -1,25 +1,9 @@
 /** @file\r
+This file contains the entry code to the HII database, which is defined by\r
+UEFI 2.1 specification.\r
 \r
-Copyright (c) 2007, 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
-Module Name:\r
-\r
-    HiiDatabaseEntry.c\r
-\r
-Abstract:\r
-\r
-    This file contains the entry code to the HII database, which is defined by\r
-    UEFI 2.1 specification.\r
-\r
-Revision History\r
-\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -30,9 +14,9 @@ Revision History
 // Global variables\r
 //\r
 EFI_EVENT gHiiKeyboardLayoutChanged;\r
-STATIC EFI_GUID gHiiSetKbdLayoutEventGuid = EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID;\r
+BOOLEAN   gExportAfterReadyToBoot = FALSE;\r
 \r
-STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {\r
+HII_DATABASE_PRIVATE_DATA mPrivate = {\r
   HII_DATABASE_PRIVATE_DATA_SIGNATURE,\r
   {\r
     (LIST_ENTRY *) NULL,\r
@@ -48,7 +32,6 @@ STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {
     HiiGetGlyph,\r
     HiiGetFontInfo\r
   },\r
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
   {\r
     HiiNewImage,\r
     HiiGetImage,\r
@@ -56,7 +39,14 @@ STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {
     HiiDrawImage,\r
     HiiDrawImageId\r
   },\r
-#endif\r
+  {\r
+    HiiNewImageEx,\r
+    HiiGetImageEx,\r
+    HiiSetImageEx,\r
+    HiiDrawImageEx,\r
+    HiiDrawImageIdEx,\r
+    HiiGetImageInfo\r
+  },\r
   {\r
     HiiNewString,\r
     HiiGetString,\r
@@ -80,11 +70,15 @@ STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {
   {\r
     HiiConfigRoutingExtractConfig,\r
     HiiConfigRoutingExportConfig,\r
-    HiiConfigRoutingRoutConfig,\r
+    HiiConfigRoutingRouteConfig,\r
     HiiBlockToConfig,\r
     HiiConfigToBlock,\r
     HiiGetAltCfg\r
   },\r
+  {\r
+    EfiConfigKeywordHandlerSetData,\r
+    EfiConfigKeywordHandlerGetData\r
+  },\r
   {\r
     (LIST_ENTRY *) NULL,\r
     (LIST_ENTRY *) NULL\r
@@ -104,53 +98,91 @@ STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {
   NULL\r
 };\r
 \r
-EFI_STATUS\r
+/**\r
+  The default event handler for gHiiKeyboardLayoutChanged\r
+  event group.\r
+\r
+  This is internal function.\r
+\r
+  @param Event           The event that triggered this notification function.\r
+  @param Context         Pointer to the notification functions context.\r
+\r
+**/\r
+VOID\r
 EFIAPI\r
-InitializeHiiDatabase (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
+KeyboardLayoutChangeNullEvent (\r
+  IN EFI_EVENT                Event,\r
+  IN VOID                     *Context\r
   )\r
-/*++\r
+{\r
+  return;\r
+}\r
 \r
-Routine Description:\r
-  Initialize HII Database\r
+/**\r
+  On Ready To Boot Services Event notification handler.\r
 \r
-Arguments:\r
-  (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
+  To trigger the function that to export the Hii Configuration setting.\r
 \r
-Returns:\r
-  EFI_SUCCESS -\r
-  other       -\r
+  @param[in]  Event     Event whose notification function is being invoked\r
+  @param[in]  Context   Pointer to the notification function's context\r
 \r
---*/\r
+**/\r
+VOID\r
+EFIAPI\r
+OnReadyToBoot (\r
+  IN      EFI_EVENT                         Event,\r
+  IN      VOID                              *Context\r
+  )\r
+{\r
+  //\r
+  // When ready to boot, we begin to export the HiiDatabase date.\r
+  // And hook all the possible HiiDatabase change actions to export data.\r
+  //\r
+  HiiGetDatabaseInfo (&mPrivate.HiiDatabase);\r
+  HiiGetConfigRespInfo (&mPrivate.HiiDatabase);\r
+  gExportAfterReadyToBoot = TRUE;\r
+\r
+  gBS->CloseEvent (Event);\r
+}\r
+\r
+/**\r
+  Initialize HII Database.\r
+\r
+\r
+  @param ImageHandle     The image handle.\r
+  @param SystemTable     The system table.\r
+\r
+  @retval EFI_SUCCESS    The Hii database is setup correctly.\r
+  @return Other value if failed to create the default event for\r
+          gHiiKeyboardLayoutChanged. Check gBS->CreateEventEx for\r
+          details. Or failed to install the protocols.\r
+          Check gBS->InstallMultipleProtocolInterfaces for details.\r
+          Or failed to create Ready To Boot Event.\r
+          Check EfiCreateEventReadyToBootEx for details.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeHiiDatabase (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
 {\r
   EFI_STATUS                             Status;\r
   EFI_HANDLE                             Handle;\r
-  EFI_HANDLE                             *HandleBuffer;\r
-  UINTN                                  HandleCount;\r
+  EFI_EVENT                              ReadyToBootEvent;\r
 \r
   //\r
   // There will be only one HII Database in the system\r
   // If there is another out there, someone is trying to install us\r
   // again.  Fail that scenario.\r
   //\r
-  Status = gBS->LocateHandleBuffer (\r
-                  ByProtocol,\r
-                  &gEfiHiiDatabaseProtocolGuid,\r
-                  NULL,\r
-                  &HandleCount,\r
-                  &HandleBuffer\r
-                  );\r
-\r
-  //\r
-  // If there was no error, assume there is an installation and fail to load\r
-  //\r
-  if (!EFI_ERROR (Status)) {\r
-    if (HandleBuffer != NULL) {\r
-      gBS->FreePool (HandleBuffer);\r
-    }\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiDatabaseProtocolGuid);\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiFontProtocolGuid);\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiImageProtocolGuid);\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiStringProtocolGuid);\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiConfigRoutingProtocolGuid);\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiConfigKeywordHandlerProtocolGuid);\r
 \r
   InitializeListHead (&mPrivate.DatabaseList);\r
   InitializeListHead (&mPrivate.DatabaseNotifyList);\r
@@ -161,11 +193,11 @@ Returns:
   // Create a event with EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group type.\r
   //\r
   Status = gBS->CreateEventEx (\r
-                  0,\r
-                  0,\r
-                  NULL,\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  KeyboardLayoutChangeNullEvent,\r
                   NULL,\r
-                  &gHiiSetKbdLayoutEventGuid,\r
+                  &gEfiHiiKeyBoardLayoutGuid,\r
                   &gHiiKeyboardLayoutChanged\r
                   );\r
   if (EFI_ERROR (Status)) {\r
@@ -173,21 +205,47 @@ Returns:
   }\r
 \r
   Handle = NULL;\r
-  return gBS->InstallMultipleProtocolInterfaces (\r
-                &Handle,\r
-                &gEfiHiiFontProtocolGuid,\r
-                &mPrivate.HiiFont,\r
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
-                &gEfiHiiImageProtocolGuid,\r
-                &mPrivate.HiiImage,\r
-#endif\r
-                &gEfiHiiStringProtocolGuid,\r
-                &mPrivate.HiiString,\r
-                &gEfiHiiDatabaseProtocolGuid,\r
-                &mPrivate.HiiDatabase,\r
-                &gEfiHiiConfigRoutingProtocolGuid,\r
-                &mPrivate.ConfigRouting,\r
-                NULL\r
-                );\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &Handle,\r
+                  &gEfiHiiFontProtocolGuid,\r
+                  &mPrivate.HiiFont,\r
+                  &gEfiHiiStringProtocolGuid,\r
+                  &mPrivate.HiiString,\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
+                  &mPrivate.HiiDatabase,\r
+                  &gEfiHiiConfigRoutingProtocolGuid,\r
+                  &mPrivate.ConfigRouting,\r
+                  &gEfiConfigKeywordHandlerProtocolGuid,\r
+                  &mPrivate.ConfigKeywordHandler,\r
+                  NULL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (FeaturePcdGet (PcdSupportHiiImageProtocol)) {\r
+    Status = gBS->InstallMultipleProtocolInterfaces (\r
+                    &Handle,\r
+                    &gEfiHiiImageProtocolGuid, &mPrivate.HiiImage,\r
+                    &gEfiHiiImageExProtocolGuid, &mPrivate.HiiImageEx,\r
+                    NULL\r
+                    );\r
+\r
+  }\r
+\r
+  if (FeaturePcdGet(PcdHiiOsRuntimeSupport)) {\r
+    Status = EfiCreateEventReadyToBootEx (\r
+               TPL_CALLBACK,\r
+               OnReadyToBoot,\r
+               NULL,\r
+               &ReadyToBootEvent\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  return Status;\r
 }\r
 \r