/*++ @file\r
Vfr Syntax\r
\r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
#token InteractiveFlag("INTERACTIVE") "INTERACTIVE"\r
#token NVAccessFlag("NV_ACCESS") "NV_ACCESS"\r
#token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"\r
+#token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED"\r
#token LateCheckFlag("LATE_CHECK") "LATE_CHECK"\r
#token ReadOnlyFlag("READ_ONLY") "READ_ONLY"\r
#token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"\r
CHAR8 *TypeName;\r
UINT32 LineNum;\r
CHAR8 *StoreName = NULL;\r
+ BOOLEAN CustomizedName = FALSE;\r
>>\r
E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>\r
(\r
- TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
+ TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >>\r
| U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
| U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
| C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
if (StoreName == NULL) {\r
_PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!");\r
}\r
+ if (!CustomizedName) {\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, E->getLine(), "Old style efivarstore must have String Identifier!");\r
+ return;\r
+ }\r
Size = _STOU32(N->getText(), N->getLine());\r
switch (Size) {\r
case 1:\r
ReadOnlyFlag << $Flags |= 0x01; >>\r
| InteractiveFlag << $Flags |= 0x04; >>\r
| ResetRequiredFlag << $Flags |= 0x10; >>\r
+ | ReconnectRequiredFlag << $Flags |= 0x40; >>\r
| O:OptionOnlyFlag << \r
if (mCompatibleMode) {\r
$Flags |= 0x80;\r
)\r
;\r
\r
-vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
- <<\r
- EFI_GUID Guid;\r
+vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
+ << \r
+ EFI_GUID Guid;\r
+ BOOLEAN Negative = FALSE;\r
+ BOOLEAN IntDecStyle = FALSE;\r
+ CIfrNumeric *NumericQst = NULL;\r
+ if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+ NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+ IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;\r
+ }\r
+ UINT8 *Type8 = (UINT8 *) &Value;\r
+ UINT16 *Type16 = (UINT16 *) &Value;\r
+ UINT32 *Type32 = (UINT32 *) &Value;\r
+ UINT64 *Type64 = (UINT64 *) &Value;\r
+ UINT16 Index = 0;\r
+ ListType = FALSE;\r
>>\r
+ {\r
+ "\-" << Negative = TRUE; >>\r
+ }\r
N1:Number <<\r
switch ($Type) {\r
case EFI_IFR_TYPE_NUM_SIZE_8 :\r
- $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
+ $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u8 > 0x80) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+ }\r
+ } else {\r
+ if ($Value.u8 > 0x7F) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+ }\r
+ }\r
+ }\r
+ if (Negative) {\r
+ $Value.u8 = ~$Value.u8 + 1;\r
+ }\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_16 :\r
- $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
+ $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u16 > 0x8000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+ }\r
+ } else {\r
+ if ($Value.u16 > 0x7FFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+ }\r
+ }\r
+ }\r
+ if (Negative) {\r
+ $Value.u16 = ~$Value.u16 + 1;\r
+ }\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_32 :\r
$Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u32 > 0x80000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+ }\r
+ } else {\r
+ if ($Value.u32 > 0X7FFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+ }\r
+ }\r
+ }\r
+ if (Negative) {\r
+ $Value.u32 = ~$Value.u32 + 1;\r
+ }\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_64 :\r
$Value.u64 = _STOU64(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u64 > 0x8000000000000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+ }\r
+ } else {\r
+ if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+ }\r
+ }\r
+ }\r
+ if (Negative) {\r
+ $Value.u64 = ~$Value.u64 + 1;\r
+ }\r
break;\r
case EFI_IFR_TYPE_BOOLEAN :\r
$Value.b = _STOU8(N1->getText(), N1->getLine());\r
| QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
<< $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
| "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
+ | "\{" << ListType = TRUE; >>\r
+ L1:Number << \r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ Type8[Index] = _STOU8(L1->getText(), L1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ Index++;\r
+ >>\r
+ (\r
+ "," \r
+ L2:Number << \r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ Type8[Index] = _STOU8(L2->getText(), L2->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ Index++;\r
+ >>\r
+ )*\r
+ "\}" \r
;\r
\r
//*****************************************************************************\r
// Just for framework vfr compatibility\r
vfrStatementInvalid |\r
vfrStatementExtension |\r
- vfrStatementModal\r
+ vfrStatementModal |\r
+ vfrStatementRefreshEvent ";"\r
)*\r
E:EndForm <<\r
if (mCompatibleMode) {\r
vfrStatementLabel |\r
vfrStatementBanner |\r
vfrStatementExtension |\r
- vfrStatementModal\r
+ vfrStatementModal |\r
+ vfrStatementRefreshEvent ";"\r
)*\r
E:EndForm << CRT_END_OP (E); >>\r
";"\r
vfrStatementDefault :\r
<<\r
BOOLEAN IsExp = FALSE;\r
- EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+ UINT64 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+ EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
CIfrDefault *DObj = NULL;\r
CIfrDefault2 *DObj2 = NULL;\r
EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
UINT32 Size = 0;\r
EFI_GUID *VarGuid = NULL;\r
+ BOOLEAN ArrayType = FALSE;\r
+ UINT8 *Type8 = (UINT8 *) ValueList;\r
+ UINT16 *Type16 = (UINT16 *) ValueList;\r
+ UINT32 *Type32 = (UINT32 *) ValueList;\r
+ UINT64 *Type64 = (UINT64 *) ValueList;\r
+ CIfrNumeric *NumericQst = NULL;\r
+\r
>>\r
D:Default \r
(\r
(\r
- "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] "," \r
+ "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," \r
<< \r
if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
//check default value is valid for Numeric Opcode\r
- if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+ if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+ ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+ ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+ ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+ ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ } else {\r
+ if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
}\r
}\r
if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
_PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+ } else if (ArrayType) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ while (Type8[Size] != 0) {\r
+ Size++;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ while (Type16[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT16);\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ while (Type32[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT32);\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ while (Type64[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT64);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
} else {\r
_PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
}\r
Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
DObj = new CIfrDefault ((UINT8)Size);\r
DObj->SetLineNo(D->getLine());\r
- DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
- DObj->SetValue(Val);\r
+ if (ArrayType) {\r
+ DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+ } else {\r
+ DObj->SetType (_GET_CURRQEST_DATATYPE());\r
+ }\r
+ DObj->SetValue(*Val);\r
>>\r
| << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
VarStoreName,\r
VarGuid,\r
_GET_CURRQEST_DATATYPE (),\r
- Val),\r
- D->getLine()\r
- );\r
+ *Val),\r
+ D->getLine()\r
+ );\r
}\r
}\r
if (DObj != NULL) {delete DObj;} \r
| ManufacturingFlag \r
| DefaultFlag \r
| ResetRequiredFlag \r
+ | ReconnectRequiredFlag\r
| N:NVAccessFlag << \r
if (!mCompatibleMode) {\r
gCVfrErrorHandle.HandleWarning (\r
UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
+ BOOLEAN IntDecStyle = FALSE;\r
+ CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\r
+ if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) {\r
+ IntDecStyle = TRUE;\r
+ }\r
+ BOOLEAN MinNegative = FALSE;\r
+ BOOLEAN MaxNegative = FALSE;\r
>>\r
- Minimum "=" I:Number ","\r
- <<\r
+ Minimum "=" \r
+ {\r
+ "\-" << MinNegative = TRUE; >>\r
+ }\r
+ I:Number "," <<\r
+ if (!IntDecStyle && MinNegative) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
+ }\r
switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText(), I->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText(), I->getLine()); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ MinU8 = _STOU64(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) { \r
+ if (MinU8 > 0x8000000000000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ } else {\r
+ if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ }\r
+ }\r
+ if (MinNegative) {\r
+ MinU8 = ~MinU8 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ MinU4 = _STOU32(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) { \r
+ if (MinU4 > 0x80000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ } else {\r
+ if (MinU4 > 0x7FFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ }\r
+ }\r
+ if (MinNegative) {\r
+ MinU4 = ~MinU4 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ MinU2 = _STOU16(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) { \r
+ if (MinU2 > 0x8000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ } else {\r
+ if (MinU2 > 0x7FFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ }\r
+ }\r
+ if (MinNegative) {\r
+ MinU2 = ~MinU2 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ MinU1 = _STOU8(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) { \r
+ if (MinU1 > 0x80) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+ }\r
+ } else {\r
+ if (MinU1 > 0x7F) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+ }\r
+ }\r
+ }\r
+ if (MinNegative) {\r
+ MinU1 = ~MinU1 + 1;\r
+ }\r
+ break;\r
}\r
>>\r
- Maximum "=" A:Number ","\r
- <<\r
+ Maximum "=" \r
+ { \r
+ "\-" << MaxNegative = TRUE; >>\r
+ }\r
+ A:Number "," <<\r
+ if (!IntDecStyle && MaxNegative) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
+ }\r
+\r
switch (_GET_CURRQEST_DATATYPE()) {\r
case EFI_IFR_TYPE_NUM_SIZE_64 : \r
MaxU8 = _STOU64(A->getText(), A->getLine()); \r
- if (MaxU8 < MinU8) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU8 > 0x8000000000000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ } else {\r
+ if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ }\r
+ }\r
+ if (MaxNegative) {\r
+ MaxU8 = ~MaxU8 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT64) MaxU8 < (INT64) MinU8) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ } else {\r
+ if (MaxU8 < MinU8) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
}\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_32 : \r
- MaxU4 = _STOU32(A->getText(), A->getLine()); \r
- if (MaxU4 < MinU4) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ MaxU4 = _STOU32(A->getText(), A->getLine());\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU4 > 0x80000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ } else {\r
+ if (MaxU4 > 0x7FFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ }\r
+ }\r
+ if (MaxNegative) {\r
+ MaxU4 = ~MaxU4 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT32) MaxU4 < (INT32) MinU4) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ } else {\r
+ if (MaxU4 < MinU4) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
}\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_16 : \r
MaxU2 = _STOU16(A->getText(), A->getLine()); \r
- if (MaxU2 < MinU2) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU2 > 0x8000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ } else {\r
+ if (MaxU2 > 0x7FFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ }\r
+ }\r
+ if (MaxNegative) {\r
+ MaxU2 = ~MaxU2 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT16) MaxU2 < (INT16) MinU2) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ } else {\r
+ if (MaxU2 < MinU2) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
}\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_8 : \r
- MaxU1 = _STOU8(A->getText(), A->getLine()); \r
- if (MaxU1 < MinU1) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ MaxU1 = _STOU8(A->getText(), A->getLine());\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU1 > 0x80) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+ }\r
+ } else {\r
+ if (MaxU1 > 0x7F) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+ }\r
+ }\r
+ }\r
+ if (MaxNegative) {\r
+ MaxU1 = ~MaxU1 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT8) MaxU1 < (INT8) MinU1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ } else {\r
+ if (MaxU1 < MinU1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
}\r
break;\r
}\r
CIfrOrderedList OLObj;\r
UINT32 VarArraySize;\r
>>\r
- L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r
+ L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
vfrQuestionHeader[OLObj] ","\r
<< \r
VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
}\r
{ F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
vfrStatementQuestionOptionList\r
- E:EndList << CRT_END_OP (E); >>\r
+ E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
";"\r
;\r
\r
vfrStatementRefresh |\r
vfrStatementVarstoreDevice |\r
vfrStatementExtension |\r
- vfrStatementRefreshEvent |\r
+ vfrStatementRefreshEvent "," |\r
vfrStatementWarningIf\r
;\r
\r
EFI_GUID Guid;\r
>>\r
L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
- "=" guidDefinition[Guid] "," << RiObj.SetRefreshEventGroutId (&Guid); >>\r
+ "=" guidDefinition[Guid] << RiObj.SetRefreshEventGroutId (&Guid); >>\r
;\r
\r
vfrStatementVarstoreDevice :\r
\r
vfrStatementOneOfOption :\r
<<\r
- EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+ UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+ EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
CHAR8 *VarStoreName = NULL;\r
UINT32 Size = 0;\r
BOOLEAN TypeError = FALSE;\r
EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
EFI_GUID *VarStoreGuid = NULL;\r
- \r
- if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
- TypeError = TRUE;\r
- Size = sizeof (EFI_IFR_TYPE_VALUE);\r
- } else {\r
- ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
- }\r
-\r
- Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
- CIfrOneOfOption OOOObj ((UINT8)Size);\r
+ BOOLEAN ArrayType = FALSE;\r
+ CIfrOneOfOption *OOOObj;\r
+ UINT8 *Type8 = (UINT8 *) ValueList;\r
+ UINT16 *Type16 = (UINT16 *) ValueList;\r
+ UINT32 *Type32 = (UINT32 *) ValueList;\r
+ UINT64 *Type64 = (UINT64 *) ValueList;\r
>>\r
L:Option << \r
- OOOObj.SetLineNo(L->getLine());\r
- if (TypeError) {\r
+ if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
_PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
}\r
- if (ReturnCode != VFR_RETURN_SUCCESS) {\r
- _PCATCH (ReturnCode, L->getLine());\r
- }\r
+\r
>>\r
- Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
- Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," \r
+ Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," \r
+ Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
<< \r
if (gCurrentMinMaxData != NULL) {\r
//set min/max value for oneof opcode\r
UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
switch (_GET_CURRQEST_DATATYPE()) {\r
case EFI_IFR_TYPE_NUM_SIZE_64:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_32:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_16:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_8:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
break;\r
default:\r
break;\r
}\r
}\r
- OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
- OOOObj.SetValue (Val); \r
+ if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+ Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+ } else if (ArrayType) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ while (Type8[Size] != 0) {\r
+ Size++;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ while (Type16[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT16);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ while (Type32[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT32);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ while (Type64[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT64);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ } else {\r
+ ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+ }\r
+ if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+ _PCATCH (ReturnCode, L->getLine());\r
+ }\r
+\r
+ Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+ OOOObj = new CIfrOneOfOption((UINT8)Size);\r
+ OOOObj->SetLineNo(L->getLine());\r
+ OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
+ if (ArrayType) {\r
+ OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
+ } else {\r
+ OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+ }\r
+ OOOObj->SetValue (*Val); \r
>>\r
- F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+ F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
<<\r
+ //\r
+ // Array type only for default type OneOfOption.\r
+ //\r
+ if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
+ _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
+ }\r
+\r
+ //\r
+ // Clear the default flag if the option not use array value but has default flag.\r
+ //\r
+ if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
+ OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
+ }\r
+\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
_PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
- if (OOOObj.GetFlags () & 0x10) {\r
+ if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
_PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
EFI_HII_DEFAULT_CLASS_STANDARD,\r
VarStoreName,\r
VarStoreGuid,\r
_GET_CURRQEST_DATATYPE (),\r
- Val\r
+ *Val\r
), L->getLine());\r
}\r
- if (OOOObj.GetFlags () & 0x20) {\r
+ if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
_PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
VarStoreName,\r
VarStoreGuid,\r
_GET_CURRQEST_DATATYPE (),\r
- Val\r
+ *Val\r
), L->getLine());\r
}\r
}\r
//\r
CIfrOptionKey IfrOptionKey (\r
gCurrentQuestion->QUESTION_ID(),\r
- Val,\r
+ *Val,\r
_STOQID(KN->getText(), KN->getLine())\r
);\r
SET_LINE_INFO (IfrOptionKey, KN);\r
>>\r
}\r
(\r
- T:"," vfrImageTag << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
+ T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
)*\r
- ";"\r
+ ";" << if (OOOObj != NULL) {delete OOOObj;} >>\r
;\r
\r
vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
| "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
| InteractiveFlag << $HFlags |= 0x04; >>\r
| ResetRequiredFlag << $HFlags |= 0x10; >>\r
+ | ReconnectRequiredFlag << $HFlags |= 0x40; >>\r
| ManufacturingFlag << $LFlags |= 0x20; >>\r
| DefaultFlag << $LFlags |= 0x10; >>\r
| A:NVAccessFlag << \r
#token ToUpper("toupper") "toupper"\r
#token ToLower("tolower") "tolower"\r
#token Match("match") "match"\r
+#token Match2("match2") "match2"\r
#token Catenate("catenate") "catenate"\r
#token QuestionRefVal("questionrefval") "questionrefval"\r
#token StringRefVal("stringrefval") "stringrefval"\r
atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
| vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
+ | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
| vfrExpressionParen[$RootLevel, $ExpOpCount]\r
| vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
| vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
"\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
;\r
\r
+vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+ <<\r
+ EFI_GUID Guid;\r
+ >>\r
+ L:Match2\r
+ "\("\r
+ vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+ ","\r
+ vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+ ","\r
+ guidDefinition[Guid]\r
+ "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
+ ;\r
+\r
vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
"\("\r
vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r