]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
Update package dependency.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Package.c
CommitLineData
4259256b 1/**@file\r
2\r
3 This file contains the keyboard processing code to the HII database.\r
4\r
5Copyright (c) 2006 - 2008, Intel Corporation\r
6All rights reserved. This 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
63dd6a96 20BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
21BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
22\r
23\r
4259256b 24EFI_STATUS\r
25GetIfrAndStringPackNum (\r
26 IN CONST EFI_HII_PACKAGES *Packages,\r
27 UINTN *IfrPackNum,\r
28 UINTN *StringPackNum\r
29 )\r
30{\r
31 UINTN Index;\r
32 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
33\r
34 ASSERT (Packages != NULL);\r
35 ASSERT (IfrPackNum != NULL);\r
36 ASSERT (StringPackNum != NULL);\r
37\r
38 *IfrPackNum = 0;\r
39 *StringPackNum = 0;\r
40\r
41 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
42 for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
43 //\r
44 // BugBug: The current UEFI HII build tool generate a binary in the format defined in: \r
45 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
46 // this binary is with same package type. So the returned IfrPackNum and StringPackNum\r
47 // may not be the exact number of valid package number in the binary generated \r
48 // by HII Build tool.\r
49 //\r
50 switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
51 case EFI_HII_PACKAGE_FORM:\r
52 *IfrPackNum += 1;\r
53 break;\r
54 case EFI_HII_PACKAGE_STRINGS:\r
55 *StringPackNum += 1;\r
56 break;\r
57\r
58 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
59 break;\r
60\r
61 //\r
62 // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
63 //\r
64 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
65 case EFI_HII_PACKAGE_FONTS:\r
66 case EFI_HII_PACKAGE_IMAGES:\r
67 default:\r
68 ASSERT (FALSE);\r
69 return EFI_INVALID_PARAMETER;\r
70 break;\r
71 }\r
72 }\r
73\r
74 return EFI_SUCCESS;\r
75}\r
76\r
77EFI_STATUS \r
78LibExportPackageLists (\r
79 IN EFI_HII_HANDLE UefiHiiHandle,\r
80 OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
81 OUT UINTN *PackageListSize\r
82 )\r
83{\r
84 EFI_STATUS Status;\r
85 UINTN Size;\r
86 EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
87\r
88 ASSERT (PackageListSize != NULL);\r
89 ASSERT (PackageListHeader != NULL);\r
90\r
91 Size = 0;\r
92 PackageListHdr = NULL;\r
59336178 93 Status = mHiiDatabase->ExportPackageLists (\r
94 mHiiDatabase,\r
4259256b 95 UefiHiiHandle,\r
96 &Size,\r
97 PackageListHdr\r
98 );\r
99 ASSERT_EFI_ERROR (Status == EFI_BUFFER_TOO_SMALL);\r
100 if (Status == EFI_BUFFER_TOO_SMALL) {\r
101 PackageListHdr = AllocateZeroPool (Size);\r
102 ASSERT (PackageListHdr != NULL);\r
103 \r
104 if (PackageListHeader == NULL) {\r
105 return EFI_OUT_OF_RESOURCES;\r
106 } else {\r
59336178 107 Status = mHiiDatabase->ExportPackageLists (\r
108 mHiiDatabase,\r
4259256b 109 UefiHiiHandle,\r
110 &Size,\r
111 PackageListHdr\r
112 );\r
113 ASSERT_EFI_ERROR (Status);\r
114 }\r
115 }\r
116\r
117 if (!EFI_ERROR (Status)) {\r
118 *PackageListHeader = PackageListHdr;\r
119 *PackageListSize = Size;\r
120 }\r
121\r
122 return Status;\r
123}\r
124\r
4259256b 125EFI_STATUS\r
126InsertStringPackagesToIfrPackageList (\r
127 IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader,\r
128 IN EFI_HII_HANDLE UefiHiiHandle \r
129 )\r
130{\r
131 EFI_STATUS Status;\r
59336178 132 Status = mHiiDatabase->UpdatePackageList (\r
133 mHiiDatabase,\r
4259256b 134 UefiHiiHandle,\r
135 StringPackageListHeader\r
136 );\r
137\r
138 return Status;\r
139}\r
140\r
141\r
142/**\r
143 Removes a node from a doubly linked list, and returns the node that follows\r
144 the removed node.\r
145\r
146 Removes the node Entry from a doubly linked list. It is up to the caller of\r
147 this function to release the memory used by this node if that is required. On\r
148 exit, the node following Entry in the doubly linked list is returned. If\r
149 Entry is the only node in the linked list, then the head node of the linked\r
150 list is returned.\r
151\r
152 If Entry is NULL, then ASSERT().\r
153 If Entry is the head node of an empty list, then ASSERT().\r
154 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
155 linked list containing Entry, including the Entry node, is greater than\r
156 or equal to PcdMaximumLinkedListLength, then ASSERT().\r
157\r
158 @param Entry A pointer to a node in a linked list\r
159\r
160 @return Entry\r
161\r
162**/\r
163EFI_STATUS\r
164AddStringPackagesToMatchingIfrPackageList (\r
165 IN EFI_HII_THUNK_PRIVATE_DATA *Private,\r
166 IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader\r
167 )\r
168{\r
169 EFI_STATUS Status;\r
170 LIST_ENTRY *ListEntry;\r
171 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
172\r
173 for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
174 ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
175 ListEntry = ListEntry->ForwardLink\r
176 ) {\r
177 HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
178 if (CompareGuid (&StringPackageListHeader->PackageListGuid, &HandleMapEntry->TagGuid)) {\r
179 Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, HandleMapEntry->UefiHiiHandle);\r
180 }\r
181 }\r
182 \r
183 return EFI_NOT_FOUND;\r
184}\r
185EFI_HII_PACKAGE_LIST_HEADER *\r
186PrepareUefiPackageListFromFrameworkHiiPackages (\r
187 IN CONST EFI_HII_PACKAGES *Packages,\r
63dd6a96 188 IN CONST EFI_GUID *PackageListGuid\r
4259256b 189 )\r
190{\r
191 UINTN NumberOfPackages;\r
192 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
193 UINT8 *PackageListData;\r
194 UINT32 PackageListLength;\r
195 UINT32 PackageLength;\r
196 EFI_HII_PACKAGE_HEADER PackageHeader;\r
197 UINTN Index;\r
198 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
199\r
63dd6a96 200 ASSERT (Packages != NULL);\r
201 ASSERT (PackageListGuid != NULL);\r
202\r
4259256b 203 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) ((UINT8 *) &Packages->GuidId + sizeof (Packages->GuidId));\r
204 NumberOfPackages = Packages->NumberOfPackages;\r
205\r
206 PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
207\r
208 for (Index = 0; Index < NumberOfPackages; Index++) {\r
209 CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->BinaryLength, sizeof (UINT32));\r
99a83b4c 210 //\r
211 //TIANO_AUTOGEN_PACKAGES_HEADER.BinaryLength include the BinaryLength itself.\r
212 //\r
213 PackageListLength += (PackageLength - sizeof(UINT32)); \r
4259256b 214 }\r
215\r
216 //\r
217 // Include the lenght of EFI_HII_PACKAGE_END\r
218 //\r
219 PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
220 PackageListHeader = AllocateZeroPool (PackageListLength);\r
221 ASSERT (PackageListHeader != NULL);\r
63dd6a96 222\r
223 CopyMem (&PackageListHeader->PackageListGuid, PackageListGuid, sizeof (EFI_GUID));\r
4259256b 224 PackageListHeader->PackageLength = PackageListLength;\r
225\r
226 PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
227\r
228 for (Index = 0; Index < NumberOfPackages; Index++) {\r
229 CopyMem (&PackageLength, &(TianoAutogenPackageHdrArray[Index]->BinaryLength), sizeof (UINT32));\r
230 PackageLength -= sizeof (UINT32);\r
231 CopyMem (PackageListData, &(TianoAutogenPackageHdrArray[Index]->PackageHeader), PackageLength);\r
232 PackageListData += PackageLength;\r
233 }\r
234\r
235 //\r
236 // Append EFI_HII_PACKAGE_END\r
237 //\r
238 PackageHeader.Type = EFI_HII_PACKAGE_END;\r
239 PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
240 CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
241\r
242 return PackageListHeader; \r
243}\r
244\r
59336178 245VOID\r
246GenerateGuidId (\r
247 IN CONST EFI_GUID * InGuid,\r
248 OUT EFI_GUID * OutGuid\r
4259256b 249 )\r
250{\r
4259256b 251 UINT64 MonotonicCount;\r
252\r
59336178 253 CopyMem (OutGuid, InGuid, sizeof (EFI_GUID));\r
4259256b 254 \r
255 gBS->GetNextMonotonicCount (&MonotonicCount);\r
256 //\r
257 // Use Monotonic Count as a psedo random number generator.\r
258 //\r
59336178 259 *((UINT64 *) OutGuid) = *((UINT64 *) OutGuid) + MonotonicCount;\r
4259256b 260}\r
261\r
262EFI_STATUS\r
263FindAndAddStringPackageToIfrPackageList(\r
264 EFI_HII_THUNK_PRIVATE_DATA *Private,\r
265 EFI_GUID *GuidId,\r
266 EFI_HII_HANDLE UefiIfrHiiHandle\r
267 )\r
268{\r
269 EFI_STATUS Status;\r
270 LIST_ENTRY *ListEntry;\r
271 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
272 EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;\r
273 UINTN Size;\r
274\r
275 for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
276 ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
277 ListEntry = ListEntry->ForwardLink\r
278 ) {\r
279 HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
280 if (CompareGuid (GuidId, &HandleMapEntry->TagGuid) && (!HandleMapEntry->DoesPackageListImportStringPackages)) {\r
281 Status = LibExportPackageLists (HandleMapEntry->UefiHiiHandle, &StringPackageListHeader, &Size);\r
282 ASSERT_EFI_ERROR (Status);\r
283\r
284 //\r
285 // Add Function to only get only String Packages from the Package List\r
286 //\r
287\r
288 Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, UefiIfrHiiHandle);\r
289 ASSERT_EFI_ERROR (Status);\r
290 \r
291 FreePool (StringPackageListHeader);\r
292 return EFI_SUCCESS;\r
293 }\r
294 }\r
295\r
296 return EFI_NOT_FOUND;\r
297\r
298}\r
299\r
59336178 300CONST EFI_GUID mAGuid = \r
301 { 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e } };\r
302\r
4259256b 303EFI_STATUS\r
304UefiRegisterPackageList(\r
305 EFI_HII_THUNK_PRIVATE_DATA *Private,\r
306 EFI_HII_PACKAGES *Packages,\r
307 FRAMEWORK_EFI_HII_HANDLE *Handle\r
308 )\r
309{\r
310 EFI_STATUS Status;\r
311 UINTN StringPackNum;\r
312 UINTN IfrPackNum;\r
313 EFI_HII_PACKAGE_LIST_HEADER *UefiPackageListHeader;\r
314 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
59336178 315 EFI_GUID GuidId;\r
4259256b 316\r
ea58467b 317 UefiPackageListHeader = NULL;\r
4259256b 318\r
319 Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
320 ASSERT_EFI_ERROR (Status);\r
59336178 321 //\r
5391c4f1 322 // Thunk Layer only handle the following combinations of IfrPack, StringPkg and FontPack.\r
323 // Thunk Layer only allow zero or one IfrPack in the Package List.\r
59336178 324 //\r
325 if (IfrPackNum > 1) {\r
326 return EFI_UNSUPPORTED;\r
327 }\r
4259256b 328\r
329 HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
330 ASSERT (HandleMappingEntry != NULL);\r
331 \r
332 HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
ea58467b 333 Status = AssignHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
334 if (EFI_ERROR (Status)) {\r
335 goto Done;\r
336 }\r
59336178 337\r
338 //\r
339 // Packages->GuidId may be NULL. In such case, caller of FramworkHii->NewPack is registering\r
340 // package with StringPack and IfrPack.\r
341 //\r
342 if (Packages->GuidId == NULL) {\r
343 Packages->GuidId = &GuidId;\r
344 GenerateGuidId (&mAGuid, Packages->GuidId);\r
63dd6a96 345 } else {\r
346 CopyGuid (&GuidId, Packages->GuidId);\r
59336178 347 }\r
348 \r
4259256b 349 CopyGuid (&HandleMappingEntry->TagGuid, Packages->GuidId);\r
350\r
351 if ((StringPackNum == 0) && (IfrPackNum != 0)) {\r
352 //\r
353 // UEFI HII database does not allow two package list with the same GUID.\r
354 // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
355 // a PackageList with only IFR to a Package list the with String package.\r
356 //\r
59336178 357 GenerateGuidId (Packages->GuidId, &GuidId);\r
4259256b 358 }\r
359\r
360 //\r
361 // UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
5391c4f1 362 // that Setup Utility can load the Buffer Storage using this protocol.\r
4259256b 363 //\r
364 if (IfrPackNum != 0) {\r
63dd6a96 365 InstallDefaultUefiConfigAccessProtocol (Packages, HandleMappingEntry);\r
4259256b 366 }\r
59336178 367 UefiPackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
368 Status = mHiiDatabase->NewPackageList (\r
369 mHiiDatabase,\r
4259256b 370 UefiPackageListHeader, \r
63dd6a96 371 HandleMappingEntry->UefiHiiDriverHandle,\r
4259256b 372 &HandleMappingEntry->UefiHiiHandle\r
373 );\r
374 ASSERT_EFI_ERROR (Status);\r
375 if (EFI_ERROR (Status)) {\r
376 goto Done;\r
377 }\r
378 \r
379 if (IfrPackNum == 0) {\r
380 if (StringPackNum != 0) {\r
381 //\r
382 // Look for a package list with IFR Pack which has already registed with HII Database\r
383 //\r
384 HandleMappingEntry->IsPackageListWithOnlyStringPackages = TRUE;\r
385 Status = AddStringPackagesToMatchingIfrPackageList (\r
386 Private,\r
387 UefiPackageListHeader\r
388 );\r
389\r
390 if (!EFI_ERROR (Status) || Status == EFI_NOT_FOUND) {\r
391\r
392 if (Status == EFI_NOT_FOUND) {\r
393 Status = EFI_SUCCESS;\r
394 }\r
395 }\r
396 }\r
397 } else {\r
398 if (StringPackNum == 0) {\r
399 //\r
400 // Register the Package List to UEFI HII first.\r
401 //\r
402 Status = FindAndAddStringPackageToIfrPackageList (\r
403 Private,\r
404 Packages->GuidId,\r
405 HandleMappingEntry->UefiHiiHandle\r
406 );\r
407 ASSERT_EFI_ERROR (Status);\r
408 if (!EFI_ERROR (Status)) {\r
409 HandleMappingEntry->DoesPackageListImportStringPackages = TRUE;\r
410 }\r
411 }\r
412 }\r
413\r
414 if (!EFI_ERROR (Status)) {\r
415 InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
416 }\r
417\r
418Done:\r
419 if (EFI_ERROR (Status)) {\r
420 FreePool (HandleMappingEntry);\r
421 } else {\r
422 *Handle = HandleMappingEntry->FrameworkHiiHandle;\r
423 }\r
424\r
ea58467b 425 SafeFreePool (UefiPackageListHeader);\r
4259256b 426 \r
427 return Status;\r
428}\r
429\r
ea58467b 430\r
4259256b 431EFI_STATUS\r
432EFIAPI\r
433HiiNewPack (\r
434 IN EFI_HII_PROTOCOL *This,\r
435 IN EFI_HII_PACKAGES *Packages,\r
436 OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
437 )\r
438/*++\r
439\r
440Routine Description:\r
441\r
442 Extracts the various packs from a package list.\r
443\r
444Arguments:\r
445\r
446 This - Pointer of HII protocol.\r
447 Packages - Pointer of HII packages.\r
448 Handle - Handle value to be returned.\r
449\r
450Returns:\r
451\r
452 EFI_SUCCESS - Pacakges has added to HII database successfully.\r
453 EFI_INVALID_PARAMETER - Invalid parameter.\r
454\r
455--*/\r
456{\r
457 EFI_STATUS Status;\r
458 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
63dd6a96 459 EFI_TPL OldTpl;\r
4259256b 460\r
461 if (Handle == NULL) {\r
462 return EFI_INVALID_PARAMETER;\r
463 }\r
464\r
465 if (Packages == NULL) {\r
466 return EFI_INVALID_PARAMETER;\r
467 }\r
468\r
63dd6a96 469 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
470 \r
ea58467b 471 //\r
472 // We use a simple Global variable to inform NewPackNotify\r
473 // that the package list registered here is already registered\r
474 // in the HII Thunk Layer. So NewPackNotify does not need to\r
475 // call RegisterUefiHiiHandle () to registered it.\r
476 //\r
477 mInFrameworkHiiNewPack = TRUE;\r
478\r
4259256b 479 Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
480\r
481 Status = UefiRegisterPackageList (\r
482 Private,\r
483 Packages,\r
484 Handle\r
485 );\r
486\r
ea58467b 487 mInFrameworkHiiNewPack = FALSE;\r
488\r
63dd6a96 489 gBS->RestoreTPL (OldTpl);\r
490\r
4259256b 491 return Status;\r
492}\r
493\r
494EFI_STATUS\r
495EFIAPI\r
496HiiRemovePack (\r
497 IN EFI_HII_PROTOCOL *This,\r
498 IN FRAMEWORK_EFI_HII_HANDLE Handle\r
499 )\r
500/*++\r
501\r
502Routine Description:\r
503 Removes the various packs from a Handle\r
504\r
505Arguments:\r
506\r
507Returns:\r
508\r
509--*/\r
510{\r
511 EFI_STATUS Status;\r
512 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
4259256b 513 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
63dd6a96 514 EFI_TPL OldTpl;\r
515 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
516\r
517 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
518\r
519 mInFrameworkHiiRemovePack = TRUE;\r
4259256b 520\r
521 Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
522\r
99a83b4c 523 HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
4259256b 524\r
63dd6a96 525 if (HandleMapEntry != NULL) {\r
59336178 526 Status = mHiiDatabase->RemovePackageList (\r
527 mHiiDatabase,\r
99a83b4c 528 HandleMapEntry->UefiHiiHandle\r
529 );\r
530 ASSERT_EFI_ERROR (Status);\r
531\r
63dd6a96 532 HiiLibDestroyHiiDriverHandle (HandleMapEntry->UefiHiiHandle);\r
533\r
99a83b4c 534 Status = gBS->HandleProtocol (\r
63dd6a96 535 HandleMapEntry->UefiHiiDriverHandle,\r
536 &gEfiHiiConfigAccessProtocolGuid,\r
537 (VOID **) &ConfigAccess\r
99a83b4c 538 );\r
539\r
540 if (!EFI_ERROR (Status)) {\r
541 Status = gBS->UninstallProtocolInterface (\r
63dd6a96 542 HandleMapEntry->UefiHiiDriverHandle,\r
543 &gEfiHiiConfigAccessProtocolGuid,\r
544 ConfigAccess\r
99a83b4c 545 );\r
63dd6a96 546 ASSERT_EFI_ERROR (Status);\r
547 } else {\r
548 Status = EFI_SUCCESS;\r
4259256b 549 }\r
99a83b4c 550\r
551 RemoveEntryList (&HandleMapEntry->List);\r
552\r
553 FreePool (HandleMapEntry);\r
63dd6a96 554\r
555 }else {\r
556 Status = EFI_NOT_FOUND;\r
4259256b 557 }\r
558\r
63dd6a96 559 mInFrameworkHiiRemovePack = FALSE;\r
560 \r
561 gBS->RestoreTPL (OldTpl);\r
562\r
563 return Status;\r
4259256b 564}\r