]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.c
1) Add in support for Framework VFR file which specify all VAR Store correctly. This...
[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
406 \r
7001eaf8 407 FreePool (FormSet);\r
59336178 408}\r
409\r
410\r
411/**\r
412 Tell whether this Operand is an Expression OpCode or not\r
413\r
414 @param Operand Operand of an IFR OpCode.\r
415\r
416 @retval TRUE This is an Expression OpCode.\r
417 @retval FALSE Not an Expression OpCode.\r
418\r
419**/\r
420BOOLEAN\r
421IsExpressionOpCode (\r
422 IN UINT8 Operand\r
423 )\r
424{\r
425 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
426 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
427 (Operand == EFI_IFR_CATENATE_OP)\r
428 ) {\r
429 return TRUE;\r
430 } else {\r
431 return FALSE;\r
432 }\r
433}\r
434\r
435\r
436/**\r
437 Calculate number of Statemens(Questions) and Expression OpCodes.\r
438\r
439 @param FormSet The FormSet to be counted.\r
440 @param NumberOfStatement Number of Statemens(Questions)\r
441 @param NumberOfExpression Number of Expression OpCodes\r
442\r
443 @return None.\r
444\r
445**/\r
446VOID\r
447CountOpCodes (\r
448 IN FORM_BROWSER_FORMSET *FormSet,\r
449 IN OUT UINT16 *NumberOfStatement,\r
450 IN OUT UINT16 *NumberOfExpression\r
451 )\r
452{\r
453 UINT16 StatementCount;\r
454 UINT16 ExpressionCount;\r
455 UINT8 *OpCodeData;\r
456 UINTN Offset;\r
457 UINTN OpCodeLen;\r
458\r
459 Offset = 0;\r
460 StatementCount = 0;\r
461 ExpressionCount = 0;\r
462\r
463 while (Offset < FormSet->IfrBinaryLength) {\r
464 OpCodeData = FormSet->IfrBinaryData + Offset;\r
465 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
466 Offset += OpCodeLen;\r
467\r
468 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
469 ExpressionCount++;\r
470 } else {\r
471 StatementCount++;\r
472 }\r
473 }\r
474\r
475 *NumberOfStatement = StatementCount;\r
476 *NumberOfExpression = ExpressionCount;\r
477}\r
478\r
479\r
480/**\r
481 Parse opcodes in the formset IFR binary.\r
482\r
483 @param FormSet Pointer of the FormSet data structure.\r
484\r
485 @retval EFI_SUCCESS Opcode parse success.\r
486 @retval Other Opcode parse fail.\r
487\r
488**/\r
489EFI_STATUS\r
490ParseOpCodes (\r
491 IN FORM_BROWSER_FORMSET *FormSet\r
492 )\r
493{\r
494 EFI_STATUS Status;\r
495 UINT16 Index;\r
496 FORM_BROWSER_FORM *CurrentForm;\r
497 FORM_BROWSER_STATEMENT *CurrentStatement;\r
59336178 498 UINT8 Operand;\r
499 UINT8 Scope;\r
500 UINTN OpCodeOffset;\r
501 UINTN OpCodeLength;\r
502 UINT8 *OpCodeData;\r
503 UINT8 ScopeOpCode;\r
504 FORMSET_STORAGE *Storage;\r
505 FORMSET_DEFAULTSTORE *DefaultStore;\r
506 QUESTION_DEFAULT *CurrentDefault;\r
507 QUESTION_OPTION *CurrentOption;\r
508 CHAR8 *AsciiString;\r
509 UINT16 NumberOfStatement;\r
510 UINT16 NumberOfExpression;\r
511 EFI_IMAGE_ID *ImageId;\r
512 BOOLEAN SuppressForOption;\r
513 BOOLEAN InScopeOptionSuppress;\r
59336178 514 BOOLEAN InScopeDisable;\r
515 UINT16 DepthOfDisable;\r
516 BOOLEAN OpCodeDisabled;\r
517 BOOLEAN SingleOpCodeExpression;\r
518 BOOLEAN InScopeDefault;\r
519 EFI_HII_VALUE *Value;\r
a9d85320 520 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
521 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
522 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
523 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
524 UINT8 OneOfType;\r
525 EFI_IFR_ONE_OF *OneOfOpcode;\r
59336178 526\r
527 mInScopeSubtitle = FALSE;\r
528 SuppressForOption = FALSE;\r
529 mInScopeSuppress = FALSE;\r
530 InScopeOptionSuppress = FALSE;\r
531 mInScopeGrayOut = FALSE;\r
532 InScopeDisable = FALSE;\r
533 DepthOfDisable = 0;\r
534 OpCodeDisabled = FALSE;\r
535 SingleOpCodeExpression = FALSE;\r
536 InScopeDefault = FALSE;\r
59336178 537 CurrentDefault = NULL;\r
538 CurrentOption = NULL;\r
a9d85320 539\r
540 //\r
541 // Set to a invalid value.\r
542 //\r
543 OneOfType = (UINT8) -1;\r
59336178 544\r
545 //\r
546 // Get the number of Statements and Expressions\r
547 //\r
548 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
a9d85320 549 FormSet->NumberOfStatement = NumberOfStatement;\r
59336178 550\r
551 mStatementIndex = 0;\r
552 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
553 if (FormSet->StatementBuffer == NULL) {\r
554 return EFI_OUT_OF_RESOURCES;\r
555 }\r
556\r
59336178 557 InitializeListHead (&FormSet->StorageListHead);\r
558 InitializeListHead (&FormSet->DefaultStoreListHead);\r
559 InitializeListHead (&FormSet->FormListHead);\r
a9d85320 560 InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
59336178 561\r
562 CurrentForm = NULL;\r
563 CurrentStatement = NULL;\r
564\r
565 ResetScopeStack ();\r
566\r
567 OpCodeOffset = 0;\r
568 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
569 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
570\r
571 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
572 OpCodeOffset += OpCodeLength;\r
573 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
574 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
575\r
576 //\r
577 // If scope bit set, push onto scope stack\r
578 //\r
579 if (Scope) {\r
580 PushScope (Operand);\r
581 }\r
582\r
583 if (OpCodeDisabled) {\r
584 //\r
585 // DisableIf Expression is evaluated to be TRUE, try to find its end.\r
586 // Here only cares the EFI_IFR_DISABLE_IF and EFI_IFR_END\r
587 //\r
588 if (Operand == EFI_IFR_DISABLE_IF_OP) {\r
589 DepthOfDisable++;\r
590 } else if (Operand == EFI_IFR_END_OP) {\r
591 Status = PopScope (&ScopeOpCode);\r
592 if (EFI_ERROR (Status)) {\r
593 return Status;\r
594 }\r
595\r
596 if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
597 if (DepthOfDisable == 0) {\r
598 InScopeDisable = FALSE;\r
599 OpCodeDisabled = FALSE;\r
600 } else {\r
601 DepthOfDisable--;\r
602 }\r
603 }\r
604 }\r
605 continue;\r
606 }\r
607\r
608 if (IsExpressionOpCode (Operand)) {\r
59336178 609 continue;\r
610 }\r
611\r
612 //\r
613 // Parse the Opcode\r
614 //\r
615 switch (Operand) {\r
616\r
617 case EFI_IFR_FORM_SET_OP:\r
618 //\r
619 // check the formset GUID\r
620 //\r
5a58200d 621 if (!CompareGuid ((EFI_GUID *)(VOID *)&FormSet->Guid, (EFI_GUID *)(VOID *)&((EFI_IFR_FORM_SET *) OpCodeData)->Guid)) {\r
59336178 622 return EFI_INVALID_PARAMETER;\r
623 }\r
624\r
625 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
626 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
627 break;\r
628\r
629 case EFI_IFR_FORM_OP:\r
630 //\r
631 // Create a new Form for this FormSet\r
632 //\r
633 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
634 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
a9d85320 635\r
59336178 636 InitializeListHead (&CurrentForm->StatementListHead);\r
637\r
638 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
639 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
640\r
641 //\r
642 // Insert into Form list of this FormSet\r
643 //\r
644 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
645 break;\r
646\r
647 //\r
648 // Storage\r
649 //\r
650 case EFI_IFR_VARSTORE_OP:\r
651 //\r
652 // Create a buffer Storage for this FormSet\r
653 //\r
654 Storage = CreateStorage (FormSet);\r
655 Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
656\r
657 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
658 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
659 CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
660\r
59336178 661 AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
662 Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
663 ASSERT (Storage->Name != NULL);\r
664 for (Index = 0; AsciiString[Index] != 0; Index++) {\r
665 Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
666 }\r
667\r
59336178 668 break;\r
669\r
670 case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
a9d85320 671 ASSERT (FALSE);\r
59336178 672\r
59336178 673 break;\r
674\r
675 case EFI_IFR_VARSTORE_EFI_OP:\r
676 //\r
677 // Create a EFI variable Storage for this FormSet\r
678 //\r
679 Storage = CreateStorage (FormSet);\r
680 Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
681\r
682 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
683 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
684 CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
685 break;\r
686\r
687 //\r
688 // DefaultStore\r
689 //\r
690 case EFI_IFR_DEFAULTSTORE_OP:\r
691 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
692 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
693\r
694 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
695 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
696\r
697 //\r
698 // Insert to DefaultStore list of this Formset\r
699 //\r
700 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
701 break;\r
702\r
703 //\r
704 // Statements\r
705 //\r
706 case EFI_IFR_SUBTITLE_OP:\r
707 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
708 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
709\r
710 if (Scope) {\r
711 mInScopeSubtitle = TRUE;\r
712 }\r
713 break;\r
714\r
715 case EFI_IFR_TEXT_OP:\r
716 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
717\r
718 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
719 break;\r
720\r
721 //\r
722 // Questions\r
723 //\r
724 case EFI_IFR_ACTION_OP:\r
725 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
726\r
727 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
728 //\r
729 // No QuestionConfig present, so no configuration string will be processed\r
730 //\r
731 CurrentStatement->QuestionConfig = 0;\r
732 } else {\r
733 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
734 }\r
735 break;\r
736\r
737 case EFI_IFR_RESET_BUTTON_OP:\r
738 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
739\r
740 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
741 break;\r
742\r
743 case EFI_IFR_REF_OP:\r
744 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
745\r
746 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
747 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
748 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
749\r
750 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
751 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
752\r
753 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
754 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
755 }\r
756 }\r
757 }\r
758 break;\r
759\r
760 case EFI_IFR_ONE_OF_OP:\r
761 case EFI_IFR_NUMERIC_OP:\r
762 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
763\r
764 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
765 Value = &CurrentStatement->HiiValue;\r
766\r
767 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
768 case EFI_IFR_NUMERIC_SIZE_1:\r
769 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
770 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
771 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
772 CurrentStatement->StorageWidth = sizeof (UINT8);\r
773 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
774 break;\r
775\r
776 case EFI_IFR_NUMERIC_SIZE_2:\r
777 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
778 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
779 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
780 CurrentStatement->StorageWidth = sizeof (UINT16);\r
781 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
782 break;\r
783\r
784 case EFI_IFR_NUMERIC_SIZE_4:\r
785 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
786 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
787 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
788 CurrentStatement->StorageWidth = sizeof (UINT32);\r
789 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
790 break;\r
791\r
792 case EFI_IFR_NUMERIC_SIZE_8:\r
793 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
794 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
795 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
796 CurrentStatement->StorageWidth = sizeof (UINT64);\r
797 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
798 break;\r
799\r
800 default:\r
801 break;\r
802 }\r
803\r
59336178 804 if ((Operand == EFI_IFR_ONE_OF_OP) && Scope) {\r
805 SuppressForOption = TRUE;\r
806 }\r
a9d85320 807\r
808 if (Operand == EFI_IFR_ONE_OF_OP) {\r
809 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
810 OneOfType = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
811 }\r
59336178 812 break;\r
813\r
814 case EFI_IFR_ORDERED_LIST_OP:\r
815 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
816\r
817 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
818 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
819 CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
59336178 820\r
821 //\r
822 // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
823 // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
824 // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
825 //\r
826 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
827 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
828\r
829 if (Scope) {\r
830 SuppressForOption = TRUE;\r
831 }\r
832 break;\r
833\r
834 case EFI_IFR_CHECKBOX_OP:\r
835 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
836\r
837 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
838 CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
839 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
840\r
59336178 841 break;\r
842\r
843 case EFI_IFR_STRING_OP:\r
844 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
845\r
846 //\r
847 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
848 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
849 // The characters are stored as Unicode, so the storage width should multiply 2.\r
850 //\r
851 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
852 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
853 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
854 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
855\r
856 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
857 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
858\r
59336178 859 break;\r
860\r
861 case EFI_IFR_PASSWORD_OP:\r
862 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
863\r
864 //\r
865 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
866 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
867 // The characters are stored as Unicode, so the storage width should multiply 2.\r
868 //\r
869 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
870 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
871 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
872\r
873 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
874 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
875\r
59336178 876 break;\r
877\r
878 case EFI_IFR_DATE_OP:\r
879 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
880\r
881 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
882 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
883\r
59336178 884 break;\r
885\r
886 case EFI_IFR_TIME_OP:\r
887 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
888\r
889 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
890 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
891\r
59336178 892 break;\r
893\r
894 //\r
895 // Default\r
896 //\r
897 case EFI_IFR_DEFAULT_OP:\r
898 //\r
899 // EFI_IFR_DEFAULT appear in scope of a Question,\r
900 // It creates a default value for the current question.\r
901 // A Question may have more than one Default value which have different default types.\r
902 //\r
903 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
904 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
905\r
906 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
907 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
908 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
909 ExtendValueToU64 (&CurrentDefault->Value);\r
910\r
911 //\r
912 // Insert to Default Value list of current Question\r
913 //\r
914 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
915\r
916 if (Scope) {\r
917 InScopeDefault = TRUE;\r
918 }\r
919 break;\r
920\r
921 //\r
922 // Option\r
923 //\r
924 case EFI_IFR_ONE_OF_OPTION_OP:\r
925 //\r
926 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
927 // It create a selection for use in current Question.\r
928 //\r
929 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
930 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
931\r
932 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
933 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
934 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
935 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
936 ExtendValueToU64 (&CurrentOption->Value);\r
937\r
59336178 938 //\r
939 // Insert to Option list of current Question\r
940 //\r
941 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
942 break;\r
943\r
944 //\r
945 // Conditional\r
946 //\r
947 case EFI_IFR_NO_SUBMIT_IF_OP:\r
948 case EFI_IFR_INCONSISTENT_IF_OP:\r
59336178 949 break;\r
950\r
951 case EFI_IFR_SUPPRESS_IF_OP:\r
59336178 952 break;\r
953\r
954 case EFI_IFR_GRAY_OUT_IF_OP:\r
59336178 955 break;\r
956\r
957 case EFI_IFR_DISABLE_IF_OP:\r
a9d85320 958 ASSERT (FALSE);\r
59336178 959\r
59336178 960\r
961 //\r
962 // Expression\r
963 //\r
964 case EFI_IFR_VALUE_OP:\r
59336178 965 break;\r
966\r
967 case EFI_IFR_RULE_OP:\r
59336178 968 break;\r
969\r
970 //\r
971 // Image\r
972 //\r
973 case EFI_IFR_IMAGE_OP:\r
974 //\r
975 // Get ScopeOpcode from top of stack\r
976 //\r
977 PopScope (&ScopeOpCode);\r
978 PushScope (ScopeOpCode);\r
979\r
980 switch (ScopeOpCode) {\r
981 case EFI_IFR_FORM_SET_OP:\r
982 ImageId = &FormSet->ImageId;\r
983 break;\r
984\r
985 case EFI_IFR_FORM_OP:\r
986 ImageId = &CurrentForm->ImageId;\r
987 break;\r
988\r
989 case EFI_IFR_ONE_OF_OPTION_OP:\r
990 ImageId = &CurrentOption->ImageId;\r
991 break;\r
992\r
993 default:\r
994 ImageId = &CurrentStatement->ImageId;\r
995 break;\r
996 }\r
997\r
998 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
999 break;\r
1000\r
1001 //\r
1002 // Refresh\r
1003 //\r
1004 case EFI_IFR_REFRESH_OP:\r
1005 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
1006 break;\r
1007\r
1008 //\r
1009 // Vendor specific\r
1010 //\r
1011 case EFI_IFR_GUID_OP:\r
a9d85320 1012 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
1013 \r
1014 if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
59336178 1015 //\r
1016 // Tiano specific GUIDed opcodes\r
1017 //\r
1018 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
1019 case EFI_IFR_EXTEND_OP_LABEL:\r
1020 //\r
1021 // just ignore label\r
1022 //\r
1023 break;\r
1024\r
59336178 1025\r
1026 case EFI_IFR_EXTEND_OP_CLASS:\r
1027 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
1028 break;\r
1029\r
1030 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
1031 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
1032 break;\r
1033\r
1034 default:\r
1035 break;\r
1036 }\r
a9d85320 1037 } \r
1038 else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
1039 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
1040 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
1041 if (OneOfOptinMapEntryListHead == NULL) {\r
1042 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
1043 ASSERT (OneOfOptionMap != NULL);\r
1044\r
1045 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
1046 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
1047\r
1048 //\r
1049 // Make sure OneOfType is initialized.\r
1050 //\r
1051 ASSERT (OneOfType != (UINT8) -1);\r
1052 OneOfOptionMap->ValueType = OneOfType;\r
1053 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
1054 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
1055 InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
1056 }\r
1057 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
1058 ASSERT (OneOfOptionMapEntry != NULL);\r
1059\r
1060 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
1061 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
1062 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
1063 \r
1064 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
1065 }\r
1066 }\r
59336178 1067 break;\r
1068\r
1069 //\r
1070 // Scope End\r
1071 //\r
1072 case EFI_IFR_END_OP:\r
1073 Status = PopScope (&ScopeOpCode);\r
1074 if (EFI_ERROR (Status)) {\r
1075 ResetScopeStack ();\r
1076 return Status;\r
1077 }\r
1078\r
1079 switch (ScopeOpCode) {\r
1080 case EFI_IFR_FORM_SET_OP:\r
1081 //\r
1082 // End of FormSet, update FormSet IFR binary length\r
1083 // to stop parsing substantial OpCodes\r
1084 //\r
1085 FormSet->IfrBinaryLength = OpCodeOffset;\r
1086 break;\r
1087\r
1088 case EFI_IFR_FORM_OP:\r
1089 //\r
1090 // End of Form\r
1091 //\r
1092 CurrentForm = NULL;\r
1093 break;\r
1094\r
1095 case EFI_IFR_ONE_OF_OPTION_OP:\r
1096 //\r
1097 // End of Option\r
1098 //\r
1099 CurrentOption = NULL;\r
1100 break;\r
1101\r
1102 case EFI_IFR_SUBTITLE_OP:\r
1103 mInScopeSubtitle = FALSE;\r
1104 break;\r
1105\r
1106 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1107 case EFI_IFR_INCONSISTENT_IF_OP:\r
1108 //\r
1109 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
1110 //\r
1111 break;\r
1112\r
1113 case EFI_IFR_SUPPRESS_IF_OP:\r
1114 if (SuppressForOption) {\r
1115 InScopeOptionSuppress = FALSE;\r
1116 } else {\r
1117 mInScopeSuppress = FALSE;\r
1118 }\r
1119 break;\r
1120\r
1121 case EFI_IFR_GRAY_OUT_IF_OP:\r
1122 mInScopeGrayOut = FALSE;\r
1123 break;\r
1124\r
1125 case EFI_IFR_DISABLE_IF_OP:\r
1126 InScopeDisable = FALSE;\r
1127 OpCodeDisabled = FALSE;\r
1128 break;\r
1129\r
1130 case EFI_IFR_ONE_OF_OP:\r
1131 case EFI_IFR_ORDERED_LIST_OP:\r
1132 SuppressForOption = FALSE;\r
1133 break;\r
1134\r
1135 case EFI_IFR_DEFAULT_OP:\r
1136 InScopeDefault = FALSE;\r
1137 break;\r
1138\r
1139 default:\r
1140 if (IsExpressionOpCode (ScopeOpCode)) {\r
59336178 1141 }\r
1142 break;\r
1143 }\r
1144 break;\r
1145\r
1146 default:\r
1147 break;\r
1148 }\r
1149 }\r
1150\r
1151 return EFI_SUCCESS;\r
1152}\r
1153\r
1154\r
1155\r
1156\r