EFI_HII_VALUE *mExpressionEvaluationStack = NULL;\r
EFI_HII_VALUE *mExpressionEvaluationStackEnd = NULL;\r
EFI_HII_VALUE *mExpressionEvaluationStackPointer = NULL;\r
+UINTN mExpressionEvaluationStackOffset = 0;\r
+\r
+EFI_HII_VALUE *mCurrentExpressionStack = NULL;\r
+EFI_HII_VALUE *mCurrentExpressionEnd = NULL;\r
+EFI_HII_VALUE *mCurrentExpressionPointer = NULL;\r
+\r
+EFI_HII_VALUE *mMapExpressionListStack = NULL;\r
+EFI_HII_VALUE *mMapExpressionListEnd = NULL;\r
+EFI_HII_VALUE *mMapExpressionListPointer = NULL;\r
\r
//\r
// Unicode collation protocol interface\r
/**\r
Pop an element from the stack.\r
\r
- @param Stack On input: old stack; On output: new stack\r
- @param StackPtr On input: old stack pointer; On output: new stack\r
- pointer\r
- @param StackEnd On input: old stack end; On output: new stack end\r
+ @param Stack On input: old stack\r
+ @param StackPtr On input: old stack pointer; On output: new stack pointer\r
@param Data Data to pop.\r
\r
@retval EFI_SUCCESS The value was popped onto the stack.\r
**/\r
EFI_STATUS\r
PopStack (\r
- IN OUT EFI_HII_VALUE **Stack,\r
+ IN EFI_HII_VALUE *Stack,\r
IN OUT EFI_HII_VALUE **StackPtr,\r
- IN OUT EFI_HII_VALUE **StackEnd,\r
OUT EFI_HII_VALUE *Data\r
)\r
{\r
//\r
// Check for a stack underflow condition\r
//\r
- if (*StackPtr == *Stack) {\r
+ if (*StackPtr == Stack) {\r
return EFI_ACCESS_DENIED;\r
}\r
\r
}\r
\r
\r
+/**\r
+ Reset stack pointer to begin of the stack.\r
+\r
+**/\r
+VOID\r
+ResetCurrentExpressionStack (\r
+ VOID\r
+ )\r
+{\r
+ mCurrentExpressionPointer = mCurrentExpressionStack;\r
+}\r
+\r
+\r
+/**\r
+ Push current expression onto the Stack\r
+\r
+ @param Pointer Pointer to current expression.\r
+\r
+ @retval EFI_SUCCESS The value was pushed onto the stack.\r
+ @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.\r
+\r
+**/\r
+EFI_STATUS\r
+PushCurrentExpression (\r
+ IN VOID *Pointer\r
+ )\r
+{\r
+ EFI_HII_VALUE Data;\r
+\r
+ Data.Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
+ Data.Value.u64 = (UINT64) (UINTN) Pointer;\r
+\r
+ return PushStack (\r
+ &mCurrentExpressionStack,\r
+ &mCurrentExpressionPointer,\r
+ &mCurrentExpressionEnd,\r
+ &Data\r
+ );\r
+}\r
+\r
+\r
+/**\r
+ Pop current expression from the Stack\r
+\r
+ @param Pointer Pointer to current expression to be pop.\r
+\r
+ @retval EFI_SUCCESS The value was pushed onto the stack.\r
+ @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.\r
+\r
+**/\r
+EFI_STATUS\r
+PopCurrentExpression (\r
+ OUT VOID **Pointer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_VALUE Data;\r
+\r
+ Status = PopStack (\r
+ mCurrentExpressionStack,\r
+ &mCurrentExpressionPointer,\r
+ &Data\r
+ );\r
+\r
+ *Pointer = (VOID *) (UINTN) Data.Value.u64;\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Reset stack pointer to begin of the stack.\r
+\r
+**/\r
+VOID\r
+ResetMapExpressionListStack (\r
+ VOID\r
+ )\r
+{\r
+ mMapExpressionListPointer = mMapExpressionListStack;\r
+}\r
+\r
+\r
+/**\r
+ Push the list of map expression onto the Stack\r
+\r
+ @param Pointer Pointer to the list of map expression to be pushed.\r
+\r
+ @retval EFI_SUCCESS The value was pushed onto the stack.\r
+ @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.\r
+\r
+**/\r
+EFI_STATUS\r
+PushMapExpressionList (\r
+ IN VOID *Pointer\r
+ )\r
+{\r
+ EFI_HII_VALUE Data;\r
+\r
+ Data.Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
+ Data.Value.u64 = (UINT64) (UINTN) Pointer;\r
+\r
+ return PushStack (\r
+ &mMapExpressionListStack,\r
+ &mMapExpressionListPointer,\r
+ &mMapExpressionListEnd,\r
+ &Data\r
+ );\r
+}\r
+\r
+\r
+/**\r
+ Pop the list of map expression from the Stack\r
+\r
+ @param Pointer Pointer to the list of map expression to be pop.\r
+\r
+ @retval EFI_SUCCESS The value was pushed onto the stack.\r
+ @retval EFI_OUT_OF_RESOURCES There is not enough system memory to grow the stack.\r
+\r
+**/\r
+EFI_STATUS\r
+PopMapExpressionList (\r
+ OUT VOID **Pointer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_VALUE Data;\r
+\r
+ Status = PopStack (\r
+ mMapExpressionListStack,\r
+ &mMapExpressionListPointer,\r
+ &Data\r
+ );\r
+\r
+ *Pointer = (VOID *) (UINTN) Data.Value.u64;\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
Reset stack pointer to begin of the stack.\r
\r
EFI_HII_VALUE Data;\r
\r
Status = PopStack (\r
- &mOpCodeScopeStack,\r
+ mOpCodeScopeStack,\r
&mOpCodeScopeStackPointer,\r
- &mOpCodeScopeStackEnd,\r
&Data\r
);\r
\r
}\r
\r
\r
-/**\r
- Reset stack pointer to begin of the stack.\r
-\r
-**/\r
-VOID\r
-ResetExpressionStack (\r
- VOID\r
- )\r
-{\r
- mExpressionEvaluationStackPointer = mExpressionEvaluationStack;\r
-}\r
-\r
-\r
/**\r
Push an Expression value onto the Stack\r
\r
)\r
{\r
return PopStack (\r
- &mExpressionEvaluationStack,\r
+ mExpressionEvaluationStack + mExpressionEvaluationStackOffset,\r
&mExpressionEvaluationStackPointer,\r
- &mExpressionEvaluationStackEnd,\r
Value\r
);\r
}\r
\r
+/**\r
+ Get current stack offset from stack start.\r
+\r
+ @return Stack offset to stack start.\r
+**/\r
+UINTN\r
+SaveExpressionEvaluationStackOffset (\r
+ )\r
+{\r
+ UINTN TempStackOffset;\r
+ TempStackOffset = mExpressionEvaluationStackOffset;\r
+ mExpressionEvaluationStackOffset = mExpressionEvaluationStackPointer - mExpressionEvaluationStack;\r
+ return TempStackOffset;\r
+}\r
+\r
+/**\r
+ Restore stack offset based on input stack offset\r
+\r
+ @param StackOffset Offset to stack start.\r
+\r
+**/\r
+VOID\r
+RestoreExpressionEvaluationStackOffset (\r
+ UINTN StackOffset\r
+ )\r
+{\r
+ mExpressionEvaluationStackOffset = StackOffset;\r
+}\r
\r
/**\r
Get Form given its FormId.\r
@param Value2 Expression value to compare on right-hand.\r
@param HiiHandle Only required for string compare.\r
\r
- @retval EFI_INVALID_PARAMETER Could not perform comparation on two values.\r
- @retval 0 Two operators equeal.\r
+ @retval EFI_INVALID_PARAMETER Could not perform compare on two values.\r
+ @retval 0 Two operators equal.\r
@return Positive value if Value1 is greater than Value2.\r
@retval Negative value if Value1 is less than Value2.\r
\r
EFI_HII_VALUE *Value;\r
INTN Result;\r
CHAR16 *StrPtr;\r
+ CHAR16 *NameValue;\r
UINT32 TempValue;\r
+ LIST_ENTRY *SubExpressionLink;\r
+ FORM_EXPRESSION *SubExpression;\r
+ UINTN StackOffset;\r
+ UINTN TempLength;\r
+ CHAR16 TempStr[5];\r
+ UINT8 DigitUint8;\r
+ UINT8 *TempBuffer;\r
+ EFI_TIME EfiTime;\r
\r
//\r
- // Always reset the stack before evaluating an Expression\r
+ // Save current stack offset.\r
//\r
- ResetExpressionStack ();\r
+ StackOffset = SaveExpressionEvaluationStackOffset ();\r
\r
ASSERT (Expression != NULL);\r
Expression->Result.Type = EFI_IFR_TYPE_OTHER;\r
case EFI_IFR_EQ_ID_VAL_OP:\r
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);\r
if (Question == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Result = CompareHiiValue (&Question->HiiValue, &OpCode->Value, NULL);\r
if (Result == EFI_INVALID_PARAMETER) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);\r
break;\r
case EFI_IFR_EQ_ID_ID_OP:\r
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);\r
if (Question == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Question2 = IdToQuestion (FormSet, Form, OpCode->QuestionId2);\r
if (Question2 == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Result = CompareHiiValue (&Question->HiiValue, &Question2->HiiValue, FormSet->HiiHandle);\r
if (Result == EFI_INVALID_PARAMETER) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);\r
break;\r
case EFI_IFR_EQ_ID_LIST_OP:\r
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);\r
if (Question == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Value->Value.b = FALSE;\r
case EFI_IFR_DUP_OP:\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
Status = PushExpression (Value);\r
case EFI_IFR_THIS_OP:\r
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);\r
if (Question == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Value = &Question->HiiValue;\r
Value->Value.b = CheckUserPrivilege (&OpCode->Guid);\r
break;\r
\r
+ case EFI_IFR_GET_OP:\r
+ //\r
+ // Get Value from VarStore buffer, EFI VarStore, Name/Value VarStore.\r
+ //\r
+ Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
+ Value->Value.u8 = 0;\r
+ if (OpCode->VarStorage != NULL) {\r
+ switch (OpCode->VarStorage->Type) {\r
+ case EFI_HII_VARSTORE_BUFFER:\r
+ //\r
+ // Get value from Edit Buffer\r
+ //\r
+ Value->Type = OpCode->ValueType;\r
+ CopyMem (&Value->Value, OpCode->VarStorage->EditBuffer + OpCode->VarStoreInfo.VarOffset, OpCode->ValueWidth);\r
+ break;\r
+ case EFI_HII_VARSTORE_NAME_VALUE:\r
+ if (OpCode->ValueType != EFI_IFR_TYPE_STRING) {\r
+ //\r
+ // Get value from string except for STRING value.\r
+ //\r
+ Status = GetValueByName (OpCode->VarStorage, OpCode->ValueName, &StrPtr);\r
+ if (!EFI_ERROR (Status)) {\r
+ TempLength = StrLen (StrPtr);\r
+ if (OpCode->ValueWidth >= ((TempLength + 1) / 2)) {\r
+ Value->Type = OpCode->ValueType;\r
+ TempBuffer = (UINT8 *) &Value->Value;\r
+ ZeroMem (TempStr, sizeof (TempStr));\r
+ for (Index = 0; Index < TempLength; Index ++) {\r
+ TempStr[0] = StrPtr[TempLength - Index - 1];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TempStr);\r
+ if ((Index & 1) == 0) {\r
+ TempBuffer [Index/2] = DigitUint8;\r
+ } else {\r
+ TempBuffer [Index/2] = (UINT8) ((DigitUint8 << 4) + TempStr [Index/2]);\r
+ }\r
+ }\r
+ } \r
+ }\r
+ }\r
+ break;\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+ //\r
+ // Get value from variable.\r
+ //\r
+ TempLength = OpCode->ValueWidth;\r
+ Value->Type = OpCode->ValueType;\r
+ Status = gRT->GetVariable (\r
+ OpCode->ValueName,\r
+ &OpCode->VarStorage->Guid,\r
+ NULL,\r
+ &TempLength,\r
+ &Value->Value\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
+ Value->Value.u8 = 0;\r
+ }\r
+ default:\r
+ //\r
+ // Not recognize storage.\r
+ //\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ }\r
+ } else {\r
+ //\r
+ // For Time/Date Data\r
+ //\r
+ if (OpCode->ValueType != EFI_IFR_TYPE_DATE && OpCode->ValueType != EFI_IFR_TYPE_TIME) {\r
+ //\r
+ // Only support Data/Time data when storage doesn't exist.\r
+ //\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ }\r
+ Status = gRT->GetTime (&EfiTime, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (OpCode->ValueType == EFI_IFR_TYPE_DATE) {\r
+ switch (OpCode->VarStoreInfo.VarOffset) {\r
+ case 0x00:\r
+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ Value->Value.u16 = EfiTime.Year;\r
+ break;\r
+ case 0x02:\r
+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ Value->Value.u8 = EfiTime.Month;\r
+ break;\r
+ case 0x03:\r
+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ Value->Value.u8 = EfiTime.Day;\r
+ break;\r
+ default:\r
+ //\r
+ // Invalid Date field.\r
+ //\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ } else {\r
+ switch (OpCode->VarStoreInfo.VarOffset) {\r
+ case 0x00:\r
+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ Value->Value.u8 = EfiTime.Hour;\r
+ break;\r
+ case 0x01:\r
+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ Value->Value.u8 = EfiTime.Minute;\r
+ break;\r
+ case 0x02:\r
+ Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ Value->Value.u8 = EfiTime.Second;\r
+ break;\r
+ default:\r
+ //\r
+ // Invalid Time field.\r
+ //\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ break;\r
+\r
case EFI_IFR_QUESTION_REF3_OP:\r
if (OpCode->DevicePath == 0) {\r
//\r
//\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
// Validate the expression value\r
//\r
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Question = IdToQuestion (FormSet, Form, Value->Value.u16);\r
if (Question == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
//\r
//\r
RuleExpression = RuleIdToExpression (Form, OpCode->RuleId);\r
if (RuleExpression == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
//\r
//\r
Status = EvaluateExpression (FormSet, Form, RuleExpression);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
Value = &RuleExpression->Result;\r
case EFI_IFR_LENGTH_OP:\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Value->Type != EFI_IFR_TYPE_STRING) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);\r
if (StrPtr == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
case EFI_IFR_NOT_OP:\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Value->Type != EFI_IFR_TYPE_BOOLEAN) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
Value->Value.b = (BOOLEAN) (!Value->Value.b);\r
break;\r
//\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
// Validate the expression value\r
//\r
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Question = IdToQuestion (FormSet, Form, Value->Value.u16);\r
if (Question == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Value = &Question->HiiValue;\r
//\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
// Validate the expression value\r
//\r
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
Value->Type = EFI_IFR_TYPE_STRING;\r
//\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
//\r
StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);\r
if (StrPtr == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
if ((StrCmp (StrPtr, L"true") == 0) || (StrCmp (StrPtr, L"false") == 0)){\r
case EFI_IFR_TO_UPPER_OP:\r
Status = InitializeUnicodeCollationProtocol ();\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
if (Value->Type != EFI_IFR_TYPE_STRING) {\r
- return EFI_UNSUPPORTED;\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
}\r
\r
StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);\r
if (StrPtr == NULL) {\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
if (OpCode->Operand == EFI_IFR_TO_LOWER_OP) {\r
//\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Value->Type > EFI_IFR_TYPE_DATE) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
Value->Value.u64 = ~Value->Value.u64;\r
break;\r
\r
+ case EFI_IFR_SET_OP:\r
+ //\r
+ // Pop an expression from the expression stack\r
+ //\r
+ Status = PopExpression (Value);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ Data1.Type = EFI_IFR_TYPE_BOOLEAN;\r
+ Data1.Value.b = FALSE;\r
+ //\r
+ // Set value to var storage buffer\r
+ //\r
+ if (OpCode->VarStorage != NULL) {\r
+ switch (OpCode->VarStorage->Type) {\r
+ case EFI_HII_VARSTORE_BUFFER:\r
+ CopyMem (OpCode->VarStorage->EditBuffer + OpCode->VarStoreInfo.VarOffset, &Value->Value, OpCode->ValueWidth);\r
+ Data1.Value.b = TRUE;\r
+ break;\r
+ case EFI_HII_VARSTORE_NAME_VALUE:\r
+ if (OpCode->ValueType != EFI_IFR_TYPE_STRING) {\r
+ NameValue = AllocateZeroPool ((OpCode->ValueWidth * 2 + 1) * sizeof (CHAR16));\r
+ ASSERT (Value != NULL);\r
+ //\r
+ // Convert Buffer to Hex String\r
+ //\r
+ TempBuffer = (UINT8 *) &Value->Value + OpCode->ValueWidth - 1;\r
+ StrPtr = NameValue;\r
+ for (Index = 0; Index < OpCode->ValueWidth; Index ++, TempBuffer --) {\r
+ StrPtr += UnicodeValueToString (StrPtr, PREFIX_ZERO | RADIX_HEX, *TempBuffer, 2);\r
+ }\r
+ Status = SetValueByName (OpCode->VarStorage, OpCode->ValueName, NameValue);\r
+ FreePool (NameValue);\r
+ if (!EFI_ERROR (Status)) {\r
+ Data1.Value.b = TRUE;\r
+ }\r
+ }\r
+ break;\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+ Status = gRT->SetVariable (\r
+ OpCode->ValueName,\r
+ &OpCode->VarStorage->Guid,\r
+ OpCode->VarStorage->Attributes,\r
+ OpCode->ValueWidth,\r
+ &Value->Value\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ Data1.Value.b = TRUE;\r
+ }\r
+ break;\r
+ default:\r
+ //\r
+ // Not recognize storage.\r
+ //\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ break;\r
+ }\r
+ } else {\r
+ //\r
+ // For Time/Date Data\r
+ //\r
+ if (OpCode->ValueType != EFI_IFR_TYPE_DATE && OpCode->ValueType != EFI_IFR_TYPE_TIME) {\r
+ //\r
+ // Only support Data/Time data when storage doesn't exist.\r
+ //\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ }\r
+ Status = gRT->GetTime (&EfiTime, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (OpCode->ValueType == EFI_IFR_TYPE_DATE) {\r
+ switch (OpCode->VarStoreInfo.VarOffset) {\r
+ case 0x00:\r
+ EfiTime.Year = Value->Value.u16;\r
+ break;\r
+ case 0x02:\r
+ EfiTime.Month = Value->Value.u8;\r
+ break;\r
+ case 0x03:\r
+ EfiTime.Day = Value->Value.u8;\r
+ break;\r
+ default:\r
+ //\r
+ // Invalid Date field.\r
+ //\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ } else {\r
+ switch (OpCode->VarStoreInfo.VarOffset) {\r
+ case 0x00:\r
+ EfiTime.Hour = Value->Value.u8;\r
+ break;\r
+ case 0x01:\r
+ EfiTime.Minute = Value->Value.u8;\r
+ break;\r
+ case 0x02:\r
+ EfiTime.Second = Value->Value.u8;\r
+ break;\r
+ default:\r
+ //\r
+ // Invalid Time field.\r
+ //\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ }\r
+ Status = gRT->SetTime (&EfiTime);\r
+ if (!EFI_ERROR (Status)) {\r
+ Data1.Value.b = TRUE;\r
+ }\r
+ }\r
+ }\r
+ Value = &Data1;\r
+ break;\r
+\r
//\r
// binary-op\r
//\r
//\r
Status = PopExpression (&Data2);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Data2.Type > EFI_IFR_TYPE_DATE) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
//\r
//\r
Status = PopExpression (&Data1);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Data1.Type > EFI_IFR_TYPE_DATE) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
//\r
Status = PopExpression (&Data2);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Data2.Type != EFI_IFR_TYPE_BOOLEAN) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
//\r
//\r
Status = PopExpression (&Data1);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
if (OpCode->Operand == EFI_IFR_AND_OP) {\r
//\r
Status = PopExpression (&Data2);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Data2.Type > EFI_IFR_TYPE_BOOLEAN && Data2.Type != EFI_IFR_TYPE_STRING) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
//\r
//\r
Status = PopExpression (&Data1);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
Result = CompareHiiValue (&Data1, &Data2, FormSet->HiiHandle);\r
if (Result == EFI_INVALID_PARAMETER) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
switch (OpCode->Operand) {\r
//\r
Status = PopExpression (&Data3);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
//\r
Status = PopExpression (&Data2);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
//\r
Status = PopExpression (&Data1);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
if (Data1.Value.b) {\r
Status = IfrSpan (FormSet, OpCode->Flags, Value);\r
break;\r
\r
+ case EFI_IFR_MAP_OP:\r
+ //\r
+ // Pop the check value\r
+ //\r
+ Status = PopExpression (&Data1);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ //\r
+ // Check MapExpression list is valid.\r
+ //\r
+ if (OpCode->MapExpressionList.ForwardLink == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ //\r
+ // Go through map expression list.\r
+ //\r
+ SubExpressionLink = GetFirstNode(&OpCode->MapExpressionList);\r
+ while (!IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {\r
+ SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);\r
+ //\r
+ // Evaluate the first expression in this pair.\r
+ //\r
+ Status = EvaluateExpression (FormSet, Form, SubExpression);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ //\r
+ // Compare the expression value with current value\r
+ //\r
+ if (CompareHiiValue (&Data1, &SubExpression->Result, NULL) == 0) {\r
+ //\r
+ // Try get the map value.\r
+ //\r
+ SubExpressionLink = GetNextNode (&OpCode->MapExpressionList, SubExpressionLink);\r
+ if (IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);\r
+ Status = EvaluateExpression (FormSet, Form, SubExpression);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ Value = &SubExpression->Result;\r
+ break;\r
+ }\r
+ //\r
+ // Skip the second expression on this pair.\r
+ //\r
+ SubExpressionLink = GetNextNode (&OpCode->MapExpressionList, SubExpressionLink);\r
+ if (IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ //\r
+ // Goto the first expression on next pair.\r
+ //\r
+ SubExpressionLink = GetNextNode (&OpCode->MapExpressionList, SubExpressionLink);\r
+ }\r
+\r
+ //\r
+ // No map value is found.\r
+ //\r
+ if (IsNull (&OpCode->MapExpressionList, SubExpressionLink)) {\r
+ Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
+ Value->Value.u8 = 0;\r
+ }\r
+ break;\r
+\r
default:\r
break;\r
}\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
Status = PushExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
}\r
\r
Value = &Data1;\r
Status = PopExpression (Value);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
// After evaluating an expression, there should be only one value left on the expression stack\r
//\r
if (PopExpression (Value) != EFI_ACCESS_DENIED) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
}\r
\r
- CopyMem (&Expression->Result, Value, sizeof (EFI_HII_VALUE));\r
+Done:\r
+ RestoreExpressionEvaluationStackOffset (StackOffset);\r
+ if (!EFI_ERROR (Status)) {\r
+ CopyMem (&Expression->Result, Value, sizeof (EFI_HII_VALUE));\r
+ }\r
\r
- return EFI_SUCCESS;\r
+ return Status;\r
}\r
{\r
LIST_ENTRY *Link;\r
EXPRESSION_OPCODE *OpCode;\r
+ LIST_ENTRY *SubExpressionLink;\r
+ FORM_EXPRESSION *SubExpression;\r
\r
while (!IsListEmpty (&Expression->OpCodeListHead)) {\r
Link = GetFirstNode (&Expression->OpCodeListHead);\r
if (OpCode->ValueList != NULL) {\r
FreePool (OpCode->ValueList);\r
}\r
+\r
+ if (OpCode->ValueName != NULL) {\r
+ FreePool (OpCode->ValueName);\r
+ }\r
+\r
+ if (OpCode->MapExpressionList.ForwardLink != NULL) {\r
+ while (!IsListEmpty (&OpCode->MapExpressionList)) {\r
+ SubExpressionLink = GetFirstNode(&OpCode->MapExpressionList);\r
+ SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);\r
+ RemoveEntryList(&SubExpression->Link);\r
+ DestroyExpression (SubExpression);\r
+ }\r
+ }\r
}\r
\r
//\r
)\r
{\r
if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
- ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
+ ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SET_OP)) ||\r
+ ((Operand >= EFI_IFR_EQUAL_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
(Operand == EFI_IFR_CATENATE_OP) ||\r
(Operand == EFI_IFR_TO_LOWER_OP) ||\r
(Operand == EFI_IFR_TO_UPPER_OP) ||\r
+ (Operand == EFI_IFR_MAP_OP) ||\r
(Operand == EFI_IFR_VERSION_OP) ||\r
(Operand == EFI_IFR_SECURITY_OP)) {\r
return TRUE;\r
BOOLEAN SingleOpCodeExpression;\r
BOOLEAN InScopeDefault;\r
EFI_HII_VALUE *Value;\r
+ EFI_IFR_FORM_MAP_METHOD *MapMethod;\r
+ UINT8 MapScopeDepth;\r
+ LIST_ENTRY *Link;\r
+ FORMSET_STORAGE *VarStorage;\r
+ LIST_ENTRY *MapExpressionList;\r
+ EFI_VARSTORE_ID TempVarstoreId;\r
\r
mInScopeSubtitle = FALSE;\r
SuppressForQuestion = FALSE;\r
OptionSuppressExpression = NULL;\r
FormSuppressExpression = NULL;\r
ImageId = NULL;\r
+ MapMethod = NULL;\r
+ MapScopeDepth = 0;\r
+ Link = NULL;\r
+ VarStorage = NULL;\r
+ MapExpressionList = NULL;\r
+ TempVarstoreId = 0;\r
\r
//\r
// Get the number of Statements and Expressions\r
InitializeListHead (&FormSet->StorageListHead);\r
InitializeListHead (&FormSet->DefaultStoreListHead);\r
InitializeListHead (&FormSet->FormListHead);\r
+ ResetCurrentExpressionStack ();\r
+ ResetMapExpressionListStack ();\r
\r
CurrentForm = NULL;\r
CurrentStatement = NULL;\r
CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));\r
break;\r
\r
+ case EFI_IFR_GET_OP:\r
+ case EFI_IFR_SET_OP:\r
+ CopyMem (&TempVarstoreId, &((EFI_IFR_GET *) OpCodeData)->VarStoreId, sizeof (TempVarstoreId));\r
+ if (TempVarstoreId != 0) {\r
+ if (FormSet->StorageListHead.ForwardLink != NULL) {\r
+ Link = GetFirstNode (&FormSet->StorageListHead);\r
+ while (!IsNull (&FormSet->StorageListHead, Link)) {\r
+ VarStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
+ if (VarStorage->VarStoreId == ((EFI_IFR_GET *) OpCodeData)->VarStoreId) {\r
+ ExpressionOpCode->VarStorage = VarStorage;\r
+ break;\r
+ }\r
+ Link = GetNextNode (&FormSet->StorageListHead, Link);\r
+ }\r
+ }\r
+ if (ExpressionOpCode->VarStorage == NULL) {\r
+ //\r
+ // VarStorage is not found.\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+ ExpressionOpCode->ValueType = ((EFI_IFR_GET *) OpCodeData)->VarStoreType;\r
+ switch (ExpressionOpCode->ValueType) {\r
+ case EFI_IFR_TYPE_BOOLEAN:\r
+ case EFI_IFR_TYPE_NUM_SIZE_8: \r
+ ExpressionOpCode->ValueWidth = 1;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ case EFI_IFR_TYPE_STRING:\r
+ ExpressionOpCode->ValueWidth = 2;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ ExpressionOpCode->ValueWidth = 4;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ ExpressionOpCode->ValueWidth = 8;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_DATE:\r
+ ExpressionOpCode->ValueWidth = sizeof (EFI_IFR_DATE);\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_TIME:\r
+ ExpressionOpCode->ValueWidth = sizeof (EFI_IFR_TIME);\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_OTHER:\r
+ case EFI_IFR_TYPE_UNDEFINED:\r
+ case EFI_IFR_TYPE_ACTION:\r
+ case EFI_IFR_TYPE_BUFFER:\r
+ default:\r
+ //\r
+ // Invalid value type for Get/Set opcode.\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ CopyMem (&ExpressionOpCode->VarStoreInfo.VarName, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarName, sizeof (EFI_STRING_ID));\r
+ CopyMem (&ExpressionOpCode->VarStoreInfo.VarOffset, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarOffset, sizeof (UINT16));\r
+ if ((ExpressionOpCode->VarStorage != NULL) && \r
+ (ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_NAME_VALUE || \r
+ ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
+ ExpressionOpCode->ValueName = GetToken (ExpressionOpCode->VarStoreInfo.VarName, FormSet->HiiHandle);\r
+ if (ExpressionOpCode->ValueName == NULL) {\r
+ //\r
+ // String ID is invalid.\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+ break;\r
+\r
case EFI_IFR_QUESTION_REF1_OP:\r
CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
break;\r
default:\r
break;\r
}\r
-\r
+ //\r
+ // Create sub expression nested in MAP opcode\r
+ //\r
+ if (CurrentExpression == NULL && MapScopeDepth > 0) {\r
+ CurrentExpression = CreateExpression (CurrentForm);\r
+ InsertTailList (MapExpressionList, &CurrentExpression->Link);\r
+ if (Scope == 0) {\r
+ SingleOpCodeExpression = TRUE;\r
+ }\r
+ }\r
ASSERT (CurrentExpression != NULL);\r
InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
-\r
- if (SingleOpCodeExpression) {\r
+ if (Operand == EFI_IFR_MAP_OP) {\r
+ //\r
+ // Store current Map Expression List.\r
+ //\r
+ if (MapExpressionList != NULL) {\r
+ PushMapExpressionList (MapExpressionList);\r
+ }\r
+ //\r
+ // Initialize new Map Expression List.\r
+ //\r
+ MapExpressionList = &ExpressionOpCode->MapExpressionList;\r
+ InitializeListHead (MapExpressionList);\r
+ //\r
+ // Store current expression.\r
+ //\r
+ PushCurrentExpression (CurrentExpression);\r
+ CurrentExpression = NULL;\r
+ MapScopeDepth ++;\r
+ } else if (SingleOpCodeExpression) {\r
//\r
// There are two cases to indicate the end of an Expression:\r
// for single OpCode expression: one Expression OpCode\r
InitializeListHead (&CurrentForm->ExpressionListHead);\r
InitializeListHead (&CurrentForm->StatementListHead);\r
\r
+ CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
\r
InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
break;\r
\r
+ case EFI_IFR_FORM_MAP_OP:\r
+ //\r
+ // Create a new Form for this FormSet\r
+ //\r
+ CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+ ASSERT (CurrentForm != NULL);\r
+ CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
+ InitializeListHead (&CurrentForm->ExpressionListHead);\r
+ InitializeListHead (&CurrentForm->StatementListHead);\r
+ CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
+\r
+ MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
+ //\r
+ // FormMap Form must contain at least one Map Method.\r
+ //\r
+ if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length < ((UINTN) (UINT8 *) (MapMethod + 1) - (UINTN) OpCodeData)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // Try to find the standard form map method.\r
+ //\r
+ while (((UINTN) (UINT8 *) MapMethod - (UINTN) OpCodeData) < ((EFI_IFR_OP_HEADER *) OpCodeData)->Length) {\r
+ if (CompareGuid ((EFI_GUID *) (VOID *) &MapMethod->MethodIdentifier, &gEfiHiiStandardFormGuid)) {\r
+ CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
+ CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
+ break;\r
+ }\r
+ MapMethod ++;\r
+ }\r
+ //\r
+ // If the standard form map method is not found, the first map method title will be used.\r
+ //\r
+ if (CurrentForm->FormTitle == 0) {\r
+ MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
+ CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
+ }\r
+\r
+ if (InScopeFormSuppress) {\r
+ //\r
+ // Form is inside of suppressif\r
+ //\r
+ CurrentForm->SuppressExpression = FormSuppressExpression;\r
+ }\r
+\r
+ if (Scope != 0) {\r
+ //\r
+ // Enter scope of a Form, suppressif will be used for Question or Option\r
+ //\r
+ SuppressForQuestion = TRUE;\r
+ }\r
+\r
+ //\r
+ // Insert into Form list of this FormSet\r
+ //\r
+ InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
+ break;\r
+\r
//\r
// Storage\r
//\r
}\r
break;\r
\r
+ case EFI_IFR_READ_OP:\r
+ CurrentExpression = CreateExpression (CurrentForm);\r
+ CurrentExpression->Type = EFI_HII_EXPRESSION_READ;\r
+ InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+\r
+ //\r
+ // Make sure CurrentStatement is not NULL.\r
+ // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+ // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
+ //\r
+ ASSERT (CurrentStatement != NULL);\r
+ CurrentStatement->ReadExpression = CurrentExpression;\r
+\r
+ //\r
+ // Take a look at next OpCode to see whether current expression consists\r
+ // of single OpCode\r
+ //\r
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
+ SingleOpCodeExpression = TRUE;\r
+ }\r
+ break;\r
+\r
+ case EFI_IFR_WRITE_OP:\r
+ CurrentExpression = CreateExpression (CurrentForm);\r
+ CurrentExpression->Type = EFI_HII_EXPRESSION_WRITE;\r
+ InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+\r
+ //\r
+ // Make sure CurrentStatement is not NULL.\r
+ // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+ // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
+ //\r
+ ASSERT (CurrentStatement != NULL);\r
+ CurrentStatement->WriteExpression = CurrentExpression;\r
+\r
+ //\r
+ // Take a look at next OpCode to see whether current expression consists\r
+ // of single OpCode\r
+ //\r
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
+ SingleOpCodeExpression = TRUE;\r
+ }\r
+ break;\r
+\r
//\r
// Image\r
//\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
+ case EFI_IFR_FORM_MAP_OP:\r
ASSERT (CurrentForm != NULL);\r
ImageId = &CurrentForm->ImageId;\r
break;\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
+ case EFI_IFR_FORM_MAP_OP:\r
//\r
// End of Form\r
//\r
InScopeDefault = FALSE;\r
break;\r
\r
+ case EFI_IFR_MAP_OP:\r
+ //\r
+ // Get current Map Expression List.\r
+ //\r
+ Status = PopMapExpressionList ((VOID **) &MapExpressionList);\r
+ if (Status == EFI_ACCESS_DENIED) {\r
+ MapExpressionList = NULL;\r
+ }\r
+ //\r
+ // Get current expression.\r
+ //\r
+ Status = PopCurrentExpression ((VOID **) &CurrentExpression);\r
+ ASSERT_EFI_ERROR (Status);\r
+ MapScopeDepth --;\r
+ break;\r
+\r
default:\r
if (IsExpressionOpCode (ScopeOpCode)) {\r
if (mInScopeDisable && CurrentForm == NULL) {\r
\r
OpCodeDisabled = CurrentExpression->Result.Value.b;\r
//\r
- // DisableIf Expression is only used once and not quequed, free it\r
+ // DisableIf Expression is only used once and not queued, free it\r
//\r
DestroyExpression (CurrentExpression);\r
}\r