]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
Fill all EFI_IFR_DATA_ARRAY fields before call FormCallBack function.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / UefiIfrParser.c
CommitLineData
59336178 1/** @file\r
2Parser for IFR binary encoding.\r
3\r
4Copyright (c) 2008, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
a9d85320 15#include <PiDxe.h>\r
16\r
a9d85320 17#include <Protocol/HiiConfigAccess.h>\r
18#include <Protocol/HiiConfigRouting.h>\r
19#include <Protocol/HiiDatabase.h>\r
20#include <Protocol/HiiString.h>\r
21\r
22#include <Library/BaseLib.h>\r
23#include <Library/BaseMemoryLib.h>\r
24#include <Library/DebugLib.h>\r
25#include <Library/HiiLib.h>\r
a9d85320 26#include <Library/MemoryAllocationLib.h>\r
27#include <Library/PrintLib.h>\r
28#include <Library/UefiBootServicesTableLib.h>\r
29\r
7e26c7e7 30#include <Guid/MdeModuleHii.h>\r
a9d85320 31\r
59336178 32#include "UefiIfrParser.h"\r
59336178 33\r
a9d85320 34#include "UefiIfrParserExpression.h"\r
59336178 35\r
36UINT16 mStatementIndex;\r
59336178 37\r
38BOOLEAN mInScopeSubtitle;\r
39BOOLEAN mInScopeSuppress;\r
40BOOLEAN mInScopeGrayOut;\r
59336178 41\r
a9d85320 42EFI_GUID mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
43extern EFI_GUID mTianoHiiIfrGuid;\r
44\r
45LIST_ENTRY *\r
46GetOneOfOptionMapEntryListHead (\r
47 IN CONST FORM_BROWSER_FORMSET *FormSet,\r
48 IN UINT16 QuestionId\r
49 )\r
50{\r
51 LIST_ENTRY *Link;\r
52 ONE_OF_OPTION_MAP *Map;\r
53\r
54 Link = GetFirstNode (&FormSet->OneOfOptionMapListHead);\r
55\r
56 while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) {\r
57 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
58 if (QuestionId == Map->QuestionId) {\r
59 return &Map->OneOfOptionMapEntryListHead;\r
60 }\r
61 Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link);\r
62 }\r
63 \r
64 return NULL;\r
65}\r
66\r
67VOID\r
68DestoryOneOfOptionMap (\r
69 IN LIST_ENTRY *OneOfOptionMapListHead\r
70 )\r
71{\r
72 ONE_OF_OPTION_MAP *Map;\r
73 ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
74 LIST_ENTRY *Link;\r
75 LIST_ENTRY *Link2;\r
76\r
77 while (!IsListEmpty (OneOfOptionMapListHead)) {\r
78 Link = GetFirstNode (OneOfOptionMapListHead);\r
79 \r
80 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
81\r
82 while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
83 Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
84 \r
85 MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
86\r
87 RemoveEntryList (Link2);\r
88\r
89 FreePool (MapEntry);\r
90 }\r
91\r
92 RemoveEntryList (Link);\r
93 FreePool (Map);\r
94 }\r
95}\r
96\r
59336178 97\r
98/**\r
99 Initialize Statement header members.\r
100\r
101 @param OpCodeData Pointer of the raw OpCode data.\r
102 @param FormSet Pointer of the current FormSe.\r
103 @param Form Pointer of the current Form.\r
104\r
105 @return The Statement.\r
106\r
107**/\r
108FORM_BROWSER_STATEMENT *\r
109CreateStatement (\r
110 IN UINT8 *OpCodeData,\r
111 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
112 IN OUT FORM_BROWSER_FORM *Form\r
113 )\r
114{\r
115 FORM_BROWSER_STATEMENT *Statement;\r
116 EFI_IFR_STATEMENT_HEADER *StatementHdr;\r
117\r
118 if (Form == NULL) {\r
119 //\r
120 // We are currently not in a Form Scope, so just skip this Statement\r
121 //\r
122 return NULL;\r
123 }\r
124\r
125 Statement = &FormSet->StatementBuffer[mStatementIndex];\r
126 mStatementIndex++;\r
127\r
128 InitializeListHead (&Statement->DefaultListHead);\r
129 InitializeListHead (&Statement->OptionListHead);\r
59336178 130\r
131 Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
132\r
133 Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
134\r
135 StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
136 CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
137 CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
138\r
59336178 139 Statement->InSubtitle = mInScopeSubtitle;\r
140\r
141 //\r
142 // Insert this Statement into current Form\r
143 //\r
144 InsertTailList (&Form->StatementListHead, &Statement->Link);\r
145\r
146 return Statement;\r
147}\r
148\r
59336178 149/**\r
150 Initialize Question's members.\r
151\r
152 @param OpCodeData Pointer of the raw OpCode data.\r
153 @param FormSet Pointer of the current FormSet.\r
154 @param Form Pointer of the current Form.\r
155\r
156 @return The Question.\r
157\r
158**/\r
159FORM_BROWSER_STATEMENT *\r
160CreateQuestion (\r
161 IN UINT8 *OpCodeData,\r
162 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
163 IN OUT FORM_BROWSER_FORM *Form\r
164 )\r
165{\r
166 FORM_BROWSER_STATEMENT *Statement;\r
167 EFI_IFR_QUESTION_HEADER *QuestionHdr;\r
168 LIST_ENTRY *Link;\r
169 FORMSET_STORAGE *Storage;\r
59336178 170\r
171 Statement = CreateStatement (OpCodeData, FormSet, Form);\r
172 if (Statement == NULL) {\r
173 return NULL;\r
174 }\r
175\r
176 QuestionHdr = (EFI_IFR_QUESTION_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
177 CopyMem (&Statement->QuestionId, &QuestionHdr->QuestionId, sizeof (EFI_QUESTION_ID));\r
178 CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
179 CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
180\r
a9d85320 181 if (FormSet->MaxQuestionId < QuestionHdr->QuestionId) {\r
182 FormSet->MaxQuestionId = QuestionHdr->QuestionId;\r
183 }\r
184\r
59336178 185 Statement->QuestionFlags = QuestionHdr->Flags;\r
186\r
187 if (Statement->VarStoreId == 0) {\r
188 //\r
189 // VarStoreId of zero indicates no variable storage\r
190 //\r
191 return Statement;\r
192 }\r
193\r
194 //\r
195 // Find Storage for this Question\r
196 //\r
197 Link = GetFirstNode (&FormSet->StorageListHead);\r
198 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
199 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
200\r
201 if (Storage->VarStoreId == Statement->VarStoreId) {\r
202 Statement->Storage = Storage;\r
203 break;\r
204 }\r
205\r
206 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
207 }\r
208 ASSERT (Statement->Storage != NULL);\r
209\r
59336178 210 return Statement;\r
211}\r
212\r
59336178 213/**\r
214 Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
215\r
216 @param FormSet Pointer of the current FormSet\r
217\r
218 @return Pointer to a FORMSET_STORAGE data structure.\r
219\r
220**/\r
221FORMSET_STORAGE *\r
222CreateStorage (\r
223 IN FORM_BROWSER_FORMSET *FormSet\r
224 )\r
225{\r
226 FORMSET_STORAGE *Storage;\r
227\r
228 Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
229 Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
59336178 230 InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
231\r
232 return Storage;\r
233}\r
234\r
59336178 235/**\r
236 Free resources of a storage\r
237\r
238 @param Storage Pointer of the storage\r
239\r
240 @return None.\r
241\r
242**/\r
243VOID\r
244DestroyStorage (\r
245 IN FORMSET_STORAGE *Storage\r
246 )\r
247{\r
59336178 248 if (Storage == NULL) {\r
249 return;\r
250 }\r
251\r
a9d85320 252 if (Storage->Name!= NULL) {\r
253 FreePool (Storage->Name);\r
59336178 254 }\r
255\r
7001eaf8 256 FreePool (Storage);\r
59336178 257}\r
258\r
259\r
260/**\r
261 Free resources of a Statement\r
262\r
263 @param Statement Pointer of the Statement\r
264\r
265 @return None.\r
266\r
267**/\r
268VOID\r
269DestroyStatement (\r
270 IN OUT FORM_BROWSER_STATEMENT *Statement\r
271 )\r
272{\r
273 LIST_ENTRY *Link;\r
274 QUESTION_DEFAULT *Default;\r
275 QUESTION_OPTION *Option;\r
59336178 276\r
277 //\r
278 // Free Default value List\r
279 //\r
280 while (!IsListEmpty (&Statement->DefaultListHead)) {\r
281 Link = GetFirstNode (&Statement->DefaultListHead);\r
282 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
283 RemoveEntryList (&Default->Link);\r
284\r
285 gBS->FreePool (Default);\r
286 }\r
287\r
288 //\r
289 // Free Options List\r
290 //\r
291 while (!IsListEmpty (&Statement->OptionListHead)) {\r
292 Link = GetFirstNode (&Statement->OptionListHead);\r
293 Option = QUESTION_OPTION_FROM_LINK (Link);\r
294 RemoveEntryList (&Option->Link);\r
295\r
296 gBS->FreePool (Option);\r
297 }\r
298\r
59336178 299}\r
300\r
301\r
7001eaf8 302\r
59336178 303/**\r
304 Free resources of a Form\r
305\r
306 @param Form Pointer of the Form\r
307\r
308 @return None.\r
309\r
310**/\r
311VOID\r
312DestroyForm (\r
313 IN OUT FORM_BROWSER_FORM *Form\r
314 )\r
315{\r
316 LIST_ENTRY *Link;\r
59336178 317 FORM_BROWSER_STATEMENT *Statement;\r
318\r
59336178 319 //\r
320 // Free Statements/Questions\r
321 //\r
322 while (!IsListEmpty (&Form->StatementListHead)) {\r
323 Link = GetFirstNode (&Form->StatementListHead);\r
324 Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
325 RemoveEntryList (&Statement->Link);\r
326\r
327 DestroyStatement (Statement);\r
328 }\r
329\r
330 //\r
331 // Free this Form\r
332 //\r
333 gBS->FreePool (Form);\r
334}\r
335\r
336\r
337/**\r
338 Free resources allocated for a FormSet\r
339\r
340 @param FormSet Pointer of the FormSet\r
341\r
342 @return None.\r
343\r
344**/\r
345VOID\r
346DestroyFormSet (\r
347 IN OUT FORM_BROWSER_FORMSET *FormSet\r
348 )\r
349{\r
350 LIST_ENTRY *Link;\r
351 FORMSET_STORAGE *Storage;\r
352 FORMSET_DEFAULTSTORE *DefaultStore;\r
353 FORM_BROWSER_FORM *Form;\r
354\r
355 //\r
356 // Free IFR binary buffer\r
357 //\r
7001eaf8 358 FreePool (FormSet->IfrBinaryData);\r
59336178 359\r
360 //\r
361 // Free FormSet Storage\r
362 //\r
363 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
364 while (!IsListEmpty (&FormSet->StorageListHead)) {\r
365 Link = GetFirstNode (&FormSet->StorageListHead);\r
366 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
367 RemoveEntryList (&Storage->Link);\r
368\r
369 DestroyStorage (Storage);\r
370 }\r
371 }\r
372\r
373 //\r
374 // Free FormSet Default Store\r
375 //\r
376 if (FormSet->DefaultStoreListHead.ForwardLink != NULL) {\r
377 while (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
378 Link = GetFirstNode (&FormSet->DefaultStoreListHead);\r
379 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
380 RemoveEntryList (&DefaultStore->Link);\r
381\r
382 gBS->FreePool (DefaultStore);\r
383 }\r
384 }\r
385\r
386 //\r
387 // Free Forms\r
388 //\r
389 if (FormSet->FormListHead.ForwardLink != NULL) {\r
390 while (!IsListEmpty (&FormSet->FormListHead)) {\r
391 Link = GetFirstNode (&FormSet->FormListHead);\r
392 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
393 RemoveEntryList (&Form->Link);\r
394\r
395 DestroyForm (Form);\r
396 }\r
397 }\r
398\r
7001eaf8 399 if (FormSet->StatementBuffer != NULL) {\r
400 FreePool (FormSet->StatementBuffer);\r
401 }\r
59336178 402\r
a9d85320 403 DestoryOneOfOptionMap (&FormSet->OneOfOptionMapListHead);\r
dee207ee 404\r
405 if (FormSet->OriginalDefaultVarStoreName != NULL) {\r
406 FreePool (FormSet->OriginalDefaultVarStoreName);\r
407 }\r
a9d85320 408 \r
7001eaf8 409 FreePool (FormSet);\r
59336178 410}\r
411\r
412\r
413/**\r
414 Tell whether this Operand is an Expression OpCode or not\r
415\r
416 @param Operand Operand of an IFR OpCode.\r
417\r
418 @retval TRUE This is an Expression OpCode.\r
419 @retval FALSE Not an Expression OpCode.\r
420\r
421**/\r
422BOOLEAN\r
423IsExpressionOpCode (\r
424 IN UINT8 Operand\r
425 )\r
426{\r
427 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
428 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
429 (Operand == EFI_IFR_CATENATE_OP)\r
430 ) {\r
431 return TRUE;\r
432 } else {\r
433 return FALSE;\r
434 }\r
435}\r
436\r
437\r
438/**\r
439 Calculate number of Statemens(Questions) and Expression OpCodes.\r
440\r
441 @param FormSet The FormSet to be counted.\r
442 @param NumberOfStatement Number of Statemens(Questions)\r
443 @param NumberOfExpression Number of Expression OpCodes\r
444\r
445 @return None.\r
446\r
447**/\r
448VOID\r
449CountOpCodes (\r
450 IN FORM_BROWSER_FORMSET *FormSet,\r
451 IN OUT UINT16 *NumberOfStatement,\r
452 IN OUT UINT16 *NumberOfExpression\r
453 )\r
454{\r
455 UINT16 StatementCount;\r
456 UINT16 ExpressionCount;\r
457 UINT8 *OpCodeData;\r
458 UINTN Offset;\r
459 UINTN OpCodeLen;\r
460\r
461 Offset = 0;\r
462 StatementCount = 0;\r
463 ExpressionCount = 0;\r
464\r
465 while (Offset < FormSet->IfrBinaryLength) {\r
466 OpCodeData = FormSet->IfrBinaryData + Offset;\r
467 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
468 Offset += OpCodeLen;\r
469\r
470 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
471 ExpressionCount++;\r
472 } else {\r
473 StatementCount++;\r
474 }\r
475 }\r
476\r
477 *NumberOfStatement = StatementCount;\r
478 *NumberOfExpression = ExpressionCount;\r
479}\r
480\r
481\r
482/**\r
483 Parse opcodes in the formset IFR binary.\r
484\r
485 @param FormSet Pointer of the FormSet data structure.\r
486\r
487 @retval EFI_SUCCESS Opcode parse success.\r
488 @retval Other Opcode parse fail.\r
489\r
490**/\r
491EFI_STATUS\r
492ParseOpCodes (\r
493 IN FORM_BROWSER_FORMSET *FormSet\r
494 )\r
495{\r
496 EFI_STATUS Status;\r
497 UINT16 Index;\r
498 FORM_BROWSER_FORM *CurrentForm;\r
499 FORM_BROWSER_STATEMENT *CurrentStatement;\r
59336178 500 UINT8 Operand;\r
501 UINT8 Scope;\r
502 UINTN OpCodeOffset;\r
503 UINTN OpCodeLength;\r
504 UINT8 *OpCodeData;\r
505 UINT8 ScopeOpCode;\r
506 FORMSET_STORAGE *Storage;\r
507 FORMSET_DEFAULTSTORE *DefaultStore;\r
508 QUESTION_DEFAULT *CurrentDefault;\r
509 QUESTION_OPTION *CurrentOption;\r
510 CHAR8 *AsciiString;\r
511 UINT16 NumberOfStatement;\r
512 UINT16 NumberOfExpression;\r
513 EFI_IMAGE_ID *ImageId;\r
59336178 514 EFI_HII_VALUE *Value;\r
a9d85320 515 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
516 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
517 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
518 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
519 UINT8 OneOfType;\r
520 EFI_IFR_ONE_OF *OneOfOpcode;\r
59336178 521\r
522 mInScopeSubtitle = FALSE;\r
59336178 523 mInScopeSuppress = FALSE;\r
59336178 524 mInScopeGrayOut = FALSE;\r
59336178 525 CurrentDefault = NULL;\r
526 CurrentOption = NULL;\r
a9d85320 527\r
528 //\r
529 // Set to a invalid value.\r
530 //\r
531 OneOfType = (UINT8) -1;\r
59336178 532\r
533 //\r
534 // Get the number of Statements and Expressions\r
535 //\r
536 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
a9d85320 537 FormSet->NumberOfStatement = NumberOfStatement;\r
59336178 538\r
539 mStatementIndex = 0;\r
540 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
541 if (FormSet->StatementBuffer == NULL) {\r
542 return EFI_OUT_OF_RESOURCES;\r
543 }\r
544\r
59336178 545 InitializeListHead (&FormSet->StorageListHead);\r
546 InitializeListHead (&FormSet->DefaultStoreListHead);\r
547 InitializeListHead (&FormSet->FormListHead);\r
a9d85320 548 InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
59336178 549\r
550 CurrentForm = NULL;\r
551 CurrentStatement = NULL;\r
552\r
553 ResetScopeStack ();\r
554\r
555 OpCodeOffset = 0;\r
556 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
557 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
558\r
559 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
560 OpCodeOffset += OpCodeLength;\r
561 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
562 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
563\r
564 //\r
565 // If scope bit set, push onto scope stack\r
566 //\r
567 if (Scope) {\r
568 PushScope (Operand);\r
569 }\r
570\r
59336178 571 if (IsExpressionOpCode (Operand)) {\r
59336178 572 continue;\r
573 }\r
574\r
575 //\r
576 // Parse the Opcode\r
577 //\r
578 switch (Operand) {\r
579\r
580 case EFI_IFR_FORM_SET_OP:\r
581 //\r
582 // check the formset GUID\r
583 //\r
5a58200d 584 if (!CompareGuid ((EFI_GUID *)(VOID *)&FormSet->Guid, (EFI_GUID *)(VOID *)&((EFI_IFR_FORM_SET *) OpCodeData)->Guid)) {\r
59336178 585 return EFI_INVALID_PARAMETER;\r
586 }\r
587\r
588 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
589 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
590 break;\r
591\r
592 case EFI_IFR_FORM_OP:\r
593 //\r
594 // Create a new Form for this FormSet\r
595 //\r
596 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
597 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
a9d85320 598\r
59336178 599 InitializeListHead (&CurrentForm->StatementListHead);\r
600\r
601 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
602 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
603\r
604 //\r
605 // Insert into Form list of this FormSet\r
606 //\r
607 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
608 break;\r
609\r
610 //\r
611 // Storage\r
612 //\r
613 case EFI_IFR_VARSTORE_OP:\r
614 //\r
615 // Create a buffer Storage for this FormSet\r
616 //\r
617 Storage = CreateStorage (FormSet);\r
618 Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
619\r
620 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
621 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
622 CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
623\r
59336178 624 AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
625 Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
626 ASSERT (Storage->Name != NULL);\r
627 for (Index = 0; AsciiString[Index] != 0; Index++) {\r
628 Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
629 }\r
630\r
59336178 631 break;\r
632\r
633 case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
a9d85320 634 ASSERT (FALSE);\r
59336178 635\r
59336178 636 break;\r
637\r
638 case EFI_IFR_VARSTORE_EFI_OP:\r
639 //\r
640 // Create a EFI variable Storage for this FormSet\r
641 //\r
642 Storage = CreateStorage (FormSet);\r
643 Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
644\r
645 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
646 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
647 CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
648 break;\r
649\r
650 //\r
651 // DefaultStore\r
652 //\r
653 case EFI_IFR_DEFAULTSTORE_OP:\r
654 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
655 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
656\r
657 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
658 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
659\r
660 //\r
661 // Insert to DefaultStore list of this Formset\r
662 //\r
663 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
664 break;\r
665\r
666 //\r
667 // Statements\r
668 //\r
669 case EFI_IFR_SUBTITLE_OP:\r
670 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
671 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
672\r
673 if (Scope) {\r
674 mInScopeSubtitle = TRUE;\r
675 }\r
676 break;\r
677\r
678 case EFI_IFR_TEXT_OP:\r
679 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
680\r
681 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
682 break;\r
683\r
684 //\r
685 // Questions\r
686 //\r
687 case EFI_IFR_ACTION_OP:\r
688 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
689\r
690 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
691 //\r
692 // No QuestionConfig present, so no configuration string will be processed\r
693 //\r
694 CurrentStatement->QuestionConfig = 0;\r
695 } else {\r
696 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
697 }\r
698 break;\r
699\r
700 case EFI_IFR_RESET_BUTTON_OP:\r
701 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
702\r
703 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
704 break;\r
705\r
706 case EFI_IFR_REF_OP:\r
707 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
708\r
709 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
710 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
711 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
712\r
713 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
714 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
715\r
716 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
717 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
718 }\r
719 }\r
720 }\r
721 break;\r
722\r
723 case EFI_IFR_ONE_OF_OP:\r
724 case EFI_IFR_NUMERIC_OP:\r
725 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
726\r
727 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
728 Value = &CurrentStatement->HiiValue;\r
729\r
730 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
731 case EFI_IFR_NUMERIC_SIZE_1:\r
732 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
733 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
734 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
735 CurrentStatement->StorageWidth = sizeof (UINT8);\r
736 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
737 break;\r
738\r
739 case EFI_IFR_NUMERIC_SIZE_2:\r
740 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
741 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
742 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
743 CurrentStatement->StorageWidth = sizeof (UINT16);\r
744 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
745 break;\r
746\r
747 case EFI_IFR_NUMERIC_SIZE_4:\r
748 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
749 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
750 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
751 CurrentStatement->StorageWidth = sizeof (UINT32);\r
752 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
753 break;\r
754\r
755 case EFI_IFR_NUMERIC_SIZE_8:\r
756 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
757 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
758 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
759 CurrentStatement->StorageWidth = sizeof (UINT64);\r
760 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
761 break;\r
762\r
763 default:\r
764 break;\r
765 }\r
766\r
a9d85320 767 if (Operand == EFI_IFR_ONE_OF_OP) {\r
768 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
98b16b9d 769 OneOfType = (UINT8) (OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE);\r
a9d85320 770 }\r
59336178 771 break;\r
772\r
773 case EFI_IFR_ORDERED_LIST_OP:\r
774 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
775\r
776 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
777 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
778 CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
59336178 779\r
780 //\r
781 // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
782 // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
783 // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
784 //\r
785 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
786 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
787\r
59336178 788 break;\r
789\r
790 case EFI_IFR_CHECKBOX_OP:\r
791 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
792\r
793 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
794 CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
795 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
796\r
59336178 797 break;\r
798\r
799 case EFI_IFR_STRING_OP:\r
800 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
801\r
802 //\r
803 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
804 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
805 // The characters are stored as Unicode, so the storage width should multiply 2.\r
806 //\r
807 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
808 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
809 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
810 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
811\r
812 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
813 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
814\r
59336178 815 break;\r
816\r
817 case EFI_IFR_PASSWORD_OP:\r
818 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
819\r
820 //\r
821 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
822 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
823 // The characters are stored as Unicode, so the storage width should multiply 2.\r
824 //\r
825 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
826 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
827 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
828\r
829 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
830 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
831\r
59336178 832 break;\r
833\r
834 case EFI_IFR_DATE_OP:\r
835 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
836\r
837 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
838 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
839\r
59336178 840 break;\r
841\r
842 case EFI_IFR_TIME_OP:\r
843 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
844\r
845 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
846 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
847\r
59336178 848 break;\r
849\r
850 //\r
851 // Default\r
852 //\r
853 case EFI_IFR_DEFAULT_OP:\r
854 //\r
855 // EFI_IFR_DEFAULT appear in scope of a Question,\r
856 // It creates a default value for the current question.\r
857 // A Question may have more than one Default value which have different default types.\r
858 //\r
859 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
860 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
861\r
862 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
863 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
864 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
865 ExtendValueToU64 (&CurrentDefault->Value);\r
866\r
867 //\r
868 // Insert to Default Value list of current Question\r
869 //\r
870 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
871\r
59336178 872 break;\r
873\r
874 //\r
875 // Option\r
876 //\r
877 case EFI_IFR_ONE_OF_OPTION_OP:\r
878 //\r
879 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
880 // It create a selection for use in current Question.\r
881 //\r
882 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
883 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
884\r
885 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
886 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
887 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
888 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
889 ExtendValueToU64 (&CurrentOption->Value);\r
890\r
59336178 891 //\r
892 // Insert to Option list of current Question\r
893 //\r
894 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
895 break;\r
896\r
897 //\r
898 // Conditional\r
899 //\r
900 case EFI_IFR_NO_SUBMIT_IF_OP:\r
901 case EFI_IFR_INCONSISTENT_IF_OP:\r
59336178 902 break;\r
903\r
904 case EFI_IFR_SUPPRESS_IF_OP:\r
59336178 905 break;\r
906\r
907 case EFI_IFR_GRAY_OUT_IF_OP:\r
59336178 908 break;\r
909\r
910 case EFI_IFR_DISABLE_IF_OP:\r
a9d85320 911 ASSERT (FALSE);\r
59336178 912\r
59336178 913\r
914 //\r
915 // Expression\r
916 //\r
917 case EFI_IFR_VALUE_OP:\r
59336178 918 break;\r
919\r
920 case EFI_IFR_RULE_OP:\r
59336178 921 break;\r
922\r
923 //\r
924 // Image\r
925 //\r
926 case EFI_IFR_IMAGE_OP:\r
927 //\r
928 // Get ScopeOpcode from top of stack\r
929 //\r
930 PopScope (&ScopeOpCode);\r
931 PushScope (ScopeOpCode);\r
932\r
933 switch (ScopeOpCode) {\r
934 case EFI_IFR_FORM_SET_OP:\r
935 ImageId = &FormSet->ImageId;\r
936 break;\r
937\r
938 case EFI_IFR_FORM_OP:\r
939 ImageId = &CurrentForm->ImageId;\r
940 break;\r
941\r
942 case EFI_IFR_ONE_OF_OPTION_OP:\r
943 ImageId = &CurrentOption->ImageId;\r
944 break;\r
945\r
946 default:\r
947 ImageId = &CurrentStatement->ImageId;\r
948 break;\r
949 }\r
950\r
951 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
952 break;\r
953\r
954 //\r
955 // Refresh\r
956 //\r
957 case EFI_IFR_REFRESH_OP:\r
958 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
959 break;\r
960\r
961 //\r
962 // Vendor specific\r
963 //\r
964 case EFI_IFR_GUID_OP:\r
a9d85320 965 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
966 \r
967 if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
59336178 968 //\r
969 // Tiano specific GUIDed opcodes\r
970 //\r
971 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
972 case EFI_IFR_EXTEND_OP_LABEL:\r
973 //\r
974 // just ignore label\r
975 //\r
976 break;\r
977\r
59336178 978\r
979 case EFI_IFR_EXTEND_OP_CLASS:\r
980 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
981 break;\r
982\r
983 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
984 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
985 break;\r
986\r
987 default:\r
988 break;\r
989 }\r
a9d85320 990 } \r
991 else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
992 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
993 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
994 if (OneOfOptinMapEntryListHead == NULL) {\r
995 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
996 ASSERT (OneOfOptionMap != NULL);\r
997\r
998 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
999 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
1000\r
1001 //\r
1002 // Make sure OneOfType is initialized.\r
1003 //\r
1004 ASSERT (OneOfType != (UINT8) -1);\r
1005 OneOfOptionMap->ValueType = OneOfType;\r
1006 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
1007 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
1008 InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
1009 }\r
1010 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
1011 ASSERT (OneOfOptionMapEntry != NULL);\r
1012\r
1013 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
1014 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
1015 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
1016 \r
1017 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
1018 }\r
1019 }\r
59336178 1020 break;\r
1021\r
1022 //\r
1023 // Scope End\r
1024 //\r
1025 case EFI_IFR_END_OP:\r
1026 Status = PopScope (&ScopeOpCode);\r
1027 if (EFI_ERROR (Status)) {\r
1028 ResetScopeStack ();\r
1029 return Status;\r
1030 }\r
1031\r
1032 switch (ScopeOpCode) {\r
1033 case EFI_IFR_FORM_SET_OP:\r
1034 //\r
1035 // End of FormSet, update FormSet IFR binary length\r
1036 // to stop parsing substantial OpCodes\r
1037 //\r
1038 FormSet->IfrBinaryLength = OpCodeOffset;\r
1039 break;\r
1040\r
1041 case EFI_IFR_FORM_OP:\r
1042 //\r
1043 // End of Form\r
1044 //\r
1045 CurrentForm = NULL;\r
1046 break;\r
1047\r
1048 case EFI_IFR_ONE_OF_OPTION_OP:\r
1049 //\r
1050 // End of Option\r
1051 //\r
1052 CurrentOption = NULL;\r
1053 break;\r
1054\r
1055 case EFI_IFR_SUBTITLE_OP:\r
1056 mInScopeSubtitle = FALSE;\r
1057 break;\r
1058\r
1059 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1060 case EFI_IFR_INCONSISTENT_IF_OP:\r
1061 //\r
1062 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
1063 //\r
1064 break;\r
1065\r
59336178 1066 case EFI_IFR_GRAY_OUT_IF_OP:\r
1067 mInScopeGrayOut = FALSE;\r
1068 break;\r
1069\r
59336178 1070 default:\r
1071 if (IsExpressionOpCode (ScopeOpCode)) {\r
59336178 1072 }\r
1073 break;\r
1074 }\r
1075 break;\r
1076\r
1077 default:\r
1078 break;\r
1079 }\r
1080 }\r
1081\r
1082 return EFI_SUCCESS;\r
1083}\r
1084\r
1085\r
1086\r
1087\r