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