]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c
1) Add in EBC build support.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / ConfigAccess.c
Content-type: text/html ]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c


500 - Internal Server Error

Malformed UTF-8 character (fatal) at (eval 6) line 1, <$fd> line 849.
CommitLineData
ebbd2793 1/**@file\r
2 This file contains functions related to Config Access Protocols installed by\r
3 by HII Thunk Modules which is used to thunk UEFI Config Access Callback to \r
4 Framework HII Callback.\r
5 \r
6Copyright (c) 2008, Intel Corporation\r
7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "HiiDatabase.h"\r
18\r
19HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE ConfigAccessProtocolInstanceTempate = {\r
20 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE,\r
21 {\r
22 ThunkExtractConfig,\r
23 ThunkRouteConfig,\r
24 ThunkCallback\r
25 }, //ConfigAccessProtocol\r
26 NULL, //FrameworkFormCallbackProtocol\r
27 {NULL, NULL} //ConfigAccessStorageListHead\r
28};\r
29\r
1a6cdbd9 30/**\r
31 Find and return the pointer to Package Header of the Form package\r
32 in the Framework Package List. The Framework Package List is created\r
33 by a module calling the Framework HII interface.\r
34 The Framwork Package List contains package data \r
35 generated by Intel's UEFI VFR Compiler and String gather tool. The data format\r
36 of the package data is defined by TIANO_AUTOGEN_PACKAGES_HEADER.\r
37\r
38 If the package list contains other type of packages such as KEYBOARD_LAYOUT,\r
39 FONTS and IMAGES, the ASSERT. This is to make sure the caller is a \r
40 Framework Module which does not include packages introduced by UEFI Specification\r
41 or packages that is not supported by Thunk layer.\r
42 \r
43 @param Packages The Framework Package List\r
44 \r
45 @retval EFI_HII_PACKAGE_HEADER* Return the Package Header of\r
46 Form Package.\r
47 @retval NULL If no Form Package is found.\r
48**/\r
ebbd2793 49EFI_HII_PACKAGE_HEADER *\r
50GetIfrFormSet (\r
51 IN CONST EFI_HII_PACKAGES *Packages\r
52 )\r
53{\r
54 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
55 EFI_HII_PACKAGE_HEADER *IfrPackage;\r
56 UINTN Index;\r
57\r
58 ASSERT (Packages != NULL);\r
59\r
60 IfrPackage = NULL;\r
61\r
62 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
63 for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
64 //\r
65 // BugBug: The current UEFI HII build tool generate a binary in the format defined in: \r
66 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
67 // this binary is with same package type. So the returned IfrPackNum and StringPackNum\r
68 // may not be the exact number of valid package number in the binary generated \r
69 // by HII Build tool.\r
70 //\r
71 switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
72 case EFI_HII_PACKAGE_FORM:\r
73 return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
74 break;\r
75\r
76 case EFI_HII_PACKAGE_STRINGS:\r
77 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
78 break;\r
79\r
80 //\r
81 // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
82 //\r
83 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
84 case EFI_HII_PACKAGE_FONTS:\r
85 case EFI_HII_PACKAGE_IMAGES:\r
86 default:\r
87 ASSERT (FALSE);\r
88 break;\r
89 }\r
90 }\r
91\r
92 return (EFI_HII_PACKAGE_HEADER *) NULL;\r
93}\r
94\r
1a6cdbd9 95/**\r
96 This function scan EFI_IFR_VARSTORE_OP in the Form Package.\r
97 It create entries for these VARSTORE found and append the entry\r
98 to a Link List.\r
99\r
100 If FormSetPackage is not EFI_HII_PACKAGE_FORM, then ASSERT.\r
101 If there is no linear buffer storage in this formset, then ASSERT.\r
102\r
103 @param FormSetPackage The Form Package header.\r
104 @param BufferStorageListHead The link list for the VARSTORE found in the form package.\r
105 \r
106 @retval EFI_SUCCESS The function scan the form set and find one or more \r
107 VARSTOREs.\r
108 @retval EFI_OUT_OF_RESOURCES There is not enough memory to complete the function.\r
109**/\r
ebbd2793 110EFI_STATUS\r
111GetBufferStorage (\r
112 IN CONST EFI_HII_PACKAGE_HEADER *FormSetPackage,\r
113 OUT LIST_ENTRY *BufferStorageListHead\r
114 )\r
115{\r
116 UINTN OpCodeOffset;\r
117 UINTN OpCodeLength;\r
118 UINT8 *OpCodeData;\r
119 UINT8 Operand;\r
120 EFI_IFR_VARSTORE *VarStoreOpCode;\r
121 HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey;\r
122\r
1a6cdbd9 123 ASSERT (FormSetPackage->Type == EFI_HII_PACKAGE_FORM);\r
124\r
ebbd2793 125 OpCodeOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
126 while (OpCodeOffset < FormSetPackage->Length) {\r
127 OpCodeData = (UINT8 *) FormSetPackage + OpCodeOffset;\r
128\r
129 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
130 OpCodeOffset += OpCodeLength;\r
131 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
132\r
133 if (Operand == EFI_IFR_VARSTORE_OP) {\r
134 VarStoreOpCode = (EFI_IFR_VARSTORE *)OpCodeData;\r
135 BufferStorageKey = AllocateZeroPool (sizeof (*BufferStorageKey));\r
136 if (BufferStorageKey == NULL) {\r
137 return EFI_OUT_OF_RESOURCES;\r
138 }\r
0915f6dc 139 CopyMem (&BufferStorageKey->Guid, &VarStoreOpCode->Guid, sizeof (EFI_GUID));\r
140 \r
ebbd2793 141 BufferStorageKey->Name = AllocateZeroPool (AsciiStrSize (VarStoreOpCode->Name) * 2);\r
142 AsciiStrToUnicodeStr (VarStoreOpCode->Name, BufferStorageKey->Name);\r
143\r
144 BufferStorageKey->VarStoreId = VarStoreOpCode->VarStoreId;\r
145\r
146 BufferStorageKey->Size = VarStoreOpCode->Size;\r
147 BufferStorageKey->Signature = HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE;\r
148\r
149 InsertTailList (BufferStorageListHead, &BufferStorageKey->List);\r
150 }\r
151 }\r
1a6cdbd9 152\r
ebbd2793 153 return EFI_SUCCESS;\r
154}\r
155 \r
1a6cdbd9 156/**\r
157 This function installs a EFI_CONFIG_ACCESS_PROTOCOL instance for a form package registered\r
158 by a module using Framework HII Protocol Interfaces.\r
159\r
160 UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
161 that Setup Utility can load the Buffer Storage using this protocol.\r
162 \r
163 @param Packages The framework package list.\r
164 @param MapEntry The Thunk Layer Handle Mapping Database Entry.\r
165 \r
166 @retval EFI_SUCCESS The Config Access Protocol is installed successfully.\r
167 @retval EFI_OUT_RESOURCE There is not enough memory.\r
168 \r
169**/\r
ebbd2793 170EFI_STATUS\r
171InstallDefaultUefiConfigAccessProtocol (\r
172 IN CONST EFI_HII_PACKAGES *Packages,\r
ebbd2793 173 IN OUT HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
174 )\r
175{\r
176 EFI_HII_PACKAGE_HEADER *FormSetPackage;\r
177 EFI_STATUS Status;\r
178 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigAccessInstance;\r
179\r
63dd6a96 180 Status = HiiLibCreateHiiDriverHandle (&MapEntry->UefiHiiDriverHandle);\r
ebbd2793 181 ConfigAccessInstance = AllocateCopyPool (\r
182 sizeof (HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE), \r
183 &ConfigAccessProtocolInstanceTempate\r
184 );\r
1a6cdbd9 185 ASSERT (ConfigAccessInstance != NULL);\r
ebbd2793 186 InitializeListHead (&ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
187\r
188 //\r
189 // We assume there is only one formset package in each Forms Package\r
190 //\r
191 FormSetPackage = GetIfrFormSet (Packages);\r
1a6cdbd9 192 ASSERT (FormSetPackage != NULL);\r
193 \r
ebbd2793 194 Status = GetBufferStorage (FormSetPackage, &ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
195 if (EFI_ERROR (Status)) {\r
196 FreePool (ConfigAccessInstance);\r
197 ASSERT (FALSE);\r
198 return Status;\r
199 }\r
200\r
201 Status = gBS->InstallMultipleProtocolInterfaces (\r
63dd6a96 202 &MapEntry->UefiHiiDriverHandle,\r
ebbd2793 203 &gEfiHiiConfigAccessProtocolGuid,\r
204 &ConfigAccessInstance->ConfigAccessProtocol,\r
205 NULL\r
206 );\r
207 ASSERT_EFI_ERROR (Status);\r
208 if (EFI_ERROR (Status)) {\r
209 FreePool (ConfigAccessInstance);\r
210 return Status;\r
211 }\r
212 \r
213 return EFI_SUCCESS;\r
214}\r
215\r
1a6cdbd9 216/**\r
217\r
218 Wrap EFI_HII_CONFIG_ACCESS_PROTOCOL.RouteConfig to a call to EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
219 \r
220 @param BufferStorageKey The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
221 @param FrameworkFormCallBack The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
222 @param Data The data to be saved.\r
223 @param DataSize The size of data.\r
224 \r
225 @retval EFI_STATUS The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
226 **/\r
ebbd2793 227EFI_STATUS\r
228RouteConfigToFrameworkFormCallBack (\r
229 IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
230 IN EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallBack,\r
231 IN VOID *Data,\r
232 IN UINTN DataSize\r
233 )\r
234{\r
235 EFI_STATUS Status;\r
236 BOOLEAN ResetRequired;\r
237\r
238 Status = FrameworkFormCallBack->NvWrite (\r
239 FrameworkFormCallBack, \r
240 BufferStorageKey->Name,\r
241 &BufferStorageKey->Guid,\r
242 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
243 DataSize,\r
244 Data,\r
245 &ResetRequired\r
246 );\r
247 return Status;\r
248}\r
249\r
1a6cdbd9 250/**\r
251 Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
252 \r
253 @param BufferStorageKey The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
254 @param FrameworkFormCallBack The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
255 @param Data The data read.\r
256 @param DataSize The size of data.\r
257 \r
258 @retval EFI_STATUS The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
259 @retval EFI_INVALID_PARAMETER If the EFI_FORM_CALLBACK_PROTOCOL.NvRead return the size information of the data\r
260 does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
261 **/\r
ebbd2793 262EFI_STATUS\r
263ExtractConfigFromFrameworkFormCallBack (\r
264 IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
265 IN EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallBack,\r
266 OUT VOID **Data,\r
267 OUT UINTN *DataSize\r
268 )\r
269{\r
270 EFI_STATUS Status;\r
271\r
272 *DataSize = 0;\r
273 *Data = NULL;\r
274 \r
275 Status = FrameworkFormCallBack->NvRead (\r
276 FrameworkFormCallBack, \r
277 BufferStorageKey->Name,\r
278 &BufferStorageKey->Guid,\r
279 NULL,\r
280 DataSize,\r
281 *Data\r
282 );\r
283 if (Status == EFI_BUFFER_TOO_SMALL) {\r
284 if (BufferStorageKey->Size != *DataSize) {\r
285 ASSERT (FALSE);\r
286 return EFI_INVALID_PARAMETER;\r
287 }\r
288\r
289 *Data = AllocateZeroPool (*DataSize);\r
290 if (Data == NULL) {\r
291 return EFI_OUT_OF_RESOURCES;\r
292 }\r
293\r
294 FrameworkFormCallBack->NvRead (\r
295 FrameworkFormCallBack, \r
296 BufferStorageKey->Name,\r
297 &BufferStorageKey->Guid,\r
298 NULL,\r
299 DataSize,\r
300 *Data\r
301 );\r
302 }\r
303\r
304 return Status;\r
305}\r
306\r
1a6cdbd9 307/**\r
308 Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to UEFI Variable Set Service.\r
309 \r
310 @param BufferStorageKey The key with all attributes needed to call a UEFI Variable Get Service.\r
311 @param Data The data read.\r
312 @param DataSize The size of data.\r
313\r
314 @retval EFI_STATUS The status returned by the UEFI Variable Set Service.\r
315 \r
316 **/\r
ebbd2793 317EFI_STATUS\r
318RouteConfigToUefiVariable (\r
319 IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
320 IN VOID *Data,\r
321 IN UINTN DataSize\r
322 )\r
323{\r
324 return gRT->SetVariable (\r
325 BufferStorageKey->Name,\r
326 &BufferStorageKey->Guid,\r
327 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
328 DataSize,\r
329 Data\r
330 );\r
331 \r
332}\r
1a6cdbd9 333\r
334/**\r
335 Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to UEFI Variable Get Service.\r
336 \r
337 @param BufferStorageKey The key with all attributes needed to call a UEFI Variable Get Service.\r
338 @param Data The data read.\r
339 @param DataSize The size of data.\r
340\r
341 If the UEFI Variable Get Service return the size information of the data\r
342 does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
343 then ASSERT.\r
344 \r
345 @retval EFI_STATUS The status returned by the UEFI Variable Get Service.\r
346 @retval EFI_INVALID_PARAMETER If the UEFI Variable Get Service return the size information of the data\r
347 does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
348 **/\r
349\r
ebbd2793 350EFI_STATUS\r
351ExtractConfigFromUefiVariable (\r
352 IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
353 OUT VOID **Data,\r
354 OUT UINTN *DataSize\r
355 )\r
356{\r
357 EFI_STATUS Status;\r
358\r
359 *DataSize = 0;\r
360 *Data = NULL;\r
361 Status = gRT->GetVariable (\r
362 BufferStorageKey->Name,\r
363 &BufferStorageKey->Guid,\r
364 NULL,\r
365 DataSize,\r
366 *Data\r
367 );\r
368 if (Status == EFI_BUFFER_TOO_SMALL) {\r
369\r
370 if (BufferStorageKey->Size != *DataSize) {\r
371 ASSERT (FALSE);\r
372 return EFI_INVALID_PARAMETER;\r
373 }\r
374\r
375 *Data = AllocateZeroPool (*DataSize);\r
376 if (Data == NULL) {\r
377 return EFI_OUT_OF_RESOURCES;\r
378 }\r
379\r
380 Status = gRT->GetVariable (\r
381 BufferStorageKey->Name,\r
382 &BufferStorageKey->Guid,\r
383 NULL,\r
384 DataSize,\r
385 *Data\r
386 );\r
387 }\r
388\r
389 return Status;\r
390}\r
391\r
1a6cdbd9 392/**\r
393\r
394 This function implement the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig\r
395 so that data can be read from the data storage such as UEFI Variable or module's\r
396 customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
397\r
398 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
399 @param Request A null-terminated Unicode string in <ConfigRequest> format. Note that this\r
400 includes the routing information as well as the configurable name / value pairs. It is\r
401 invalid for this string to be in <MultiConfigRequest> format.\r
402\r
403