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