]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
Add the missing check for NULL pointer before use it.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / UefiIfrParser.c
CommitLineData
59336178 1/** @file\r
2Parser for IFR binary encoding.\r
3\r
771ececd 4Copyright (c) 2008 - 2010, Intel Corporation\r
59336178 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
771ececd 212 ASSERT (Storage != NULL);\r
59336178 213 Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
59336178 214 InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
215\r
216 return Storage;\r
217}\r
218\r
59336178 219/**\r
220 Free resources of a storage\r
221\r
222 @param Storage Pointer of the storage\r
223\r
224 @return None.\r
225\r
226**/\r
227VOID\r
228DestroyStorage (\r
229 IN FORMSET_STORAGE *Storage\r
230 )\r
231{\r
59336178 232 if (Storage == NULL) {\r
233 return;\r
234 }\r
235\r
a9d85320 236 if (Storage->Name!= NULL) {\r
237 FreePool (Storage->Name);\r
59336178 238 }\r
239\r
7001eaf8 240 FreePool (Storage);\r
59336178 241}\r
242\r
243\r
244/**\r
245 Free resources of a Statement\r
246\r
247 @param Statement Pointer of the Statement\r
248\r
249 @return None.\r
250\r
251**/\r
252VOID\r
253DestroyStatement (\r
254 IN OUT FORM_BROWSER_STATEMENT *Statement\r
255 )\r
256{\r
257 LIST_ENTRY *Link;\r
258 QUESTION_DEFAULT *Default;\r
259 QUESTION_OPTION *Option;\r
59336178 260\r
261 //\r
262 // Free Default value List\r
263 //\r
264 while (!IsListEmpty (&Statement->DefaultListHead)) {\r
265 Link = GetFirstNode (&Statement->DefaultListHead);\r
266 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
267 RemoveEntryList (&Default->Link);\r
268\r
269 gBS->FreePool (Default);\r
270 }\r
271\r
272 //\r
273 // Free Options List\r
274 //\r
275 while (!IsListEmpty (&Statement->OptionListHead)) {\r
276 Link = GetFirstNode (&Statement->OptionListHead);\r
277 Option = QUESTION_OPTION_FROM_LINK (Link);\r
278 RemoveEntryList (&Option->Link);\r
279\r
280 gBS->FreePool (Option);\r
281 }\r
282\r
59336178 283}\r
284\r
285\r
7001eaf8 286\r
59336178 287/**\r
288 Free resources of a Form\r
289\r
290 @param Form Pointer of the Form\r
291\r
292 @return None.\r
293\r
294**/\r
295VOID\r
296DestroyForm (\r
297 IN OUT FORM_BROWSER_FORM *Form\r
298 )\r
299{\r
300 LIST_ENTRY *Link;\r
59336178 301 FORM_BROWSER_STATEMENT *Statement;\r
302\r
59336178 303 //\r
304 // Free Statements/Questions\r
305 //\r
306 while (!IsListEmpty (&Form->StatementListHead)) {\r
307 Link = GetFirstNode (&Form->StatementListHead);\r
308 Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
309 RemoveEntryList (&Statement->Link);\r
310\r
311 DestroyStatement (Statement);\r
312 }\r
313\r
314 //\r
315 // Free this Form\r
316 //\r
317 gBS->FreePool (Form);\r
318}\r
319\r
320\r
321/**\r
322 Free resources allocated for a FormSet\r
323\r
324 @param FormSet Pointer of the FormSet\r
325\r
326 @return None.\r
327\r
328**/\r
329VOID\r
330DestroyFormSet (\r
331 IN OUT FORM_BROWSER_FORMSET *FormSet\r
332 )\r
333{\r
334 LIST_ENTRY *Link;\r
335 FORMSET_STORAGE *Storage;\r
336 FORMSET_DEFAULTSTORE *DefaultStore;\r
337 FORM_BROWSER_FORM *Form;\r
338\r
339 //\r
340 // Free IFR binary buffer\r
341 //\r
7001eaf8 342 FreePool (FormSet->IfrBinaryData);\r
59336178 343\r
344 //\r
345 // Free FormSet Storage\r
346 //\r
347 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
348 while (!IsListEmpty (&FormSet->StorageListHead)) {\r
349 Link = GetFirstNode (&FormSet->StorageListHead);\r
350 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
351 RemoveEntryList (&Storage->Link);\r
352\r
353 DestroyStorage (Storage);\r
354 }\r
355 }\r
356\r
357 //\r
358 // Free FormSet Default Store\r
359 //\r
360 if (FormSet->DefaultStoreListHead.ForwardLink != NULL) {\r
361 while (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
362 Link = GetFirstNode (&FormSet->DefaultStoreListHead);\r
363 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
364 RemoveEntryList (&DefaultStore->Link);\r
365\r
366 gBS->FreePool (DefaultStore);\r
367 }\r
368 }\r
369\r
370 //\r
371 // Free Forms\r
372 //\r
373 if (FormSet->FormListHead.ForwardLink != NULL) {\r
374 while (!IsListEmpty (&FormSet->FormListHead)) {\r
375 Link = GetFirstNode (&FormSet->FormListHead);\r
376 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
377 RemoveEntryList (&Form->Link);\r
378\r
379 DestroyForm (Form);\r
380 }\r
381 }\r
382\r
7001eaf8 383 if (FormSet->StatementBuffer != NULL) {\r
384 FreePool (FormSet->StatementBuffer);\r
385 }\r
59336178 386\r
a9d85320 387 DestoryOneOfOptionMap (&FormSet->OneOfOptionMapListHead);\r
dee207ee 388\r
389 if (FormSet->OriginalDefaultVarStoreName != NULL) {\r
390 FreePool (FormSet->OriginalDefaultVarStoreName);\r
391 }\r
a9d85320 392 \r
7001eaf8 393 FreePool (FormSet);\r
59336178 394}\r
395\r
396\r
397/**\r
398 Tell whether this Operand is an Expression OpCode or not\r
399\r
400 @param Operand Operand of an IFR OpCode.\r
401\r
402 @retval TRUE This is an Expression OpCode.\r
403 @retval FALSE Not an Expression OpCode.\r
404\r
405**/\r
406BOOLEAN\r
407IsExpressionOpCode (\r
408 IN UINT8 Operand\r
409 )\r
410{\r
411 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
6a824198
LG
412 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SET_OP)) ||\r
413 ((Operand >= EFI_IFR_EQUAL_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
414 (Operand == EFI_IFR_CATENATE_OP) ||\r
415 (Operand == EFI_IFR_TO_LOWER_OP) ||\r
416 (Operand == EFI_IFR_TO_UPPER_OP) ||\r
417 (Operand == EFI_IFR_MAP_OP) ||\r
418 (Operand == EFI_IFR_VERSION_OP) ||\r
419 (Operand == EFI_IFR_SECURITY_OP)) {\r
59336178 420 return TRUE;\r
421 } else {\r
422 return FALSE;\r
423 }\r
424}\r
425\r
426\r
427/**\r
428 Calculate number of Statemens(Questions) and Expression OpCodes.\r
429\r
430 @param FormSet The FormSet to be counted.\r
431 @param NumberOfStatement Number of Statemens(Questions)\r
432 @param NumberOfExpression Number of Expression OpCodes\r
433\r
434 @return None.\r
435\r
436**/\r
437VOID\r
438CountOpCodes (\r
439 IN FORM_BROWSER_FORMSET *FormSet,\r
440 IN OUT UINT16 *NumberOfStatement,\r
441 IN OUT UINT16 *NumberOfExpression\r
442 )\r
443{\r
444 UINT16 StatementCount;\r
445 UINT16 ExpressionCount;\r
446 UINT8 *OpCodeData;\r
447 UINTN Offset;\r
448 UINTN OpCodeLen;\r
449\r
450 Offset = 0;\r
451 StatementCount = 0;\r
452 ExpressionCount = 0;\r
453\r
454 while (Offset < FormSet->IfrBinaryLength) {\r
455 OpCodeData = FormSet->IfrBinaryData + Offset;\r
456 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
457 Offset += OpCodeLen;\r
458\r
459 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
460 ExpressionCount++;\r
461 } else {\r
462 StatementCount++;\r
463 }\r
464 }\r
465\r
466 *NumberOfStatement = StatementCount;\r
467 *NumberOfExpression = ExpressionCount;\r
468}\r
469\r
470\r
471/**\r
472 Parse opcodes in the formset IFR binary.\r
473\r
474 @param FormSet Pointer of the FormSet data structure.\r
475\r
476 @retval EFI_SUCCESS Opcode parse success.\r
477 @retval Other Opcode parse fail.\r
478\r
479**/\r
480EFI_STATUS\r
481ParseOpCodes (\r
482 IN FORM_BROWSER_FORMSET *FormSet\r
483 )\r
484{\r
485 EFI_STATUS Status;\r
486 UINT16 Index;\r
487 FORM_BROWSER_FORM *CurrentForm;\r
488 FORM_BROWSER_STATEMENT *CurrentStatement;\r
59336178 489 UINT8 Operand;\r
490 UINT8 Scope;\r
491 UINTN OpCodeOffset;\r
492 UINTN OpCodeLength;\r
493 UINT8 *OpCodeData;\r
494 UINT8 ScopeOpCode;\r
495 FORMSET_STORAGE *Storage;\r
496 FORMSET_DEFAULTSTORE *DefaultStore;\r
497 QUESTION_DEFAULT *CurrentDefault;\r
498 QUESTION_OPTION *CurrentOption;\r
499 CHAR8 *AsciiString;\r
500 UINT16 NumberOfStatement;\r
501 UINT16 NumberOfExpression;\r
502 EFI_IMAGE_ID *ImageId;\r
59336178 503 EFI_HII_VALUE *Value;\r
a9d85320 504 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
505 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
506 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
507 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
508 UINT8 OneOfType;\r
509 EFI_IFR_ONE_OF *OneOfOpcode;\r
6d207823 510 HII_THUNK_CONTEXT *ThunkContext;\r
6a824198 511 EFI_IFR_FORM_MAP_METHOD *MapMethod;\r
59336178 512\r
6d207823
LG
513 mInScopeSubtitle = FALSE;\r
514 mInScopeSuppress = FALSE;\r
515 mInScopeGrayOut = FALSE;\r
516 CurrentDefault = NULL;\r
517 CurrentOption = NULL;\r
6a824198 518 MapMethod = NULL;\r
6d207823 519 ThunkContext = UefiHiiHandleToThunkContext ((CONST HII_THUNK_PRIVATE_DATA*) mHiiThunkPrivateData, FormSet->HiiHandle);\r
a9d85320 520\r
521 //\r
522 // Set to a invalid value.\r
523 //\r
524 OneOfType = (UINT8) -1;\r
59336178 525\r
526 //\r
527 // Get the number of Statements and Expressions\r
528 //\r
529 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
a9d85320 530 FormSet->NumberOfStatement = NumberOfStatement;\r
59336178 531\r
532 mStatementIndex = 0;\r
533 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
534 if (FormSet->StatementBuffer == NULL) {\r
535 return EFI_OUT_OF_RESOURCES;\r
536 }\r
537\r
59336178 538 InitializeListHead (&FormSet->StorageListHead);\r
539 InitializeListHead (&FormSet->DefaultStoreListHead);\r
540 InitializeListHead (&FormSet->FormListHead);\r
a9d85320 541 InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
59336178 542\r
543 CurrentForm = NULL;\r
544 CurrentStatement = NULL;\r
545\r
546 ResetScopeStack ();\r
547\r
548 OpCodeOffset = 0;\r
549 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
550 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
551\r
552 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
553 OpCodeOffset += OpCodeLength;\r
554 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
555 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
556\r
557 //\r
558 // If scope bit set, push onto scope stack\r
559 //\r
234980f6 560 if (Scope != 0) {\r
59336178 561 PushScope (Operand);\r
562 }\r
563\r
59336178 564 if (IsExpressionOpCode (Operand)) {\r
59336178 565 continue;\r
566 }\r
567\r
568 //\r
569 // Parse the Opcode\r
570 //\r
571 switch (Operand) {\r
572\r
573 case EFI_IFR_FORM_SET_OP:\r
574 //\r
575 // check the formset GUID\r
576 //\r
5a58200d 577 if (!CompareGuid ((EFI_GUID *)(VOID *)&FormSet->Guid, (EFI_GUID *)(VOID *)&((EFI_IFR_FORM_SET *) OpCodeData)->Guid)) {\r
59336178 578 return EFI_INVALID_PARAMETER;\r
579 }\r
580\r
581 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
582 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
583 break;\r
584\r
585 case EFI_IFR_FORM_OP:\r
586 //\r
587 // Create a new Form for this FormSet\r
588 //\r
589 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
771ececd 590 ASSERT (CurrentForm != NULL);\r
59336178 591 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
a9d85320 592\r
59336178 593 InitializeListHead (&CurrentForm->StatementListHead);\r
594\r
595 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
596 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
597\r
598 //\r
599 // Insert into Form list of this FormSet\r
600 //\r
601 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
602 break;\r
603\r
6a824198
LG
604 case EFI_IFR_FORM_MAP_OP:\r
605 //\r
606 // Create a new Form Map for this FormSet\r
607 //\r
608 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
609 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
610\r
611 InitializeListHead (&CurrentForm->StatementListHead);\r
612\r
613 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
614 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
615\r
616 //\r
617 // FormMap Form must contain at least one Map Method.\r
618 //\r
619 if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length < ((UINTN) (UINT8 *) (MapMethod + 1) - (UINTN) OpCodeData)) {\r
620 return EFI_INVALID_PARAMETER;\r
621 }\r
622\r
623 //\r
624 // Try to find the standard form map method.\r
625 //\r
626 while (((UINTN) (UINT8 *) MapMethod - (UINTN) OpCodeData) < ((EFI_IFR_OP_HEADER *) OpCodeData)->Length) {\r
627 if (CompareGuid ((EFI_GUID *) (VOID *) &MapMethod->MethodIdentifier, &gEfiHiiStandardFormGuid)) {\r
628 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
629 break;\r
630 }\r
631 MapMethod ++;\r
632 }\r
633 //\r
634 // If the standard form map method is not found, the first map method title will be used.\r
635 //\r
636 if (CurrentForm->FormTitle == 0) {\r
637 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
638 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
639 }\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
59336178 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
6d207823
LG
671 //\r
672 // Framework IFR doesn't support Name/Value VarStore opcode\r
673 //\r
674 if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
675 ASSERT (FALSE);\r
676 }\r
548dda8f
LG
677\r
678 //\r
679 // Create a name/value Storage for this FormSet\r
680 //\r
681 Storage = CreateStorage (FormSet);\r
682 Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
683\r
684 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
685 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
686\r
59336178 687 break;\r
688\r
689 case EFI_IFR_VARSTORE_EFI_OP:\r
690 //\r
691 // Create a EFI variable Storage for this FormSet\r
692 //\r
693 Storage = CreateStorage (FormSet);\r
694 Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
695\r
696 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
697 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
698 CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
699 break;\r
700\r
701 //\r
702 // DefaultStore\r
703 //\r
704 case EFI_IFR_DEFAULTSTORE_OP:\r
705 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
771ececd 706 ASSERT (DefaultStore != NULL);\r
59336178 707 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
708\r
709 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
710 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
711\r
712 //\r
713 // Insert to DefaultStore list of this Formset\r
714 //\r
715 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
716 break;\r
717\r
718 //\r
719 // Statements\r
720 //\r
721 case EFI_IFR_SUBTITLE_OP:\r
722 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
234980f6 723 ASSERT (CurrentStatement != NULL);\r
59336178 724 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
725\r
234980f6 726 if (Scope != 0) {\r
59336178 727 mInScopeSubtitle = TRUE;\r
728 }\r
729 break;\r
730\r
731 case EFI_IFR_TEXT_OP:\r
732 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
234980f6 733 ASSERT (CurrentStatement != NULL);\r
59336178 734\r
735 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
736 break;\r
737\r
738 //\r
739 // Questions\r
740 //\r
741 case EFI_IFR_ACTION_OP:\r
742 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 743 ASSERT (CurrentStatement != NULL);\r
59336178 744\r
745 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
746 //\r
747 // No QuestionConfig present, so no configuration string will be processed\r
748 //\r
749 CurrentStatement->QuestionConfig = 0;\r
750 } else {\r
751 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
752 }\r
753 break;\r
754\r
755 case EFI_IFR_RESET_BUTTON_OP:\r
3032f549 756 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
234980f6 757 ASSERT (CurrentStatement != NULL);\r
59336178 758 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
759 break;\r
760\r
761 case EFI_IFR_REF_OP:\r
762 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 763 ASSERT (CurrentStatement != NULL);\r
59336178 764\r
765 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
766 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
767 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
768\r
769 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
770 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
771\r
772 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
773 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
774 }\r
775 }\r
776 }\r
777 break;\r
778\r
779 case EFI_IFR_ONE_OF_OP:\r
780 case EFI_IFR_NUMERIC_OP:\r
781 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 782 ASSERT (CurrentStatement != NULL);\r
59336178 783\r
784 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
785 Value = &CurrentStatement->HiiValue;\r
786\r
787 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
788 case EFI_IFR_NUMERIC_SIZE_1:\r
789 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
790 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
791 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
792 CurrentStatement->StorageWidth = sizeof (UINT8);\r
793 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
794 break;\r
795\r
796 case EFI_IFR_NUMERIC_SIZE_2:\r
797 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
798 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
799 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
800 CurrentStatement->StorageWidth = sizeof (UINT16);\r
801 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
802 break;\r
803\r
804 case EFI_IFR_NUMERIC_SIZE_4:\r
805 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
806 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
807 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
808 CurrentStatement->StorageWidth = sizeof (UINT32);\r
809 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
810 break;\r
811\r
812 case EFI_IFR_NUMERIC_SIZE_8:\r
813 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
814 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
815 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
816 CurrentStatement->StorageWidth = sizeof (UINT64);\r
817 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
818 break;\r
819\r
820 default:\r
821 break;\r
822 }\r
823\r
a9d85320 824 if (Operand == EFI_IFR_ONE_OF_OP) {\r
825 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
98b16b9d 826 OneOfType = (UINT8) (OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE);\r
a9d85320 827 }\r
59336178 828 break;\r
829\r
830 case EFI_IFR_ORDERED_LIST_OP:\r
831 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 832 ASSERT (CurrentStatement != NULL);\r
59336178 833\r
834 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
835 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
836 CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
59336178 837\r
838 //\r
839 // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
840 // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
841 // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
842 //\r
843 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
844 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
845\r
59336178 846 break;\r
847\r
848 case EFI_IFR_CHECKBOX_OP:\r
849 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 850 ASSERT (CurrentStatement != NULL);\r
59336178 851\r
852 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
853 CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
854 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
855\r
59336178 856 break;\r
857\r
858 case EFI_IFR_STRING_OP:\r
859 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 860 ASSERT (CurrentStatement != NULL);\r
59336178 861\r
862 //\r
863 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
864 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
865 // The characters are stored as Unicode, so the storage width should multiply 2.\r
866 //\r
867 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
868 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
869 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
870 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
871\r
872 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
873 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
874\r
59336178 875 break;\r
876\r
877 case EFI_IFR_PASSWORD_OP:\r
878 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 879 ASSERT (CurrentStatement != NULL);\r
59336178 880\r
881 //\r
882 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
883 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
884 // The characters are stored as Unicode, so the storage width should multiply 2.\r
885 //\r
886 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
887 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
888 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
889\r
890 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
891 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
892\r
59336178 893 break;\r
894\r
895 case EFI_IFR_DATE_OP:\r
896 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 897 ASSERT (CurrentStatement != NULL);\r
59336178 898\r
899 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
900 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
901\r
59336178 902 break;\r
903\r
904 case EFI_IFR_TIME_OP:\r
905 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 906 ASSERT (CurrentStatement != NULL);\r
59336178 907\r
908 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
909 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
910\r
59336178 911 break;\r
912\r
913 //\r
914 // Default\r
915 //\r
916 case EFI_IFR_DEFAULT_OP:\r
917 //\r
918 // EFI_IFR_DEFAULT appear in scope of a Question,\r
919 // It creates a default value for the current question.\r
920 // A Question may have more than one Default value which have different default types.\r
921 //\r
922 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
771ececd 923 ASSERT (CurrentDefault != NULL);\r
59336178 924 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
925\r
926 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
927 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
928 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
929 ExtendValueToU64 (&CurrentDefault->Value);\r
930\r
931 //\r
932 // Insert to Default Value list of current Question\r
933 //\r
934 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
935\r
59336178 936 break;\r
937\r
938 //\r
939 // Option\r
940 //\r
941 case EFI_IFR_ONE_OF_OPTION_OP:\r
942 //\r
943 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
944 // It create a selection for use in current Question.\r
945 //\r
946 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
771ececd 947 ASSERT (CurrentOption != NULL);\r
59336178 948 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
949\r
950 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
951 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
952 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
953 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
954 ExtendValueToU64 (&CurrentOption->Value);\r
955\r
59336178 956 //\r
957 // Insert to Option list of current Question\r
958 //\r
959 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
960 break;\r
961\r
962 //\r
963 // Conditional\r
964 //\r
965 case EFI_IFR_NO_SUBMIT_IF_OP:\r
966 case EFI_IFR_INCONSISTENT_IF_OP:\r
59336178 967 break;\r
968\r
969 case EFI_IFR_SUPPRESS_IF_OP:\r
59336178 970 break;\r
971\r
972 case EFI_IFR_GRAY_OUT_IF_OP:\r
59336178 973 break;\r
974\r
975 case EFI_IFR_DISABLE_IF_OP:\r
6d207823
LG
976 //\r
977 // Framework IFR doesn't support DisableIf opcode\r
978 //\r
979 if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
980 ASSERT (FALSE);\r
981 }\r
59336178 982\r
983 //\r
984 // Expression\r
985 //\r
986 case EFI_IFR_VALUE_OP:\r
6a824198
LG
987 case EFI_IFR_READ_OP:\r
988 case EFI_IFR_WRITE_OP:\r
59336178 989 break;\r
990\r
991 case EFI_IFR_RULE_OP:\r
59336178 992 break;\r
993\r
994 //\r
995 // Image\r
996 //\r
997 case EFI_IFR_IMAGE_OP:\r
998 //\r
999 // Get ScopeOpcode from top of stack\r
1000 //\r
1001 PopScope (&ScopeOpCode);\r
1002 PushScope (ScopeOpCode);\r
1003\r
1004 switch (ScopeOpCode) {\r
1005 case EFI_IFR_FORM_SET_OP:\r
1006 ImageId = &FormSet->ImageId;\r
1007 break;\r
1008\r
1009 case EFI_IFR_FORM_OP:\r
6a824198 1010 case EFI_IFR_FORM_MAP_OP:\r
59336178 1011 ImageId = &CurrentForm->ImageId;\r
1012 break;\r
1013\r
1014 case EFI_IFR_ONE_OF_OPTION_OP:\r
1015 ImageId = &CurrentOption->ImageId;\r
1016 break;\r
1017\r
1018 default:\r
234980f6
LG
1019 //\r
1020 // Make sure CurrentStatement is not NULL.\r
1021 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
1022 // file is wrongly generated by tools such as VFR Compiler.\r
1023 //\r
1024 ASSERT (CurrentStatement != NULL);\r
59336178 1025 ImageId = &CurrentStatement->ImageId;\r
1026 break;\r
1027 }\r
234980f6
LG
1028 \r
1029 ASSERT (ImageId != NULL);\r
59336178 1030 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
1031 break;\r
1032\r
1033 //\r
1034 // Refresh\r
1035 //\r
1036 case EFI_IFR_REFRESH_OP:\r
234980f6 1037 ASSERT (CurrentStatement != NULL);\r
59336178 1038 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
1039 break;\r
1040\r
1041 //\r
1042 // Vendor specific\r
1043 //\r
1044 case EFI_IFR_GUID_OP:\r
a9d85320 1045 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
1046 \r
1047 if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
59336178 1048 //\r
1049 // Tiano specific GUIDed opcodes\r
1050 //\r
1051 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
1052 case EFI_IFR_EXTEND_OP_LABEL:\r
1053 //\r
1054 // just ignore label\r
1055 //\r
1056 break;\r
1057\r
59336178 1058\r
1059 case EFI_IFR_EXTEND_OP_CLASS:\r
1060 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
1061 break;\r
1062\r
1063 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
1064 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
1065 break;\r
1066\r
1067 default:\r
1068 break;\r
1069 }\r
3032f549 1070 } else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
a9d85320 1071 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
1072 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
1073 if (OneOfOptinMapEntryListHead == NULL) {\r
1074 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
1075 ASSERT (OneOfOptionMap != NULL);\r
1076\r
1077 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
1078 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
1079\r
1080 //\r
1081 // Make sure OneOfType is initialized.\r
1082 //\r
1083 ASSERT (OneOfType != (UINT8) -1);\r
1084 OneOfOptionMap->ValueType = OneOfType;\r
1085 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
1086 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
1087 InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
1088 }\r
1089 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
1090 ASSERT (OneOfOptionMapEntry != NULL);\r
1091\r
1092 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
1093 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
1094 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
1095 \r
1096 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
1097 }\r
1098 }\r
59336178 1099 break;\r
1100\r
1101 //\r
1102 // Scope End\r
1103 //\r
1104 case EFI_IFR_END_OP:\r
1105 Status = PopScope (&ScopeOpCode);\r
1106 if (EFI_ERROR (Status)) {\r
1107 ResetScopeStack ();\r
1108 return Status;\r
1109 }\r
1110\r
1111 switch (ScopeOpCode) {\r
1112 case EFI_IFR_FORM_SET_OP:\r
1113 //\r
1114 // End of FormSet, update FormSet IFR binary length\r
1115 // to stop parsing substantial OpCodes\r
1116 //\r
1117 FormSet->IfrBinaryLength = OpCodeOffset;\r
1118 break;\r
1119\r
1120 case EFI_IFR_FORM_OP:\r
6a824198 1121 case EFI_IFR_FORM_MAP_OP:\r
59336178 1122 //\r
1123 // End of Form\r
1124 //\r
1125 CurrentForm = NULL;\r
1126 break;\r
1127\r
1128 case EFI_IFR_ONE_OF_OPTION_OP:\r
1129 //\r
1130 // End of Option\r
1131 //\r
1132 CurrentOption = NULL;\r
1133 break;\r
1134\r
1135 case EFI_IFR_SUBTITLE_OP:\r
1136 mInScopeSubtitle = FALSE;\r
1137 break;\r
1138\r
1139 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1140 case EFI_IFR_INCONSISTENT_IF_OP:\r
1141 //\r
1142 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
1143 //\r
1144 break;\r
1145\r
59336178 1146 case EFI_IFR_GRAY_OUT_IF_OP:\r
1147 mInScopeGrayOut = FALSE;\r
1148 break;\r
1149\r
59336178 1150 default:\r
1151 if (IsExpressionOpCode (ScopeOpCode)) {\r
59336178 1152 }\r
1153 break;\r
1154 }\r
1155 break;\r
1156\r
1157 default:\r
1158 break;\r
1159 }\r
1160 }\r
1161\r
1162 return EFI_SUCCESS;\r
1163}\r
1164\r
1165\r
1166\r
1167\r