]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
add required 'profiles.txt' file to the binary releases.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
CommitLineData
c60a0616 1/** @file\r
2Parser for IFR binary encoding.\r
3\r
e5eed7d3
HT
4Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
c60a0616 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
15#include "Setup.h"\r
c60a0616 16\r
17UINT16 mStatementIndex;\r
18UINT16 mExpressionOpCodeIndex;\r
19\r
20BOOLEAN mInScopeSubtitle;\r
21BOOLEAN mInScopeSuppress;\r
22BOOLEAN mInScopeGrayOut;\r
0a1147ed 23BOOLEAN mInScopeDisable;\r
c60a0616 24FORM_EXPRESSION *mSuppressExpression;\r
25FORM_EXPRESSION *mGrayOutExpression;\r
0a1147ed 26FORM_EXPRESSION *mDisableExpression;\r
c60a0616 27\r
c60a0616 28/**\r
29 Initialize Statement header members.\r
30\r
31 @param OpCodeData Pointer of the raw OpCode data.\r
32 @param FormSet Pointer of the current FormSe.\r
33 @param Form Pointer of the current Form.\r
34\r
35 @return The Statement.\r
36\r
37**/\r
38FORM_BROWSER_STATEMENT *\r
39CreateStatement (\r
40 IN UINT8 *OpCodeData,\r
41 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
42 IN OUT FORM_BROWSER_FORM *Form\r
43 )\r
44{\r
45 FORM_BROWSER_STATEMENT *Statement;\r
46 EFI_IFR_STATEMENT_HEADER *StatementHdr;\r
47\r
48 if (Form == NULL) {\r
49 //\r
50 // We are currently not in a Form Scope, so just skip this Statement\r
51 //\r
52 return NULL;\r
53 }\r
54\r
55 Statement = &FormSet->StatementBuffer[mStatementIndex];\r
56 mStatementIndex++;\r
57\r
58 InitializeListHead (&Statement->DefaultListHead);\r
59 InitializeListHead (&Statement->OptionListHead);\r
60 InitializeListHead (&Statement->InconsistentListHead);\r
61 InitializeListHead (&Statement->NoSubmitListHead);\r
62\r
63 Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
64\r
65 Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
66\r
67 StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
68 CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
69 CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
70\r
71 if (mInScopeSuppress) {\r
72 Statement->SuppressExpression = mSuppressExpression;\r
73 }\r
74\r
75 if (mInScopeGrayOut) {\r
76 Statement->GrayOutExpression = mGrayOutExpression;\r
77 }\r
78\r
0a1147ed
LG
79\r
80 if (mInScopeDisable) {\r
81 Statement->DisableExpression = mDisableExpression;\r
82 }\r
83\r
c60a0616 84 Statement->InSubtitle = mInScopeSubtitle;\r
85\r
86 //\r
87 // Insert this Statement into current Form\r
88 //\r
89 InsertTailList (&Form->StatementListHead, &Statement->Link);\r
90\r
91 return Statement;\r
92}\r
93\r
7064c0a5 94/**\r
95 Convert a numeric value to a Unicode String and insert it to String Package.\r
96 This string is used as the Unicode Name for the EFI Variable. This is to support\r
97 the deprecated vareqval opcode.\r
8b0fc5c1 98\r
7064c0a5 99 @param FormSet The FormSet.\r
100 @param Statement The numeric question whose VarStoreInfo.VarName is the\r
101 numeric value which is used to produce the Unicode Name\r
102 for the EFI Variable.\r
8b0fc5c1 103\r
7064c0a5 104 If the Statement is NULL, the ASSERT.\r
105 If the opcode is not Numeric, then ASSERT.\r
8b0fc5c1 106\r
7064c0a5 107 @retval EFI_SUCCESS The funtion always succeeds.\r
108**/\r
c60a0616 109EFI_STATUS\r
110UpdateCheckBoxStringToken (\r
111 IN CONST FORM_BROWSER_FORMSET *FormSet,\r
112 IN FORM_BROWSER_STATEMENT *Statement\r
113 )\r
114{\r
115 CHAR16 Str[MAXIMUM_VALUE_CHARACTERS];\r
116 EFI_STRING_ID Id;\r
c60a0616 117\r
118 ASSERT (Statement != NULL);\r
119 ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
8b0fc5c1 120\r
c60a0616 121 UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
c60a0616 122\r
cb7d01c0 123 Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
124 if (Id == 0) {\r
125 return EFI_OUT_OF_RESOURCES;\r
c60a0616 126 }\r
127\r
128 Statement->VarStoreInfo.VarName = Id;\r
8b0fc5c1 129\r
c60a0616 130 return EFI_SUCCESS;\r
131}\r
132\r
7064c0a5 133/**\r
134 Check if the next opcode is the EFI_IFR_EXTEND_OP_VAREQNAME.\r
8b0fc5c1 135\r
7064c0a5 136 @param OpCodeData The current opcode.\r
8b0fc5c1 137\r
7064c0a5 138 @retval TRUE Yes.\r
139 @retval FALSE No.\r
140**/\r
c60a0616 141BOOLEAN\r
142IsNextOpCodeGuidedVarEqName (\r
8b0fc5c1 143 IN UINT8 *OpCodeData\r
c60a0616 144 )\r
145{\r
146 //\r
147 // Get next opcode\r
148 //\r
149 OpCodeData += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
150 if (*OpCodeData == EFI_IFR_GUID_OP) {\r
5c526736 151 if (CompareGuid (&gEfiIfrFrameworkGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
c60a0616 152 //\r
8b0fc5c1 153 // Specific GUIDed opcodes to support IFR generated from Framework HII VFR\r
c60a0616 154 //\r
155 if ((((EFI_IFR_GUID_VAREQNAME *) OpCodeData)->ExtendOpCode) == EFI_IFR_EXTEND_OP_VAREQNAME) {\r
156 return TRUE;\r
157 }\r
158 }\r
159 }\r
160\r
161 return FALSE;\r
162}\r
163\r
164/**\r
165 Initialize Question's members.\r
166\r
167 @param OpCodeData Pointer of the raw OpCode data.\r
168 @param FormSet Pointer of the current FormSet.\r
169 @param Form Pointer of the current Form.\r
170\r
171 @return The Question.\r
172\r
173**/\r
174FORM_BROWSER_STATEMENT *\r
175CreateQuestion (\r
176 IN UINT8 *OpCodeData,\r
177 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
178 IN OUT FORM_BROWSER_FORM *Form\r
179 )\r
180{\r
181 FORM_BROWSER_STATEMENT *Statement;\r
182 EFI_IFR_QUESTION_HEADER *QuestionHdr;\r
183 LIST_ENTRY *Link;\r
184 FORMSET_STORAGE *Storage;\r
185 NAME_VALUE_NODE *NameValueNode;\r
186 EFI_STATUS Status;\r
187\r
188 Statement = CreateStatement (OpCodeData, FormSet, Form);\r
189 if (Statement == NULL) {\r
190 return NULL;\r
191 }\r
192\r
193 QuestionHdr = (EFI_IFR_QUESTION_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
194 CopyMem (&Statement->QuestionId, &QuestionHdr->QuestionId, sizeof (EFI_QUESTION_ID));\r
195 CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
196 CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
197\r
198 Statement->QuestionFlags = QuestionHdr->Flags;\r
199\r
200 if (Statement->VarStoreId == 0) {\r
201 //\r
202 // VarStoreId of zero indicates no variable storage\r
203 //\r
204 return Statement;\r
205 }\r
206\r
207 //\r
208 // Take a look at next OpCode to see whether it is a GUIDed opcode to support\r
209 // Framework Compatibility\r
210 //\r
f806dd27 211 if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) {\r
c60a0616 212 if ((*OpCodeData == EFI_IFR_NUMERIC_OP) && IsNextOpCodeGuidedVarEqName (OpCodeData)) {\r
213 Status = UpdateCheckBoxStringToken (FormSet, Statement);\r
214 if (EFI_ERROR (Status)) {\r
215 return NULL;\r
216 }\r
217 }\r
218 }\r
219\r
220 //\r
221 // Find Storage for this Question\r
222 //\r
223 Link = GetFirstNode (&FormSet->StorageListHead);\r
224 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
225 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
226\r
227 if (Storage->VarStoreId == Statement->VarStoreId) {\r
228 Statement->Storage = Storage;\r
229 break;\r
230 }\r
231\r
232 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
233 }\r
234 ASSERT (Statement->Storage != NULL);\r
235\r
236 //\r
237 // Initialilze varname for Name/Value or EFI Variable\r
238 //\r
239 if ((Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) ||\r
240 (Statement->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
241 Statement->VariableName = GetToken (Statement->VarStoreInfo.VarName, FormSet->HiiHandle);\r
242 ASSERT (Statement->VariableName != NULL);\r
243\r
244 if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
245 //\r
246 // Insert to Name/Value varstore list\r
247 //\r
248 NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));\r
249 ASSERT (NameValueNode != NULL);\r
250 NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;\r
251 NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName);\r
252 ASSERT (NameValueNode->Name != NULL);\r
253 NameValueNode->Value = AllocateZeroPool (0x10);\r
254 ASSERT (NameValueNode->Value != NULL);\r
255 NameValueNode->EditValue = AllocateZeroPool (0x10);\r
256 ASSERT (NameValueNode->EditValue != NULL);\r
257\r
258 InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
259 }\r
260 }\r
261\r
262 return Statement;\r
263}\r
264\r
265\r
266/**\r
267 Allocate a FORM_EXPRESSION node.\r
268\r
269 @param Form The Form associated with this Expression\r
270\r
271 @return Pointer to a FORM_EXPRESSION data structure.\r
272\r
273**/\r
274FORM_EXPRESSION *\r
275CreateExpression (\r
276 IN OUT FORM_BROWSER_FORM *Form\r
277 )\r
278{\r
279 FORM_EXPRESSION *Expression;\r
280\r
281 Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
1ac628ee 282 ASSERT (Expression != NULL);\r
c60a0616 283 Expression->Signature = FORM_EXPRESSION_SIGNATURE;\r
284 InitializeListHead (&Expression->OpCodeListHead);\r
285\r
286 return Expression;\r
287}\r
288\r
289\r
290/**\r
291 Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
292\r
293 @param FormSet Pointer of the current FormSet\r
294\r
295 @return Pointer to a FORMSET_STORAGE data structure.\r
296\r
297**/\r
298FORMSET_STORAGE *\r
299CreateStorage (\r
300 IN FORM_BROWSER_FORMSET *FormSet\r
301 )\r
302{\r
303 FORMSET_STORAGE *Storage;\r
304\r
305 Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
1ac628ee 306 ASSERT (Storage != NULL);\r
c60a0616 307 Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
308 InitializeListHead (&Storage->NameValueListHead);\r
309 InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
310\r
311 return Storage;\r
312}\r
313\r
314\r
315/**\r
316 Create ConfigHdr string for a storage.\r
317\r
318 @param FormSet Pointer of the current FormSet\r
319 @param Storage Pointer of the storage\r
320\r
321 @retval EFI_SUCCESS Initialize ConfigHdr success\r
322\r
323**/\r
324EFI_STATUS\r
325InitializeConfigHdr (\r
326 IN FORM_BROWSER_FORMSET *FormSet,\r
327 IN OUT FORMSET_STORAGE *Storage\r
328 )\r
329{\r
c60a0616 330 CHAR16 *Name;\r
8b0fc5c1 331\r
c60a0616 332 if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
333 Name = Storage->Name;\r
334 } else {\r
335 Name = NULL;\r
336 }\r
8b0fc5c1 337\r
7e3bcccb
LG
338 Storage->ConfigHdr = HiiConstructConfigHdr (\r
339 &Storage->Guid,\r
340 Name,\r
341 FormSet->DriverHandle\r
342 );\r
8b0fc5c1 343\r
7e3bcccb
LG
344 if (Storage->ConfigHdr == NULL) {\r
345 return EFI_NOT_FOUND;\r
c60a0616 346 }\r
347\r
7e3bcccb 348 Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
c60a0616 349 Storage->SpareStrLen = 0;\r
350\r
351 return EFI_SUCCESS;\r
352}\r
353\r
354\r
355/**\r
356 Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>\r
357\r
358 @param FormSet Pointer of the current FormSet.\r
359 @param Question The Question to be initialized.\r
360\r
361 @retval EFI_SUCCESS Function success.\r
362 @retval EFI_INVALID_PARAMETER No storage associated with the Question.\r
363\r
364**/\r
365EFI_STATUS\r
366InitializeRequestElement (\r
367 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
368 IN OUT FORM_BROWSER_STATEMENT *Question\r
369 )\r
370{\r
371 FORMSET_STORAGE *Storage;\r
372 UINTN StrLen;\r
373 UINTN StringSize;\r
374 CHAR16 *NewStr;\r
375 CHAR16 RequestElement[30];\r
376\r
377 Storage = Question->Storage;\r
378 if (Storage == NULL) {\r
379 return EFI_INVALID_PARAMETER;\r
380 }\r
381\r
382 if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
383 //\r
384 // <ConfigRequest> is unnecessary for EFI variable storage,\r
385 // GetVariable()/SetVariable() will be used to retrieve/save values\r
386 //\r
387 return EFI_SUCCESS;\r
388 }\r
389\r
390 //\r
391 // Prepare <RequestElement>\r
392 //\r
393 if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
394 StrLen = UnicodeSPrint (\r
395 RequestElement,\r
396 30 * sizeof (CHAR16),\r
397 L"&OFFSET=%x&WIDTH=%x",\r
398 Question->VarStoreInfo.VarOffset,\r
399 Question->StorageWidth\r
400 );\r
401 Question->BlockName = AllocateCopyPool ((StrLen + 1) * sizeof (CHAR16), RequestElement);\r
402 } else {\r
403 StrLen = UnicodeSPrint (RequestElement, 30 * sizeof (CHAR16), L"&%s", Question->VariableName);\r
404 }\r
405\r
406 if ((Question->Operand == EFI_IFR_PASSWORD_OP) && ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK)) {\r
407 //\r
408 // Password with CALLBACK flag is stored in encoded format,\r
409 // so don't need to append it to <ConfigRequest>\r
410 //\r
411 return EFI_SUCCESS;\r
412 }\r
413\r
414 //\r
415 // Append <RequestElement> to <ConfigRequest>\r
416 //\r
417 if (StrLen > Storage->SpareStrLen) {\r
418 //\r
419 // Old String buffer is not sufficient for RequestElement, allocate a new one\r
420 //\r
421 StringSize = (Storage->ConfigRequest != NULL) ? StrSize (Storage->ConfigRequest) : sizeof (CHAR16);\r
422 NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
1ac628ee 423 ASSERT (NewStr != NULL);\r
c60a0616 424 if (Storage->ConfigRequest != NULL) {\r
425 CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
f4113e1f 426 FreePool (Storage->ConfigRequest);\r
c60a0616 427 }\r
428 Storage->ConfigRequest = NewStr;\r
429 Storage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
430 }\r
431\r
432 StrCat (Storage->ConfigRequest, RequestElement);\r
433 Storage->ElementCount++;\r
434 Storage->SpareStrLen -= StrLen;\r
435\r
436 return EFI_SUCCESS;\r
437}\r
438\r
439\r
440/**\r
441 Free resources of a Expression.\r
442\r
443 @param FormSet Pointer of the Expression\r
444\r
445**/\r
446VOID\r
447DestroyExpression (\r
448 IN FORM_EXPRESSION *Expression\r
449 )\r
450{\r
451 LIST_ENTRY *Link;\r
452 EXPRESSION_OPCODE *OpCode;\r
2573712e
LG
453 LIST_ENTRY *SubExpressionLink;\r
454 FORM_EXPRESSION *SubExpression;\r
c60a0616 455\r
456 while (!IsListEmpty (&Expression->OpCodeListHead)) {\r
457 Link = GetFirstNode (&Expression->OpCodeListHead);\r
458 OpCode = EXPRESSION_OPCODE_FROM_LINK (Link);\r
459 RemoveEntryList (&OpCode->Link);\r
460\r
461 if (OpCode->ValueList != NULL) {\r
462 FreePool (OpCode->ValueList);\r
463 }\r
2573712e
LG
464\r
465 if (OpCode->ValueName != NULL) {\r
466 FreePool (OpCode->ValueName);\r
467 }\r
468\r
469 if (OpCode->MapExpressionList.ForwardLink != NULL) {\r
470 while (!IsListEmpty (&OpCode->MapExpressionList)) {\r
471 SubExpressionLink = GetFirstNode(&OpCode->MapExpressionList);\r
472 SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);\r
473 RemoveEntryList(&SubExpression->Link);\r
474 DestroyExpression (SubExpression);\r
475 }\r
476 }\r
c60a0616 477 }\r
478\r
479 //\r
480 // Free this Expression\r
481 //\r
f4113e1f 482 FreePool (Expression);\r
c60a0616 483}\r
484\r
485\r
486/**\r
487 Free resources of a storage.\r
488\r
489 @param Storage Pointer of the storage\r
490\r
491**/\r
492VOID\r
493DestroyStorage (\r
494 IN FORMSET_STORAGE *Storage\r
495 )\r
496{\r
497 LIST_ENTRY *Link;\r
498 NAME_VALUE_NODE *NameValueNode;\r
499\r
500 if (Storage == NULL) {\r
501 return;\r
502 }\r
503\r
504 if (Storage->Name != NULL) {\r
505 FreePool (Storage->Name);\r
506 }\r
507 if (Storage->Buffer != NULL) {\r
508 FreePool (Storage->Buffer);\r
509 }\r
510 if (Storage->EditBuffer != NULL) {\r
511 FreePool (Storage->EditBuffer);\r
512 }\r
513\r
514 while (!IsListEmpty (&Storage->NameValueListHead)) {\r
515 Link = GetFirstNode (&Storage->NameValueListHead);\r
516 NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
517 RemoveEntryList (&NameValueNode->Link);\r
518\r
519 if (NameValueNode->Name != NULL) {\r
520 FreePool (NameValueNode->Name);\r
521 }\r
522 if (NameValueNode->Value != NULL) {\r
523 FreePool (NameValueNode->Value);\r
524 }\r
525 if (NameValueNode->EditValue != NULL) {\r
526 FreePool (NameValueNode->EditValue);\r
527 }\r
528 FreePool (NameValueNode);\r
529 }\r
530\r
531 if (Storage->ConfigHdr != NULL) {\r
532 FreePool (Storage->ConfigHdr);\r
533 }\r
534 if (Storage->ConfigRequest != NULL) {\r
535 FreePool (Storage->ConfigRequest);\r
536 }\r
537\r
538 FreePool (Storage);\r
539}\r
540\r
541\r
542/**\r
543 Free resources of a Statement.\r
544\r
e2100bfa 545 @param FormSet Pointer of the FormSet\r
c60a0616 546 @param Statement Pointer of the Statement\r
547\r
548**/\r
549VOID\r
550DestroyStatement (\r
e2100bfa 551 IN FORM_BROWSER_FORMSET *FormSet,\r
c60a0616 552 IN OUT FORM_BROWSER_STATEMENT *Statement\r
553 )\r
554{\r
555 LIST_ENTRY *Link;\r
556 QUESTION_DEFAULT *Default;\r
557 QUESTION_OPTION *Option;\r
558 FORM_EXPRESSION *Expression;\r
559\r
560 //\r
561 // Free Default value List\r
562 //\r
563 while (!IsListEmpty (&Statement->DefaultListHead)) {\r
564 Link = GetFirstNode (&Statement->DefaultListHead);\r
565 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
566 RemoveEntryList (&Default->Link);\r
567\r
f4113e1f 568 FreePool (Default);\r
c60a0616 569 }\r
570\r
571 //\r
572 // Free Options List\r
573 //\r
574 while (!IsListEmpty (&Statement->OptionListHead)) {\r
575 Link = GetFirstNode (&Statement->OptionListHead);\r
576 Option = QUESTION_OPTION_FROM_LINK (Link);\r
577 RemoveEntryList (&Option->Link);\r
578\r
f4113e1f 579 FreePool (Option);\r
c60a0616 580 }\r
581\r
582 //\r
583 // Free Inconsistent List\r
584 //\r
585 while (!IsListEmpty (&Statement->InconsistentListHead)) {\r
586 Link = GetFirstNode (&Statement->InconsistentListHead);\r
587 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
588 RemoveEntryList (&Expression->Link);\r
589\r
590 DestroyExpression (Expression);\r
591 }\r
592\r
593 //\r
594 // Free NoSubmit List\r
595 //\r
596 while (!IsListEmpty (&Statement->NoSubmitListHead)) {\r
597 Link = GetFirstNode (&Statement->NoSubmitListHead);\r
598 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
599 RemoveEntryList (&Expression->Link);\r
600\r
601 DestroyExpression (Expression);\r
602 }\r
603\r
604 if (Statement->VariableName != NULL) {\r
605 FreePool (Statement->VariableName);\r
606 }\r
607 if (Statement->BlockName != NULL) {\r
608 FreePool (Statement->BlockName);\r
609 }\r
b86b413a
LG
610 if (Statement->BufferValue != NULL) {\r
611 FreePool (Statement->BufferValue);\r
612 }\r
e2100bfa
ED
613 if (Statement->Operand == EFI_IFR_STRING_OP || Statement->Operand == EFI_IFR_PASSWORD_OP) {\r
614 DeleteString(Statement->HiiValue.Value.string, FormSet->HiiHandle);\r
615 }\r
c60a0616 616}\r
617\r
618\r
619/**\r
620 Free resources of a Form.\r
621\r
e2100bfa 622 @param FormSet Pointer of the FormSet\r
c60a0616 623 @param Form Pointer of the Form.\r
624\r
625**/\r
626VOID\r
627DestroyForm (\r
e2100bfa
ED
628 IN FORM_BROWSER_FORMSET *FormSet,\r
629 IN OUT FORM_BROWSER_FORM *Form\r
c60a0616 630 )\r
631{\r
632 LIST_ENTRY *Link;\r
633 FORM_EXPRESSION *Expression;\r
634 FORM_BROWSER_STATEMENT *Statement;\r
635\r
636 //\r
637 // Free Form Expressions\r
638 //\r
639 while (!IsListEmpty (&Form->ExpressionListHead)) {\r
640 Link = GetFirstNode (&Form->ExpressionListHead);\r
641 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
642 RemoveEntryList (&Expression->Link);\r
643\r
644 DestroyExpression (Expression);\r
645 }\r
646\r
647 //\r
648 // Free Statements/Questions\r
649 //\r
650 while (!IsListEmpty (&Form->StatementListHead)) {\r
651 Link = GetFirstNode (&Form->StatementListHead);\r
652 Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
653 RemoveEntryList (&Statement->Link);\r
654\r
e2100bfa 655 DestroyStatement (FormSet, Statement);\r
c60a0616 656 }\r
657\r
658 //\r
659 // Free this Form\r
660 //\r
f4113e1f 661 FreePool (Form);\r
c60a0616 662}\r
663\r
664\r
665/**\r
666 Free resources allocated for a FormSet.\r
667\r
668 @param FormSet Pointer of the FormSet\r
669\r
670**/\r
671VOID\r
672DestroyFormSet (\r
673 IN OUT FORM_BROWSER_FORMSET *FormSet\r
674 )\r
675{\r
676 LIST_ENTRY *Link;\r
677 FORMSET_STORAGE *Storage;\r
678 FORMSET_DEFAULTSTORE *DefaultStore;\r
0c66bc76 679 FORM_EXPRESSION *Expression;\r
c60a0616 680 FORM_BROWSER_FORM *Form;\r
681\r
4c8358c7 682 if (FormSet->IfrBinaryData == NULL) {\r
683 //\r
684 // Uninitialized FormSet\r
685 //\r
686 FreePool (FormSet);\r
687 return;\r
688 }\r
689\r
c60a0616 690 //\r
691 // Free IFR binary buffer\r
692 //\r
693 FreePool (FormSet->IfrBinaryData);\r
694\r
695 //\r
696 // Free FormSet Storage\r
697 //\r
698 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
699 while (!IsListEmpty (&FormSet->StorageListHead)) {\r
700 Link = GetFirstNode (&FormSet->StorageListHead);\r
701 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
702 RemoveEntryList (&Storage->Link);\r
703\r
704 DestroyStorage (Storage);\r
705 }\r
706 }\r
707\r
708 //\r
709 // Free FormSet Default Store\r
710 //\r
711 if (FormSet->DefaultStoreListHead.ForwardLink != NULL) {\r
712 while (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
713 Link = GetFirstNode (&FormSet->DefaultStoreListHead);\r
714 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
715 RemoveEntryList (&DefaultStore->Link);\r
716\r
f4113e1f 717 FreePool (DefaultStore);\r
c60a0616 718 }\r
719 }\r
720\r
0c66bc76
LG
721 //\r
722 // Free Formset Expressions\r
723 //\r
724 while (!IsListEmpty (&FormSet->ExpressionListHead)) {\r
725 Link = GetFirstNode (&FormSet->ExpressionListHead);\r
726 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
727 RemoveEntryList (&Expression->Link);\r
728\r
729 DestroyExpression (Expression);\r
730 }\r
731\r
c60a0616 732 //\r
733 // Free Forms\r
734 //\r
735 if (FormSet->FormListHead.ForwardLink != NULL) {\r
736 while (!IsListEmpty (&FormSet->FormListHead)) {\r
737 Link = GetFirstNode (&FormSet->FormListHead);\r
738 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
739 RemoveEntryList (&Form->Link);\r
740\r
e2100bfa 741 DestroyForm (FormSet, Form);\r
c60a0616 742 }\r
743 }\r
744\r
745 if (FormSet->StatementBuffer != NULL) {\r
746 FreePool (FormSet->StatementBuffer);\r
747 }\r
748 if (FormSet->ExpressionBuffer != NULL) {\r
749 FreePool (FormSet->ExpressionBuffer);\r
750 }\r
751\r
752 FreePool (FormSet);\r
753}\r
754\r
755\r
756/**\r
757 Tell whether this Operand is an Expression OpCode or not\r
758\r
759 @param Operand Operand of an IFR OpCode.\r
760\r
761 @retval TRUE This is an Expression OpCode.\r
762 @retval FALSE Not an Expression OpCode.\r
763\r
764**/\r
765BOOLEAN\r
766IsExpressionOpCode (\r
767 IN UINT8 Operand\r
768 )\r
769{\r
770 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
2573712e
LG
771 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SET_OP)) ||\r
772 ((Operand >= EFI_IFR_EQUAL_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
c60a0616 773 (Operand == EFI_IFR_CATENATE_OP) ||\r
774 (Operand == EFI_IFR_TO_LOWER_OP) ||\r
775 (Operand == EFI_IFR_TO_UPPER_OP) ||\r
2573712e 776 (Operand == EFI_IFR_MAP_OP) ||\r
cbf73e50 777 (Operand == EFI_IFR_VERSION_OP) ||\r
778 (Operand == EFI_IFR_SECURITY_OP)) {\r
c60a0616 779 return TRUE;\r
780 } else {\r
781 return FALSE;\r
782 }\r
783}\r
784\r
785\r
786/**\r
787 Calculate number of Statemens(Questions) and Expression OpCodes.\r
788\r
789 @param FormSet The FormSet to be counted.\r
790 @param NumberOfStatement Number of Statemens(Questions)\r
791 @param NumberOfExpression Number of Expression OpCodes\r
792\r
793**/\r
794VOID\r
795CountOpCodes (\r
796 IN FORM_BROWSER_FORMSET *FormSet,\r
797 IN OUT UINT16 *NumberOfStatement,\r
798 IN OUT UINT16 *NumberOfExpression\r
799 )\r
800{\r
801 UINT16 StatementCount;\r
802 UINT16 ExpressionCount;\r
803 UINT8 *OpCodeData;\r
804 UINTN Offset;\r
805 UINTN OpCodeLen;\r
806\r
807 Offset = 0;\r
808 StatementCount = 0;\r
809 ExpressionCount = 0;\r
810\r
811 while (Offset < FormSet->IfrBinaryLength) {\r
812 OpCodeData = FormSet->IfrBinaryData + Offset;\r
813 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
814 Offset += OpCodeLen;\r
815\r
816 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
817 ExpressionCount++;\r
818 } else {\r
819 StatementCount++;\r
820 }\r
821 }\r
822\r
823 *NumberOfStatement = StatementCount;\r
824 *NumberOfExpression = ExpressionCount;\r
825}\r
826\r
827\r
828\r
829/**\r
830 Parse opcodes in the formset IFR binary.\r
831\r
832 @param FormSet Pointer of the FormSet data structure.\r
833\r
834 @retval EFI_SUCCESS Opcode parse success.\r
835 @retval Other Opcode parse fail.\r
836\r
837**/\r
838EFI_STATUS\r
839ParseOpCodes (\r
840 IN FORM_BROWSER_FORMSET *FormSet\r
841 )\r
842{\r
843 EFI_STATUS Status;\r
844 UINT16 Index;\r
845 FORM_BROWSER_FORM *CurrentForm;\r
846 FORM_BROWSER_STATEMENT *CurrentStatement;\r
847 EXPRESSION_OPCODE *ExpressionOpCode;\r
848 FORM_EXPRESSION *CurrentExpression;\r
849 UINT8 Operand;\r
850 UINT8 Scope;\r
851 UINTN OpCodeOffset;\r
852 UINTN OpCodeLength;\r
853 UINT8 *OpCodeData;\r
854 UINT8 ScopeOpCode;\r
855 FORMSET_STORAGE *Storage;\r
856 FORMSET_DEFAULTSTORE *DefaultStore;\r
857 QUESTION_DEFAULT *CurrentDefault;\r
858 QUESTION_OPTION *CurrentOption;\r
d02847d3 859 UINT8 Width;\r
c60a0616 860 CHAR8 *AsciiString;\r
861 UINT16 NumberOfStatement;\r
862 UINT16 NumberOfExpression;\r
863 EFI_IMAGE_ID *ImageId;\r
0c66bc76 864 BOOLEAN SuppressForQuestion;\r
c60a0616 865 BOOLEAN SuppressForOption;\r
866 BOOLEAN InScopeOptionSuppress;\r
867 FORM_EXPRESSION *OptionSuppressExpression;\r
0c66bc76
LG
868 BOOLEAN InScopeFormSuppress;\r
869 FORM_EXPRESSION *FormSuppressExpression;\r
c60a0616 870 UINT16 DepthOfDisable;\r
871 BOOLEAN OpCodeDisabled;\r
872 BOOLEAN SingleOpCodeExpression;\r
873 BOOLEAN InScopeDefault;\r
874 EFI_HII_VALUE *Value;\r
2573712e
LG
875 EFI_IFR_FORM_MAP_METHOD *MapMethod;\r
876 UINT8 MapScopeDepth;\r
877 LIST_ENTRY *Link;\r
878 FORMSET_STORAGE *VarStorage;\r
879 LIST_ENTRY *MapExpressionList;\r
880 EFI_VARSTORE_ID TempVarstoreId;\r
c60a0616 881\r
882 mInScopeSubtitle = FALSE;\r
0c66bc76 883 SuppressForQuestion = FALSE;\r
c60a0616 884 SuppressForOption = FALSE;\r
0c66bc76 885 InScopeFormSuppress = FALSE;\r
c60a0616 886 mInScopeSuppress = FALSE;\r
887 InScopeOptionSuppress = FALSE;\r
888 mInScopeGrayOut = FALSE;\r
0a1147ed 889 mInScopeDisable = FALSE;\r
c60a0616 890 DepthOfDisable = 0;\r
891 OpCodeDisabled = FALSE;\r
892 SingleOpCodeExpression = FALSE;\r
893 InScopeDefault = FALSE;\r
894 CurrentExpression = NULL;\r
895 CurrentDefault = NULL;\r
896 CurrentOption = NULL;\r
897 OptionSuppressExpression = NULL;\r
0c66bc76 898 FormSuppressExpression = NULL;\r
c410589e 899 ImageId = NULL;\r
2573712e
LG
900 MapMethod = NULL;\r
901 MapScopeDepth = 0;\r
902 Link = NULL;\r
903 VarStorage = NULL;\r
904 MapExpressionList = NULL;\r
905 TempVarstoreId = 0;\r
c60a0616 906\r
907 //\r
908 // Get the number of Statements and Expressions\r
909 //\r
910 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
911\r
912 mStatementIndex = 0;\r
913 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
914 if (FormSet->StatementBuffer == NULL) {\r
915 return EFI_OUT_OF_RESOURCES;\r
916 }\r
917\r
918 mExpressionOpCodeIndex = 0;\r
919 FormSet->ExpressionBuffer = AllocateZeroPool (NumberOfExpression * sizeof (EXPRESSION_OPCODE));\r
920 if (FormSet->ExpressionBuffer == NULL) {\r
921 return EFI_OUT_OF_RESOURCES;\r
922 }\r
923\r
924 InitializeListHead (&FormSet->StorageListHead);\r
925 InitializeListHead (&FormSet->DefaultStoreListHead);\r
926 InitializeListHead (&FormSet->FormListHead);\r
2573712e
LG
927 ResetCurrentExpressionStack ();\r
928 ResetMapExpressionListStack ();\r
c60a0616 929\r
930 CurrentForm = NULL;\r
931 CurrentStatement = NULL;\r
932\r
933 ResetScopeStack ();\r
934\r
935 OpCodeOffset = 0;\r
936 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
937 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
938\r
939 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
940 OpCodeOffset += OpCodeLength;\r
941 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
942 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
943\r
944 //\r
945 // If scope bit set, push onto scope stack\r
946 //\r
947 if (Scope != 0) {\r
948 PushScope (Operand);\r
949 }\r
950\r
951 if (OpCodeDisabled) {\r
952 //\r
953 // DisableIf Expression is evaluated to be TRUE, try to find its end.\r
954 // Here only cares the EFI_IFR_DISABLE_IF and EFI_IFR_END\r
955 //\r
956 if (Operand == EFI_IFR_DISABLE_IF_OP) {\r
957 DepthOfDisable++;\r
958 } else if (Operand == EFI_IFR_END_OP) {\r
959 Status = PopScope (&ScopeOpCode);\r
960 if (EFI_ERROR (Status)) {\r
961 return Status;\r
962 }\r
963\r
964 if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
965 if (DepthOfDisable == 0) {\r
0a1147ed 966 mInScopeDisable = FALSE;\r
c60a0616 967 OpCodeDisabled = FALSE;\r
968 } else {\r
969 DepthOfDisable--;\r
970 }\r
971 }\r
972 }\r
973 continue;\r
974 }\r
975\r
976 if (IsExpressionOpCode (Operand)) {\r
977 ExpressionOpCode = &FormSet->ExpressionBuffer[mExpressionOpCodeIndex];\r
978 mExpressionOpCodeIndex++;\r
979\r
980 ExpressionOpCode->Signature = EXPRESSION_OPCODE_SIGNATURE;\r
981 ExpressionOpCode->Operand = Operand;\r
982 Value = &ExpressionOpCode->Value;\r
983\r
984 switch (Operand) {\r
985 case EFI_IFR_EQ_ID_VAL_OP:\r
986 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
987\r
988 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
989 CopyMem (&Value->Value.u16, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->Value, sizeof (UINT16));\r
990 break;\r
991\r
992 case EFI_IFR_EQ_ID_ID_OP:\r
993 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId1, sizeof (EFI_QUESTION_ID));\r
994 CopyMem (&ExpressionOpCode->QuestionId2, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId2, sizeof (EFI_QUESTION_ID));\r
995 break;\r
996\r
997 case EFI_IFR_EQ_ID_LIST_OP:\r
2654f642 998 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
999 CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
1000 ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ValueList);\r
c60a0616 1001 break;\r
1002\r
1003 case EFI_IFR_TO_STRING_OP:\r
1004 case EFI_IFR_FIND_OP:\r
1005 ExpressionOpCode->Format = (( EFI_IFR_TO_STRING *) OpCodeData)->Format;\r
1006 break;\r
1007\r
1008 case EFI_IFR_STRING_REF1_OP:\r
1009 Value->Type = EFI_IFR_TYPE_STRING;\r
1010 CopyMem (&Value->Value.string, &(( EFI_IFR_STRING_REF1 *) OpCodeData)->StringId, sizeof (EFI_STRING_ID));\r
1011 break;\r
1012\r
1013 case EFI_IFR_RULE_REF_OP:\r
1014 ExpressionOpCode->RuleId = (( EFI_IFR_RULE_REF *) OpCodeData)->RuleId;\r
1015 break;\r
1016\r
1017 case EFI_IFR_SPAN_OP:\r
1018 ExpressionOpCode->Flags = (( EFI_IFR_SPAN *) OpCodeData)->Flags;\r
1019 break;\r
1020\r
1021 case EFI_IFR_THIS_OP:\r
d0720b57 1022 ASSERT (CurrentStatement != NULL);\r
c60a0616 1023 ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
1024 break;\r
1025\r
cbf73e50 1026 case EFI_IFR_SECURITY_OP:\r
1027 CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));\r
1028 break;\r
1029\r
2573712e
LG
1030 case EFI_IFR_GET_OP:\r
1031 case EFI_IFR_SET_OP:\r
1032 CopyMem (&TempVarstoreId, &((EFI_IFR_GET *) OpCodeData)->VarStoreId, sizeof (TempVarstoreId));\r
1033 if (TempVarstoreId != 0) {\r
1034 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
1035 Link = GetFirstNode (&FormSet->StorageListHead);\r
1036 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
1037 VarStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
1038 if (VarStorage->VarStoreId == ((EFI_IFR_GET *) OpCodeData)->VarStoreId) {\r
1039 ExpressionOpCode->VarStorage = VarStorage;\r
1040 break;\r
1041 }\r
1042 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
1043 }\r
1044 }\r
1045 if (ExpressionOpCode->VarStorage == NULL) {\r
1046 //\r
1047 // VarStorage is not found.\r
1048 //\r
1049 return EFI_INVALID_PARAMETER;\r
1050 }\r
1051 }\r
1052 ExpressionOpCode->ValueType = ((EFI_IFR_GET *) OpCodeData)->VarStoreType;\r
1053 switch (ExpressionOpCode->ValueType) {\r
1054 case EFI_IFR_TYPE_BOOLEAN:\r
1055 case EFI_IFR_TYPE_NUM_SIZE_8: \r
1056 ExpressionOpCode->ValueWidth = 1;\r
1057 break;\r
1058\r
1059 case EFI_IFR_TYPE_NUM_SIZE_16:\r
1060 case EFI_IFR_TYPE_STRING:\r
1061 ExpressionOpCode->ValueWidth = 2;\r
1062 break;\r
1063\r
1064 case EFI_IFR_TYPE_NUM_SIZE_32:\r
1065 ExpressionOpCode->ValueWidth = 4;\r
1066 break;\r
1067\r
1068 case EFI_IFR_TYPE_NUM_SIZE_64:\r
1069 ExpressionOpCode->ValueWidth = 8;\r
1070 break;\r
1071\r
1072 case EFI_IFR_TYPE_DATE:\r
c9325700 1073 ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_DATE);\r
2573712e
LG
1074 break;\r
1075\r
1076 case EFI_IFR_TYPE_TIME:\r
c9325700 1077 ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_TIME);\r
2573712e
LG
1078 break;\r
1079\r
1080 case EFI_IFR_TYPE_OTHER:\r
1081 case EFI_IFR_TYPE_UNDEFINED:\r
1082 case EFI_IFR_TYPE_ACTION:\r
1083 case EFI_IFR_TYPE_BUFFER:\r
1084 default:\r
1085 //\r
1086 // Invalid value type for Get/Set opcode.\r
1087 //\r
1088 return EFI_INVALID_PARAMETER;\r
1089 }\r
1090 CopyMem (&ExpressionOpCode->VarStoreInfo.VarName, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarName, sizeof (EFI_STRING_ID));\r
1091 CopyMem (&ExpressionOpCode->VarStoreInfo.VarOffset, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarOffset, sizeof (UINT16));\r
1092 if ((ExpressionOpCode->VarStorage != NULL) && \r
1093 (ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_NAME_VALUE || \r
1094 ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
1095 ExpressionOpCode->ValueName = GetToken (ExpressionOpCode->VarStoreInfo.VarName, FormSet->HiiHandle);\r
1096 if (ExpressionOpCode->ValueName == NULL) {\r
1097 //\r
1098 // String ID is invalid.\r
1099 //\r
1100 return EFI_INVALID_PARAMETER;\r
1101 }\r
1102 }\r
1103 break;\r
1104\r
c60a0616 1105 case EFI_IFR_QUESTION_REF1_OP:\r
2654f642 1106 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
c60a0616 1107 break;\r
1108\r
1109 case EFI_IFR_QUESTION_REF3_OP:\r
1110 if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_2)) {\r
1111 CopyMem (&ExpressionOpCode->DevicePath, &(( EFI_IFR_QUESTION_REF3_2 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
1112\r
1113 if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_3)) {\r
1114 CopyMem (&ExpressionOpCode->Guid, &(( EFI_IFR_QUESTION_REF3_3 *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
1115 }\r
1116 }\r
1117 break;\r
1118\r
1119 //\r
1120 // constant\r
1121 //\r
1122 case EFI_IFR_TRUE_OP:\r
1123 Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
1124 Value->Value.b = TRUE;\r
1125 break;\r
1126\r
1127 case EFI_IFR_FALSE_OP:\r
1128 Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
1129 Value->Value.b = FALSE;\r
1130 break;\r
1131\r
1132 case EFI_IFR_ONE_OP:\r
1133 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1134 Value->Value.u8 = 1;\r
1135 break;\r
1136\r
1137 case EFI_IFR_ZERO_OP:\r
1138 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1139 Value->Value.u8 = 0;\r
1140 break;\r
1141\r
1142 case EFI_IFR_ONES_OP:\r
1143 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
1144 Value->Value.u64 = 0xffffffffffffffffULL;\r
1145 break;\r
1146\r
1147 case EFI_IFR_UINT8_OP:\r
1148 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1149 Value->Value.u8 = (( EFI_IFR_UINT8 *) OpCodeData)->Value;\r
1150 break;\r
1151\r
1152 case EFI_IFR_UINT16_OP:\r
1153 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1154 CopyMem (&Value->Value.u16, &(( EFI_IFR_UINT16 *) OpCodeData)->Value, sizeof (UINT16));\r
1155 break;\r
1156\r
1157 case EFI_IFR_UINT32_OP:\r
1158 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
1159 CopyMem (&Value->Value.u32, &(( EFI_IFR_UINT32 *) OpCodeData)->Value, sizeof (UINT32));\r
1160 break;\r
1161\r
1162 case EFI_IFR_UINT64_OP:\r
1163 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
1164 CopyMem (&Value->Value.u64, &(( EFI_IFR_UINT64 *) OpCodeData)->Value, sizeof (UINT64));\r
1165 break;\r
1166\r
1167 case EFI_IFR_UNDEFINED_OP:\r
d02847d3 1168 Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
c60a0616 1169 break;\r
1170\r
1171 case EFI_IFR_VERSION_OP:\r
1172 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1173 Value->Value.u16 = EFI_IFR_SPECIFICATION_VERSION;\r
1174 break;\r
1175\r
1176 default:\r
1177 break;\r
1178 }\r
2573712e
LG
1179 //\r
1180 // Create sub expression nested in MAP opcode\r
1181 //\r
1182 if (CurrentExpression == NULL && MapScopeDepth > 0) {\r
1183 CurrentExpression = CreateExpression (CurrentForm);\r
771ececd 1184 ASSERT (MapExpressionList != NULL);\r
2573712e
LG
1185 InsertTailList (MapExpressionList, &CurrentExpression->Link);\r
1186 if (Scope == 0) {\r
1187 SingleOpCodeExpression = TRUE;\r
1188 }\r
1189 }\r
f8a1c229 1190 ASSERT (CurrentExpression != NULL);\r
c60a0616 1191 InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
2573712e
LG
1192 if (Operand == EFI_IFR_MAP_OP) {\r
1193 //\r
1194 // Store current Map Expression List.\r
1195 //\r
1196 if (MapExpressionList != NULL) {\r
1197 PushMapExpressionList (MapExpressionList);\r
1198 }\r
1199 //\r
1200 // Initialize new Map Expression List.\r
1201 //\r
1202 MapExpressionList = &ExpressionOpCode->MapExpressionList;\r
1203 InitializeListHead (MapExpressionList);\r
1204 //\r
1205 // Store current expression.\r
1206 //\r
1207 PushCurrentExpression (CurrentExpression);\r
1208 CurrentExpression = NULL;\r
1209 MapScopeDepth ++;\r
1210 } else if (SingleOpCodeExpression) {\r
c60a0616 1211 //\r
1212 // There are two cases to indicate the end of an Expression:\r
1213 // for single OpCode expression: one Expression OpCode\r
1214 // for expression consists of more than one OpCode: EFI_IFR_END\r
1215 //\r
1216 SingleOpCodeExpression = FALSE;\r
1217\r
0a1147ed 1218 if (mInScopeDisable && CurrentForm == NULL) {\r
c60a0616 1219 //\r
0a1147ed 1220 // This is DisableIf expression for Form, it should be a constant expression\r
c60a0616 1221 //\r
1222 Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
1223 if (EFI_ERROR (Status)) {\r
1224 return Status;\r
1225 }\r
c410589e 1226\r
c60a0616 1227 if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
1228 return EFI_INVALID_PARAMETER;\r
1229 }\r
1230\r
1231 OpCodeDisabled = CurrentExpression->Result.Value.b;\r
1232 }\r
1233\r
1234 CurrentExpression = NULL;\r
1235 }\r
1236\r
1237 continue;\r
1238 }\r
1239\r
1240 //\r
1241 // Parse the Opcode\r
1242 //\r
1243 switch (Operand) {\r
1244\r
1245 case EFI_IFR_FORM_SET_OP:\r
1246 //\r
f8a1c229 1247 // Check the formset GUID\r
c60a0616 1248 //\r
1249 if (CompareMem (&FormSet->Guid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) != 0) {\r
1250 return EFI_INVALID_PARAMETER;\r
1251 }\r
1252\r
1253 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
1254 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
0a1147ed 1255\r
d228526f
LG
1256 if (OpCodeLength > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
1257 //\r
1258 // The formset OpCode contains ClassGuid\r
1259 //\r
1260 FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
1261 CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
1262 }\r
0c66bc76
LG
1263\r
1264 InitializeListHead (&FormSet->ExpressionListHead);\r
c60a0616 1265 break;\r
1266\r
1267 case EFI_IFR_FORM_OP:\r
1268 //\r
1269 // Create a new Form for this FormSet\r
1270 //\r
1271 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
1ac628ee 1272 ASSERT (CurrentForm != NULL);\r
c60a0616 1273 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
1274 InitializeListHead (&CurrentForm->ExpressionListHead);\r
1275 InitializeListHead (&CurrentForm->StatementListHead);\r
1276\r
2573712e 1277 CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
c60a0616 1278 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
1279 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
1280\r
0c66bc76
LG
1281 if (InScopeFormSuppress) {\r
1282 //\r
1283 // Form is inside of suppressif\r
1284 //\r
1285 CurrentForm->SuppressExpression = FormSuppressExpression;\r
1286 }\r
1287\r
1288 if (Scope != 0) {\r
1289 //\r
1290 // Enter scope of a Form, suppressif will be used for Question or Option\r
1291 //\r
1292 SuppressForQuestion = TRUE;\r
1293 }\r
1294\r
c60a0616 1295 //\r
1296 // Insert into Form list of this FormSet\r
1297 //\r
1298 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
1299 break;\r
1300\r
2573712e
LG
1301 case EFI_IFR_FORM_MAP_OP:\r
1302 //\r
1303 // Create a new Form for this FormSet\r
1304 //\r
1305 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
1306 ASSERT (CurrentForm != NULL);\r
1307 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
1308 InitializeListHead (&CurrentForm->ExpressionListHead);\r
1309 InitializeListHead (&CurrentForm->StatementListHead);\r
1310 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
1311\r
1312 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
1313 //\r
1314 // FormMap Form must contain at least one Map Method.\r
1315 //\r
1316 if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length < ((UINTN) (UINT8 *) (MapMethod + 1) - (UINTN) OpCodeData)) {\r
1317 return EFI_INVALID_PARAMETER;\r
1318 }\r
1319 //\r
1320 // Try to find the standard form map method.\r
1321 //\r
1322 while (((UINTN) (UINT8 *) MapMethod - (UINTN) OpCodeData) < ((EFI_IFR_OP_HEADER *) OpCodeData)->Length) {\r
1323 if (CompareGuid ((EFI_GUID *) (VOID *) &MapMethod->MethodIdentifier, &gEfiHiiStandardFormGuid)) {\r
1324 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
1325 CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
1326 break;\r
1327 }\r
1328 MapMethod ++;\r
1329 }\r
1330 //\r
1331 // If the standard form map method is not found, the first map method title will be used.\r
1332 //\r
1333 if (CurrentForm->FormTitle == 0) {\r
1334 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
1335 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
1336 }\r
1337\r
1338 if (InScopeFormSuppress) {\r
1339 //\r
1340 // Form is inside of suppressif\r
1341 //\r
1342 CurrentForm->SuppressExpression = FormSuppressExpression;\r
1343 }\r
1344\r
1345 if (Scope != 0) {\r
1346 //\r
1347 // Enter scope of a Form, suppressif will be used for Question or Option\r
1348 //\r
1349 SuppressForQuestion = TRUE;\r
1350 }\r
1351\r
1352 //\r
1353 // Insert into Form list of this FormSet\r
1354 //\r
1355 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
1356 break;\r
1357\r
c60a0616 1358 //\r
1359 // Storage\r
1360 //\r
1361 case EFI_IFR_VARSTORE_OP:\r
1362 //\r
1363 // Create a buffer Storage for this FormSet\r
1364 //\r
1365 Storage = CreateStorage (FormSet);\r
1366 Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
1367\r
1368 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
1369 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
1370 CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
1371\r
1372 Storage->Buffer = AllocateZeroPool (Storage->Size);\r
1373 Storage->EditBuffer = AllocateZeroPool (Storage->Size);\r
1374\r
1375 AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
1376 Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
1377 ASSERT (Storage->Name != NULL);\r
1378 for (Index = 0; AsciiString[Index] != 0; Index++) {\r
1379 Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
1380 }\r
1381\r
1382 //\r
1383 // Initialize <ConfigHdr>\r
1384 //\r
1385 InitializeConfigHdr (FormSet, Storage);\r
1386 break;\r
1387\r
1388 case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
1389 //\r
1390 // Create a name/value Storage for this FormSet\r
1391 //\r
1392 Storage = CreateStorage (FormSet);\r
1393 Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
1394\r
1395 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
1396 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
1397\r
1398 //\r
1399 // Initialize <ConfigHdr>\r
1400 //\r
1401 InitializeConfigHdr (FormSet, Storage);\r
1402 break;\r
1403\r
1404 case EFI_IFR_VARSTORE_EFI_OP:\r
1405 //\r
1406 // Create a EFI variable Storage for this FormSet\r
1407 //\r
1408 Storage = CreateStorage (FormSet);\r
1409 Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
1410\r
1411 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
1412 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
1413 CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
1414 break;\r
1415\r
1416 //\r
1417 // DefaultStore\r
1418 //\r
1419 case EFI_IFR_DEFAULTSTORE_OP:\r
1420 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
1ac628ee 1421 ASSERT (DefaultStore != NULL);\r
c60a0616 1422 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
1423\r
1424 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
1425 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
1426\r
1427 //\r
1428 // Insert to DefaultStore list of this Formset\r
1429 //\r
1430 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
1431 break;\r
1432\r
1433 //\r
1434 // Statements\r
1435 //\r
1436 case EFI_IFR_SUBTITLE_OP:\r
1437 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
bc166db3 1438 ASSERT (CurrentStatement != NULL);\r
8b0fc5c1 1439\r
c60a0616 1440 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
1441\r
1442 if (Scope != 0) {\r
1443 mInScopeSubtitle = TRUE;\r
1444 }\r
1445 break;\r
1446\r
1447 case EFI_IFR_TEXT_OP:\r
1448 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
bc166db3 1449 ASSERT (CurrentStatement != NULL);\r
c60a0616 1450\r
1451 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
1452 break;\r
1453\r
f8a1c229 1454 case EFI_IFR_RESET_BUTTON_OP:\r
1455 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
1456 ASSERT (CurrentStatement != NULL);\r
1457 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
1458 break;\r
1459\r
c60a0616 1460 //\r
1461 // Questions\r
1462 //\r
1463 case EFI_IFR_ACTION_OP:\r
1464 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
bc166db3 1465 ASSERT (CurrentStatement != NULL);\r
d02847d3 1466 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_ACTION;\r
c60a0616 1467\r
1468 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
1469 //\r
1470 // No QuestionConfig present, so no configuration string will be processed\r
1471 //\r
1472 CurrentStatement->QuestionConfig = 0;\r
1473 } else {\r
1474 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
1475 }\r
1476 break;\r
1477\r
c60a0616 1478 case EFI_IFR_REF_OP:\r
1479 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1480 ASSERT (CurrentStatement != NULL);\r
d02847d3 1481 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_UNDEFINED;\r
c60a0616 1482 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
1483 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
1484 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
1485\r
1486 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
1487 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
1488\r
1489 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
1490 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
1491 }\r
1492 }\r
1493 }\r
1494 break;\r
1495\r
1496 case EFI_IFR_ONE_OF_OP:\r
1497 case EFI_IFR_NUMERIC_OP:\r
1498 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
945e3aed 1499 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1500\r
c60a0616 1501 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
1502 Value = &CurrentStatement->HiiValue;\r
1503\r
1504 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
1505 case EFI_IFR_NUMERIC_SIZE_1:\r
1506 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
1507 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
1508 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
cd7bfc2c 1509 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
c60a0616 1510 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1511 break;\r
1512\r
1513 case EFI_IFR_NUMERIC_SIZE_2:\r
1514 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
1515 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
1516 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
cd7bfc2c 1517 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
c60a0616 1518 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1519 break;\r
1520\r
1521 case EFI_IFR_NUMERIC_SIZE_4:\r
1522 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
1523 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
1524 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
cd7bfc2c 1525 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
c60a0616 1526 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
1527 break;\r
1528\r
1529 case EFI_IFR_NUMERIC_SIZE_8:\r
1530 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
1531 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
1532 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
cd7bfc2c 1533 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
c60a0616 1534 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
1535 break;\r
1536\r
1537 default:\r
1538 break;\r
1539 }\r
1540\r
1541 InitializeRequestElement (FormSet, CurrentStatement);\r
1542\r
1543 if ((Operand == EFI_IFR_ONE_OF_OP) && Scope != 0) {\r
1544 SuppressForOption = TRUE;\r
1545 }\r
1546 break;\r
1547\r
1548 case EFI_IFR_ORDERED_LIST_OP:\r
1549 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1550 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1551\r
c60a0616 1552 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
1553 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
c60a0616 1554\r
d02847d3 1555 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BUFFER;\r
b86b413a 1556 CurrentStatement->BufferValue = NULL;\r
c60a0616 1557\r
1558 if (Scope != 0) {\r
1559 SuppressForOption = TRUE;\r
1560 }\r
1561 break;\r
1562\r
1563 case EFI_IFR_CHECKBOX_OP:\r
1564 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1565 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1566\r
c60a0616 1567 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
cd7bfc2c 1568 CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
c60a0616 1569 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
1570\r
1571 InitializeRequestElement (FormSet, CurrentStatement);\r
1572\r
1573 break;\r
1574\r
1575 case EFI_IFR_STRING_OP:\r
1576 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1577 ASSERT (CurrentStatement != NULL);\r
c60a0616 1578 //\r
1579 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
1580 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
1581 // The characters are stored as Unicode, so the storage width should multiply 2.\r
1582 //\r
1583 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
1584 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
1585 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (CHAR16));\r
1586 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
1587\r
1588 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
1589 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth + sizeof (CHAR16));\r
e2100bfa 1590 CurrentStatement->HiiValue.Value.string = NewString ((CHAR16*) CurrentStatement->BufferValue, FormSet->HiiHandle);\r
c60a0616 1591\r
1592 InitializeRequestElement (FormSet, CurrentStatement);\r
1593 break;\r
1594\r
1595 case EFI_IFR_PASSWORD_OP:\r
1596 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1597 ASSERT (CurrentStatement != NULL);\r
c60a0616 1598 //\r
1599 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
1600 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
1601 // The characters are stored as Unicode, so the storage width should multiply 2.\r
1602 //\r
1603 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
1604 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
1605 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (CHAR16));\r
1606\r
1607 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
1608 CurrentStatement->BufferValue = AllocateZeroPool ((CurrentStatement->StorageWidth + sizeof (CHAR16)));\r
e2100bfa 1609 CurrentStatement->HiiValue.Value.string = NewString ((CHAR16*) CurrentStatement->BufferValue, FormSet->HiiHandle);\r
c60a0616 1610\r
1611 InitializeRequestElement (FormSet, CurrentStatement);\r
1612 break;\r
1613\r
1614 case EFI_IFR_DATE_OP:\r
1615 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1616 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1617\r
c60a0616 1618 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
1619 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
1620\r
1621 if ((CurrentStatement->Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) {\r
cd7bfc2c 1622 CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_DATE);\r
c60a0616 1623\r
1624 InitializeRequestElement (FormSet, CurrentStatement);\r
1625 } else {\r
1626 //\r
1627 // Don't assign storage for RTC type of date/time\r
1628 //\r
1629 CurrentStatement->Storage = NULL;\r
1630 CurrentStatement->StorageWidth = 0;\r
1631 }\r
1632 break;\r
1633\r
1634 case EFI_IFR_TIME_OP:\r
1635 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1636 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1637\r
c60a0616 1638 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
1639 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
1640\r
1641 if ((CurrentStatement->Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) {\r
cd7bfc2c 1642 CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_IFR_TIME);\r
c60a0616 1643\r
1644 InitializeRequestElement (FormSet, CurrentStatement);\r
1645 } else {\r
1646 //\r
1647 // Don't assign storage for RTC type of date/time\r
1648 //\r
1649 CurrentStatement->Storage = NULL;\r
1650 CurrentStatement->StorageWidth = 0;\r
1651 }\r
1652 break;\r
1653\r
1654 //\r
1655 // Default\r
1656 //\r
1657 case EFI_IFR_DEFAULT_OP:\r
1658 //\r
1659 // EFI_IFR_DEFAULT appear in scope of a Question,\r
1660 // It creates a default value for the current question.\r
1661 // A Question may have more than one Default value which have different default types.\r
1662 //\r
1663 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
1ac628ee 1664 ASSERT (CurrentDefault != NULL);\r
c60a0616 1665 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
1666\r
1667 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
1668 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
1669 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
1670 ExtendValueToU64 (&CurrentDefault->Value);\r
1671\r
1672 //\r
1673 // Insert to Default Value list of current Question\r
1674 //\r
1675 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
1676\r
1677 if (Scope != 0) {\r
1678 InScopeDefault = TRUE;\r
1679 }\r
1680 break;\r
1681\r
1682 //\r
1683 // Option\r
1684 //\r
1685 case EFI_IFR_ONE_OF_OPTION_OP:\r
1686 //\r
1687 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
1688 // It create a selection for use in current Question.\r
1689 //\r
1690 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
1ac628ee 1691 ASSERT (CurrentOption != NULL);\r
c60a0616 1692 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
1693\r
1694 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
1695 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
1696 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
1697 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
1698 ExtendValueToU64 (&CurrentOption->Value);\r
1699\r
1700 if (InScopeOptionSuppress) {\r
1701 CurrentOption->SuppressExpression = OptionSuppressExpression;\r
1702 }\r
1703\r
1704 //\r
1705 // Insert to Option list of current Question\r
1706 //\r
1707 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
d02847d3 1708\r
1709 //\r
1710 // Now we know the Storage width of nested Ordered List\r
1711 //\r
1b2bf3ca 1712 ASSERT (CurrentStatement != NULL);\r
d02847d3 1713 if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (CurrentStatement->BufferValue == NULL)) {\r
1714 Width = 1;\r
1715 switch (CurrentOption->Value.Type) {\r
1716 case EFI_IFR_TYPE_NUM_SIZE_8:\r
1717 Width = 1;\r
1718 break;\r
1719\r
1720 case EFI_IFR_TYPE_NUM_SIZE_16:\r
1721 Width = 2;\r
1722 break;\r
1723\r
1724 case EFI_IFR_TYPE_NUM_SIZE_32:\r
1725 Width = 4;\r
1726 break;\r
1727\r
1728 case EFI_IFR_TYPE_NUM_SIZE_64:\r
1729 Width = 8;\r
1730 break;\r
1731\r
1732 default:\r
1733 //\r
1734 // Invalid type for Ordered List\r
1735 //\r
1736 break;\r
1737 }\r
1738\r
1739 CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width);\r
1740 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
1741 CurrentStatement->ValueType = CurrentOption->Value.Type;\r
1742\r
1743 InitializeRequestElement (FormSet, CurrentStatement);\r
1744 }\r
c60a0616 1745 break;\r
1746\r
1747 //\r
1748 // Conditional\r
1749 //\r
1750 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1751 case EFI_IFR_INCONSISTENT_IF_OP:\r
1752 //\r
1753 // Create an Expression node\r
1754 //\r
1755 CurrentExpression = CreateExpression (CurrentForm);\r
1756 CopyMem (&CurrentExpression->Error, &((EFI_IFR_INCONSISTENT_IF *) OpCodeData)->Error, sizeof (EFI_STRING_ID));\r
1757\r
1758 if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) {\r
1759 CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF;\r
1760 InsertTailList (&CurrentStatement->NoSubmitListHead, &CurrentExpression->Link);\r
1761 } else {\r
1762 CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;\r
1763 InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link);\r
1764 }\r
0c66bc76
LG
1765\r
1766 //\r
1767 // Take a look at next OpCode to see whether current expression consists\r
1768 // of single OpCode\r
1769 //\r
1770 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1771 SingleOpCodeExpression = TRUE;\r
1772 }\r
c60a0616 1773 break;\r
1774\r
1775 case EFI_IFR_SUPPRESS_IF_OP:\r
1776 //\r
1777 // Question and Option will appear in scope of this OpCode\r
1778 //\r
1779 CurrentExpression = CreateExpression (CurrentForm);\r
1780 CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF;\r
0c66bc76
LG
1781\r
1782 if (CurrentForm == NULL) {\r
1783 InsertTailList (&FormSet->ExpressionListHead, &CurrentExpression->Link);\r
1784 } else {\r
1785 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
1786 }\r
c60a0616 1787\r
1788 if (SuppressForOption) {\r
1789 InScopeOptionSuppress = TRUE;\r
1790 OptionSuppressExpression = CurrentExpression;\r
0c66bc76 1791 } else if (SuppressForQuestion) {\r
c60a0616 1792 mInScopeSuppress = TRUE;\r
1793 mSuppressExpression = CurrentExpression;\r
0c66bc76
LG
1794 } else {\r
1795 InScopeFormSuppress = TRUE;\r
1796 FormSuppressExpression = CurrentExpression;\r
1797 }\r
1798\r
1799 //\r
1800 // Take a look at next OpCode to see whether current expression consists\r
1801 // of single OpCode\r
1802 //\r
1803 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1804 SingleOpCodeExpression = TRUE;\r
c60a0616 1805 }\r
1806 break;\r
1807\r
1808 case EFI_IFR_GRAY_OUT_IF_OP:\r
1809 //\r
1810 // Questions will appear in scope of this OpCode\r
1811 //\r
1812 CurrentExpression = CreateExpression (CurrentForm);\r
1813 CurrentExpression->Type = EFI_HII_EXPRESSION_GRAY_OUT_IF;\r
1814 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
1815\r
1816 mInScopeGrayOut = TRUE;\r
1817 mGrayOutExpression = CurrentExpression;\r
0c66bc76
LG
1818\r
1819 //\r
1820 // Take a look at next OpCode to see whether current expression consists\r
1821 // of single OpCode\r
1822 //\r
1823 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1824 SingleOpCodeExpression = TRUE;\r
1825 }\r
c60a0616 1826 break;\r
1827\r
1828 case EFI_IFR_DISABLE_IF_OP:\r
1829 //\r
1830 // The DisableIf expression should only rely on constant, so it could be\r
1831 // evaluated at initialization and it will not be queued\r
1832 //\r
1833 CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
1ac628ee 1834 ASSERT (CurrentExpression != NULL);\r
c60a0616 1835 CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE;\r
1836 CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
1837 InitializeListHead (&CurrentExpression->OpCodeListHead);\r
1838\r
0a1147ed
LG
1839 if (CurrentForm != NULL) {\r
1840 //\r
1841 // This is DisableIf for Question, enqueue it to Form expression list\r
1842 //\r
1843 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
1844 }\r
1845\r
1846 mDisableExpression = CurrentExpression;\r
1847 mInScopeDisable = TRUE;\r
1848 OpCodeDisabled = FALSE;\r
c60a0616 1849\r
1850 //\r
1851 // Take a look at next OpCode to see whether current expression consists\r
1852 // of single OpCode\r
1853 //\r
1854 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1855 SingleOpCodeExpression = TRUE;\r
1856 }\r
1857 break;\r
1858\r
1859 //\r
1860 // Expression\r
1861 //\r
1862 case EFI_IFR_VALUE_OP:\r
1863 CurrentExpression = CreateExpression (CurrentForm);\r
1864 CurrentExpression->Type = EFI_HII_EXPRESSION_VALUE;\r
1865 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
1866\r
1867 if (InScopeDefault) {\r
1868 //\r
1869 // Used for default (EFI_IFR_DEFAULT)\r
1870 //\r
1871 CurrentDefault->ValueExpression = CurrentExpression;\r
1872 } else {\r
1873 //\r
1874 // If used for a question, then the question will be read-only\r
1875 //\r
bc166db3 1876 //\r
1877 // Make sure CurrentStatement is not NULL.\r
1878 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
1879 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
1880 //\r
1881 ASSERT (CurrentStatement != NULL);\r
c60a0616 1882 CurrentStatement->ValueExpression = CurrentExpression;\r
1883 }\r
0c66bc76
LG
1884\r
1885 //\r
1886 // Take a look at next OpCode to see whether current expression consists\r
1887 // of single OpCode\r
1888 //\r
1889 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1890 SingleOpCodeExpression = TRUE;\r
1891 }\r
c60a0616 1892 break;\r
1893\r
1894 case EFI_IFR_RULE_OP:\r
1895 CurrentExpression = CreateExpression (CurrentForm);\r
1896 CurrentExpression->Type = EFI_HII_EXPRESSION_RULE;\r
1897\r
1898 CurrentExpression->RuleId = ((EFI_IFR_RULE *) OpCodeData)->RuleId;\r
1899 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
0c66bc76
LG
1900\r
1901 //\r
1902 // Take a look at next OpCode to see whether current expression consists\r
1903 // of single OpCode\r
1904 //\r
1905 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1906 SingleOpCodeExpression = TRUE;\r
1907 }\r
c60a0616 1908 break;\r
1909\r
2573712e
LG
1910 case EFI_IFR_READ_OP:\r
1911 CurrentExpression = CreateExpression (CurrentForm);\r
1912 CurrentExpression->Type = EFI_HII_EXPRESSION_READ;\r
1913 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
1914\r
1915 //\r
1916 // Make sure CurrentStatement is not NULL.\r
1917 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
1918 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
1919 //\r
1920 ASSERT (CurrentStatement != NULL);\r
1921 CurrentStatement->ReadExpression = CurrentExpression;\r
1922\r
1923 //\r
1924 // Take a look at next OpCode to see whether current expression consists\r
1925 // of single OpCode\r
1926 //\r
1927 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1928 SingleOpCodeExpression = TRUE;\r
1929 }\r
1930 break;\r
1931\r
1932 case EFI_IFR_WRITE_OP:\r
1933 CurrentExpression = CreateExpression (CurrentForm);\r
1934 CurrentExpression->Type = EFI_HII_EXPRESSION_WRITE;\r
1935 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
1936\r
1937 //\r
1938 // Make sure CurrentStatement is not NULL.\r
1939 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
1940 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
1941 //\r
1942 ASSERT (CurrentStatement != NULL);\r
1943 CurrentStatement->WriteExpression = CurrentExpression;\r
1944\r
1945 //\r
1946 // Take a look at next OpCode to see whether current expression consists\r
1947 // of single OpCode\r
1948 //\r
1949 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
1950 SingleOpCodeExpression = TRUE;\r
1951 }\r
1952 break;\r
1953\r
c60a0616 1954 //\r
1955 // Image\r
1956 //\r
1957 case EFI_IFR_IMAGE_OP:\r
1958 //\r
1959 // Get ScopeOpcode from top of stack\r
1960 //\r
1961 PopScope (&ScopeOpCode);\r
1962 PushScope (ScopeOpCode);\r
1963\r
1964 switch (ScopeOpCode) {\r
1965 case EFI_IFR_FORM_SET_OP:\r
1966 ImageId = &FormSet->ImageId;\r
1967 break;\r
1968\r
1969 case EFI_IFR_FORM_OP:\r
2573712e 1970 case EFI_IFR_FORM_MAP_OP:\r
d0720b57 1971 ASSERT (CurrentForm != NULL);\r
c60a0616 1972 ImageId = &CurrentForm->ImageId;\r
1973 break;\r
1974\r
1975 case EFI_IFR_ONE_OF_OPTION_OP:\r
1976 ImageId = &CurrentOption->ImageId;\r
1977 break;\r
1978\r
1979 default:\r
bc166db3 1980 //\r
1981 // Make sure CurrentStatement is not NULL.\r
1982 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
1983 // file is wrongly generated by tools such as VFR Compiler.\r
1984 //\r
1985 ASSERT (CurrentStatement != NULL);\r
c60a0616 1986 ImageId = &CurrentStatement->ImageId;\r
1987 break;\r
1988 }\r
1989\r
c410589e 1990 ASSERT (ImageId != NULL);\r
c60a0616 1991 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
1992 break;\r
1993\r
1994 //\r
1995 // Refresh\r
1996 //\r
1997 case EFI_IFR_REFRESH_OP:\r
c410589e 1998 ASSERT (CurrentStatement != NULL);\r
c60a0616 1999 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
2000 break;\r
2001\r
2002 //\r
2003 // Vendor specific\r
2004 //\r
2005 case EFI_IFR_GUID_OP:\r
5c526736 2006 if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
c60a0616 2007 //\r
2008 // Tiano specific GUIDed opcodes\r
2009 //\r
2010 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
2011 case EFI_IFR_EXTEND_OP_LABEL:\r
2012 //\r
2013 // just ignore label\r
2014 //\r
2015 break;\r
2016\r
2017 case EFI_IFR_EXTEND_OP_BANNER:\r
0a1147ed 2018 //\r
b9e388d2 2019 // By SubClass to get Banner Data from Front Page\r
0a1147ed 2020 //\r
c60a0616 2021 if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
2022 CopyMem (\r
0a1147ed 2023 &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
c60a0616 2024 ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
2025 &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
2026 sizeof (EFI_STRING_ID)\r
2027 );\r
2028 }\r
2029 break;\r
2030\r
2031 case EFI_IFR_EXTEND_OP_CLASS:\r
2032 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
2033 break;\r
2034\r
2035 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
2036 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
2037 break;\r
2038\r
2039 default:\r
2040 break;\r
2041 }\r
2042 }\r
2043\r
2044 break;\r
2045\r
2046 //\r
2047 // Scope End\r
2048 //\r
2049 case EFI_IFR_END_OP:\r
2050 Status = PopScope (&ScopeOpCode);\r
2051 if (EFI_ERROR (Status)) {\r
2052 ResetScopeStack ();\r
2053 return Status;\r
2054 }\r
2055\r
2056 switch (ScopeOpCode) {\r
2057 case EFI_IFR_FORM_SET_OP:\r
2058 //\r
2059 // End of FormSet, update FormSet IFR binary length\r
2060 // to stop parsing substantial OpCodes\r
2061 //\r
2062 FormSet->IfrBinaryLength = OpCodeOffset;\r
2063 break;\r
2064\r
2065 case EFI_IFR_FORM_OP:\r
2573712e 2066 case EFI_IFR_FORM_MAP_OP:\r
c60a0616 2067 //\r
2068 // End of Form\r
2069 //\r
2070 CurrentForm = NULL;\r
0c66bc76 2071 SuppressForQuestion = FALSE;\r
c60a0616 2072 break;\r
2073\r
2074 case EFI_IFR_ONE_OF_OPTION_OP:\r
2075 //\r
2076 // End of Option\r
2077 //\r
2078 CurrentOption = NULL;\r
2079 break;\r
2080\r
2081 case EFI_IFR_SUBTITLE_OP:\r
2082 mInScopeSubtitle = FALSE;\r
2083 break;\r
2084\r
2085 case EFI_IFR_NO_SUBMIT_IF_OP:\r
2086 case EFI_IFR_INCONSISTENT_IF_OP:\r
2087 //\r
2088 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
2089 //\r
2090 break;\r
2091\r
2092 case EFI_IFR_SUPPRESS_IF_OP:\r
2093 if (SuppressForOption) {\r
2094 InScopeOptionSuppress = FALSE;\r
0c66bc76 2095 } else if (SuppressForQuestion) {\r
c60a0616 2096 mInScopeSuppress = FALSE;\r
0c66bc76
LG
2097 } else {\r
2098 InScopeFormSuppress = FALSE;\r
c60a0616 2099 }\r
2100 break;\r
2101\r
2102 case EFI_IFR_GRAY_OUT_IF_OP:\r
2103 mInScopeGrayOut = FALSE;\r
2104 break;\r
2105\r
2106 case EFI_IFR_DISABLE_IF_OP:\r
0a1147ed 2107 mInScopeDisable = FALSE;\r
c60a0616 2108 OpCodeDisabled = FALSE;\r
2109 break;\r
2110\r
2111 case EFI_IFR_ONE_OF_OP:\r
2112 case EFI_IFR_ORDERED_LIST_OP:\r
2113 SuppressForOption = FALSE;\r
2114 break;\r
2115\r
2116 case EFI_IFR_DEFAULT_OP:\r
2117 InScopeDefault = FALSE;\r
2118 break;\r
2119\r
2573712e
LG
2120 case EFI_IFR_MAP_OP:\r
2121 //\r
2122 // Get current Map Expression List.\r
2123 //\r
2124 Status = PopMapExpressionList ((VOID **) &MapExpressionList);\r
2125 if (Status == EFI_ACCESS_DENIED) {\r
2126 MapExpressionList = NULL;\r
2127 }\r
2128 //\r
2129 // Get current expression.\r
2130 //\r
2131 Status = PopCurrentExpression ((VOID **) &CurrentExpression);\r
2132 ASSERT_EFI_ERROR (Status);\r
771ececd 2133 ASSERT (MapScopeDepth > 0);\r
2573712e
LG
2134 MapScopeDepth --;\r
2135 break;\r
2136\r
c60a0616 2137 default:\r
2138 if (IsExpressionOpCode (ScopeOpCode)) {\r
0a1147ed 2139 if (mInScopeDisable && CurrentForm == NULL) {\r
c60a0616 2140 //\r
0a1147ed 2141 // This is DisableIf expression for Form, it should be a constant expression\r
c60a0616 2142 //\r
f8a1c229 2143 ASSERT (CurrentExpression != NULL);\r
c60a0616 2144 Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
2145 if (EFI_ERROR (Status)) {\r
2146 return Status;\r
2147 }\r
a935a0d8 2148\r
c60a0616 2149 if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
2150 return EFI_INVALID_PARAMETER;\r
2151 }\r
2152\r
2153 OpCodeDisabled = CurrentExpression->Result.Value.b;\r
2154 //\r
2573712e 2155 // DisableIf Expression is only used once and not queued, free it\r
c60a0616 2156 //\r
2157 DestroyExpression (CurrentExpression);\r
2158 }\r
2159\r
2160 //\r
2161 // End of current Expression\r
2162 //\r
2163 CurrentExpression = NULL;\r
2164 }\r
2165 break;\r
2166 }\r
2167 break;\r
2168\r
2169 default:\r
2170 break;\r
2171 }\r
2172 }\r
2173\r
2174 return EFI_SUCCESS;\r
2175}\r