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