2 Parser for IFR binary encoding.
4 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 UINT16 mStatementIndex
;
18 UINT16 mExpressionOpCodeIndex
;
19 EFI_QUESTION_ID mUsedQuestionId
;
20 extern LIST_ENTRY gBrowserStorageList
;
22 Initialize Statement header members.
24 @param OpCodeData Pointer of the raw OpCode data.
25 @param FormSet Pointer of the current FormSe.
26 @param Form Pointer of the current Form.
28 @return The Statement.
31 FORM_BROWSER_STATEMENT
*
34 IN OUT FORM_BROWSER_FORMSET
*FormSet
,
35 IN OUT FORM_BROWSER_FORM
*Form
38 FORM_BROWSER_STATEMENT
*Statement
;
39 EFI_IFR_STATEMENT_HEADER
*StatementHdr
;
40 INTN ConditionalExprCount
;
44 // Only guid op may out side the form level.
46 ASSERT (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_GUID_OP
);
49 Statement
= &FormSet
->StatementBuffer
[mStatementIndex
];
52 InitializeListHead (&Statement
->DefaultListHead
);
53 InitializeListHead (&Statement
->OptionListHead
);
54 InitializeListHead (&Statement
->InconsistentListHead
);
55 InitializeListHead (&Statement
->NoSubmitListHead
);
56 InitializeListHead (&Statement
->WarningListHead
);
58 Statement
->Signature
= FORM_BROWSER_STATEMENT_SIGNATURE
;
60 Statement
->Operand
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
;
61 Statement
->OpCode
= (EFI_IFR_OP_HEADER
*) OpCodeData
;
63 StatementHdr
= (EFI_IFR_STATEMENT_HEADER
*) (OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
));
64 CopyMem (&Statement
->Prompt
, &StatementHdr
->Prompt
, sizeof (EFI_STRING_ID
));
65 CopyMem (&Statement
->Help
, &StatementHdr
->Help
, sizeof (EFI_STRING_ID
));
67 ConditionalExprCount
= GetConditionalExpressionCount(ExpressStatement
);
68 if (ConditionalExprCount
> 0) {
70 // Form is inside of suppressif
73 Statement
->Expression
= (FORM_EXPRESSION_LIST
*) AllocatePool(
74 (UINTN
) (sizeof(FORM_EXPRESSION_LIST
) + ((ConditionalExprCount
-1) * sizeof(FORM_EXPRESSION
*))));
75 ASSERT (Statement
->Expression
!= NULL
);
76 Statement
->Expression
->Count
= (UINTN
) ConditionalExprCount
;
77 Statement
->Expression
->Signature
= FORM_EXPRESSION_LIST_SIGNATURE
;
78 CopyMem (Statement
->Expression
->Expression
, GetConditionalExpressionList(ExpressStatement
), (UINTN
) (sizeof (FORM_EXPRESSION
*) * ConditionalExprCount
));
82 // Insert this Statement into current Form
85 InsertTailList (&FormSet
->StatementListOSF
, &Statement
->Link
);
87 InsertTailList (&Form
->StatementListHead
, &Statement
->Link
);
93 Convert a numeric value to a Unicode String and insert it to String Package.
94 This string is used as the Unicode Name for the EFI Variable. This is to support
95 the deprecated vareqval opcode.
97 @param FormSet The FormSet.
98 @param Statement The numeric question whose VarStoreInfo.VarName is the
99 numeric value which is used to produce the Unicode Name
100 for the EFI Variable.
102 If the Statement is NULL, the ASSERT.
103 If the opcode is not Numeric, then ASSERT.
105 @retval EFI_SUCCESS The funtion always succeeds.
108 UpdateCheckBoxStringToken (
109 IN CONST FORM_BROWSER_FORMSET
*FormSet
,
110 IN FORM_BROWSER_STATEMENT
*Statement
113 CHAR16 Str
[MAXIMUM_VALUE_CHARACTERS
];
116 ASSERT (Statement
!= NULL
);
117 ASSERT (Statement
->Operand
== EFI_IFR_NUMERIC_OP
);
119 UnicodeValueToString (Str
, 0, Statement
->VarStoreInfo
.VarName
, MAXIMUM_VALUE_CHARACTERS
- 1);
121 Id
= HiiSetString (FormSet
->HiiHandle
, 0, Str
, NULL
);
123 return EFI_OUT_OF_RESOURCES
;
126 Statement
->VarStoreInfo
.VarName
= Id
;
132 Check if the next opcode is the EFI_IFR_EXTEND_OP_VAREQNAME.
134 @param OpCodeData The current opcode.
140 IsNextOpCodeGuidedVarEqName (
147 OpCodeData
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
148 if (*OpCodeData
== EFI_IFR_GUID_OP
) {
149 if (CompareGuid (&gEfiIfrFrameworkGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
)))) {
151 // Specific GUIDed opcodes to support IFR generated from Framework HII VFR
153 if ((((EFI_IFR_GUID_VAREQNAME
*) OpCodeData
)->ExtendOpCode
) == EFI_IFR_EXTEND_OP_VAREQNAME
) {
163 Initialize Question's members.
165 @param OpCodeData Pointer of the raw OpCode data.
166 @param FormSet Pointer of the current FormSet.
167 @param Form Pointer of the current Form.
169 @return The Question.
172 FORM_BROWSER_STATEMENT
*
174 IN UINT8
*OpCodeData
,
175 IN OUT FORM_BROWSER_FORMSET
*FormSet
,
176 IN OUT FORM_BROWSER_FORM
*Form
179 FORM_BROWSER_STATEMENT
*Statement
;
180 EFI_IFR_QUESTION_HEADER
*QuestionHdr
;
182 FORMSET_STORAGE
*Storage
;
183 NAME_VALUE_NODE
*NameValueNode
;
187 Statement
= CreateStatement (OpCodeData
, FormSet
, Form
);
188 if (Statement
== NULL
) {
192 QuestionHdr
= (EFI_IFR_QUESTION_HEADER
*) (OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
));
193 CopyMem (&Statement
->QuestionId
, &QuestionHdr
->QuestionId
, sizeof (EFI_QUESTION_ID
));
194 CopyMem (&Statement
->VarStoreId
, &QuestionHdr
->VarStoreId
, sizeof (EFI_VARSTORE_ID
));
195 CopyMem (&Statement
->VarStoreInfo
.VarOffset
, &QuestionHdr
->VarStoreInfo
.VarOffset
, sizeof (UINT16
));
197 Statement
->QuestionFlags
= QuestionHdr
->Flags
;
199 if (Statement
->VarStoreId
== 0) {
201 // VarStoreId of zero indicates no variable storage
207 // Take a look at next OpCode to see whether it is a GUIDed opcode to support
208 // Framework Compatibility
210 if (FeaturePcdGet (PcdFrameworkCompatibilitySupport
)) {
211 if ((*OpCodeData
== EFI_IFR_NUMERIC_OP
) && IsNextOpCodeGuidedVarEqName (OpCodeData
)) {
212 Status
= UpdateCheckBoxStringToken (FormSet
, Statement
);
213 if (EFI_ERROR (Status
)) {
220 // Find Storage for this Question
222 Link
= GetFirstNode (&FormSet
->StorageListHead
);
223 while (!IsNull (&FormSet
->StorageListHead
, Link
)) {
224 Storage
= FORMSET_STORAGE_FROM_LINK (Link
);
226 if (Storage
->VarStoreId
== Statement
->VarStoreId
) {
227 Statement
->Storage
= Storage
->BrowserStorage
;
231 Link
= GetNextNode (&FormSet
->StorageListHead
, Link
);
233 ASSERT (Statement
->Storage
!= NULL
);
236 // Initialilze varname for Name/Value or EFI Variable
238 if ((Statement
->Storage
->Type
== EFI_HII_VARSTORE_NAME_VALUE
) ||
239 (Statement
->Storage
->Type
== EFI_HII_VARSTORE_EFI_VARIABLE
)) {
240 Statement
->VariableName
= GetToken (Statement
->VarStoreInfo
.VarName
, FormSet
->HiiHandle
);
241 ASSERT (Statement
->VariableName
!= NULL
);
243 if (Statement
->Storage
->Type
== EFI_HII_VARSTORE_NAME_VALUE
) {
245 // Check whether old string node already exist.
248 if (!IsListEmpty(&Statement
->Storage
->NameValueListHead
)) {
249 Link
= GetFirstNode (&Statement
->Storage
->NameValueListHead
);
250 while (!IsNull (&Statement
->Storage
->NameValueListHead
, Link
)) {
251 NameValueNode
= NAME_VALUE_NODE_FROM_LINK (Link
);
253 if (StrCmp (Statement
->VariableName
, NameValueNode
->Name
) == 0) {
258 Link
= GetNextNode (&Statement
->Storage
->NameValueListHead
, Link
);
264 // Insert to Name/Value varstore list
266 NameValueNode
= AllocateZeroPool (sizeof (NAME_VALUE_NODE
));
267 ASSERT (NameValueNode
!= NULL
);
268 NameValueNode
->Signature
= NAME_VALUE_NODE_SIGNATURE
;
269 NameValueNode
->Name
= AllocateCopyPool (StrSize (Statement
->VariableName
), Statement
->VariableName
);
270 ASSERT (NameValueNode
->Name
!= NULL
);
271 NameValueNode
->Value
= AllocateZeroPool (0x10);
272 ASSERT (NameValueNode
->Value
!= NULL
);
273 NameValueNode
->EditValue
= AllocateZeroPool (0x10);
274 ASSERT (NameValueNode
->EditValue
!= NULL
);
276 InsertTailList (&Statement
->Storage
->NameValueListHead
, &NameValueNode
->Link
);
286 Allocate a FORM_EXPRESSION node.
288 @param Form The Form associated with this Expression
289 @param OpCode The binary opcode data.
291 @return Pointer to a FORM_EXPRESSION data structure.
296 IN OUT FORM_BROWSER_FORM
*Form
,
300 FORM_EXPRESSION
*Expression
;
302 Expression
= AllocateZeroPool (sizeof (FORM_EXPRESSION
));
303 ASSERT (Expression
!= NULL
);
304 Expression
->Signature
= FORM_EXPRESSION_SIGNATURE
;
305 InitializeListHead (&Expression
->OpCodeListHead
);
306 Expression
->OpCode
= (EFI_IFR_OP_HEADER
*) OpCode
;
312 Create ConfigHdr string for a storage.
314 @param FormSet Pointer of the current FormSet
315 @param Storage Pointer of the storage
317 @retval EFI_SUCCESS Initialize ConfigHdr success
321 InitializeConfigHdr (
322 IN FORM_BROWSER_FORMSET
*FormSet
,
323 IN OUT FORMSET_STORAGE
*Storage
328 if (Storage
->BrowserStorage
->Type
== EFI_HII_VARSTORE_BUFFER
||
329 Storage
->BrowserStorage
->Type
== EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
) {
330 Name
= Storage
->BrowserStorage
->Name
;
335 Storage
->ConfigHdr
= HiiConstructConfigHdr (
336 &Storage
->BrowserStorage
->Guid
,
338 FormSet
->DriverHandle
341 if (Storage
->ConfigHdr
== NULL
) {
342 return EFI_NOT_FOUND
;
349 Find the global storage link base on the input storate type, name and guid.
351 For EFI_HII_VARSTORE_EFI_VARIABLE and EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER,
352 same guid + name = same storage
354 For EFI_HII_VARSTORE_NAME_VALUE:
355 same guid + HiiHandle = same storage
357 For EFI_HII_VARSTORE_BUFFER:
358 same guid + name + HiiHandle = same storage
360 @param StorageType Storage type.
361 @param StorageGuid Storage guid.
362 @param StorageName Storage Name.
363 @param HiiHandle HiiHandle for this varstore.
365 @return Pointer to a GLOBAL_STORAGE data structure.
370 IN UINT8 StorageType
,
371 IN EFI_GUID
*StorageGuid
,
372 IN CHAR16
*StorageName
,
373 IN EFI_HII_HANDLE HiiHandle
377 BROWSER_STORAGE
*BrowserStorage
;
379 Link
= GetFirstNode (&gBrowserStorageList
);
380 while (!IsNull (&gBrowserStorageList
, Link
)) {
381 BrowserStorage
= BROWSER_STORAGE_FROM_LINK (Link
);
382 Link
= GetNextNode (&gBrowserStorageList
, Link
);
384 if ((BrowserStorage
->Type
== StorageType
) && CompareGuid (&BrowserStorage
->Guid
, StorageGuid
)) {
385 if (StorageType
== EFI_HII_VARSTORE_NAME_VALUE
) {
386 if (BrowserStorage
->HiiHandle
== HiiHandle
) {
387 return BrowserStorage
;
393 ASSERT (StorageName
!= NULL
);
394 if (StrCmp (BrowserStorage
->Name
, StorageName
) == 0) {
395 if (StorageType
== EFI_HII_VARSTORE_EFI_VARIABLE
|| StorageType
== EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
) {
396 return BrowserStorage
;
397 } else if (StorageType
== EFI_HII_VARSTORE_BUFFER
&& BrowserStorage
->HiiHandle
== HiiHandle
) {
398 return BrowserStorage
;
408 Intialize the Global Storage.
410 @param BrowserStorage Pointer to the global storage.
411 @param StorageType Storage type.
412 @param OpCodeData Binary data for this opcode.
416 IntializeBrowserStorage (
417 IN BROWSER_STORAGE
*BrowserStorage
,
418 IN UINT8 StorageType
,
422 switch (StorageType
) {
423 case EFI_HII_VARSTORE_BUFFER
:
424 CopyMem (&BrowserStorage
->Guid
, &((EFI_IFR_VARSTORE
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
425 CopyMem (&BrowserStorage
->Size
, &((EFI_IFR_VARSTORE
*) OpCodeData
)->Size
, sizeof (UINT16
));
427 BrowserStorage
->Buffer
= AllocateZeroPool (BrowserStorage
->Size
);
428 BrowserStorage
->EditBuffer
= AllocateZeroPool (BrowserStorage
->Size
);
431 case EFI_HII_VARSTORE_EFI_VARIABLE
:
432 case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
:
433 CopyMem (&BrowserStorage
->Guid
, &((EFI_IFR_VARSTORE_EFI
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
434 CopyMem (&BrowserStorage
->Attributes
, &((EFI_IFR_VARSTORE_EFI
*) OpCodeData
)->Attributes
, sizeof (UINT32
));
435 CopyMem (&BrowserStorage
->Size
, &((EFI_IFR_VARSTORE_EFI
*) OpCodeData
)->Size
, sizeof (UINT16
));
437 if (StorageType
== EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
) {
438 BrowserStorage
->Buffer
= AllocateZeroPool (BrowserStorage
->Size
);
439 BrowserStorage
->EditBuffer
= AllocateZeroPool (BrowserStorage
->Size
);
443 case EFI_HII_VARSTORE_NAME_VALUE
:
444 CopyMem (&BrowserStorage
->Guid
, &((EFI_IFR_VARSTORE_NAME_VALUE
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
446 InitializeListHead (&BrowserStorage
->NameValueListHead
);
455 Check whether exist device path info in the ConfigHdr string.
457 @param String UEFI configuration string
459 @retval TRUE Device Path exist.
460 @retval FALSE Not exist device path info.
470 for (; (*String
!= 0 && StrnCmp (String
, L
"PATH=", StrLen (L
"PATH=")) != 0); String
++);
475 String
+= StrLen (L
"PATH=");
480 for (Length
= 0; *String
!= 0 && *String
!= L
'&'; String
++, Length
++);
481 if (((Length
+ 1) / 2) < sizeof (EFI_DEVICE_PATH_PROTOCOL
)) {
489 Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.
491 @param FormSet Pointer of the current FormSet
492 @param StorageType Storage type.
493 @param OpCodeData Binary data for this opcode.
495 @return Pointer to a FORMSET_STORAGE data structure.
500 IN FORM_BROWSER_FORMSET
*FormSet
,
501 IN UINT8 StorageType
,
505 FORMSET_STORAGE
*Storage
;
506 CHAR16
*UnicodeString
;
508 BROWSER_STORAGE
*BrowserStorage
;
509 EFI_GUID
*StorageGuid
;
512 UnicodeString
= NULL
;
514 switch (StorageType
) {
515 case EFI_HII_VARSTORE_BUFFER
:
516 StorageGuid
= (EFI_GUID
*) (CHAR8
*) &((EFI_IFR_VARSTORE
*) OpCodeData
)->Guid
;
517 StorageName
= (CHAR8
*) ((EFI_IFR_VARSTORE
*) OpCodeData
)->Name
;
520 case EFI_HII_VARSTORE_EFI_VARIABLE
:
521 case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
:
522 StorageGuid
= (EFI_GUID
*) (CHAR8
*) &((EFI_IFR_VARSTORE_EFI
*) OpCodeData
)->Guid
;
523 StorageName
= (CHAR8
*) ((EFI_IFR_VARSTORE_EFI
*) OpCodeData
)->Name
;
527 ASSERT (StorageType
== EFI_HII_VARSTORE_NAME_VALUE
);
528 StorageGuid
= &((EFI_IFR_VARSTORE_NAME_VALUE
*) OpCodeData
)->Guid
;
532 if (StorageType
!= EFI_HII_VARSTORE_NAME_VALUE
) {
533 ASSERT (StorageName
!= NULL
);
535 UnicodeString
= AllocateZeroPool (AsciiStrSize (StorageName
) * 2);
536 ASSERT (UnicodeString
!= NULL
);
537 for (Index
= 0; StorageName
[Index
] != 0; Index
++) {
538 UnicodeString
[Index
] = (CHAR16
) StorageName
[Index
];
542 Storage
= AllocateZeroPool (sizeof (FORMSET_STORAGE
));
543 ASSERT (Storage
!= NULL
);
544 Storage
->Signature
= FORMSET_STORAGE_SIGNATURE
;
545 InsertTailList (&FormSet
->StorageListHead
, &Storage
->Link
);
547 BrowserStorage
= FindStorageInList(StorageType
, StorageGuid
, UnicodeString
, FormSet
->HiiHandle
);
548 if (BrowserStorage
== NULL
) {
549 BrowserStorage
= AllocateZeroPool (sizeof (BROWSER_STORAGE
));
550 ASSERT (BrowserStorage
!= NULL
);
552 BrowserStorage
->Signature
= BROWSER_STORAGE_SIGNATURE
;
553 InsertTailList (&gBrowserStorageList
, &BrowserStorage
->Link
);
555 IntializeBrowserStorage (BrowserStorage
, StorageType
, OpCodeData
);
556 BrowserStorage
->Type
= StorageType
;
557 if (StorageType
!= EFI_HII_VARSTORE_NAME_VALUE
) {
558 BrowserStorage
->Name
= UnicodeString
;
561 BrowserStorage
->HiiHandle
= FormSet
->HiiHandle
;
563 BrowserStorage
->Initialized
= FALSE
;
566 Storage
->BrowserStorage
= BrowserStorage
;
567 InitializeConfigHdr (FormSet
, Storage
);
568 Storage
->ConfigRequest
= AllocateCopyPool (StrSize (Storage
->ConfigHdr
), Storage
->ConfigHdr
);
569 Storage
->SpareStrLen
= 0;
575 Get Formset_storage base on the input varstoreid info.
577 @param FormSet Pointer of the current FormSet.
578 @param VarStoreId Varstore ID info.
580 @return Pointer to a FORMSET_STORAGE data structure.
585 IN FORM_BROWSER_FORMSET
*FormSet
,
586 IN EFI_VARSTORE_ID VarStoreId
589 FORMSET_STORAGE
*FormsetStorage
;
594 FormsetStorage
= NULL
;
596 // Find Formset Storage for this Question
598 Link
= GetFirstNode (&FormSet
->StorageListHead
);
599 while (!IsNull (&FormSet
->StorageListHead
, Link
)) {
600 FormsetStorage
= FORMSET_STORAGE_FROM_LINK (Link
);
602 if (FormsetStorage
->VarStoreId
== VarStoreId
) {
607 Link
= GetNextNode (&FormSet
->StorageListHead
, Link
);
610 return Found
? FormsetStorage
: NULL
;
614 Get Formset_storage base on the input browser storage.
616 More than one formsets may share the same browser storage,
617 this function just get the first formset storage which
618 share the browser storage.
620 @param Storage browser storage info.
622 @return Pointer to a FORMSET_STORAGE data structure.
627 GetFstStgFromBrsStg (
628 IN BROWSER_STORAGE
*Storage
631 FORMSET_STORAGE
*FormsetStorage
;
633 LIST_ENTRY
*FormsetLink
;
634 FORM_BROWSER_FORMSET
*FormSet
;
638 FormsetStorage
= NULL
;
640 FormsetLink
= GetFirstNode (&gBrowserFormSetList
);
641 while (!IsNull (&gBrowserFormSetList
, FormsetLink
)) {
642 FormSet
= FORM_BROWSER_FORMSET_FROM_LINK (FormsetLink
);
643 FormsetLink
= GetNextNode (&gBrowserFormSetList
, FormsetLink
);
645 Link
= GetFirstNode (&FormSet
->StorageListHead
);
646 while (!IsNull (&FormSet
->StorageListHead
, Link
)) {
647 FormsetStorage
= FORMSET_STORAGE_FROM_LINK (Link
);
648 Link
= GetNextNode (&FormSet
->StorageListHead
, Link
);
650 if (FormsetStorage
->BrowserStorage
== Storage
) {
661 return Found
? FormsetStorage
: NULL
;
665 Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>
667 @param FormSet Pointer of the current FormSet.
668 @param Question The Question to be initialized.
669 @param Form Pointer of the current form.
671 @retval EFI_SUCCESS Function success.
672 @retval EFI_INVALID_PARAMETER No storage associated with the Question.
676 InitializeRequestElement (
677 IN OUT FORM_BROWSER_FORMSET
*FormSet
,
678 IN OUT FORM_BROWSER_STATEMENT
*Question
,
679 IN OUT FORM_BROWSER_FORM
*Form
682 BROWSER_STORAGE
*Storage
;
683 FORMSET_STORAGE
*FormsetStorage
;
687 CHAR16 RequestElement
[30];
690 FORM_BROWSER_CONFIG_REQUEST
*ConfigInfo
;
692 Storage
= Question
->Storage
;
693 if (Storage
== NULL
) {
694 return EFI_INVALID_PARAMETER
;
697 if (Storage
->Type
== EFI_HII_VARSTORE_EFI_VARIABLE
) {
699 // <ConfigRequest> is unnecessary for EFI variable storage,
700 // GetVariable()/SetVariable() will be used to retrieve/save values
706 // Prepare <RequestElement>
708 if (Storage
->Type
== EFI_HII_VARSTORE_BUFFER
||
709 Storage
->Type
== EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
) {
710 StrLen
= UnicodeSPrint (
712 30 * sizeof (CHAR16
),
713 L
"&OFFSET=%04x&WIDTH=%04x",
714 Question
->VarStoreInfo
.VarOffset
,
715 Question
->StorageWidth
717 Question
->BlockName
= AllocateCopyPool ((StrLen
+ 1) * sizeof (CHAR16
), RequestElement
);
719 StrLen
= UnicodeSPrint (RequestElement
, 30 * sizeof (CHAR16
), L
"&%s", Question
->VariableName
);
722 if ((Question
->Operand
== EFI_IFR_PASSWORD_OP
) && ((Question
->QuestionFlags
& EFI_IFR_FLAG_CALLBACK
) == EFI_IFR_FLAG_CALLBACK
)) {
724 // Password with CALLBACK flag is stored in encoded format,
725 // so don't need to append it to <ConfigRequest>
731 // Find Formset Storage for this Question
733 FormsetStorage
= GetFstStgFromVarId(FormSet
, Question
->VarStoreId
);
734 ASSERT (FormsetStorage
!= NULL
);
737 // Append <RequestElement> to <ConfigRequest>
739 if (StrLen
> FormsetStorage
->SpareStrLen
) {
741 // Old String buffer is not sufficient for RequestElement, allocate a new one
743 StringSize
= (FormsetStorage
->ConfigRequest
!= NULL
) ? StrSize (FormsetStorage
->ConfigRequest
) : sizeof (CHAR16
);
744 NewStr
= AllocateZeroPool (StringSize
+ CONFIG_REQUEST_STRING_INCREMENTAL
* sizeof (CHAR16
));
745 ASSERT (NewStr
!= NULL
);
746 if (FormsetStorage
->ConfigRequest
!= NULL
) {
747 CopyMem (NewStr
, FormsetStorage
->ConfigRequest
, StringSize
);
748 FreePool (FormsetStorage
->ConfigRequest
);
750 FormsetStorage
->ConfigRequest
= NewStr
;
751 FormsetStorage
->SpareStrLen
= CONFIG_REQUEST_STRING_INCREMENTAL
;
754 StrCat (FormsetStorage
->ConfigRequest
, RequestElement
);
755 FormsetStorage
->ElementCount
++;
756 FormsetStorage
->SpareStrLen
-= StrLen
;
759 // Update the Config Request info saved in the form.
763 Link
= GetFirstNode (&Form
->ConfigRequestHead
);
764 while (!IsNull (&Form
->ConfigRequestHead
, Link
)) {
765 ConfigInfo
= FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link
);
767 if (ConfigInfo
!= NULL
&& ConfigInfo
->Storage
== FormsetStorage
->BrowserStorage
) {
772 Link
= GetNextNode (&Form
->ConfigRequestHead
, Link
);
776 ConfigInfo
= AllocateZeroPool(sizeof (FORM_BROWSER_CONFIG_REQUEST
));
777 ASSERT (ConfigInfo
!= NULL
);
778 ConfigInfo
->Signature
= FORM_BROWSER_CONFIG_REQUEST_SIGNATURE
;
779 ConfigInfo
->ConfigRequest
= AllocateCopyPool (StrSize (FormsetStorage
->ConfigHdr
), FormsetStorage
->ConfigHdr
);
780 ASSERT (ConfigInfo
->ConfigRequest
!= NULL
);
781 ConfigInfo
->SpareStrLen
= 0;
782 ConfigInfo
->Storage
= FormsetStorage
->BrowserStorage
;
783 InsertTailList(&Form
->ConfigRequestHead
, &ConfigInfo
->Link
);
787 // Append <RequestElement> to <ConfigRequest>
789 if (StrLen
> ConfigInfo
->SpareStrLen
) {
791 // Old String buffer is not sufficient for RequestElement, allocate a new one
793 StringSize
= (ConfigInfo
->ConfigRequest
!= NULL
) ? StrSize (ConfigInfo
->ConfigRequest
) : sizeof (CHAR16
);
794 NewStr
= AllocateZeroPool (StringSize
+ CONFIG_REQUEST_STRING_INCREMENTAL
* sizeof (CHAR16
));
795 ASSERT (NewStr
!= NULL
);
796 if (ConfigInfo
->ConfigRequest
!= NULL
) {
797 CopyMem (NewStr
, ConfigInfo
->ConfigRequest
, StringSize
);
798 FreePool (ConfigInfo
->ConfigRequest
);
800 ConfigInfo
->ConfigRequest
= NewStr
;
801 ConfigInfo
->SpareStrLen
= CONFIG_REQUEST_STRING_INCREMENTAL
;
804 StrCat (ConfigInfo
->ConfigRequest
, RequestElement
);
805 ConfigInfo
->ElementCount
++;
806 ConfigInfo
->SpareStrLen
-= StrLen
;
812 Free resources of a Expression.
814 @param FormSet Pointer of the Expression
819 IN FORM_EXPRESSION
*Expression
823 EXPRESSION_OPCODE
*OpCode
;
824 LIST_ENTRY
*SubExpressionLink
;
825 FORM_EXPRESSION
*SubExpression
;
827 while (!IsListEmpty (&Expression
->OpCodeListHead
)) {
828 Link
= GetFirstNode (&Expression
->OpCodeListHead
);
829 OpCode
= EXPRESSION_OPCODE_FROM_LINK (Link
);
830 RemoveEntryList (&OpCode
->Link
);
832 if (OpCode
->ValueList
!= NULL
) {
833 FreePool (OpCode
->ValueList
);
836 if (OpCode
->ValueName
!= NULL
) {
837 FreePool (OpCode
->ValueName
);
840 if (OpCode
->MapExpressionList
.ForwardLink
!= NULL
) {
841 while (!IsListEmpty (&OpCode
->MapExpressionList
)) {
842 SubExpressionLink
= GetFirstNode(&OpCode
->MapExpressionList
);
843 SubExpression
= FORM_EXPRESSION_FROM_LINK (SubExpressionLink
);
844 RemoveEntryList(&SubExpression
->Link
);
845 DestroyExpression (SubExpression
);
851 // Free this Expression
853 FreePool (Expression
);
857 Free resources of a storage.
859 @param Storage Pointer of the storage
864 IN FORMSET_STORAGE
*Storage
867 if (Storage
== NULL
) {
871 if (Storage
->ConfigRequest
!= NULL
) {
872 FreePool (Storage
->ConfigRequest
);
880 Free resources of a Statement.
882 @param FormSet Pointer of the FormSet
883 @param Statement Pointer of the Statement
888 IN FORM_BROWSER_FORMSET
*FormSet
,
889 IN OUT FORM_BROWSER_STATEMENT
*Statement
893 QUESTION_DEFAULT
*Default
;
894 QUESTION_OPTION
*Option
;
895 FORM_EXPRESSION
*Expression
;
898 // Free Default value List
900 while (!IsListEmpty (&Statement
->DefaultListHead
)) {
901 Link
= GetFirstNode (&Statement
->DefaultListHead
);
902 Default
= QUESTION_DEFAULT_FROM_LINK (Link
);
903 RemoveEntryList (&Default
->Link
);
911 while (!IsListEmpty (&Statement
->OptionListHead
)) {
912 Link
= GetFirstNode (&Statement
->OptionListHead
);
913 Option
= QUESTION_OPTION_FROM_LINK (Link
);
914 if (Option
->SuppressExpression
!= NULL
) {
915 FreePool (Option
->SuppressExpression
);
917 RemoveEntryList (&Option
->Link
);
923 // Free Inconsistent List
925 while (!IsListEmpty (&Statement
->InconsistentListHead
)) {
926 Link
= GetFirstNode (&Statement
->InconsistentListHead
);
927 Expression
= FORM_EXPRESSION_FROM_LINK (Link
);
928 RemoveEntryList (&Expression
->Link
);
930 DestroyExpression (Expression
);
934 // Free NoSubmit List
936 while (!IsListEmpty (&Statement
->NoSubmitListHead
)) {
937 Link
= GetFirstNode (&Statement
->NoSubmitListHead
);
938 Expression
= FORM_EXPRESSION_FROM_LINK (Link
);
939 RemoveEntryList (&Expression
->Link
);
941 DestroyExpression (Expression
);
945 // Free WarningIf List
947 while (!IsListEmpty (&Statement
->WarningListHead
)) {
948 Link
= GetFirstNode (&Statement
->WarningListHead
);
949 Expression
= FORM_EXPRESSION_FROM_LINK (Link
);
950 RemoveEntryList (&Expression
->Link
);
952 DestroyExpression (Expression
);
955 if (Statement
->Expression
!= NULL
) {
956 FreePool (Statement
->Expression
);
959 if (Statement
->VariableName
!= NULL
) {
960 FreePool (Statement
->VariableName
);
962 if (Statement
->BlockName
!= NULL
) {
963 FreePool (Statement
->BlockName
);
965 if (Statement
->BufferValue
!= NULL
) {
966 FreePool (Statement
->BufferValue
);
968 if (Statement
->Operand
== EFI_IFR_STRING_OP
|| Statement
->Operand
== EFI_IFR_PASSWORD_OP
) {
969 DeleteString(Statement
->HiiValue
.Value
.string
, FormSet
->HiiHandle
);
975 Free resources of a Form.
977 @param FormSet Pointer of the FormSet
978 @param Form Pointer of the Form.
983 IN FORM_BROWSER_FORMSET
*FormSet
,
984 IN OUT FORM_BROWSER_FORM
*Form
988 FORM_EXPRESSION
*Expression
;
989 FORM_BROWSER_STATEMENT
*Statement
;
990 FORM_BROWSER_CONFIG_REQUEST
*ConfigInfo
;
993 // Free Form Expressions
995 while (!IsListEmpty (&Form
->ExpressionListHead
)) {
996 Link
= GetFirstNode (&Form
->ExpressionListHead
);
997 Expression
= FORM_EXPRESSION_FROM_LINK (Link
);
998 RemoveEntryList (&Expression
->Link
);
1000 DestroyExpression (Expression
);
1004 // Free Statements/Questions
1006 while (!IsListEmpty (&Form
->StatementListHead
)) {
1007 Link
= GetFirstNode (&Form
->StatementListHead
);
1008 Statement
= FORM_BROWSER_STATEMENT_FROM_LINK (Link
);
1009 RemoveEntryList (&Statement
->Link
);
1011 DestroyStatement (FormSet
, Statement
);
1015 // Free ConfigRequest string.
1017 while (!IsListEmpty (&Form
->ConfigRequestHead
)) {
1018 Link
= GetFirstNode (&Form
->ConfigRequestHead
);
1019 ConfigInfo
= FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link
);
1020 RemoveEntryList (&ConfigInfo
->Link
);
1022 FreePool (ConfigInfo
->ConfigRequest
);
1023 FreePool (ConfigInfo
);
1026 if (Form
->SuppressExpression
!= NULL
) {
1027 FreePool (Form
->SuppressExpression
);
1030 UiFreeMenuList (&Form
->FormViewListHead
);
1040 Free resources allocated for a FormSet.
1042 @param FormSet Pointer of the FormSet
1047 IN OUT FORM_BROWSER_FORMSET
*FormSet
1051 FORMSET_STORAGE
*Storage
;
1052 FORMSET_DEFAULTSTORE
*DefaultStore
;
1053 FORM_EXPRESSION
*Expression
;
1054 FORM_BROWSER_FORM
*Form
;
1056 if (FormSet
->IfrBinaryData
== NULL
) {
1058 // Uninitialized FormSet
1065 // Free IFR binary buffer
1067 FreePool (FormSet
->IfrBinaryData
);
1070 // Free FormSet Storage
1072 if (FormSet
->StorageListHead
.ForwardLink
!= NULL
) {
1073 while (!IsListEmpty (&FormSet
->StorageListHead
)) {
1074 Link
= GetFirstNode (&FormSet
->StorageListHead
);
1075 Storage
= FORMSET_STORAGE_FROM_LINK (Link
);
1076 RemoveEntryList (&Storage
->Link
);
1078 DestroyStorage (Storage
);
1083 // Free FormSet Default Store
1085 if (FormSet
->DefaultStoreListHead
.ForwardLink
!= NULL
) {
1086 while (!IsListEmpty (&FormSet
->DefaultStoreListHead
)) {
1087 Link
= GetFirstNode (&FormSet
->DefaultStoreListHead
);
1088 DefaultStore
= FORMSET_DEFAULTSTORE_FROM_LINK (Link
);
1089 RemoveEntryList (&DefaultStore
->Link
);
1091 FreePool (DefaultStore
);
1096 // Free Formset Expressions
1098 while (!IsListEmpty (&FormSet
->ExpressionListHead
)) {
1099 Link
= GetFirstNode (&FormSet
->ExpressionListHead
);
1100 Expression
= FORM_EXPRESSION_FROM_LINK (Link
);
1101 RemoveEntryList (&Expression
->Link
);
1103 DestroyExpression (Expression
);
1109 if (FormSet
->FormListHead
.ForwardLink
!= NULL
) {
1110 while (!IsListEmpty (&FormSet
->FormListHead
)) {
1111 Link
= GetFirstNode (&FormSet
->FormListHead
);
1112 Form
= FORM_BROWSER_FORM_FROM_LINK (Link
);
1113 RemoveEntryList (&Form
->Link
);
1115 DestroyForm (FormSet
, Form
);
1119 if (FormSet
->StatementBuffer
!= NULL
) {
1120 FreePool (FormSet
->StatementBuffer
);
1122 if (FormSet
->ExpressionBuffer
!= NULL
) {
1123 FreePool (FormSet
->ExpressionBuffer
);
1131 Tell whether this Operand is an Expression OpCode or not
1133 @param Operand Operand of an IFR OpCode.
1135 @retval TRUE This is an Expression OpCode.
1136 @retval FALSE Not an Expression OpCode.
1140 IsExpressionOpCode (
1144 if (((Operand
>= EFI_IFR_EQ_ID_VAL_OP
) && (Operand
<= EFI_IFR_NOT_OP
)) ||
1145 ((Operand
>= EFI_IFR_MATCH_OP
) && (Operand
<= EFI_IFR_SET_OP
)) ||
1146 ((Operand
>= EFI_IFR_EQUAL_OP
) && (Operand
<= EFI_IFR_SPAN_OP
)) ||
1147 (Operand
== EFI_IFR_CATENATE_OP
) ||
1148 (Operand
== EFI_IFR_TO_LOWER_OP
) ||
1149 (Operand
== EFI_IFR_TO_UPPER_OP
) ||
1150 (Operand
== EFI_IFR_MAP_OP
) ||
1151 (Operand
== EFI_IFR_VERSION_OP
) ||
1152 (Operand
== EFI_IFR_SECURITY_OP
)) {
1160 Tell whether this Operand is an Statement OpCode.
1162 @param Operand Operand of an IFR OpCode.
1164 @retval TRUE This is an Statement OpCode.
1165 @retval FALSE Not an Statement OpCode.
1173 if ((Operand
== EFI_IFR_SUBTITLE_OP
) ||
1174 (Operand
== EFI_IFR_TEXT_OP
) ||
1175 (Operand
== EFI_IFR_RESET_BUTTON_OP
) ||
1176 (Operand
== EFI_IFR_REF_OP
) ||
1177 (Operand
== EFI_IFR_ACTION_OP
) ||
1178 (Operand
== EFI_IFR_NUMERIC_OP
) ||
1179 (Operand
== EFI_IFR_ORDERED_LIST_OP
) ||
1180 (Operand
== EFI_IFR_CHECKBOX_OP
) ||
1181 (Operand
== EFI_IFR_STRING_OP
) ||
1182 (Operand
== EFI_IFR_PASSWORD_OP
) ||
1183 (Operand
== EFI_IFR_DATE_OP
) ||
1184 (Operand
== EFI_IFR_TIME_OP
) ||
1185 (Operand
== EFI_IFR_GUID_OP
) ||
1186 (Operand
== EFI_IFR_ONE_OF_OP
)) {
1194 Tell whether this Operand is an known OpCode.
1196 @param Operand Operand of an IFR OpCode.
1198 @retval TRUE This is an Statement OpCode.
1199 @retval FALSE Not an Statement OpCode.
1207 return Operand
> EFI_IFR_WARNING_IF_OP
? TRUE
: FALSE
;
1211 Calculate number of Statemens(Questions) and Expression OpCodes.
1213 @param FormSet The FormSet to be counted.
1214 @param NumberOfStatement Number of Statemens(Questions)
1215 @param NumberOfExpression Number of Expression OpCodes
1220 IN FORM_BROWSER_FORMSET
*FormSet
,
1221 IN OUT UINT16
*NumberOfStatement
,
1222 IN OUT UINT16
*NumberOfExpression
1225 UINT16 StatementCount
;
1226 UINT16 ExpressionCount
;
1233 ExpressionCount
= 0;
1235 while (Offset
< FormSet
->IfrBinaryLength
) {
1236 OpCodeData
= FormSet
->IfrBinaryData
+ Offset
;
1237 OpCodeLen
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
1238 Offset
+= OpCodeLen
;
1240 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
)) {
1247 *NumberOfStatement
= StatementCount
;
1248 *NumberOfExpression
= ExpressionCount
;
1254 Parse opcodes in the formset IFR binary.
1256 @param FormSet Pointer of the FormSet data structure.
1258 @retval EFI_SUCCESS Opcode parse success.
1259 @retval Other Opcode parse fail.
1264 IN FORM_BROWSER_FORMSET
*FormSet
1268 FORM_BROWSER_FORM
*CurrentForm
;
1269 FORM_BROWSER_STATEMENT
*CurrentStatement
;
1270 FORM_BROWSER_STATEMENT
*ParentStatement
;
1271 EXPRESSION_OPCODE
*ExpressionOpCode
;
1272 FORM_EXPRESSION
*CurrentExpression
;
1279 FORMSET_STORAGE
*Storage
;
1280 FORMSET_DEFAULTSTORE
*DefaultStore
;
1281 QUESTION_DEFAULT
*CurrentDefault
;
1282 QUESTION_OPTION
*CurrentOption
;
1284 UINT16 NumberOfStatement
;
1285 UINT16 NumberOfExpression
;
1286 EFI_IMAGE_ID
*ImageId
;
1287 BOOLEAN SuppressForQuestion
;
1288 BOOLEAN SuppressForOption
;
1289 UINT16 DepthOfDisable
;
1290 BOOLEAN OpCodeDisabled
;
1291 BOOLEAN SingleOpCodeExpression
;
1292 BOOLEAN InScopeDefault
;
1293 EFI_HII_VALUE
*Value
;
1294 EFI_IFR_FORM_MAP_METHOD
*MapMethod
;
1295 UINT8 MapScopeDepth
;
1297 FORMSET_STORAGE
*VarStorage
;
1298 LIST_ENTRY
*MapExpressionList
;
1299 EFI_VARSTORE_ID TempVarstoreId
;
1300 BOOLEAN InScopeDisable
;
1301 INTN ConditionalExprCount
;
1302 BOOLEAN InUnknownScope
;
1305 SuppressForQuestion
= FALSE
;
1306 SuppressForOption
= FALSE
;
1307 InScopeDisable
= FALSE
;
1309 OpCodeDisabled
= FALSE
;
1310 SingleOpCodeExpression
= FALSE
;
1311 InScopeDefault
= FALSE
;
1312 CurrentExpression
= NULL
;
1313 CurrentDefault
= NULL
;
1314 CurrentOption
= NULL
;
1320 MapExpressionList
= NULL
;
1322 ConditionalExprCount
= 0;
1323 InUnknownScope
= FALSE
;
1327 // Get the number of Statements and Expressions
1329 CountOpCodes (FormSet
, &NumberOfStatement
, &NumberOfExpression
);
1331 mStatementIndex
= 0;
1332 mUsedQuestionId
= 1;
1333 FormSet
->StatementBuffer
= AllocateZeroPool (NumberOfStatement
* sizeof (FORM_BROWSER_STATEMENT
));
1334 if (FormSet
->StatementBuffer
== NULL
) {
1335 return EFI_OUT_OF_RESOURCES
;
1338 mExpressionOpCodeIndex
= 0;
1339 FormSet
->ExpressionBuffer
= AllocateZeroPool (NumberOfExpression
* sizeof (EXPRESSION_OPCODE
));
1340 if (FormSet
->ExpressionBuffer
== NULL
) {
1341 return EFI_OUT_OF_RESOURCES
;
1344 InitializeListHead (&FormSet
->StatementListOSF
);
1345 InitializeListHead (&FormSet
->StorageListHead
);
1346 InitializeListHead (&FormSet
->SaveFailStorageListHead
);
1347 InitializeListHead (&FormSet
->DefaultStoreListHead
);
1348 InitializeListHead (&FormSet
->FormListHead
);
1349 InitializeListHead (&FormSet
->ExpressionListHead
);
1350 ResetCurrentExpressionStack ();
1351 ResetMapExpressionListStack ();
1354 CurrentStatement
= NULL
;
1355 ParentStatement
= NULL
;
1360 while (OpCodeOffset
< FormSet
->IfrBinaryLength
) {
1361 OpCodeData
= FormSet
->IfrBinaryData
+ OpCodeOffset
;
1363 OpCodeLength
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
1364 OpCodeOffset
+= OpCodeLength
;
1365 Operand
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
;
1366 Scope
= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Scope
;
1368 if (InUnknownScope
) {
1369 if (Operand
== EFI_IFR_END_OP
) {
1372 if (UnknownDepth
== 0) {
1373 InUnknownScope
= FALSE
;
1384 if (IsUnKnownOpCode(Operand
)) {
1386 InUnknownScope
= TRUE
;
1394 // If scope bit set, push onto scope stack
1397 PushScope (Operand
);
1400 if (OpCodeDisabled
) {
1402 // DisableIf Expression is evaluated to be TRUE, try to find its end.
1403 // Here only cares the EFI_IFR_DISABLE_IF and EFI_IFR_END
1405 if (Operand
== EFI_IFR_DISABLE_IF_OP
) {
1407 } else if (Operand
== EFI_IFR_END_OP
) {
1408 Status
= PopScope (&ScopeOpCode
);
1409 if (EFI_ERROR (Status
)) {
1413 if (ScopeOpCode
== EFI_IFR_DISABLE_IF_OP
) {
1414 if (DepthOfDisable
== 0) {
1415 InScopeDisable
= FALSE
;
1416 OpCodeDisabled
= FALSE
;
1425 if (IsExpressionOpCode (Operand
)) {
1426 ExpressionOpCode
= &FormSet
->ExpressionBuffer
[mExpressionOpCodeIndex
];
1427 mExpressionOpCodeIndex
++;
1429 ExpressionOpCode
->Signature
= EXPRESSION_OPCODE_SIGNATURE
;
1430 ExpressionOpCode
->Operand
= Operand
;
1431 Value
= &ExpressionOpCode
->Value
;
1434 case EFI_IFR_EQ_ID_VAL_OP
:
1435 CopyMem (&ExpressionOpCode
->QuestionId
, &((EFI_IFR_EQ_ID_VAL
*) OpCodeData
)->QuestionId
, sizeof (EFI_QUESTION_ID
));
1437 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_16
;
1438 CopyMem (&Value
->Value
.u16
, &((EFI_IFR_EQ_ID_VAL
*) OpCodeData
)->Value
, sizeof (UINT16
));
1441 case EFI_IFR_EQ_ID_ID_OP
:
1442 CopyMem (&ExpressionOpCode
->QuestionId
, &((EFI_IFR_EQ_ID_ID
*) OpCodeData
)->QuestionId1
, sizeof (EFI_QUESTION_ID
));
1443 CopyMem (&ExpressionOpCode
->QuestionId2
, &((EFI_IFR_EQ_ID_ID
*) OpCodeData
)->QuestionId2
, sizeof (EFI_QUESTION_ID
));
1446 case EFI_IFR_EQ_ID_VAL_LIST_OP
:
1447 CopyMem (&ExpressionOpCode
->QuestionId
, &((EFI_IFR_EQ_ID_VAL_LIST
*) OpCodeData
)->QuestionId
, sizeof (EFI_QUESTION_ID
));
1448 CopyMem (&ExpressionOpCode
->ListLength
, &((EFI_IFR_EQ_ID_VAL_LIST
*) OpCodeData
)->ListLength
, sizeof (UINT16
));
1449 ExpressionOpCode
->ValueList
= AllocateCopyPool (ExpressionOpCode
->ListLength
* sizeof (UINT16
), &((EFI_IFR_EQ_ID_VAL_LIST
*) OpCodeData
)->ValueList
);
1452 case EFI_IFR_TO_STRING_OP
:
1453 case EFI_IFR_FIND_OP
:
1454 ExpressionOpCode
->Format
= (( EFI_IFR_TO_STRING
*) OpCodeData
)->Format
;
1457 case EFI_IFR_STRING_REF1_OP
:
1458 Value
->Type
= EFI_IFR_TYPE_STRING
;
1459 CopyMem (&Value
->Value
.string
, &(( EFI_IFR_STRING_REF1
*) OpCodeData
)->StringId
, sizeof (EFI_STRING_ID
));
1462 case EFI_IFR_RULE_REF_OP
:
1463 ExpressionOpCode
->RuleId
= (( EFI_IFR_RULE_REF
*) OpCodeData
)->RuleId
;
1466 case EFI_IFR_SPAN_OP
:
1467 ExpressionOpCode
->Flags
= (( EFI_IFR_SPAN
*) OpCodeData
)->Flags
;
1470 case EFI_IFR_THIS_OP
:
1471 ASSERT (ParentStatement
!= NULL
);
1472 ExpressionOpCode
->QuestionId
= ParentStatement
->QuestionId
;
1475 case EFI_IFR_SECURITY_OP
:
1476 CopyMem (&ExpressionOpCode
->Guid
, &((EFI_IFR_SECURITY
*) OpCodeData
)->Permissions
, sizeof (EFI_GUID
));
1479 case EFI_IFR_GET_OP
:
1480 case EFI_IFR_SET_OP
:
1481 CopyMem (&TempVarstoreId
, &((EFI_IFR_GET
*) OpCodeData
)->VarStoreId
, sizeof (TempVarstoreId
));
1482 if (TempVarstoreId
!= 0) {
1483 if (FormSet
->StorageListHead
.ForwardLink
!= NULL
) {
1484 Link
= GetFirstNode (&FormSet
->StorageListHead
);
1485 while (!IsNull (&FormSet
->StorageListHead
, Link
)) {
1486 VarStorage
= FORMSET_STORAGE_FROM_LINK (Link
);
1487 if (VarStorage
->VarStoreId
== ((EFI_IFR_GET
*) OpCodeData
)->VarStoreId
) {
1488 ExpressionOpCode
->VarStorage
= VarStorage
->BrowserStorage
;
1491 Link
= GetNextNode (&FormSet
->StorageListHead
, Link
);
1494 if (ExpressionOpCode
->VarStorage
== NULL
) {
1496 // VarStorage is not found.
1498 return EFI_INVALID_PARAMETER
;
1501 ExpressionOpCode
->ValueType
= ((EFI_IFR_GET
*) OpCodeData
)->VarStoreType
;
1502 switch (ExpressionOpCode
->ValueType
) {
1503 case EFI_IFR_TYPE_BOOLEAN
:
1504 case EFI_IFR_TYPE_NUM_SIZE_8
:
1505 ExpressionOpCode
->ValueWidth
= 1;
1508 case EFI_IFR_TYPE_NUM_SIZE_16
:
1509 case EFI_IFR_TYPE_STRING
:
1510 ExpressionOpCode
->ValueWidth
= 2;
1513 case EFI_IFR_TYPE_NUM_SIZE_32
:
1514 ExpressionOpCode
->ValueWidth
= 4;
1517 case EFI_IFR_TYPE_NUM_SIZE_64
:
1518 ExpressionOpCode
->ValueWidth
= 8;
1521 case EFI_IFR_TYPE_DATE
:
1522 ExpressionOpCode
->ValueWidth
= (UINT8
) sizeof (EFI_IFR_DATE
);
1525 case EFI_IFR_TYPE_TIME
:
1526 ExpressionOpCode
->ValueWidth
= (UINT8
) sizeof (EFI_IFR_TIME
);
1529 case EFI_IFR_TYPE_REF
:
1530 ExpressionOpCode
->ValueWidth
= (UINT8
) sizeof (EFI_IFR_REF
);
1533 case EFI_IFR_TYPE_OTHER
:
1534 case EFI_IFR_TYPE_UNDEFINED
:
1535 case EFI_IFR_TYPE_ACTION
:
1536 case EFI_IFR_TYPE_BUFFER
:
1539 // Invalid value type for Get/Set opcode.
1541 return EFI_INVALID_PARAMETER
;
1543 CopyMem (&ExpressionOpCode
->VarStoreInfo
.VarName
, &((EFI_IFR_GET
*) OpCodeData
)->VarStoreInfo
.VarName
, sizeof (EFI_STRING_ID
));
1544 CopyMem (&ExpressionOpCode
->VarStoreInfo
.VarOffset
, &((EFI_IFR_GET
*) OpCodeData
)->VarStoreInfo
.VarOffset
, sizeof (UINT16
));
1545 if ((ExpressionOpCode
->VarStorage
!= NULL
) &&
1546 (ExpressionOpCode
->VarStorage
->Type
== EFI_HII_VARSTORE_NAME_VALUE
||
1547 ExpressionOpCode
->VarStorage
->Type
== EFI_HII_VARSTORE_EFI_VARIABLE
)) {
1548 ExpressionOpCode
->ValueName
= GetToken (ExpressionOpCode
->VarStoreInfo
.VarName
, FormSet
->HiiHandle
);
1549 if (ExpressionOpCode
->ValueName
== NULL
) {
1551 // String ID is invalid.
1553 return EFI_INVALID_PARAMETER
;
1558 case EFI_IFR_QUESTION_REF1_OP
:
1559 CopyMem (&ExpressionOpCode
->QuestionId
, &((EFI_IFR_EQ_ID_VAL_LIST
*) OpCodeData
)->QuestionId
, sizeof (EFI_QUESTION_ID
));
1562 case EFI_IFR_QUESTION_REF3_OP
:
1563 if (OpCodeLength
>= sizeof (EFI_IFR_QUESTION_REF3_2
)) {
1564 CopyMem (&ExpressionOpCode
->DevicePath
, &(( EFI_IFR_QUESTION_REF3_2
*) OpCodeData
)->DevicePath
, sizeof (EFI_STRING_ID
));
1566 if (OpCodeLength
>= sizeof (EFI_IFR_QUESTION_REF3_3
)) {
1567 CopyMem (&ExpressionOpCode
->Guid
, &(( EFI_IFR_QUESTION_REF3_3
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
1575 case EFI_IFR_TRUE_OP
:
1576 Value
->Type
= EFI_IFR_TYPE_BOOLEAN
;
1577 Value
->Value
.b
= TRUE
;
1580 case EFI_IFR_FALSE_OP
:
1581 Value
->Type
= EFI_IFR_TYPE_BOOLEAN
;
1582 Value
->Value
.b
= FALSE
;
1585 case EFI_IFR_ONE_OP
:
1586 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_8
;
1587 Value
->Value
.u8
= 1;
1590 case EFI_IFR_ZERO_OP
:
1591 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_8
;
1592 Value
->Value
.u8
= 0;
1595 case EFI_IFR_ONES_OP
:
1596 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_64
;
1597 Value
->Value
.u64
= 0xffffffffffffffffULL
;
1600 case EFI_IFR_UINT8_OP
:
1601 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_8
;
1602 Value
->Value
.u8
= (( EFI_IFR_UINT8
*) OpCodeData
)->Value
;
1605 case EFI_IFR_UINT16_OP
:
1606 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_16
;
1607 CopyMem (&Value
->Value
.u16
, &(( EFI_IFR_UINT16
*) OpCodeData
)->Value
, sizeof (UINT16
));
1610 case EFI_IFR_UINT32_OP
:
1611 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_32
;
1612 CopyMem (&Value
->Value
.u32
, &(( EFI_IFR_UINT32
*) OpCodeData
)->Value
, sizeof (UINT32
));
1615 case EFI_IFR_UINT64_OP
:
1616 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_64
;
1617 CopyMem (&Value
->Value
.u64
, &(( EFI_IFR_UINT64
*) OpCodeData
)->Value
, sizeof (UINT64
));
1620 case EFI_IFR_UNDEFINED_OP
:
1621 Value
->Type
= EFI_IFR_TYPE_UNDEFINED
;
1624 case EFI_IFR_VERSION_OP
:
1625 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_16
;
1626 Value
->Value
.u16
= EFI_IFR_SPECIFICATION_VERSION
;
1633 // Create sub expression nested in MAP opcode
1635 if (CurrentExpression
== NULL
&& MapScopeDepth
> 0) {
1636 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
1637 ASSERT (MapExpressionList
!= NULL
);
1638 InsertTailList (MapExpressionList
, &CurrentExpression
->Link
);
1640 SingleOpCodeExpression
= TRUE
;
1643 ASSERT (CurrentExpression
!= NULL
);
1644 InsertTailList (&CurrentExpression
->OpCodeListHead
, &ExpressionOpCode
->Link
);
1645 if (Operand
== EFI_IFR_MAP_OP
) {
1647 // Store current Map Expression List.
1649 if (MapExpressionList
!= NULL
) {
1650 PushMapExpressionList (MapExpressionList
);
1653 // Initialize new Map Expression List.
1655 MapExpressionList
= &ExpressionOpCode
->MapExpressionList
;
1656 InitializeListHead (MapExpressionList
);
1658 // Store current expression.
1660 PushCurrentExpression (CurrentExpression
);
1661 CurrentExpression
= NULL
;
1663 } else if (SingleOpCodeExpression
) {
1665 // There are two cases to indicate the end of an Expression:
1666 // for single OpCode expression: one Expression OpCode
1667 // for expression consists of more than one OpCode: EFI_IFR_END
1669 SingleOpCodeExpression
= FALSE
;
1671 if (InScopeDisable
&& CurrentForm
== NULL
) {
1673 // This is DisableIf expression for Form, it should be a constant expression
1675 Status
= EvaluateExpression (FormSet
, CurrentForm
, CurrentExpression
);
1676 if (EFI_ERROR (Status
)) {
1680 OpCodeDisabled
= IsTrue(&CurrentExpression
->Result
);
1683 CurrentExpression
= NULL
;
1694 case EFI_IFR_FORM_SET_OP
:
1696 // Check the formset GUID
1698 if (CompareMem (&FormSet
->Guid
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
)) != 0) {
1699 return EFI_INVALID_PARAMETER
;
1702 CopyMem (&FormSet
->FormSetTitle
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->FormSetTitle
, sizeof (EFI_STRING_ID
));
1703 CopyMem (&FormSet
->Help
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Help
, sizeof (EFI_STRING_ID
));
1705 if (OpCodeLength
> OFFSET_OF (EFI_IFR_FORM_SET
, Flags
)) {
1707 // The formset OpCode contains ClassGuid
1709 FormSet
->NumberOfClassGuid
= (UINT8
) (((EFI_IFR_FORM_SET
*) OpCodeData
)->Flags
& 0x3);
1710 CopyMem (FormSet
->ClassGuid
, OpCodeData
+ sizeof (EFI_IFR_FORM_SET
), FormSet
->NumberOfClassGuid
* sizeof (EFI_GUID
));
1714 case EFI_IFR_FORM_OP
:
1716 // Create a new Form for this FormSet
1718 CurrentForm
= AllocateZeroPool (sizeof (FORM_BROWSER_FORM
));
1719 ASSERT (CurrentForm
!= NULL
);
1720 CurrentForm
->Signature
= FORM_BROWSER_FORM_SIGNATURE
;
1721 InitializeListHead (&CurrentForm
->ExpressionListHead
);
1722 InitializeListHead (&CurrentForm
->StatementListHead
);
1723 InitializeListHead (&CurrentForm
->ConfigRequestHead
);
1724 InitializeListHead (&CurrentForm
->FormViewListHead
);
1726 CurrentForm
->FormType
= STANDARD_MAP_FORM_TYPE
;
1727 CopyMem (&CurrentForm
->FormId
, &((EFI_IFR_FORM
*) OpCodeData
)->FormId
, sizeof (UINT16
));
1728 CopyMem (&CurrentForm
->FormTitle
, &((EFI_IFR_FORM
*) OpCodeData
)->FormTitle
, sizeof (EFI_STRING_ID
));
1730 ConditionalExprCount
= GetConditionalExpressionCount(ExpressForm
);
1731 if ( ConditionalExprCount
> 0) {
1733 // Form is inside of suppressif
1735 CurrentForm
->SuppressExpression
= (FORM_EXPRESSION_LIST
*) AllocatePool(
1736 (UINTN
) (sizeof(FORM_EXPRESSION_LIST
) + ((ConditionalExprCount
-1) * sizeof(FORM_EXPRESSION
*))));
1737 ASSERT (CurrentForm
->SuppressExpression
!= NULL
);
1738 CurrentForm
->SuppressExpression
->Count
= (UINTN
) ConditionalExprCount
;
1739 CurrentForm
->SuppressExpression
->Signature
= FORM_EXPRESSION_LIST_SIGNATURE
;
1740 CopyMem (CurrentForm
->SuppressExpression
->Expression
, GetConditionalExpressionList(ExpressForm
), (UINTN
) (sizeof (FORM_EXPRESSION
*) * ConditionalExprCount
));
1745 // Enter scope of a Form, suppressif will be used for Question or Option
1747 SuppressForQuestion
= TRUE
;
1751 // Insert into Form list of this FormSet
1753 InsertTailList (&FormSet
->FormListHead
, &CurrentForm
->Link
);
1756 case EFI_IFR_FORM_MAP_OP
:
1758 // Create a new Form for this FormSet
1760 CurrentForm
= AllocateZeroPool (sizeof (FORM_BROWSER_FORM
));
1761 ASSERT (CurrentForm
!= NULL
);
1762 CurrentForm
->Signature
= FORM_BROWSER_FORM_SIGNATURE
;
1763 InitializeListHead (&CurrentForm
->ExpressionListHead
);
1764 InitializeListHead (&CurrentForm
->StatementListHead
);
1765 InitializeListHead (&CurrentForm
->ConfigRequestHead
);
1766 InitializeListHead (&CurrentForm
->FormViewListHead
);
1768 CopyMem (&CurrentForm
->FormId
, &((EFI_IFR_FORM
*) OpCodeData
)->FormId
, sizeof (UINT16
));
1770 MapMethod
= (EFI_IFR_FORM_MAP_METHOD
*) (OpCodeData
+ sizeof (EFI_IFR_FORM_MAP
));
1772 // FormMap Form must contain at least one Map Method.
1774 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
< ((UINTN
) (UINT8
*) (MapMethod
+ 1) - (UINTN
) OpCodeData
)) {
1775 return EFI_INVALID_PARAMETER
;
1778 // Try to find the standard form map method.
1780 while (((UINTN
) (UINT8
*) MapMethod
- (UINTN
) OpCodeData
) < ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
) {
1781 if (CompareGuid ((EFI_GUID
*) (VOID
*) &MapMethod
->MethodIdentifier
, &gEfiHiiStandardFormGuid
)) {
1782 CopyMem (&CurrentForm
->FormTitle
, &MapMethod
->MethodTitle
, sizeof (EFI_STRING_ID
));
1783 CurrentForm
->FormType
= STANDARD_MAP_FORM_TYPE
;
1789 // If the standard form map method is not found, the first map method title will be used.
1791 if (CurrentForm
->FormTitle
== 0) {
1792 MapMethod
= (EFI_IFR_FORM_MAP_METHOD
*) (OpCodeData
+ sizeof (EFI_IFR_FORM_MAP
));
1793 CopyMem (&CurrentForm
->FormTitle
, &MapMethod
->MethodTitle
, sizeof (EFI_STRING_ID
));
1796 ConditionalExprCount
= GetConditionalExpressionCount(ExpressForm
);
1797 if ( ConditionalExprCount
> 0) {
1799 // Form is inside of suppressif
1801 CurrentForm
->SuppressExpression
= (FORM_EXPRESSION_LIST
*) AllocatePool(
1802 (UINTN
) (sizeof(FORM_EXPRESSION_LIST
) + ((ConditionalExprCount
-1) * sizeof(FORM_EXPRESSION
*))));
1803 ASSERT (CurrentForm
->SuppressExpression
!= NULL
);
1804 CurrentForm
->SuppressExpression
->Count
= (UINTN
) ConditionalExprCount
;
1805 CurrentForm
->SuppressExpression
->Signature
= FORM_EXPRESSION_LIST_SIGNATURE
;
1806 CopyMem (CurrentForm
->SuppressExpression
->Expression
, GetConditionalExpressionList(ExpressForm
), (UINTN
) (sizeof (FORM_EXPRESSION
*) * ConditionalExprCount
));
1811 // Enter scope of a Form, suppressif will be used for Question or Option
1813 SuppressForQuestion
= TRUE
;
1817 // Insert into Form list of this FormSet
1819 InsertTailList (&FormSet
->FormListHead
, &CurrentForm
->Link
);
1825 case EFI_IFR_VARSTORE_OP
:
1827 // Create a buffer Storage for this FormSet
1829 Storage
= CreateStorage (FormSet
, EFI_HII_VARSTORE_BUFFER
, OpCodeData
);
1830 CopyMem (&Storage
->VarStoreId
, &((EFI_IFR_VARSTORE
*) OpCodeData
)->VarStoreId
, sizeof (EFI_VARSTORE_ID
));
1833 case EFI_IFR_VARSTORE_NAME_VALUE_OP
:
1835 // Create a name/value Storage for this FormSet
1837 Storage
= CreateStorage (FormSet
, EFI_HII_VARSTORE_NAME_VALUE
, OpCodeData
);
1838 CopyMem (&Storage
->VarStoreId
, &((EFI_IFR_VARSTORE_NAME_VALUE
*) OpCodeData
)->VarStoreId
, sizeof (EFI_VARSTORE_ID
));
1841 case EFI_IFR_VARSTORE_EFI_OP
:
1843 // Create a EFI variable Storage for this FormSet
1845 if (OpCodeLength
< sizeof (EFI_IFR_VARSTORE_EFI
)) {
1847 // Create efi varstore with format follow UEFI spec before 2.3.1.
1849 Storage
= CreateStorage (FormSet
, EFI_HII_VARSTORE_EFI_VARIABLE
, OpCodeData
);
1852 // Create efi varstore with format follow UEFI spec 2.3.1 and later.
1854 Storage
= CreateStorage (FormSet
, EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER
, OpCodeData
);
1856 CopyMem (&Storage
->VarStoreId
, &((EFI_IFR_VARSTORE_EFI
*) OpCodeData
)->VarStoreId
, sizeof (EFI_VARSTORE_ID
));
1862 case EFI_IFR_DEFAULTSTORE_OP
:
1863 DefaultStore
= AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE
));
1864 ASSERT (DefaultStore
!= NULL
);
1865 DefaultStore
->Signature
= FORMSET_DEFAULTSTORE_SIGNATURE
;
1867 CopyMem (&DefaultStore
->DefaultId
, &((EFI_IFR_DEFAULTSTORE
*) OpCodeData
)->DefaultId
, sizeof (UINT16
));
1868 CopyMem (&DefaultStore
->DefaultName
, &((EFI_IFR_DEFAULTSTORE
*) OpCodeData
)->DefaultName
, sizeof (EFI_STRING_ID
));
1871 // Insert to DefaultStore list of this Formset
1873 InsertTailList (&FormSet
->DefaultStoreListHead
, &DefaultStore
->Link
);
1879 case EFI_IFR_SUBTITLE_OP
:
1880 CurrentStatement
= CreateStatement (OpCodeData
, FormSet
, CurrentForm
);
1881 ASSERT (CurrentStatement
!= NULL
);
1883 CurrentStatement
->Flags
= ((EFI_IFR_SUBTITLE
*) OpCodeData
)->Flags
;
1884 CurrentStatement
->FakeQuestionId
= mUsedQuestionId
++;
1887 case EFI_IFR_TEXT_OP
:
1888 CurrentStatement
= CreateStatement (OpCodeData
, FormSet
, CurrentForm
);
1889 ASSERT (CurrentStatement
!= NULL
);
1890 CurrentStatement
->FakeQuestionId
= mUsedQuestionId
++;
1891 CopyMem (&CurrentStatement
->TextTwo
, &((EFI_IFR_TEXT
*) OpCodeData
)->TextTwo
, sizeof (EFI_STRING_ID
));
1894 case EFI_IFR_RESET_BUTTON_OP
:
1895 CurrentStatement
= CreateStatement (OpCodeData
, FormSet
, CurrentForm
);
1896 ASSERT (CurrentStatement
!= NULL
);
1897 CurrentStatement
->FakeQuestionId
= mUsedQuestionId
++;
1898 CopyMem (&CurrentStatement
->DefaultId
, &((EFI_IFR_RESET_BUTTON
*) OpCodeData
)->DefaultId
, sizeof (EFI_DEFAULT_ID
));
1904 case EFI_IFR_ACTION_OP
:
1905 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
1906 ASSERT (CurrentStatement
!= NULL
);
1907 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_ACTION
;
1909 if (OpCodeLength
== sizeof (EFI_IFR_ACTION_1
)) {
1911 // No QuestionConfig present, so no configuration string will be processed
1913 CurrentStatement
->QuestionConfig
= 0;
1915 CopyMem (&CurrentStatement
->QuestionConfig
, &((EFI_IFR_ACTION
*) OpCodeData
)->QuestionConfig
, sizeof (EFI_STRING_ID
));
1919 case EFI_IFR_REF_OP
:
1920 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
1921 ASSERT (CurrentStatement
!= NULL
);
1922 Value
= &CurrentStatement
->HiiValue
;
1923 Value
->Type
= EFI_IFR_TYPE_REF
;
1924 if (OpCodeLength
>= sizeof (EFI_IFR_REF
)) {
1925 CopyMem (&Value
->Value
.ref
.FormId
, &((EFI_IFR_REF
*) OpCodeData
)->FormId
, sizeof (EFI_FORM_ID
));
1927 if (OpCodeLength
>= sizeof (EFI_IFR_REF2
)) {
1928 CopyMem (&Value
->Value
.ref
.QuestionId
, &((EFI_IFR_REF2
*) OpCodeData
)->QuestionId
, sizeof (EFI_QUESTION_ID
));
1930 if (OpCodeLength
>= sizeof (EFI_IFR_REF3
)) {
1931 CopyMem (&Value
->Value
.ref
.FormSetGuid
, &((EFI_IFR_REF3
*) OpCodeData
)->FormSetId
, sizeof (EFI_GUID
));
1933 if (OpCodeLength
>= sizeof (EFI_IFR_REF4
)) {
1934 CopyMem (&Value
->Value
.ref
.DevicePath
, &((EFI_IFR_REF4
*) OpCodeData
)->DevicePath
, sizeof (EFI_STRING_ID
));
1939 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (EFI_HII_REF
);
1940 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
1943 case EFI_IFR_ONE_OF_OP
:
1944 case EFI_IFR_NUMERIC_OP
:
1945 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
1946 ASSERT(CurrentStatement
!= NULL
);
1948 CurrentStatement
->Flags
= ((EFI_IFR_ONE_OF
*) OpCodeData
)->Flags
;
1949 Value
= &CurrentStatement
->HiiValue
;
1951 switch (CurrentStatement
->Flags
& EFI_IFR_NUMERIC_SIZE
) {
1952 case EFI_IFR_NUMERIC_SIZE_1
:
1953 CurrentStatement
->Minimum
= ((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u8
.MinValue
;
1954 CurrentStatement
->Maximum
= ((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u8
.MaxValue
;
1955 CurrentStatement
->Step
= ((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u8
.Step
;
1956 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (UINT8
);
1957 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_8
;
1960 case EFI_IFR_NUMERIC_SIZE_2
:
1961 CopyMem (&CurrentStatement
->Minimum
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u16
.MinValue
, sizeof (UINT16
));
1962 CopyMem (&CurrentStatement
->Maximum
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u16
.MaxValue
, sizeof (UINT16
));
1963 CopyMem (&CurrentStatement
->Step
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u16
.Step
, sizeof (UINT16
));
1964 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (UINT16
);
1965 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_16
;
1968 case EFI_IFR_NUMERIC_SIZE_4
:
1969 CopyMem (&CurrentStatement
->Minimum
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u32
.MinValue
, sizeof (UINT32
));
1970 CopyMem (&CurrentStatement
->Maximum
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u32
.MaxValue
, sizeof (UINT32
));
1971 CopyMem (&CurrentStatement
->Step
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u32
.Step
, sizeof (UINT32
));
1972 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (UINT32
);
1973 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_32
;
1976 case EFI_IFR_NUMERIC_SIZE_8
:
1977 CopyMem (&CurrentStatement
->Minimum
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u64
.MinValue
, sizeof (UINT64
));
1978 CopyMem (&CurrentStatement
->Maximum
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u64
.MaxValue
, sizeof (UINT64
));
1979 CopyMem (&CurrentStatement
->Step
, &((EFI_IFR_NUMERIC
*) OpCodeData
)->data
.u64
.Step
, sizeof (UINT64
));
1980 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (UINT64
);
1981 Value
->Type
= EFI_IFR_TYPE_NUM_SIZE_64
;
1988 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
1990 if ((Operand
== EFI_IFR_ONE_OF_OP
) && Scope
!= 0) {
1991 SuppressForOption
= TRUE
;
1995 case EFI_IFR_ORDERED_LIST_OP
:
1996 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
1997 ASSERT(CurrentStatement
!= NULL
);
1999 CurrentStatement
->Flags
= ((EFI_IFR_ORDERED_LIST
*) OpCodeData
)->Flags
;
2000 CurrentStatement
->MaxContainers
= ((EFI_IFR_ORDERED_LIST
*) OpCodeData
)->MaxContainers
;
2002 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_BUFFER
;
2003 CurrentStatement
->BufferValue
= NULL
;
2006 SuppressForOption
= TRUE
;
2010 case EFI_IFR_CHECKBOX_OP
:
2011 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
2012 ASSERT(CurrentStatement
!= NULL
);
2014 CurrentStatement
->Flags
= ((EFI_IFR_CHECKBOX
*) OpCodeData
)->Flags
;
2015 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (BOOLEAN
);
2016 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_BOOLEAN
;
2018 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
2022 case EFI_IFR_STRING_OP
:
2023 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
2024 ASSERT (CurrentStatement
!= NULL
);
2026 // MinSize is the minimum number of characters that can be accepted for this opcode,
2027 // MaxSize is the maximum number of characters that can be accepted for this opcode.
2028 // The characters are stored as Unicode, so the storage width should multiply 2.
2030 CurrentStatement
->Minimum
= ((EFI_IFR_STRING
*) OpCodeData
)->MinSize
;
2031 CurrentStatement
->Maximum
= ((EFI_IFR_STRING
*) OpCodeData
)->MaxSize
;
2032 CurrentStatement
->StorageWidth
= (UINT16
)((UINTN
) CurrentStatement
->Maximum
* sizeof (CHAR16
));
2033 CurrentStatement
->Flags
= ((EFI_IFR_STRING
*) OpCodeData
)->Flags
;
2035 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_STRING
;
2036 CurrentStatement
->BufferValue
= AllocateZeroPool (CurrentStatement
->StorageWidth
+ sizeof (CHAR16
));
2037 CurrentStatement
->HiiValue
.Value
.string
= NewString ((CHAR16
*) CurrentStatement
->BufferValue
, FormSet
->HiiHandle
);
2039 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
2042 case EFI_IFR_PASSWORD_OP
:
2043 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
2044 ASSERT (CurrentStatement
!= NULL
);
2046 // MinSize is the minimum number of characters that can be accepted for this opcode,
2047 // MaxSize is the maximum number of characters that can be accepted for this opcode.
2048 // The characters are stored as Unicode, so the storage width should multiply 2.
2050 CopyMem (&CurrentStatement
->Minimum
, &((EFI_IFR_PASSWORD
*) OpCodeData
)->MinSize
, sizeof (UINT16
));
2051 CopyMem (&CurrentStatement
->Maximum
, &((EFI_IFR_PASSWORD
*) OpCodeData
)->MaxSize
, sizeof (UINT16
));
2052 CurrentStatement
->StorageWidth
= (UINT16
)((UINTN
) CurrentStatement
->Maximum
* sizeof (CHAR16
));
2054 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_STRING
;
2055 CurrentStatement
->BufferValue
= AllocateZeroPool ((CurrentStatement
->StorageWidth
+ sizeof (CHAR16
)));
2056 CurrentStatement
->HiiValue
.Value
.string
= NewString ((CHAR16
*) CurrentStatement
->BufferValue
, FormSet
->HiiHandle
);
2058 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
2061 case EFI_IFR_DATE_OP
:
2062 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
2063 ASSERT(CurrentStatement
!= NULL
);
2065 CurrentStatement
->Flags
= ((EFI_IFR_DATE
*) OpCodeData
)->Flags
;
2066 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_DATE
;
2068 if ((CurrentStatement
->Flags
& EFI_QF_DATE_STORAGE
) == QF_DATE_STORAGE_NORMAL
) {
2069 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (EFI_HII_DATE
);
2071 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
2074 // Don't assign storage for RTC type of date/time
2076 CurrentStatement
->Storage
= NULL
;
2077 CurrentStatement
->StorageWidth
= 0;
2081 case EFI_IFR_TIME_OP
:
2082 CurrentStatement
= CreateQuestion (OpCodeData
, FormSet
, CurrentForm
);
2083 ASSERT(CurrentStatement
!= NULL
);
2085 CurrentStatement
->Flags
= ((EFI_IFR_TIME
*) OpCodeData
)->Flags
;
2086 CurrentStatement
->HiiValue
.Type
= EFI_IFR_TYPE_TIME
;
2088 if ((CurrentStatement
->Flags
& QF_TIME_STORAGE
) == QF_TIME_STORAGE_NORMAL
) {
2089 CurrentStatement
->StorageWidth
= (UINT16
) sizeof (EFI_HII_TIME
);
2091 InitializeRequestElement (FormSet
, CurrentStatement
, CurrentForm
);
2094 // Don't assign storage for RTC type of date/time
2096 CurrentStatement
->Storage
= NULL
;
2097 CurrentStatement
->StorageWidth
= 0;
2104 case EFI_IFR_DEFAULT_OP
:
2106 // EFI_IFR_DEFAULT appear in scope of a Question,
2107 // It creates a default value for the current question.
2108 // A Question may have more than one Default value which have different default types.
2110 CurrentDefault
= AllocateZeroPool (sizeof (QUESTION_DEFAULT
));
2111 ASSERT (CurrentDefault
!= NULL
);
2112 CurrentDefault
->Signature
= QUESTION_DEFAULT_SIGNATURE
;
2114 CurrentDefault
->Value
.Type
= ((EFI_IFR_DEFAULT
*) OpCodeData
)->Type
;
2115 CopyMem (&CurrentDefault
->DefaultId
, &((EFI_IFR_DEFAULT
*) OpCodeData
)->DefaultId
, sizeof (UINT16
));
2116 if (OpCodeLength
> OFFSET_OF (EFI_IFR_DEFAULT
, Value
)) {
2117 CopyMem (&CurrentDefault
->Value
.Value
, &((EFI_IFR_DEFAULT
*) OpCodeData
)->Value
, OpCodeLength
- OFFSET_OF (EFI_IFR_DEFAULT
, Value
));
2118 ExtendValueToU64 (&CurrentDefault
->Value
);
2122 // Insert to Default Value list of current Question
2124 InsertTailList (&ParentStatement
->DefaultListHead
, &CurrentDefault
->Link
);
2127 InScopeDefault
= TRUE
;
2134 case EFI_IFR_ONE_OF_OPTION_OP
:
2136 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.
2137 // It create a selection for use in current Question.
2139 CurrentOption
= AllocateZeroPool (sizeof (QUESTION_OPTION
));
2140 ASSERT (CurrentOption
!= NULL
);
2141 CurrentOption
->Signature
= QUESTION_OPTION_SIGNATURE
;
2142 CurrentOption
->OpCode
= (EFI_IFR_ONE_OF_OPTION
*) OpCodeData
;
2144 CurrentOption
->Flags
= ((EFI_IFR_ONE_OF_OPTION
*) OpCodeData
)->Flags
;
2145 CurrentOption
->Value
.Type
= ((EFI_IFR_ONE_OF_OPTION
*) OpCodeData
)->Type
;
2146 CopyMem (&CurrentOption
->Text
, &((EFI_IFR_ONE_OF_OPTION
*) OpCodeData
)->Option
, sizeof (EFI_STRING_ID
));
2147 CopyMem (&CurrentOption
->Value
.Value
, &((EFI_IFR_ONE_OF_OPTION
*) OpCodeData
)->Value
, OpCodeLength
- OFFSET_OF (EFI_IFR_ONE_OF_OPTION
, Value
));
2148 ExtendValueToU64 (&CurrentOption
->Value
);
2150 ConditionalExprCount
= GetConditionalExpressionCount(ExpressOption
);
2151 if ( ConditionalExprCount
> 0) {
2153 // Form is inside of suppressif
2155 CurrentOption
->SuppressExpression
= (FORM_EXPRESSION_LIST
*) AllocatePool(
2156 (UINTN
) (sizeof(FORM_EXPRESSION_LIST
) + ((ConditionalExprCount
-1) * sizeof(FORM_EXPRESSION
*))));
2157 ASSERT (CurrentOption
->SuppressExpression
!= NULL
);
2158 CurrentOption
->SuppressExpression
->Count
= (UINTN
) ConditionalExprCount
;
2159 CurrentOption
->SuppressExpression
->Signature
= FORM_EXPRESSION_LIST_SIGNATURE
;
2160 CopyMem (CurrentOption
->SuppressExpression
->Expression
, GetConditionalExpressionList(ExpressOption
), (UINTN
) (sizeof (FORM_EXPRESSION
*) * ConditionalExprCount
));
2163 ASSERT (ParentStatement
!= NULL
);
2165 // Insert to Option list of current Question
2167 InsertTailList (&ParentStatement
->OptionListHead
, &CurrentOption
->Link
);
2169 // Now we know the Storage width of nested Ordered List
2171 if ((ParentStatement
->Operand
== EFI_IFR_ORDERED_LIST_OP
) && (ParentStatement
->BufferValue
== NULL
)) {
2173 switch (CurrentOption
->Value
.Type
) {
2174 case EFI_IFR_TYPE_NUM_SIZE_8
:
2178 case EFI_IFR_TYPE_NUM_SIZE_16
:
2182 case EFI_IFR_TYPE_NUM_SIZE_32
:
2186 case EFI_IFR_TYPE_NUM_SIZE_64
:
2192 // Invalid type for Ordered List
2197 ParentStatement
->StorageWidth
= (UINT16
) (ParentStatement
->MaxContainers
* Width
);
2198 ParentStatement
->BufferValue
= AllocateZeroPool (ParentStatement
->StorageWidth
);
2199 ParentStatement
->ValueType
= CurrentOption
->Value
.Type
;
2200 if (ParentStatement
->HiiValue
.Type
== EFI_IFR_TYPE_BUFFER
) {
2201 ParentStatement
->HiiValue
.Buffer
= ParentStatement
->BufferValue
;
2202 ParentStatement
->HiiValue
.BufferLen
= ParentStatement
->StorageWidth
;
2205 InitializeRequestElement (FormSet
, ParentStatement
, CurrentForm
);
2212 case EFI_IFR_NO_SUBMIT_IF_OP
:
2213 case EFI_IFR_INCONSISTENT_IF_OP
:
2215 // Create an Expression node
2217 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2218 CopyMem (&CurrentExpression
->Error
, &((EFI_IFR_INCONSISTENT_IF
*) OpCodeData
)->Error
, sizeof (EFI_STRING_ID
));
2220 if (Operand
== EFI_IFR_NO_SUBMIT_IF_OP
) {
2221 CurrentExpression
->Type
= EFI_HII_EXPRESSION_NO_SUBMIT_IF
;
2222 InsertTailList (&ParentStatement
->NoSubmitListHead
, &CurrentExpression
->Link
);
2224 CurrentExpression
->Type
= EFI_HII_EXPRESSION_INCONSISTENT_IF
;
2225 InsertTailList (&ParentStatement
->InconsistentListHead
, &CurrentExpression
->Link
);
2229 // Take a look at next OpCode to see whether current expression consists
2232 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2233 SingleOpCodeExpression
= TRUE
;
2237 case EFI_IFR_WARNING_IF_OP
:
2239 // Create an Expression node
2241 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2242 CopyMem (&CurrentExpression
->Error
, &((EFI_IFR_WARNING_IF
*) OpCodeData
)->Warning
, sizeof (EFI_STRING_ID
));
2243 CurrentExpression
->TimeOut
= ((EFI_IFR_WARNING_IF
*) OpCodeData
)->TimeOut
;
2244 CurrentExpression
->Type
= EFI_HII_EXPRESSION_WARNING_IF
;
2245 InsertTailList (&ParentStatement
->WarningListHead
, &CurrentExpression
->Link
);
2248 // Take a look at next OpCode to see whether current expression consists
2251 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2252 SingleOpCodeExpression
= TRUE
;
2256 case EFI_IFR_SUPPRESS_IF_OP
:
2258 // Question and Option will appear in scope of this OpCode
2260 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2261 CurrentExpression
->Type
= EFI_HII_EXPRESSION_SUPPRESS_IF
;
2263 if (CurrentForm
== NULL
) {
2264 InsertTailList (&FormSet
->ExpressionListHead
, &CurrentExpression
->Link
);
2266 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2269 if (SuppressForOption
) {
2270 PushConditionalExpression(CurrentExpression
, ExpressOption
);
2271 } else if (SuppressForQuestion
) {
2272 PushConditionalExpression(CurrentExpression
, ExpressStatement
);
2274 PushConditionalExpression(CurrentExpression
, ExpressForm
);
2278 // Take a look at next OpCode to see whether current expression consists
2281 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2282 SingleOpCodeExpression
= TRUE
;
2286 case EFI_IFR_GRAY_OUT_IF_OP
:
2288 // Questions will appear in scope of this OpCode
2290 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2291 CurrentExpression
->Type
= EFI_HII_EXPRESSION_GRAY_OUT_IF
;
2292 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2293 PushConditionalExpression(CurrentExpression
, ExpressStatement
);
2296 // Take a look at next OpCode to see whether current expression consists
2299 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2300 SingleOpCodeExpression
= TRUE
;
2304 case EFI_IFR_DISABLE_IF_OP
:
2306 // The DisableIf expression should only rely on constant, so it could be
2307 // evaluated at initialization and it will not be queued
2309 CurrentExpression
= AllocateZeroPool (sizeof (FORM_EXPRESSION
));
2310 ASSERT (CurrentExpression
!= NULL
);
2311 CurrentExpression
->Signature
= FORM_EXPRESSION_SIGNATURE
;
2312 CurrentExpression
->Type
= EFI_HII_EXPRESSION_DISABLE_IF
;
2313 InitializeListHead (&CurrentExpression
->OpCodeListHead
);
2315 if (CurrentForm
!= NULL
) {
2317 // This is DisableIf for Question, enqueue it to Form expression list
2319 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2320 PushConditionalExpression(CurrentExpression
, ExpressStatement
);
2323 OpCodeDisabled
= FALSE
;
2324 InScopeDisable
= TRUE
;
2326 // Take a look at next OpCode to see whether current expression consists
2329 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2330 SingleOpCodeExpression
= TRUE
;
2337 case EFI_IFR_VALUE_OP
:
2338 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2339 CurrentExpression
->Type
= EFI_HII_EXPRESSION_VALUE
;
2340 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2342 if (InScopeDefault
) {
2344 // Used for default (EFI_IFR_DEFAULT)
2346 CurrentDefault
->ValueExpression
= CurrentExpression
;
2349 // If used for a question, then the question will be read-only
2352 // Make sure CurrentStatement is not NULL.
2353 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR
2354 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.
2356 ASSERT (ParentStatement
!= NULL
);
2357 ParentStatement
->ValueExpression
= CurrentExpression
;
2361 // Take a look at next OpCode to see whether current expression consists
2364 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2365 SingleOpCodeExpression
= TRUE
;
2369 case EFI_IFR_RULE_OP
:
2370 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2371 CurrentExpression
->Type
= EFI_HII_EXPRESSION_RULE
;
2373 CurrentExpression
->RuleId
= ((EFI_IFR_RULE
*) OpCodeData
)->RuleId
;
2374 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2377 // Take a look at next OpCode to see whether current expression consists
2380 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2381 SingleOpCodeExpression
= TRUE
;
2385 case EFI_IFR_READ_OP
:
2386 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2387 CurrentExpression
->Type
= EFI_HII_EXPRESSION_READ
;
2388 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2391 // Make sure CurrentStatement is not NULL.
2392 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR
2393 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.
2395 ASSERT (ParentStatement
!= NULL
);
2396 ParentStatement
->ReadExpression
= CurrentExpression
;
2399 // Take a look at next OpCode to see whether current expression consists
2402 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2403 SingleOpCodeExpression
= TRUE
;
2407 case EFI_IFR_WRITE_OP
:
2408 CurrentExpression
= CreateExpression (CurrentForm
, OpCodeData
);
2409 CurrentExpression
->Type
= EFI_HII_EXPRESSION_WRITE
;
2410 InsertTailList (&CurrentForm
->ExpressionListHead
, &CurrentExpression
->Link
);
2413 // Make sure CurrentStatement is not NULL.
2414 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR
2415 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.
2417 ASSERT (ParentStatement
!= NULL
);
2418 ParentStatement
->WriteExpression
= CurrentExpression
;
2421 // Take a look at next OpCode to see whether current expression consists
2424 if (((EFI_IFR_OP_HEADER
*) (OpCodeData
+ OpCodeLength
))->Scope
== 0) {
2425 SingleOpCodeExpression
= TRUE
;
2432 case EFI_IFR_IMAGE_OP
:
2434 // Get ScopeOpcode from top of stack
2436 PopScope (&ScopeOpCode
);
2437 PushScope (ScopeOpCode
);
2439 switch (ScopeOpCode
) {
2440 case EFI_IFR_FORM_SET_OP
:
2441 ImageId
= &FormSet
->ImageId
;
2444 case EFI_IFR_FORM_OP
:
2445 case EFI_IFR_FORM_MAP_OP
:
2446 ASSERT (CurrentForm
!= NULL
);
2447 ImageId
= &CurrentForm
->ImageId
;
2450 case EFI_IFR_ONE_OF_OPTION_OP
:
2451 ASSERT (CurrentOption
!= NULL
);
2452 ImageId
= &CurrentOption
->ImageId
;
2457 // Make sure CurrentStatement is not NULL.
2458 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR
2459 // file is wrongly generated by tools such as VFR Compiler.
2461 ASSERT (ParentStatement
!= NULL
);
2462 ImageId
= &ParentStatement
->ImageId
;
2466 ASSERT (ImageId
!= NULL
);
2467 CopyMem (ImageId
, &((EFI_IFR_IMAGE
*) OpCodeData
)->Id
, sizeof (EFI_IMAGE_ID
));
2473 case EFI_IFR_REFRESH_OP
:
2474 ASSERT (ParentStatement
!= NULL
);
2475 ParentStatement
->RefreshInterval
= ((EFI_IFR_REFRESH
*) OpCodeData
)->RefreshInterval
;
2481 case EFI_IFR_REFRESH_ID_OP
:
2482 ASSERT (ParentStatement
!= NULL
);
2483 CopyMem (&ParentStatement
->RefreshGuid
, &((EFI_IFR_REFRESH_ID
*) OpCodeData
)->RefreshEventGroupId
, sizeof (EFI_GUID
));
2489 case EFI_IFR_MODAL_TAG_OP
:
2490 ASSERT (CurrentForm
!= NULL
);
2491 CurrentForm
->ModalForm
= TRUE
;
2495 // Lock tag, used by form and statement.
2497 case EFI_IFR_LOCKED_OP
:
2499 // Get ScopeOpcode from top of stack
2501 PopScope (&ScopeOpCode
);
2502 PushScope (ScopeOpCode
);
2503 switch (ScopeOpCode
) {
2504 case EFI_IFR_FORM_OP
:
2505 case EFI_IFR_FORM_MAP_OP
:
2506 ASSERT (CurrentForm
!= NULL
);
2507 CurrentForm
->Locked
= TRUE
;
2511 ASSERT (ParentStatement
!= NULL
);
2512 ParentStatement
->Locked
= TRUE
;
2519 case EFI_IFR_GUID_OP
:
2520 CurrentStatement
= CreateStatement (OpCodeData
, FormSet
, CurrentForm
);
2526 case EFI_IFR_END_OP
:
2527 Status
= PopScope (&ScopeOpCode
);
2528 if (EFI_ERROR (Status
)) {
2534 // Parent statement end tag found, update ParentStatement info.
2536 if (IsStatementOpCode(ScopeOpCode
) && (ParentStatement
!= NULL
) && (ParentStatement
->Operand
== ScopeOpCode
)) {
2537 ParentStatement
= ParentStatement
->ParentStatement
;
2540 switch (ScopeOpCode
) {
2541 case EFI_IFR_FORM_SET_OP
:
2543 // End of FormSet, update FormSet IFR binary length
2544 // to stop parsing substantial OpCodes
2546 FormSet
->IfrBinaryLength
= OpCodeOffset
;
2549 case EFI_IFR_FORM_OP
:
2550 case EFI_IFR_FORM_MAP_OP
:
2555 SuppressForQuestion
= FALSE
;
2558 case EFI_IFR_ONE_OF_OPTION_OP
:
2562 CurrentOption
= NULL
;
2565 case EFI_IFR_NO_SUBMIT_IF_OP
:
2566 case EFI_IFR_INCONSISTENT_IF_OP
:
2567 case EFI_IFR_WARNING_IF_OP
:
2569 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF
2573 case EFI_IFR_SUPPRESS_IF_OP
:
2574 if (SuppressForOption
) {
2575 PopConditionalExpression(ExpressOption
);
2576 } else if (SuppressForQuestion
) {
2577 PopConditionalExpression(ExpressStatement
);
2579 PopConditionalExpression(ExpressForm
);
2583 case EFI_IFR_GRAY_OUT_IF_OP
:
2584 PopConditionalExpression(ExpressStatement
);
2587 case EFI_IFR_DISABLE_IF_OP
:
2588 if (CurrentForm
!= NULL
) {
2589 PopConditionalExpression(ExpressStatement
);
2591 InScopeDisable
= FALSE
;
2592 OpCodeDisabled
= FALSE
;
2595 case EFI_IFR_ONE_OF_OP
:
2596 case EFI_IFR_ORDERED_LIST_OP
:
2597 SuppressForOption
= FALSE
;
2600 case EFI_IFR_DEFAULT_OP
:
2601 InScopeDefault
= FALSE
;
2604 case EFI_IFR_MAP_OP
:
2606 // Get current Map Expression List.
2608 Status
= PopMapExpressionList ((VOID
**) &MapExpressionList
);
2609 if (Status
== EFI_ACCESS_DENIED
) {
2610 MapExpressionList
= NULL
;
2613 // Get current expression.
2615 Status
= PopCurrentExpression ((VOID
**) &CurrentExpression
);
2616 ASSERT_EFI_ERROR (Status
);
2617 ASSERT (MapScopeDepth
> 0);
2622 if (IsExpressionOpCode (ScopeOpCode
)) {
2623 if (InScopeDisable
&& CurrentForm
== NULL
) {
2625 // This is DisableIf expression for Form, it should be a constant expression
2627 ASSERT (CurrentExpression
!= NULL
);
2628 Status
= EvaluateExpression (FormSet
, CurrentForm
, CurrentExpression
);
2629 if (EFI_ERROR (Status
)) {
2633 OpCodeDisabled
= IsTrue (&CurrentExpression
->Result
);
2636 // DisableIf Expression is only used once and not queued, free it
2638 DestroyExpression (CurrentExpression
);
2642 // End of current Expression
2644 CurrentExpression
= NULL
;
2654 if (IsStatementOpCode(Operand
)) {
2655 CurrentStatement
->ParentStatement
= ParentStatement
;
2658 // Scope != 0, other statements or options may nest in this statement.
2659 // Update the ParentStatement info.
2661 ParentStatement
= CurrentStatement
;