• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
KeyboardLayoutChangeNullEvent(IN EFI_EVENT Event,IN VOID * Context)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
OnReadyToBoot(IN EFI_EVENT Event,IN VOID * Context)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
InitializeHiiDatabase(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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