Add --catch_default option Raise a DefaultValueError when encountering VFR default definitions to help remove default variables. Add --except_list option Exclude packages that don't require enabling the catch_default function.
Cc: Rebecca Cran <rebe...@bsdio.com> Cc: Liming Gao <gaolim...@byosoft.com.cn> Cc: Bob Feng <bob.c.f...@intel.com> Cc: Christine Chen <yuwei.c...@intel.com> Cc: Yuting Yang <yuting2.y...@intel.com> Signed-off-by: Yuting Yang <yuting2.y...@intel.com> --- BaseTools/Source/C/VfrCompile/VfrCompiler.cpp | 40 ++- BaseTools/Source/C/VfrCompile/VfrCompiler.h | 3 + BaseTools/Source/C/VfrCompile/VfrError.cpp | 3 +- BaseTools/Source/C/VfrCompile/VfrError.h | 3 +- BaseTools/Source/C/VfrCompile/VfrFormPkg.h | 1 + BaseTools/Source/C/VfrCompile/VfrSyntax.g | 238 ++++++++++-------- 6 files changed, 184 insertions(+), 104 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp b/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp index 5f4d262d85..e97cebff65 100644 --- a/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp @@ -78,6 +78,9 @@ CVfrCompiler::OptionInitialization ( mOptions.WarningAsError = FALSE; mOptions.AutoDefault = FALSE; mOptions.CheckDefault = FALSE; + mOptions.IsCatchDefaultEnable = FALSE; + mOptions.ExceptionList = NULL; + mOptions.ExceptionListSize = 0; memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID)); if (Argc == 1) { @@ -95,6 +98,23 @@ CVfrCompiler::OptionInitialization ( Version (); SET_RUN_STATUS (STATUS_DEAD); return; + } else if (stricmp(Argv[Index], "--catch_default") == 0){ + mOptions.IsCatchDefaultEnable = TRUE; + } else if (stricmp(Argv[Index], "--except_list") == 0){ + INT32 Start = ++Index; + if ((Start >= Argc) || (Argv[Start][0] == '-')) { + DebugError (NULL, 0, 1001, "Missing option", "-exception_list missing except list"); + goto Fail; + } + while ((Argv[Index][0] != '-') && (Index < Argc - 1)) { + Index++; + } + INT32 End = Index--; + mOptions.ExceptionListSize = End - Start; + for (INT32 i = Start; i < End; i++) { + mOptions.ExceptionList = (CHAR8**) realloc(mOptions.ExceptionList, (i - Start + 1) * sizeof(CHAR8*)); + mOptions.ExceptionList[i-Start] = Argv[i]; + } } else if (stricmp(Argv[Index], "-l") == 0) { mOptions.CreateRecordListFile = TRUE; gCIfrRecordInfoDB.TurnOn (); @@ -179,7 +199,11 @@ CVfrCompiler::OptionInitialization ( goto Fail; } strcpy (mOptions.VfrFileName, Argv[Index]); - + for (int i = 0; i < mOptions.ExceptionListSize; i++) { + if (strstr(mOptions.VfrFileName, mOptions.ExceptionList[i]) != NULL) { + mOptions.IsCatchDefaultEnable = FALSE; + } + } if (mOptions.OutputDirectory == NULL) { mOptions.OutputDirectory = (CHAR8 *) malloc (1); if (mOptions.OutputDirectory == NULL) { @@ -217,6 +241,11 @@ Fail: free (mOptions.VfrFileName); mOptions.VfrFileName = NULL; } + if (mOptions.ExceptionList != NULL) { + free(mOptions.ExceptionList); + mOptions.ExceptionList = NULL; + + } if (mOptions.VfrBaseFileName != NULL) { free (mOptions.VfrBaseFileName); mOptions.VfrBaseFileName = NULL; @@ -496,6 +525,11 @@ CVfrCompiler::~CVfrCompiler ( mOptions.VfrBaseFileName = NULL; } + if (mOptions.ExceptionList != NULL) { + free (mOptions.ExceptionList); + mOptions.ExceptionList = NULL; + } + if (mOptions.OutputDirectory != NULL) { free (mOptions.OutputDirectory); mOptions.OutputDirectory = NULL; @@ -679,7 +713,7 @@ CVfrCompiler::Compile ( DebugError (NULL, 0, 0001, "Error opening the input file", "%s", InFileName); goto Fail; } - + InputInfo.IsCatchDefaultEnable = mOptions.IsCatchDefaultEnable; if (mOptions.HasOverrideClassGuid) { InputInfo.OverrideClassGuid = &mOptions.OverrideClassGuid; } else { @@ -937,5 +971,3 @@ main ( return GetUtilityStatus (); } - - diff --git a/BaseTools/Source/C/VfrCompile/VfrCompiler.h b/BaseTools/Source/C/VfrCompile/VfrCompiler.h index b6e207d2ce..39e0a89a29 100644 --- a/BaseTools/Source/C/VfrCompile/VfrCompiler.h +++ b/BaseTools/Source/C/VfrCompile/VfrCompiler.h @@ -52,6 +52,9 @@ typedef struct { BOOLEAN WarningAsError; BOOLEAN AutoDefault; BOOLEAN CheckDefault; + BOOLEAN IsCatchDefaultEnable; + CHAR8** ExceptionList; + INT16 ExceptionListSize; } OPTIONS; typedef enum { diff --git a/BaseTools/Source/C/VfrCompile/VfrError.cpp b/BaseTools/Source/C/VfrCompile/VfrError.cpp index 65bb8e34fd..8a706f929b 100644 --- a/BaseTools/Source/C/VfrCompile/VfrError.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrError.cpp @@ -49,7 +49,8 @@ static SVFR_WARNING_HANDLE VFR_WARNING_HANDLE_TABLE [] = { { VFR_WARNING_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"}, { VFR_WARNING_ACTION_WITH_TEXT_TWO, ": Action opcode should not have TextTwo part"}, { VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, ": Not recommend to use obsoleted framework opcode"}, - { VFR_WARNING_CODEUNDEFINED, ": undefined Warning Code" } + { VFR_WARNING_CODEUNDEFINED, ": undefined Warning Code" }, + { VFR_WARNING_UNSUPPORTED, ": pls remove the default values if necessary" } }; CVfrErrorHandle::CVfrErrorHandle ( diff --git a/BaseTools/Source/C/VfrCompile/VfrError.h b/BaseTools/Source/C/VfrCompile/VfrError.h index 7d16bd5f74..1b4bc173d2 100644 --- a/BaseTools/Source/C/VfrCompile/VfrError.h +++ b/BaseTools/Source/C/VfrCompile/VfrError.h @@ -47,7 +47,8 @@ typedef enum { VFR_WARNING_DEFAULT_VALUE_REDEFINED = 0, VFR_WARNING_ACTION_WITH_TEXT_TWO, VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, - VFR_WARNING_CODEUNDEFINED + VFR_WARNING_CODEUNDEFINED, + VFR_WARNING_UNSUPPORTED } EFI_VFR_WARNING_CODE; typedef struct _SVFR_ERROR_HANDLE { diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h index 9ef6f07787..d8fada3bcb 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h @@ -96,6 +96,7 @@ struct SBufferNode { typedef struct { EFI_GUID *OverrideClassGuid; + BOOLEAN IsCatchDefaultEnable; } INPUT_INFO_TO_SYNTAX; class CFormPkg { diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C/VfrCompile/VfrSyntax.g index 55fd067f8a..5daf1c423c 100644 --- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g +++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g @@ -50,6 +50,7 @@ VfrParserStart ( { ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File); VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid); + VfrParser.parser()->SetIsCatchDefaultEnable(InputInfo->IsCatchDefaultEnable); return VfrParser.parser()->vfrProgram(); } >> @@ -386,8 +387,8 @@ dataStructField32 [BOOLEAN FieldInUnion]: ; dataStructField16 [BOOLEAN FieldInUnion]: - << - UINT32 ArrayNum = 0; + << + UINT32 ArrayNum = 0; >> ("UINT16" | "CHAR16") N:StringIdentifier @@ -737,7 +738,7 @@ vfrFormSetList : ; vfrStatementExtension: - << + << EFI_GUID Guid; CIfrGuid *GuidObj = NULL; CHAR8 *TypeName = NULL; @@ -751,7 +752,7 @@ vfrStatementExtension: >> L:GuidOp Uuid "=" guidDefinition[Guid] - {"," DataType "=" + {"," DataType "=" ( U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText(), AN1->getLine());>>} << TypeName = U64->getText(); LineNum = U64->getLine(); >> @@ -770,7 +771,7 @@ vfrStatementExtension: | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>} << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>> | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>} - << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> + << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>} << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>> ) @@ -875,19 +876,19 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, memcpy (ByteOffset, &Data_U64, TypeSize); }else if (strcmp ("UINT32", TypeName) == 0) { Data_U32 = _STOU32(RD->getText(), RD->getLine()); - memcpy (ByteOffset, &Data_U32, TypeSize); + memcpy (ByteOffset, &Data_U32, TypeSize); }else if (strcmp ("UINT16", TypeName) == 0) { Data_U16 = _STOU16(RD->getText(), RD->getLine()); - memcpy (ByteOffset, &Data_U16, TypeSize); + memcpy (ByteOffset, &Data_U16, TypeSize); }else if (strcmp ("UINT8", TypeName) == 0) { Data_U8 = _STOU8(RD->getText(), RD->getLine()); - memcpy (ByteOffset, &Data_U8, TypeSize); + memcpy (ByteOffset, &Data_U8, TypeSize); }else if (strcmp ("BOOLEAN", TypeName)== 0) { Data_BL = _STOU8(RD->getText(), RD->getLine()); - memcpy (ByteOffset, &Data_BL, TypeSize); + memcpy (ByteOffset, &Data_BL, TypeSize); }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) { Data_SID = _STOSID(RD->getText(), RD->getLine()); - memcpy (ByteOffset, &Data_SID, TypeSize); + memcpy (ByteOffset, &Data_SID, TypeSize); } } else { gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize, BitField); @@ -975,7 +976,15 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, vfrStatementDefaultStore : << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >> - D:DefaultStore N:StringIdentifier "," + D:DefaultStore N:StringIdentifier "," << + if (mIsCatchDefaultEnable) { + gCVfrErrorHandle.HandleWarning ( + VFR_WARNING_UNSUPPORTED, + D->getLine(), + D->getText() + ); + } + >> Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" { "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText(), A->getLine()); >> @@ -1074,7 +1083,7 @@ vfrStatementVarStoreEfi : | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >> | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >> | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >> - | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> + | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> ) { VarId "=" ID:Number "," << @@ -1092,8 +1101,8 @@ vfrStatementVarStoreEfi : ( Name "=" SN:StringIdentifier "," << StoreName = SN->getText(); >> | - Name "=" "STRING_TOKEN" "\(" VN:Number "\)" "," - VarSize "=" N:Number "," << + Name "=" "STRING_TOKEN" "\(" VN:Number "\)" "," + VarSize "=" N:Number "," << IsUEFI23EfiVarstore = FALSE; StoreName = gCVfrStringDB.GetVarStoreNameFormStringId(_STOSID(VN->getText(), VN->getLine())); if (StoreName == NULL) { @@ -1116,7 +1125,7 @@ vfrStatementVarStoreEfi : break; case 8: TypeName = (CHAR8 *) "UINT64"; - break; + break; default: _PCATCH (VFR_RETURN_UNSUPPORTED, N); break; @@ -1124,7 +1133,7 @@ vfrStatementVarStoreEfi : >> ) - Uuid "=" guidDefinition[Guid] << + Uuid "=" guidDefinition[Guid] << if (IsUEFI23EfiVarstore) { _PCATCH(gCVfrDataStorage.DeclareBufferVarStore ( StoreName, @@ -1150,7 +1159,7 @@ vfrStatementVarStoreEfi : } VSEObj.SetGuid (&Guid); VSEObj.SetVarStoreId (VarStoreId); - + VSEObj.SetSize ((UINT16) Size); VSEObj.SetName (StoreName); if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) { @@ -1184,7 +1193,7 @@ vfrStatementVarStoreNameValue : >> } ( - Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << + Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << if (!Created) { _PCATCH(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN); Created = TRUE; @@ -1245,12 +1254,12 @@ vfrStatementDisableIfFormSet : vfrStatementSuppressIfFormSet : << CIfrSuppressIf SIObj;>> L:SuppressIf << - SIObj.SetLineNo(L->getLine()); + SIObj.SetLineNo(L->getLine()); >> { FLAGS "=" flagsField ( "\|" flagsField )* "," } vfrStatementExpression[0] ";" vfrFormSetList - E: EndIf + E: EndIf ";" << CRT_END_OP (E); >> ; @@ -1491,7 +1500,7 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, ( SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >> ( - "." << + "." << _STRCAT (&VarIdStr, "."); if (mConstantOnlyInExpression) { _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo); @@ -1518,7 +1527,7 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, ; vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] : - << + << EFI_GUID Guid; BOOLEAN Negative = FALSE; BOOLEAN IntDecStyle = FALSE; @@ -1634,11 +1643,11 @@ vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] | Z:Zero << $Value.u8 = _STOU8(Z->getText(), Z->getLine()); >> | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >> | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >> - | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" + | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >> | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >> | "\{" << ListType = TRUE; >> - L1:Number << + L1:Number << switch (Type) { case EFI_IFR_TYPE_NUM_SIZE_8 : Type8[Index] = _STOU8(L1->getText(), L1->getLine()); @@ -1658,8 +1667,8 @@ vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] Index++; >> ( - "," - L2:Number << + "," + L2:Number << switch (Type) { case EFI_IFR_TYPE_NUM_SIZE_8 : Type8[Index] = _STOU8(L2->getText(), L2->getLine()); @@ -1679,7 +1688,7 @@ vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] Index++; >> )* - "\}" + "\}" ; //***************************************************************************** @@ -1714,7 +1723,7 @@ vfrFormDefinition : ; vfrFormMapDefinition : - << + << CIfrFormMap *FMapObj = NULL; UINT32 FormMapMethodNumber = 0; EFI_GUID Guid; @@ -1775,11 +1784,15 @@ vfrStatementDefault : CIfrNumeric *NumericQst = NULL; >> - D:Default + D:Default << + if (mIsCatchDefaultEnable) { + DefaultValueError(VFR_RETURN_UNSUPPORTED, D->getLine()); + } + >> ( ( - "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," - << + "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," + << if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) { //check default value is valid for Numeric Opcode NumericQst = (CIfrNumeric *) gCurrentQuestion; @@ -1888,14 +1901,14 @@ vfrStatementDefault : vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >> ) { - DefaultStore "=" SN:StringIdentifier "," << + DefaultStore "=" SN:StringIdentifier "," << _PCATCH(gCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); if (DObj != NULL) { - DObj->SetDefaultId (DefaultId); - } + DObj->SetDefaultId (DefaultId); + } if (DObj2 != NULL) { - DObj2->SetDefaultId (DefaultId); + DObj2->SetDefaultId (DefaultId); } >> } @@ -1917,8 +1930,8 @@ vfrStatementDefault : ); } } - if (DObj != NULL) {delete DObj;} - if (DObj2 != NULL) {delete DObj2;} + if (DObj != NULL) {delete DObj;} + if (DObj2 != NULL) {delete DObj2;} >> ) ; @@ -1970,11 +1983,15 @@ vfrStatementInvalid : ; flagsField : - Number - | InteractiveFlag - | ManufacturingFlag - | DefaultFlag - | ResetRequiredFlag + Number + | InteractiveFlag + | ManufacturingFlag + | D:DefaultFlag << + if (mIsCatchDefaultEnable) { + DefaultValueError(VFR_RETURN_UNSUPPORTED, D->getLine()); + } + >> + | ResetRequiredFlag | ReconnectRequiredFlag | N:NVAccessFlag << gCVfrErrorHandle.HandleWarning ( @@ -1989,7 +2006,7 @@ flagsField : L->getLine(), L->getText() ); - >> + >> ; vfrStatementValue : @@ -2001,13 +2018,13 @@ vfrStatementValue : vfrStatementRead : << CIfrRead RObj; >> R:Read << RObj.SetLineNo(R->getLine()); >> - vfrStatementExpression[0] ";" + vfrStatementExpression[0] ";" ; vfrStatementWrite : << CIfrWrite WObj; >> W:Write << WObj.SetLineNo(W->getLine()); >> - vfrStatementExpression[0] ";" + vfrStatementExpression[0] ";" ; vfrStatementSubTitle : @@ -2140,7 +2157,7 @@ vfrStatementGoto : FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >> Question "=" ( - QN3:StringIdentifier "," << + QN3:StringIdentifier "," << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); if (QId == EFI_QUESTION_ID_INVALID) { _PCATCH(VFR_RETURN_UNDEFINED, QN3); @@ -2222,7 +2239,7 @@ vfrStatementGoto : "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >> } { - E:"," + E:"," vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>> } ";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} if (R5Obj != NULL) {delete R5Obj;}>> @@ -2511,20 +2528,20 @@ minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] : { "default" "=" N:Number "," << switch (KeyValue) { - case 0: + case 0: D.Year = _STOU16(N->getText(), N->getLine()); if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year."); } break; - case 1: - D.Month = _STOU8(N->getText(), N->getLine()); + case 1: + D.Month = _STOU8(N->getText(), N->getLine()); if (D.Month < 1 || D.Month > 12) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12."); } break; - case 2: - D.Day = _STOU8(N->getText(), N->getLine()); + case 2: + D.Day = _STOU8(N->getText(), N->getLine()); if (D.Day < 1 || D.Day > 31) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31."); } @@ -2570,7 +2587,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] : BOOLEAN MinNegative = FALSE; BOOLEAN MaxNegative = FALSE; >> - Minimum "=" + Minimum "=" { "\-" << MinNegative = TRUE; >> } @@ -2659,8 +2676,8 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] : } } >> - Maximum "=" - { + Maximum "=" + { "\-" << MaxNegative = TRUE; >> } A:Number "," << @@ -2889,7 +2906,7 @@ vfrStatementNumeric : } >> vfrStatementQuestionOptionList - E:EndNumeric << + E:EndNumeric << CRT_END_OP (E); if (GuidObj != NULL) { GuidObj->SetScope(1); @@ -3131,7 +3148,7 @@ vfrStatementString : { Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >> } - MinSize "=" MIN:Number "," << + MinSize "=" MIN:Number "," << VarArraySize = _GET_CURRQEST_ARRAY_SIZE(); StringMinSize = _STOU8(MIN->getText(), MIN->getLine()); if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) { @@ -3141,7 +3158,7 @@ vfrStatementString : } SObj.SetMinSize (StringMinSize); >> - MaxSize "=" MAX:Number "," << + MaxSize "=" MAX:Number "," << StringMaxSize = _STOU8(MAX->getText(), MAX->getLine()); if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF."); @@ -3185,7 +3202,7 @@ vfrStatementPassword : { Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >> } - MinSize "=" MIN:Number "," << + MinSize "=" MIN:Number "," << VarArraySize = _GET_CURRQEST_ARRAY_SIZE(); PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine()); if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) { @@ -3195,7 +3212,7 @@ vfrStatementPassword : } PObj.SetMinSize (PasswordMinSize); >> - MaxSize "=" MAX:Number "," << + MaxSize "=" MAX:Number "," << PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine()); if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF."); @@ -3230,12 +3247,12 @@ vfrStatementOrderedList : >> L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>> vfrQuestionHeader[OLObj] "," - << + << VarArraySize = _GET_CURRQEST_ARRAY_SIZE(); OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize)); >> { - MaxContainers "=" M:Number "," << + MaxContainers "=" M:Number "," << if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF."); } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) { @@ -3328,19 +3345,19 @@ minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] : { "default" "=" N:Number "," << switch (KeyValue) { - case 0: - T.Hour = _STOU8(N->getText(), N->getLine()); + case 0: + T.Hour = _STOU8(N->getText(), N->getLine()); if (T.Hour > 23) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23."); } break; - case 1: - T.Minute = _STOU8(N->getText(), N->getLine()); + case 1: + T.Minute = _STOU8(N->getText(), N->getLine()); if (T.Minute > 59) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59."); } break; - case 2: + case 2: T.Second = _STOU8(N->getText(), N->getLine()); if (T.Second > 59) { _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59."); @@ -3419,11 +3436,11 @@ vfrStatementStatListOld : ; vfrStatementDisableIfStat : - << - CIfrDisableIf DIObj; + << + CIfrDisableIf DIObj; >> L:DisableIf << DIObj.SetLineNo(L->getLine()); >> - vfrStatementExpression[0] ";" + vfrStatementExpression[0] ";" ( vfrStatementStatList )* E:EndIf << CRT_END_OP (E); >> ";" @@ -3548,8 +3565,8 @@ vfrStatementWarningIf : ; vfrStatementDisableIfQuest : - << - CIfrDisableIf DIObj; + << + CIfrDisableIf DIObj; >> L:DisableIf << DIObj.SetLineNo(L->getLine()); >> vfrStatementExpression[0] ";" @@ -3616,15 +3633,15 @@ vfrStatementOneOfOption : UINT32 *Type32 = (UINT32 *) ValueList; UINT64 *Type64 = (UINT64 *) ValueList; >> - L:Option << + L:Option << if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error."); } >> - Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," + Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," - << + << if (gCurrentMinMaxData != NULL) { //set min/max value for oneof opcode UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE(), _GET_CURRQEST_VARTINFO().mIsBitVar); @@ -3696,7 +3713,7 @@ vfrStatementOneOfOption : Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value); OOOObj = new CIfrOneOfOption((UINT8)Size); OOOObj->SetLineNo(L->getLine()); - OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); + OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); if (ArrayType) { OOOObj->SetType (EFI_IFR_TYPE_BUFFER); } else { @@ -3706,7 +3723,7 @@ vfrStatementOneOfOption : OOOObj->SetType (_GET_CURRQEST_DATATYPE()); } } - OOOObj->SetValue (*Val); + OOOObj->SetValue (*Val); >> F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()] << @@ -3790,7 +3807,12 @@ oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] : | RestStyleFlag << $HFlags |= 0x20; >> | ReconnectRequiredFlag << $HFlags |= 0x40; >> | ManufacturingFlag << $LFlags |= 0x20; >> - | DefaultFlag << $LFlags |= 0x10; >> + | D:DefaultFlag << + $LFlags |= 0x10; + if (mIsCatchDefaultEnable) { + DefaultValueError(VFR_RETURN_UNSUPPORTED, D->getLine()); + } + >> | A:NVAccessFlag << gCVfrErrorHandle.HandleWarning ( VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, @@ -3963,7 +3985,7 @@ vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] : } } } - + if ($RootLevel == 0) { _CLEAR_SAVED_OPHDR (); mCIfrOpHdrIndex --; @@ -4405,10 +4427,10 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : for (Index = 0; Index < ListLen; Index++) { EILObj.SetValueList (Index, ValueList[Index]); } - + EILObj.UpdateIfrBuffer(); - _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); - + _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); + if (QId == EFI_QUESTION_ID_INVALID) { EILObj.SetQuestionId (QId, VarIdStr, LineNo); } @@ -4458,9 +4480,9 @@ stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] : >> L:StringRef "\(" - ( + ( "STRING_TOKEN" - "\(" + "\(" S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >> "\)" | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >> @@ -4499,10 +4521,10 @@ getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : Info.mVarStoreId = 0; >> L:Get - "\(" + "\(" vfrStorageVarId[Info, VarIdStr, FALSE] {"\|" FLAGS "=" numericVarStoreType [VarType] } - "\)" << + "\)" << { if (Info.mVarStoreId == 0) { // support Date/Time question @@ -4549,9 +4571,9 @@ getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array"); } } - CIfrGet GObj(L->getLine()); - _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); - GObj.SetVarInfo (&Info); + CIfrGet GObj(L->getLine()); + _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); + GObj.SetVarInfo (&Info); delete[] VarIdStr; $ExpOpCount++; } @@ -4608,7 +4630,7 @@ question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : { Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >> } - vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] + vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" << switch (Type) { @@ -4675,9 +4697,9 @@ setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : "\(" vfrStorageVarId[Info, VarIdStr, FALSE] {"\|" FLAG "=" numericVarStoreType [VarType] } - "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] + "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" - << + << { if (Info.mVarStoreId == 0) { // support Date/Time question @@ -4724,8 +4746,8 @@ setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array"); } } - CIfrSet TSObj(L->getLine()); - TSObj.SetVarInfo (&Info); + CIfrSet TSObj(L->getLine()); + TSObj.SetVarInfo (&Info); delete[] VarIdStr; $ExpOpCount++; } @@ -4808,9 +4830,9 @@ spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : ; vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]: - L:Map - "\(" - vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] + L:Map + "\(" + vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] ":" << { CIfrMap MObj(L->getLine()); } >> ( vfrStatementExpression[0] @@ -4837,6 +4859,7 @@ spanFlags [UINT8 & Flags] : class EfiVfrParser { << private: + BOOLEAN mIsCatchDefaultEnable; UINT8 mParserStatus; BOOLEAN mConstantOnlyInExpression; @@ -4880,6 +4903,7 @@ public: VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr); VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32); VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *); + VOID DefaultValueError (IN EFI_VFR_RETURN_CODE, IN UINT32); VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32); @@ -4909,6 +4933,7 @@ public: VOID IdEqIdDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_COMPARE_TYPE); VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *); VOID SetOverrideClassGuid (IN EFI_GUID *); + VOID SetIsCatchDefaultEnable (BOOLEAN IsCatchDefaultEnable); >> } @@ -5086,6 +5111,17 @@ EfiVfrParser::_PCATCH ( mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg); } +VOID +EfiVfrParser::DefaultValueError ( + IN EFI_VFR_RETURN_CODE ReturnCode, + IN UINT32 LineNum + ) +{ + CHAR8 ErrorMsg[100]; + sprintf(ErrorMsg, "please remove the default value / defaultstore in line %d", LineNum); + mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, ErrorMsg); +} + VOID EfiVfrParser::syn ( ANTLRAbstractToken *Tok, @@ -5682,12 +5718,18 @@ EfiVfrParser::IdEqListDoSpecial ( } } -VOID +VOID EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid) { mOverrideClassGuid = OverrideClassGuid; } +VOID +EfiVfrParser::SetIsCatchDefaultEnable (BOOLEAN IsCatchDefaultEnable) +{ + mIsCatchDefaultEnable = IsCatchDefaultEnable; +} + VOID EfiVfrParser::CheckDuplicateDefaultValue ( IN EFI_DEFAULT_ID DefaultId, -- 2.26.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#112434): https://edk2.groups.io/g/devel/message/112434 Mute This Topic: https://groups.io/mt/103126873/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-