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