UINT8\r
VfrParserStart (\r
IN FILE *File,\r
- IN BOOLEAN CompatibleMode\r
+ IN INPUT_INFO_TO_SYNTAX *InputInfo\r
)\r
{\r
ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);\r
- VfrParser.parser()->SetCompatibleMode (CompatibleMode);\r
+ VfrParser.parser()->SetCompatibleMode (InputInfo->CompatibleMode);\r
+ VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid);\r
return VfrParser.parser()->vfrProgram();\r
}\r
>>\r
#token EndGuidOp("endguidop") "endguidop"\r
#token DataType("datatype") "datatype"\r
#token Data("data") "data"\r
+#token Modal("modal") "modal"\r
\r
//\r
// Define the class and subclass tokens\r
dataStructFieldString |\r
dataStructFieldDate |\r
dataStructFieldTime |\r
+ dataStructFieldRef |\r
dataStructFieldUser\r
)*\r
;\r
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
+dataStructFieldRef :\r
+ << UINT32 ArrayNum = 0; >>\r
+ D:"EFI_HII_REF"\r
+ N:StringIdentifier\r
+ {\r
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
+ }\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ;\r
+\r
dataStructFieldUser :\r
<< UINT32 ArrayNum = 0; >>\r
T:StringIdentifier\r
","\r
}\r
<<\r
+ if (mOverrideClassGuid != NULL && ClassGuidNum >= 3) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 3 class guids, can't add extra class guid!");\r
+ }\r
switch (ClassGuidNum) {\r
case 0:\r
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\r
+ if (mOverrideClassGuid != NULL) {\r
+ ClassGuidNum = 2;\r
+ } else {\r
+ ClassGuidNum = 1;\r
+ }\r
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&DefaultClassGuid);\r
+ if (mOverrideClassGuid != NULL) {\r
+ FSObj->SetClassGuid(mOverrideClassGuid);\r
+ } \r
break;\r
case 1:\r
+ if (mOverrideClassGuid != NULL) {\r
+ ClassGuidNum ++;\r
+ } \r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
+ if (mOverrideClassGuid != NULL) {\r
+ FSObj->SetClassGuid(mOverrideClassGuid);\r
+ } \r
break;\r
case 2:\r
+ if (mOverrideClassGuid != NULL) {\r
+ ClassGuidNum ++;\r
+ } \r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
FSObj->SetClassGuid(&ClassGuid2);\r
+ if (mOverrideClassGuid != NULL) {\r
+ FSObj->SetClassGuid(mOverrideClassGuid);\r
+ } \r
break;\r
case 3:\r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
<< TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
| T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText());>>}\r
<< TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
- | TN:StringIdentifier {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText());>>}\r
+ | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText());>>}\r
+ << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> \r
+ | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText());>>}\r
<< TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>\r
)\r
<<\r
| U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
| D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
| T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
+ | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >>\r
)\r
{ Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
if (mCompatibleMode) {\r
\r
vfrStatementVarStoreEfi :\r
<<\r
+ BOOLEAN IsUEFI23EfiVarstore = TRUE;\r
EFI_GUID Guid;\r
CIfrVarStoreEfi VSEObj;\r
- EFI_VARSTORE_ID VarStoreId;\r
+ EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
UINT32 Attr = 0;\r
+ UINT32 Size;\r
+ CHAR8 *TypeName;\r
+ UINT32 LineNum;\r
+ CHAR8 *StoreName = NULL;\r
>>\r
E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>\r
- SN:StringIdentifier ","\r
+ (\r
+ TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\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
+ | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+ | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+ | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
+ | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
+ | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> \r
+ )\r
+ {\r
+ VarId "=" ID:Number "," <<\r
+ _PCATCH(\r
+ (INTN)(VarStoreId = _STOU16(ID->getText())) != 0,\r
+ (INTN)TRUE,\r
+ ID,\r
+ "varid 0 is not allowed."\r
+ );\r
+ >>\r
+ }\r
Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","\r
<< VSEObj.SetAttributes (Attr); >>\r
- Name "=" "STRING_TOKEN" "\(" VN:Number "\)" ","\r
- VarSize "=" N:Number ","\r
- Uuid "=" guidDefinition[Guid] << mCVfrDataStorage.DeclareEfiVarStore (SN->getText(), &Guid, _STOSID(VN->getText()), _STOU32(N->getText())); >>\r
- <<\r
- VSEObj.SetGuid (&Guid);\r
- _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+\r
+ (\r
+ Name "=" SN:StringIdentifier "," << StoreName = SN->getText(); >>\r
+ |\r
+ Name "=" "STRING_TOKEN" "\(" VN:Number "\)" "," \r
+ VarSize "=" N:Number "," << \r
+ IsUEFI23EfiVarstore = FALSE;\r
+ StoreName = gCVfrStringDB.GetVarStoreNameFormStringId(_STOSID(VN->getText()));\r
+ if (StoreName == NULL) {\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!");\r
+ }\r
+ Size = _STOU32(N->getText());\r
+ switch (Size) {\r
+ case 1:\r
+ TypeName = (CHAR8 *) "UINT8";\r
+ break;\r
+ case 2:\r
+ TypeName = (CHAR8 *) "UINT16";\r
+ break;\r
+ case 4:\r
+ TypeName = (CHAR8 *) "UINT32";\r
+ break;\r
+ case 8:\r
+ TypeName = (CHAR8 *) "UINT64";\r
+ break; \r
+ default:\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, N);\r
+ break;\r
+ }\r
+ >>\r
+ )\r
+\r
+ Uuid "=" guidDefinition[Guid] << \r
+ if (IsUEFI23EfiVarstore) {\r
+ _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+ StoreName,\r
+ &Guid,\r
+ &gCVfrVarDataTypeDB,\r
+ TypeName,\r
+ VarStoreId\r
+ ), LineNum); \r
+ _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
+ } else {\r
+ _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+ TN->getText(),\r
+ &Guid,\r
+ &gCVfrVarDataTypeDB,\r
+ TypeName,\r
+ VarStoreId\r
+ ), LineNum); \r
+ _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId), VN);\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
+ }\r
+ VSEObj.SetGuid (&Guid); \r
VSEObj.SetVarStoreId (VarStoreId);\r
+ \r
+ VSEObj.SetSize ((UINT16) Size);\r
+ VSEObj.SetName (StoreName);\r
+ if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {\r
+ delete StoreName; \r
+ }\r
>>\r
";"\r
;\r
case QUESTION_TIME:\r
mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
break;\r
+ case QUESTION_REF:\r
+ //\r
+ // VarIdStr != NULL stand for question with storagae.\r
+ //\r
+ if (VarIdStr != NULL) {\r
+ mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);\r
+ } else {\r
+ mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
+ }\r
+ break;\r
default:\r
_PCATCH(VFR_RETURN_FATAL_ERROR);\r
}\r
$QHObj.SetQuestionId (QId);\r
- $QHObj.SetVarStoreInfo (&Info);\r
+ if (VarIdStr != NULL) {\r
+ $QHObj.SetVarStoreInfo (&Info);\r
+ }\r
>>\r
vfrStatementHeader[&$QHObj]\r
- << _SAVE_CURRQEST_VARINFO (Info); >>\r
- << if (VarIdStr != NULL) delete VarIdStr; >>\r
- ;\r
-\r
-vfrQuestionHeaderWithNoStorage[CIfrQuestionHeader *QHObj] :\r
- <<\r
- EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
- CHAR8 *QName = NULL;\r
- >>\r
- {\r
- Name "=" QN:StringIdentifier "," <<\r
- QName = QN->getText();\r
- _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
- >>\r
- }\r
- {\r
- QuestionId "=" ID:Number "," <<\r
- QId = _STOQID(ID->getText());\r
- _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "redefined quesiont ID");\r
- >>\r
- }\r
- <<\r
- mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
- $QHObj->SetQuestionId (QId);\r
+ << \r
+ if (VarIdStr != NULL) {\r
+ delete VarIdStr; \r
+ _SAVE_CURRQEST_VARINFO (Info);\r
+ }\r
>>\r
- vfrStatementHeader[$QHObj]\r
;\r
\r
questionheaderFlagsField[UINT8 & Flags] :\r
_PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
_PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
}\r
+\r
+ QuestVarIdStr = VarIdStr;\r
>>\r
)\r
|\r
;\r
\r
vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
+ <<\r
+ EFI_GUID Guid;\r
+ >>\r
N1:Number <<\r
switch ($Type) {\r
case EFI_IFR_TYPE_NUM_SIZE_8 :\r
break;\r
case EFI_IFR_TYPE_TIME :\r
case EFI_IFR_TYPE_DATE :\r
+ case EFI_IFR_TYPE_REF :\r
default :\r
break;\r
}\r
| Z:Zero << $Value.u8 = _STOU8(Z->getText()); >>\r
| HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(), SECOND->getText()); >>\r
| YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText()); >>\r
+ | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
+ << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText()); >>\r
| "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText()); >>\r
;\r
\r
vfrStatementBanner |\r
// Just for framework vfr compatibility\r
vfrStatementInvalid |\r
- vfrStatementExtension\r
+ vfrStatementExtension |\r
+ vfrStatementModal\r
)*\r
E:EndForm <<\r
if (mCompatibleMode) {\r
vfrStatementConditional |\r
vfrStatementLabel |\r
vfrStatementBanner |\r
- vfrStatementExtension\r
+ vfrStatementExtension |\r
+ vfrStatementModal\r
)*\r
E:EndForm << CRT_END_OP (E); >>\r
";"\r
\r
vfrStatementGoto :\r
<<\r
- UINT8 RefType = 1;\r
+ UINT8 RefType = 5;\r
EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
EFI_GUID FSId = {0,};\r
EFI_FORM_ID FId;\r
CIfrRef2 *R2Obj = NULL;\r
CIfrRef3 *R3Obj = NULL;\r
CIfrRef4 *R4Obj = NULL;\r
+ CIfrRef5 *R5Obj = NULL;\r
>>\r
G:Goto\r
- (\r
+ {\r
(\r
DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
FormSetGuid "=" guidDefinition[FSId] ","\r
FId = _STOFID(F4->getText());\r
>>\r
)\r
- )\r
+ }\r
<<\r
switch (RefType) {\r
+ case 5:\r
+ {\r
+ R5Obj = new CIfrRef5;\r
+ QHObj = R5Obj;\r
+ R5Obj->SetLineNo(G->getLine());\r
+ break;\r
+ }\r
case 4:\r
{\r
R4Obj = new CIfrRef4;\r
default: break;\r
}\r
>>\r
- vfrQuestionHeaderWithNoStorage[QHObj]\r
+ vfrQuestionHeader[*QHObj, QUESTION_REF]\r
{ "," vfrStatementStatTagList }\r
{ "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
{\r
"," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
}\r
- ";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} >>\r
+ ";" << 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;}>>\r
;\r
\r
vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
vfrStatementAction :\r
<< CIfrAction AObj; >>\r
L:Action << AObj.SetLineNo(L->getLine()); >>\r
- vfrQuestionHeaderWithNoStorage[&AObj] ","\r
+ vfrQuestionHeader[AObj] ","\r
{ F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText())); >>\r
vfrStatementQuestionTagList\r
vfrStatementDisableIfQuest |\r
vfrStatementRefresh |\r
vfrStatementVarstoreDevice |\r
- vfrStatementExtension\r
+ vfrStatementExtension |\r
+ vfrStatementRefreshEvent\r
;\r
\r
vfrStatementQuestionTagList :\r
L:Locked << LObj.SetLineNo(L->getLine()); >>\r
;\r
\r
+vfrModalTag :\r
+ << CIfrModal MObj; >>\r
+ L:Modal << MObj.SetLineNo(L->getLine()); >>\r
+ ;\r
+\r
vfrStatementStatTag :\r
vfrImageTag |\r
vfrLockedTag\r
";"\r
;\r
\r
+vfrStatementModal :\r
+ vfrModalTag\r
+ ";"\r
+ ;\r
+\r
vfrStatementLocked :\r
vfrLockedTag\r
";"\r
Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText())); >>\r
;\r
\r
+vfrStatementRefreshEvent :\r
+ <<\r
+ CIfrRefreshId RiObj;\r
+ EFI_GUID Guid;\r
+ >>\r
+ L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
+ "=" guidDefinition[Guid] "," << RiObj.SetRefreshEventGroutId (&Guid); >>\r
+ ;\r
+\r
vfrStatementVarstoreDevice :\r
<< CIfrVarStoreDevice VDObj; >>\r
L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r
#token QuestionRefVal("questionrefval") "questionrefval"\r
#token StringRefVal("stringrefval") "stringrefval"\r
#token Map("map") "map"\r
+#token RefreshGuid("refreshguid") "refreshguid"\r
\r
//\r
// Root expression extension function called by other function.\r
\r
\r
EFI_VARSTORE_INFO mCurrQestVarInfo;\r
+ EFI_GUID *mOverrideClassGuid;\r
\r
//\r
// For framework vfr compatibility\r
UINT64 _STOU64 (IN CHAR8 *);\r
EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *);\r
EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *);\r
+ EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *);\r
\r
EFI_STRING_ID _STOSID (IN CHAR8 *);\r
EFI_FORM_ID _STOFID (IN CHAR8 *);\r
VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
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);\r
VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
+ VOID SetOverrideClassGuid (IN EFI_GUID *);\r
//\r
// For framework vfr compatibility\r
//\r
*Dest = NewStr;\r
}\r
\r
+EFI_HII_REF\r
+EfiVfrParser::_STOR (\r
+ IN CHAR8 *QuestionId,\r
+ IN CHAR8 *FormId,\r
+ IN EFI_GUID *FormSetGuid,\r
+ IN CHAR8 *DevicePath\r
+ )\r
+{\r
+ EFI_HII_REF Ref;\r
+ UINT32 Index;\r
+\r
+ memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
+ Ref.QuestionId = _STOQID (QuestionId);\r
+ Ref.FormId = _STOFID (FormId);\r
+ Ref.DevicePath = _STOSID (DevicePath);\r
+\r
+ return Ref;\r
+}\r
+\r
//\r
// framework vfr to default declare varstore for each structure\r
//\r
VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
VSEObj.SetGuid (&pNode->mGuid);\r
VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
+ // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
+ // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
+ VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
#ifdef VFREXP_DEBUG\r
printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
#endif\r
}\r
}\r
\r
+VOID \r
+EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)\r
+{\r
+ mOverrideClassGuid = OverrideClassGuid;\r
+}\r
+\r
//\r
// For framework vfr compatibility\r
//\r