]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
Correct EFI_IFR_RESET_BUTTON from question to statement.
[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
3032f549 701 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
59336178 702 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
703 break;\r
704\r
705 case EFI_IFR_REF_OP:\r
706 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
707\r
708 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
709 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
710 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
711\r
712 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
713 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
714\r
715 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
716 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
717 }\r
718 }\r
719 }\r
720 break;\r
721\r
722 case EFI_IFR_ONE_OF_OP:\r
723 case EFI_IFR_NUMERIC_OP:\r
724 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
725\r
726 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
727 Value = &CurrentStatement->HiiValue;\r
728\r
729 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
730 case EFI_IFR_NUMERIC_SIZE_1:\r
731 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
732 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
733 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
734 CurrentStatement->StorageWidth = sizeof (UINT8);\r
735 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
736 break;\r
737\r
738 case EFI_IFR_NUMERIC_SIZE_2:\r
739 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
740 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
741 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
742 CurrentStatement->StorageWidth = sizeof (UINT16);\r
743 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
744 break;\r
745\r
746 case EFI_IFR_NUMERIC_SIZE_4:\r
747 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
748 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
749 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
750 CurrentStatement->StorageWidth = sizeof (UINT32);\r
751 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
752 break;\r
753\r
754 case EFI_IFR_NUMERIC_SIZE_8:\r
755 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
756 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
757 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
758 CurrentStatement->StorageWidth = sizeof (UINT64);\r
759 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
760 break;\r
761\r
762 default:\r
763 break;\r
764 }\r
765\r
a9d85320 766 if (Operand == EFI_IFR_ONE_OF_OP) {\r
767 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
98b16b9d 768 OneOfType = (UINT8) (OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE);\r
a9d85320 769 }\r
59336178 770 break;\r
771\r
772 case EFI_IFR_ORDERED_LIST_OP:\r
773 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
774\r
775 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
776 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
777 CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
59336178 778\r
779 //\r
780 // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
781 // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
782 // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
783 //\r
784 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
785 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
786\r
59336178 787 break;\r
788\r
789 case EFI_IFR_CHECKBOX_OP:\r
790 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
791\r
792 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
793 CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
794 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
795\r
59336178 796 break;\r
797\r
798 case EFI_IFR_STRING_OP:\r
799 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
800\r
801 //\r
802 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
803 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
804 // The characters are stored as Unicode, so the storage width should multiply 2.\r
805 //\r
806 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
807 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
808 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
809 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
810\r
811 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
812 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
813\r
59336178 814 break;\r
815\r
816 case EFI_IFR_PASSWORD_OP:\r
817 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
818\r
819 //\r
820 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
821 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
822 // The characters are stored as Unicode, so the storage width should multiply 2.\r
823 //\r
824 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
825 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
826 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
827\r
828 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
829 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
830\r
59336178 831 break;\r
832\r
833 case EFI_IFR_DATE_OP:\r
834 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
835\r
836 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
837 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
838\r
59336178 839 break;\r
840\r
841 case EFI_IFR_TIME_OP:\r
842 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
843\r
844 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
845 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
846\r
59336178 847 break;\r
848\r
849 //\r
850 // Default\r
851 //\r
852 case EFI_IFR_DEFAULT_OP:\r
853 //\r
854 // EFI_IFR_DEFAULT appear in scope of a Question,\r
855 // It creates a default value for the current question.\r
856 // A Question may have more than one Default value which have different default types.\r
857 //\r
858 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
859 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
860\r
861 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
862 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
863 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
864 ExtendValueToU64 (&CurrentDefault->Value);\r
865\r
866 //\r
867 // Insert to Default Value list of current Question\r
868 //\r
869 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
870\r
59336178 871 break;\r
872\r
873 //\r
874 // Option\r
875 //\r
876 case EFI_IFR_ONE_OF_OPTION_OP:\r
877 //\r
878 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
879 // It create a selection for use in current Question.\r
880 //\r
881 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
882 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
883\r
884 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
885 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
886 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
887 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
888 ExtendValueToU64 (&CurrentOption->Value);\r
889\r
59336178 890 //\r
891 // Insert to Option list of current Question\r
892 //\r
893 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
894 break;\r
895\r
896 //\r
897 // Conditional\r
898 //\r
899 case EFI_IFR_NO_SUBMIT_IF_OP:\r
900 case EFI_IFR_INCONSISTENT_IF_OP:\r
59336178 901 break;\r
902\r
903 case EFI_IFR_SUPPRESS_IF_OP:\r
59336178 904 break;\r
905\r
906 case EFI_IFR_GRAY_OUT_IF_OP:\r
59336178 907 break;\r
908\r
909 case EFI_IFR_DISABLE_IF_OP:\r
a9d85320 910 ASSERT (FALSE);\r
59336178 911\r
59336178 912\r
913 //\r
914 // Expression\r
915 //\r
916 case EFI_IFR_VALUE_OP:\r
59336178 917 break;\r
918\r
919 case EFI_IFR_RULE_OP:\r
59336178 920 break;\r
921\r
922 //\r
923 // Image\r
924 //\r
925 case EFI_IFR_IMAGE_OP:\r
926 //\r
927 // Get ScopeOpcode from top of stack\r
928 //\r
929 PopScope (&ScopeOpCode);\r
930 PushScope (ScopeOpCode);\r
931\r
932 switch (ScopeOpCode) {\r
933 case EFI_IFR_FORM_SET_OP:\r
934 ImageId = &FormSet->ImageId;\r
935 break;\r
936\r
937 case EFI_IFR_FORM_OP:\r
938 ImageId = &CurrentForm->ImageId;\r
939 break;\r
940\r
941 case EFI_IFR_ONE_OF_OPTION_OP:\r
942 ImageId = &CurrentOption->ImageId;\r
943 break;\r
944\r
945 default:\r
946 ImageId = &CurrentStatement->ImageId;\r
947 break;\r
948 }\r
949\r
950 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
951 break;\r
952\r
953 //\r
954 // Refresh\r
955 //\r
956 case EFI_IFR_REFRESH_OP:\r
957 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
958 break;\r
959\r
960 //\r
961 // Vendor specific\r
962 //\r
963 case EFI_IFR_GUID_OP:\r
a9d85320 964 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
965 \r
966 if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
59336178 967 //\r
968 // Tiano specific GUIDed opcodes\r
969 //\r
970 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
971 case EFI_IFR_EXTEND_OP_LABEL:\r
972 //\r
973 // just ignore label\r
974 //\r
975 break;\r
976\r
59336178 977\r
978 case EFI_IFR_EXTEND_OP_CLASS:\r
979 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
980 break;\r
981\r
982 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
983 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
984 break;\r
985\r
986 default:\r
987 break;\r
988 }\r
3032f549 989 } else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
a9d85320 990 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
991 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
992 if (OneOfOptinMapEntryListHead == NULL) {\r
993 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
994 ASSERT (OneOfOptionMap != NULL);\r
995\r
996 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
997 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
998\r
999 //\r
1000 // Make sure OneOfType is initialized.\r
1001 //\r
1002 ASSERT (OneOfType != (UINT8) -1);\r
1003 OneOfOptionMap->ValueType = OneOfType;\r
1004 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
1005 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
1006 InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
1007 }\r
1008 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
1009 ASSERT (OneOfOptionMapEntry != NULL);\r
1010\r
1011 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
1012 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
1013 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
1014 \r
1015 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
1016 }\r
1017 }\r
59336178 1018 break;\r
1019\r
1020 //\r
1021 // Scope End\r
1022 //\r
1023 case EFI_IFR_END_OP:\r
1024 Status = PopScope (&ScopeOpCode);\r
1025 if (EFI_ERROR (Status)) {\r
1026 ResetScopeStack ();\r
1027 return Status;\r
1028 }\r
1029\r
1030 switch (ScopeOpCode) {\r
1031 case EFI_IFR_FORM_SET_OP:\r
1032 //\r
1033 // End of FormSet, update FormSet IFR binary length\r
1034 // to stop parsing substantial OpCodes\r
1035 //\r
1036 FormSet->IfrBinaryLength = OpCodeOffset;\r
1037 break;\r
1038\r
1039 case EFI_IFR_FORM_OP:\r
1040 //\r
1041 // End of Form\r
1042 //\r
1043 CurrentForm = NULL;\r
1044 break;\r
1045\r
1046 case EFI_IFR_ONE_OF_OPTION_OP:\r
1047 //\r
1048 // End of Option\r
1049 //\r
1050 CurrentOption = NULL;\r
1051 break;\r
1052\r
1053 case EFI_IFR_SUBTITLE_OP:\r
1054 mInScopeSubtitle = FALSE;\r
1055 break;\r
1056\r
1057 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1058 case EFI_IFR_INCONSISTENT_IF_OP:\r
1059 //\r
1060 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
1061 //\r
1062 break;\r
1063\r
59336178 1064 case EFI_IFR_GRAY_OUT_IF_OP:\r
1065 mInScopeGrayOut = FALSE;\r
1066 break;\r
1067\r
59336178 1068 default:\r
1069 if (IsExpressionOpCode (ScopeOpCode)) {\r
59336178 1070 }\r
1071 break;\r
1072 }\r
1073 break;\r
1074\r
1075 default:\r
1076 break;\r
1077 }\r
1078 }\r
1079\r
1080 return EFI_SUCCESS;\r
1081}\r
1082\r
1083\r
1084\r
1085\r