]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c
Rename EfiScsiStallSeconds to EFI_SCSI_STALL_SECONDS to follow the naming convention...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / UefiIfrDefault.c
CommitLineData
59336178 1/** @file\r
2 Function and Macro defintions for to extract default values from UEFI Form package.\r
3\r
4 Copyright (c) 2008, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15\r
16#include <FrameworkDxe.h>\r
17\r
18#include <Protocol/FrameworkHii.h>\r
19#include <Protocol/HiiDatabase.h>\r
20\r
21#include <Library/BaseLib.h>\r
22#include <Library/BaseMemoryLib.h>\r
23#include <Library/DebugLib.h>\r
24#include <Library/MemoryAllocationLib.h>\r
25#include <Library/UefiBootServicesTableLib.h>\r
26\r
a9d85320 27#include "HiiDatabase.h"\r
59336178 28#include "UefiIfrParser.h"\r
29#include "UefiIfrDefault.h"\r
30\r
31//\r
32// Extern Variables\r
33//\r
34extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
59336178 35extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
36extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
37extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
38\r
59336178 39/**\r
40 Set the data position at Offset with Width in Node->Buffer based \r
41 the value passed in.\r
42\r
43 @param Node The Buffer Storage Node.\r
44 @param Value The input value.\r
45 @param Offset The offset in Node->Buffer for the update.\r
46 @param Width The length of the Value.\r
47 \r
48 @retval VOID\r
49\r
50**/\r
51VOID\r
52SetNodeBuffer (\r
53 OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node,\r
54 IN CONST EFI_HII_VALUE *Value,\r
55 IN UINTN Offset,\r
56 IN UINTN Width\r
57 )\r
58{\r
59 ASSERT (Node->Signature == UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE);\r
60 ASSERT (Offset + Width <= Node->Size);\r
61\r
62 CopyMem (Node->Buffer + Offset, &Value->Value.u8, Width);\r
63}\r
64\r
65\r
66/**\r
67 Reset Question to its default value.\r
68\r
a9d85320 69 Note Framework 0.92's HII Implementation does not support for default value for these opcodes:\r
70 EFI_IFR_ORDERED_LIST_OP:\r
71 EFI_IFR_PASSWORD_OP:\r
72 EFI_IFR_STRING_OP:\r
73\r
59336178 74 @param FormSet FormSet data structure.\r
75 @param DefaultId The Class of the default.\r
76\r
77 @retval EFI_SUCCESS Question is reset to default value.\r
78\r
79**/\r
80EFI_STATUS\r
81GetQuestionDefault (\r
82 IN FORM_BROWSER_FORMSET *FormSet,\r
83 IN FORM_BROWSER_FORM *Form,\r
84 IN FORM_BROWSER_STATEMENT *Question,\r
85 IN UINT16 DefaultId,\r
86 IN UINT16 VarStoreId,\r
87 OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node\r
88 )\r
89{\r
90 EFI_STATUS Status;\r
91 LIST_ENTRY *Link;\r
92 QUESTION_DEFAULT *Default;\r
93 QUESTION_OPTION *Option;\r
94 EFI_HII_VALUE *HiiValue;\r
95\r
96 Status = EFI_SUCCESS;\r
97\r
98 //\r
99 // Statement don't have storage, skip them\r
100 //\r
101 if (Question->QuestionId == 0) {\r
102 return Status;\r
103 }\r
104\r
105 if (Question->VarStoreId != VarStoreId) {\r
106 return Status;\r
107 }\r
108\r
109 ASSERT (Question->Storage->Type == EFI_HII_VARSTORE_BUFFER);\r
110\r
111 //\r
112 // There are three ways to specify default value for a Question:\r
113 // 1, use nested EFI_IFR_DEFAULT (highest priority)\r
114 // 2, set flags of EFI_ONE_OF_OPTION (provide Standard and Manufacturing default)\r
115 // 3, set flags of EFI_IFR_CHECKBOX (provide Standard and Manufacturing default) (lowest priority)\r
116 //\r
117 HiiValue = &Question->HiiValue;\r
118\r
119 //\r
120 // EFI_IFR_DEFAULT has highest priority\r
121 //\r
122 if (!IsListEmpty (&Question->DefaultListHead)) {\r
123 Link = GetFirstNode (&Question->DefaultListHead);\r
124 while (!IsNull (&Question->DefaultListHead, Link)) {\r
125 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
126\r
127 if (Default->DefaultId == DefaultId) {\r
a9d85320 128 //\r
129 // Default value is embedded in EFI_IFR_DEFAULT\r
130 //\r
131 CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
59336178 132 \r
133 SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
134 return EFI_SUCCESS;\r
135 }\r
136\r
137 Link = GetNextNode (&Question->DefaultListHead, Link);\r
138 }\r
139 }\r
140\r
141 //\r
142 // EFI_ONE_OF_OPTION\r
143 //\r
144 if ((Question->Operand == EFI_IFR_ONE_OF_OP) && !IsListEmpty (&Question->OptionListHead)) {\r
145 if (DefaultId <= EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
146 //\r
147 // OneOfOption could only provide Standard and Manufacturing default\r
148 //\r
149 Link = GetFirstNode (&Question->OptionListHead);\r
150 while (!IsNull (&Question->OptionListHead, Link)) {\r
151 Option = QUESTION_OPTION_FROM_LINK (Link);\r
152\r
153 if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && (Option->Flags & EFI_IFR_OPTION_DEFAULT)) ||\r
154 ((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && (Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG))\r
155 ) {\r
156 CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
157\r
158 SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
159 return EFI_SUCCESS;\r
160 }\r
161\r
162 Link = GetNextNode (&Question->OptionListHead, Link);\r
163 }\r
164 }\r
165 }\r
166\r
167 //\r
168 // EFI_IFR_CHECKBOX - lowest priority\r
169 //\r
170 if (Question->Operand == EFI_IFR_CHECKBOX_OP) {\r
171 if (DefaultId <= EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
172 //\r
173 // Checkbox could only provide Standard and Manufacturing default\r
174 //\r
175 if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && (Question->Flags & EFI_IFR_CHECKBOX_DEFAULT)) ||\r
176 ((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && (Question->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG))\r
177 ) {\r
178 HiiValue->Value.b = TRUE;\r
179 } else {\r
180 HiiValue->Value.b = FALSE;\r
181 }\r
182\r
183 SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
184 return EFI_SUCCESS;\r
185 }\r
186 }\r
187\r
188 return Status;\r
189}\r
190\r
191\r
192/**\r
193 Reset Questions in a Form to their default value.\r
194\r
195 @param FormSet FormSet data structure.\r
196 @param Form The Form which to be reset.\r
197 @param DefaultId The Class of the default.\r
198\r
199 @retval EFI_SUCCESS The function completed successfully.\r
200\r
201**/\r
202EFI_STATUS\r
203ExtractFormDefault (\r
204 IN FORM_BROWSER_FORMSET *FormSet,\r
205 IN FORM_BROWSER_FORM *Form,\r
206 IN UINT16 DefaultId,\r
207 IN UINT16 VarStoreId,\r
208 OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node\r
209 )\r
210{\r
211 EFI_STATUS Status;\r
212 LIST_ENTRY *Link;\r
213 FORM_BROWSER_STATEMENT *Question;\r
214\r
215 Link = GetFirstNode (&Form->StatementListHead);\r
216 while (!IsNull (&Form->StatementListHead, Link)) {\r
217 Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
59336178 218 //\r
219 // Reset Question to its default value\r
220 //\r
221 Status = GetQuestionDefault (FormSet, Form, Question, DefaultId, VarStoreId, Node);\r
222 if (EFI_ERROR (Status)) {\r
223 continue;\r
224 }\r
225\r
0368663f 226 Link = GetNextNode (&Form->StatementListHead, Link);\r
59336178 227 }\r
228 return EFI_SUCCESS;\r
229}\r
230\r
231\r
232/**\r
233 Destroy all the buffer allocated for the fileds of\r
234 UEFI_IFR_BUFFER_STORAGE_NODE. The Node itself\r
235 will be freed too.\r
236\r
237 @param FormSet FormSet data structure.\r
238 @param DefaultId The Class of the default.\r
239\r
240 @retval VOID\r
241\r
242**/\r
243VOID\r
244DestroyDefaultNode (\r
245 IN UEFI_IFR_BUFFER_STORAGE_NODE *Node\r
246 )\r
247{\r
7001eaf8 248 FreePool (Node->Buffer);\r
249 FreePool (Node->Name);\r
250 FreePool (Node);\r
59336178 251}\r
252\r
253\r
254/**\r
255 Get the default value for Buffer Type storage named by\r
256 a Default Store and a Storage Store from a FormSet.\r
257 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE\r
258 allocated by this function. It is inserted to the link list.\r
259 \r
260 @param DefaultStore The Default Store.\r
261 @param Storage The Storage.\r
262 @param FormSet The Form Set.\r
263 @param UefiDefaultsListHead The head of link list for the output.\r
264\r
265 @retval EFI_SUCCESS Successful.\r
266 \r
267**/\r
268EFI_STATUS\r
269GetBufferTypeDefaultIdAndStorageId (\r
270 IN FORMSET_DEFAULTSTORE *DefaultStore,\r
271 IN FORMSET_STORAGE *Storage,\r
272 IN FORM_BROWSER_FORMSET *FormSet,\r
273 OUT LIST_ENTRY *UefiDefaultsListHead\r
274 )\r
275{\r
276 UEFI_IFR_BUFFER_STORAGE_NODE *Node;\r
277 LIST_ENTRY *Link;\r
278 FORM_BROWSER_FORM *Form;\r
279 EFI_STATUS Status;\r
280\r
281 Node = AllocateZeroPool (sizeof (UEFI_IFR_BUFFER_STORAGE_NODE));\r
282 ASSERT (Node != NULL);\r
283\r
284 Node->Signature = UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE;\r
285 Node->Name = AllocateCopyPool (StrSize (Storage->Name), Storage->Name);\r
286 Node->DefaultId = DefaultStore->DefaultId;\r
b47694b9 287 Node->StoreId = Storage->VarStoreId;\r
59336178 288 CopyGuid (&Node->Guid, &Storage->Guid);\r
289 Node->Size = Storage->Size;\r
290 Node->Buffer = AllocateZeroPool (Node->Size);\r
291 //\r
292 // Extract default from IFR binary\r
293 //\r
294 Link = GetFirstNode (&FormSet->FormListHead);\r
295 while (!IsNull (&FormSet->FormListHead, Link)) {\r
296 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
297\r
298 Status = ExtractFormDefault (FormSet, Form, DefaultStore->DefaultId, Storage->VarStoreId, Node);\r
299 ASSERT_EFI_ERROR (Status);\r
300\r
301 Link = GetNextNode (&FormSet->FormListHead, Link);\r
302 }\r
303\r
304 InsertTailList (UefiDefaultsListHead, &Node->List);\r
305 \r
306 return EFI_SUCCESS;\r
307}\r
308\r
309\r
310/**\r
311 Get the default value for Buffer Type storage named by\r
312 a Default Store from a FormSet.\r
313 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE\r
314 allocated by this function. The output can be multiple instances\r
315 of UEFI_IFR_BUFFER_STORAGE_NODE. It is inserted to the link list.\r
316 \r
317 @param DefaultStore The Default Store.\r
318 @param FormSet The Form Set.\r
319 @param UefiDefaultsListHead The head of link list for the output.\r
320\r
321 @retval EFI_SUCCESS Successful.\r
322 \r
323**/\r
324EFI_STATUS\r
325GetBufferTypeDefaultId (\r
326 IN FORMSET_DEFAULTSTORE *DefaultStore,\r
327 IN FORM_BROWSER_FORMSET *FormSet,\r
328 OUT LIST_ENTRY *UefiDefaultsListHead\r
329 )\r
330{\r
0368663f 331 LIST_ENTRY *StorageLink;\r
59336178 332 FORMSET_STORAGE *Storage;\r
333 EFI_STATUS Status;\r
334\r
0368663f 335 StorageLink = GetFirstNode (&FormSet->StorageListHead);\r
59336178 336\r
0368663f 337 while (!IsNull (&FormSet->StorageListHead, StorageLink)) {\r
338 Storage = FORMSET_STORAGE_FROM_LINK(StorageLink);\r
59336178 339\r
340 if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
341 Status = GetBufferTypeDefaultIdAndStorageId (DefaultStore, Storage, FormSet, UefiDefaultsListHead);\r
342 }\r
343\r
0368663f 344 StorageLink = GetNextNode (&FormSet->StorageListHead, StorageLink);\r
59336178 345 }\r
346 \r
347 return EFI_SUCCESS;\r
348}\r
349\r
350\r
351/**\r
352 Get the default value for Buffer Type storage from the first FormSet\r
353 in the Package List specified by a EFI_HII_HANDLE.\r
354 \r
355 The results can be multiple instances of UEFI_IFR_BUFFER_STORAGE_NODE. \r
356 They are inserted to the link list.\r
357 \r
358 @param UefiHiiHandle The handle for the package list.\r
359 @param UefiDefaultsListHead The head of link list for the output.\r
360\r
361 @retval EFI_SUCCESS Successful.\r
362 \r
363**/\r
364EFI_STATUS\r
365UefiIfrGetBufferTypeDefaults (\r
a9d85320 366 IN HII_THUNK_CONTEXT *ThunkContext,\r
59336178 367 OUT LIST_ENTRY **UefiDefaults\r
368 )\r
369{\r
0368663f 370 LIST_ENTRY *DefaultLink;\r
59336178 371 FORMSET_DEFAULTSTORE *DefaultStore;\r
372 EFI_STATUS Status;\r
373\r
374 ASSERT (UefiDefaults != NULL);\r
375\r
59336178 376 *UefiDefaults = AllocateZeroPool (sizeof (LIST_ENTRY));\r
377 ASSERT (UefiDefaults != NULL);\r
378 InitializeListHead (*UefiDefaults);\r
379\r
a9d85320 380 DefaultLink = GetFirstNode (&ThunkContext->FormSet->DefaultStoreListHead);\r
381 while (!IsNull (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink)) {\r
0368663f 382 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
59336178 383\r
a9d85320 384 Status = GetBufferTypeDefaultId (DefaultStore, ThunkContext->FormSet, *UefiDefaults);\r
59336178 385 ASSERT_EFI_ERROR (Status);\r
386\r
a9d85320 387 DefaultLink = GetNextNode (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink); \r
59336178 388 }\r
389\r
59336178 390 return EFI_SUCCESS;\r
391}\r
392\r
393\r
394/**\r
395 Convert the UEFI Buffer Type default values to a Framework HII default\r
396 values specified by a EFI_HII_VARIABLE_PACK_LIST structure.\r
397 \r
398 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE\r
399 which contains the default values retrived from\r
400 a UEFI form set.\r
401 @param DefaultMask The default mask.\r
402 The valid values are FRAMEWORK_EFI_IFR_FLAG_DEFAULT\r
403 and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.\r
404 UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING \r
405 from specification to valid default class.\r
406 @param VariablePackList The output default value in a format defined in Framework.\r
407 \r
408\r
409 @retval EFI_SUCCESS Successful.\r
410 @retval EFI_INVALID_PARAMETER The default mask is not FRAMEWORK_EFI_IFR_FLAG_DEFAULT or \r
411 FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.\r
412**/\r
413EFI_STATUS\r
0368663f 414UefiDefaultsToFwDefaults (\r
59336178 415 IN LIST_ENTRY *ListHead,\r
416 IN UINTN DefaultMask,\r
a9d85320 417 IN EFI_VARSTORE_ID UefiFormSetDefaultVarStoreId,\r
59336178 418 OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
419 )\r
420{\r
421 LIST_ENTRY *List;\r
422 UEFI_IFR_BUFFER_STORAGE_NODE *Node;\r
423 UINTN Size;\r
424 UINTN Count;\r
425 UINT16 DefaultId;\r
426 EFI_HII_VARIABLE_PACK *Pack;\r
427 EFI_HII_VARIABLE_PACK_LIST *PackList;\r
1e22d0b0 428 UINTN Index;\r
59336178 429\r
430 if (DefaultMask == FRAMEWORK_EFI_IFR_FLAG_DEFAULT) {\r
431 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
432 } else if (DefaultMask == FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING) {\r
433 DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
434 } else {\r
435 //\r
436 // UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING \r
437 // from specification to valid default class.\r
438 //\r
439 ASSERT (FALSE);\r
440 return EFI_INVALID_PARAMETER;\r
441 }\r
442 \r
443 //\r
444 // Calculate the size of the output EFI_HII_VARIABLE_PACK_LIST structure\r
445 //\r
446 Size = 0;\r
447 Count = 0;\r
448 List = GetFirstNode (ListHead);\r
449 while (!IsNull (ListHead, List)) {\r
450 Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);\r
451\r
452 if (Node->DefaultId == DefaultId) {\r
453 Size += Node->Size;\r
454 Size += StrSize (Node->Name);\r
455\r
456 Count++;\r
457 }\r
458 \r
459 List = GetNextNode (ListHead, List); \r
460 }\r
461\r
1e22d0b0 462 if (Count == 0) {\r
463 *VariablePackList = NULL;\r
464 return EFI_NOT_FOUND;\r
465 }\r
466\r
59336178 467 Size = Size + Count * (sizeof (EFI_HII_VARIABLE_PACK_LIST) + sizeof (EFI_HII_VARIABLE_PACK));\r
468 \r
469 *VariablePackList = AllocateZeroPool (Size);\r
470 ASSERT (*VariablePackList != NULL);\r
471\r
472 List = GetFirstNode (ListHead);\r
473\r
474 PackList = (EFI_HII_VARIABLE_PACK_LIST *) *VariablePackList;\r
475 Pack = (EFI_HII_VARIABLE_PACK *) (PackList + 1);\r
1e22d0b0 476 Index = 0;\r
59336178 477 while (!IsNull (ListHead, List)) {\r
478 Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);\r
479\r
480 Size = 0; \r
481 if (Node->DefaultId == DefaultId) {\r
482 Size += Node->Size;\r
483 Size += StrSize (Node->Name);\r
484 Size += sizeof (EFI_HII_VARIABLE_PACK); \r
485\r
486 //\r
487 // In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId.\r
488 // So the default storage of Var Store in VFR from a Framework module \r
a9d85320 489 // should be translated to 0x0001 (FRAMEWORK_RESERVED_VARSTORE_ID).\r
59336178 490 //\r
a9d85320 491 if (Node->StoreId == UefiFormSetDefaultVarStoreId) {\r
59336178 492 Pack->VariableId = 0;\r
b47694b9 493 } else {\r
494 Pack->VariableId = Node->StoreId;\r
59336178 495 }\r
496 //\r
497 // Initialize EFI_HII_VARIABLE_PACK\r
498 //\r
499 Pack->Header.Type = 0;\r
dee6b58d 500 Pack->Header.Length = (UINT32) Size;\r
501 Pack->VariableNameLength = (UINT32) StrSize (Node->Name);\r
59336178 502 CopyMem (&Pack->VariableGuid, &Node->Guid, sizeof (EFI_GUID));\r
503 \r
504 CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK), Node->Name, StrSize (Node->Name));\r
505 CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK) + Pack->VariableNameLength, Node->Buffer, Node->Size);\r
506\r
507 Size += sizeof (EFI_HII_VARIABLE_PACK_LIST);\r
508\r
509 //\r
1e22d0b0 510 // Initialize EFI_HII_VARIABLE_PACK_LIST\r
59336178 511 //\r
512 PackList->VariablePack = Pack;\r
1e22d0b0 513 Index++;\r
514 if (Index < Count) {\r
515 PackList->NextVariablePack = (EFI_HII_VARIABLE_PACK_LIST *)((UINT8 *) PackList + Size);\r
516 }\r
59336178 517 \r
518 }\r
519 \r
520 List = GetNextNode (ListHead, List); \r
521 }\r
522 \r
523 \r
524 return EFI_SUCCESS;\r
525}\r
526\r
527\r
528/**\r
529 Free up all buffer allocated for the link list of UEFI_IFR_BUFFER_STORAGE_NODE.\r
530 \r
531 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE\r
532 which contains the default values retrived from\r
533 a UEFI form set.\r
534 \r
535\r
b47694b9 536 @retval VOID\r
59336178 537**/\r
538VOID\r
539FreeDefaultList (\r
540 IN LIST_ENTRY *ListHead\r
541 )\r
542{\r
0368663f 543 LIST_ENTRY *Link;\r
59336178 544 UEFI_IFR_BUFFER_STORAGE_NODE *Default;\r
545\r
b074cb39 546 while (!IsListEmpty (ListHead)) {\r
547 Link = GetFirstNode (ListHead);\r
548 \r
0368663f 549 Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link);\r
59336178 550\r
0368663f 551 RemoveEntryList (Link);\r
59336178 552 \r
553 DestroyDefaultNode (Default);\r
59336178 554 }\r
555\r
556 FreePool (ListHead);\r
557}\r
558\r