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