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