Home | History | Annotate | Download | only in HiiDatabaseDxe
      1 /** @file
      2 This file contains the entry code to the HII database, which is defined by
      3 UEFI 2.1 specification.
      4 
      5 Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 
     17 #include "HiiDatabase.h"
     18 
     19 //
     20 // Global variables
     21 //
     22 EFI_EVENT gHiiKeyboardLayoutChanged;
     23 BOOLEAN   gExportAfterReadyToBoot = FALSE;
     24 
     25 HII_DATABASE_PRIVATE_DATA mPrivate = {
     26   HII_DATABASE_PRIVATE_DATA_SIGNATURE,
     27   {
     28     (LIST_ENTRY *) NULL,
     29     (LIST_ENTRY *) NULL
     30   },
     31   {
     32     (LIST_ENTRY *) NULL,
     33     (LIST_ENTRY *) NULL
     34   },
     35   {
     36     HiiStringToImage,
     37     HiiStringIdToImage,
     38     HiiGetGlyph,
     39     HiiGetFontInfo
     40   },
     41   {
     42     HiiNewImage,
     43     HiiGetImage,
     44     HiiSetImage,
     45     HiiDrawImage,
     46     HiiDrawImageId
     47   },
     48   {
     49     HiiNewImageEx,
     50     HiiGetImageEx,
     51     HiiSetImageEx,
     52     HiiDrawImageEx,
     53     HiiDrawImageIdEx,
     54     HiiGetImageInfo
     55   },
     56   {
     57     HiiNewString,
     58     HiiGetString,
     59     HiiSetString,
     60     HiiGetLanguages,
     61     HiiGetSecondaryLanguages
     62   },
     63   {
     64     HiiNewPackageList,
     65     HiiRemovePackageList,
     66     HiiUpdatePackageList,
     67     HiiListPackageLists,
     68     HiiExportPackageLists,
     69     HiiRegisterPackageNotify,
     70     HiiUnregisterPackageNotify,
     71     HiiFindKeyboardLayouts,
     72     HiiGetKeyboardLayout,
     73     HiiSetKeyboardLayout,
     74     HiiGetPackageListHandle
     75   },
     76   {
     77     HiiConfigRoutingExtractConfig,
     78     HiiConfigRoutingExportConfig,
     79     HiiConfigRoutingRouteConfig,
     80     HiiBlockToConfig,
     81     HiiConfigToBlock,
     82     HiiGetAltCfg
     83   },
     84   {
     85     EfiConfigKeywordHandlerSetData,
     86     EfiConfigKeywordHandlerGetData
     87   },
     88   {
     89     (LIST_ENTRY *) NULL,
     90     (LIST_ENTRY *) NULL
     91   },
     92   0,
     93   {
     94     (LIST_ENTRY *) NULL,
     95     (LIST_ENTRY *) NULL
     96   },
     97   EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK),
     98   {
     99     0x00000000,
    100     0x0000,
    101     0x0000,
    102     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
    103   },
    104   NULL
    105 };
    106 
    107 /**
    108   The default event handler for gHiiKeyboardLayoutChanged
    109   event group.
    110 
    111   This is internal function.
    112 
    113   @param Event           The event that triggered this notification function.
    114   @param Context         Pointer to the notification functions context.
    115 
    116 **/
    117 VOID
    118 EFIAPI
    119 KeyboardLayoutChangeNullEvent (
    120   IN EFI_EVENT                Event,
    121   IN VOID                     *Context
    122   )
    123 {
    124   return;
    125 }
    126 
    127 /**
    128   On Ready To Boot Services Event notification handler.
    129 
    130   To trigger the function that to export the Hii Configuration setting.
    131 
    132   @param[in]  Event     Event whose notification function is being invoked
    133   @param[in]  Context   Pointer to the notification function's context
    134 
    135 **/
    136 VOID
    137 EFIAPI
    138 OnReadyToBoot (
    139   IN      EFI_EVENT                         Event,
    140   IN      VOID                              *Context
    141   )
    142 {
    143   //
    144   // When ready to boot, we begin to export the HiiDatabase date.
    145   // And hook all the possible HiiDatabase change actions to export data.
    146   //
    147   HiiGetConfigurationSetting(&mPrivate.HiiDatabase);
    148   gExportAfterReadyToBoot = TRUE;
    149 
    150   gBS->CloseEvent (Event);
    151 }
    152 
    153 /**
    154   Initialize HII Database.
    155 
    156 
    157   @param ImageHandle     The image handle.
    158   @param SystemTable     The system table.
    159 
    160   @retval EFI_SUCCESS    The Hii database is setup correctly.
    161   @return Other value if failed to create the default event for
    162           gHiiKeyboardLayoutChanged. Check gBS->CreateEventEx for
    163           details. Or failed to install the protocols.
    164           Check gBS->InstallMultipleProtocolInterfaces for details.
    165           Or failed to create Ready To Boot Event.
    166           Check EfiCreateEventReadyToBootEx for details.
    167 
    168 **/
    169 EFI_STATUS
    170 EFIAPI
    171 InitializeHiiDatabase (
    172   IN EFI_HANDLE           ImageHandle,
    173   IN EFI_SYSTEM_TABLE     *SystemTable
    174   )
    175 {
    176   EFI_STATUS                             Status;
    177   EFI_HANDLE                             Handle;
    178   EFI_EVENT                              ReadyToBootEvent;
    179 
    180   //
    181   // There will be only one HII Database in the system
    182   // If there is another out there, someone is trying to install us
    183   // again.  Fail that scenario.
    184   //
    185   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiDatabaseProtocolGuid);
    186   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiFontProtocolGuid);
    187   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiImageProtocolGuid);
    188   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiStringProtocolGuid);
    189   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiConfigRoutingProtocolGuid);
    190   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiConfigKeywordHandlerProtocolGuid);
    191 
    192   InitializeListHead (&mPrivate.DatabaseList);
    193   InitializeListHead (&mPrivate.DatabaseNotifyList);
    194   InitializeListHead (&mPrivate.HiiHandleList);
    195   InitializeListHead (&mPrivate.FontInfoList);
    196 
    197   //
    198   // Create a event with EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group type.
    199   //
    200   Status = gBS->CreateEventEx (
    201                   EVT_NOTIFY_SIGNAL,
    202                   TPL_NOTIFY,
    203                   KeyboardLayoutChangeNullEvent,
    204                   NULL,
    205                   &gEfiHiiKeyBoardLayoutGuid,
    206                   &gHiiKeyboardLayoutChanged
    207                   );
    208   if (EFI_ERROR (Status)) {
    209     return Status;
    210   }
    211 
    212   Handle = NULL;
    213   Status = gBS->InstallMultipleProtocolInterfaces (
    214                   &Handle,
    215                   &gEfiHiiFontProtocolGuid,
    216                   &mPrivate.HiiFont,
    217                   &gEfiHiiStringProtocolGuid,
    218                   &mPrivate.HiiString,
    219                   &gEfiHiiDatabaseProtocolGuid,
    220                   &mPrivate.HiiDatabase,
    221                   &gEfiHiiConfigRoutingProtocolGuid,
    222                   &mPrivate.ConfigRouting,
    223                   &gEfiConfigKeywordHandlerProtocolGuid,
    224                   &mPrivate.ConfigKeywordHandler,
    225                   NULL
    226                   );
    227 
    228   if (EFI_ERROR (Status)) {
    229     return Status;
    230   }
    231 
    232   if (FeaturePcdGet (PcdSupportHiiImageProtocol)) {
    233     Status = gBS->InstallMultipleProtocolInterfaces (
    234                     &Handle,
    235                     &gEfiHiiImageProtocolGuid, &mPrivate.HiiImage,
    236                     &gEfiHiiImageExProtocolGuid, &mPrivate.HiiImageEx,
    237                     NULL
    238                     );
    239 
    240   }
    241 
    242   if (FeaturePcdGet(PcdHiiOsRuntimeSupport)) {
    243     Status = EfiCreateEventReadyToBootEx (
    244                TPL_CALLBACK,
    245                OnReadyToBoot,
    246                NULL,
    247                &ReadyToBootEvent
    248                );
    249     if (EFI_ERROR (Status)) {
    250       return Status;
    251     }
    252   }
    253 
    254   return Status;
    255 }
    256 
    257