]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 02a7b5c1f4382752f44efb6b64afcd56e0fbcfb8..081c67d715dd35930b79673fd66da355ab715a13 100644 (file)
@@ -51,11 +51,12 @@ public:
 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
@@ -237,6 +238,7 @@ VfrParserStart (
 #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
@@ -340,6 +342,7 @@ vfrDataStructFields :
      dataStructFieldString |\r
      dataStructFieldDate   |\r
      dataStructFieldTime   |\r
+     dataStructFieldRef    |\r
      dataStructFieldUser\r
   )*\r
   ;\r
@@ -426,6 +429,16 @@ dataStructFieldTime :
   ";"                                               << _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
@@ -497,19 +510,42 @@ vfrFormSetDefinition :
                   ","\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
@@ -602,7 +638,9 @@ vfrStatementExtension:
                                                       << 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
@@ -794,6 +832,7 @@ vfrStatementVarStoreLinear :
     | 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
@@ -838,22 +877,102 @@ vfrStatementVarStoreLinear :
 \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
@@ -978,39 +1097,31 @@ vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_
                                                        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
@@ -1060,6 +1171,8 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                          _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
                                                          _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
                                                        }\r
+\r
+                                                       QuestVarIdStr = VarIdStr;\r
                                                     >>\r
   )\r
   |\r
@@ -1194,6 +1307,9 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
   ;\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
@@ -1216,6 +1332,7 @@ vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
                                                        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
@@ -1227,6 +1344,8 @@ vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
   | 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
@@ -1251,7 +1370,8 @@ vfrFormDefinition :
     vfrStatementBanner                       |\r
     // Just for framework vfr compatibility\r
     vfrStatementInvalid                      |\r
-    vfrStatementExtension\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal\r
   )*\r
   E:EndForm                                         <<\r
                                                       if (mCompatibleMode) {\r
@@ -1310,7 +1430,8 @@ vfrFormMapDefinition :
     vfrStatementConditional                  |\r
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
-    vfrStatementExtension\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal\r
   )*\r
   E:EndForm                                         << CRT_END_OP (E); >>\r
   ";"\r
@@ -1516,7 +1637,7 @@ vfrStatementCrossReference :
 \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
@@ -1527,9 +1648,10 @@ vfrStatementGoto :
      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
@@ -1569,9 +1691,16 @@ vfrStatementGoto :
                                                           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
@@ -1613,13 +1742,13 @@ vfrStatementGoto :
                                                           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
@@ -1792,7 +1921,7 @@ checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :
 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
@@ -2339,7 +2468,8 @@ vfrStatementQuestionTag :
   vfrStatementDisableIfQuest    |\r
   vfrStatementRefresh           |\r
   vfrStatementVarstoreDevice    |\r
-  vfrStatementExtension\r
+  vfrStatementExtension         |\r
+  vfrStatementRefreshEvent\r
   ;\r
 \r
 vfrStatementQuestionTagList :\r
@@ -2490,6 +2620,11 @@ vfrLockedTag :
   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
@@ -2504,6 +2639,11 @@ vfrStatementImage :
   ";"\r
   ;\r
 \r
+vfrStatementModal :\r
+  vfrModalTag\r
+  ";"\r
+  ;\r
+\r
 vfrStatementLocked :\r
   vfrLockedTag\r
   ";"\r
@@ -2543,6 +2683,15 @@ vfrStatementRefresh :
   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
@@ -2811,6 +2960,7 @@ vfrStatementInvalidSaveRestoreDefaults :
 #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
@@ -3687,6 +3837,7 @@ private:
 \r
 \r
   EFI_VARSTORE_INFO   mCurrQestVarInfo;\r
+  EFI_GUID            *mOverrideClassGuid;\r
 \r
 //\r
 // For framework vfr compatibility\r
@@ -3720,6 +3871,7 @@ public:
   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
@@ -3737,6 +3889,7 @@ public:
   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
@@ -4158,6 +4311,25 @@ EfiVfrParser::_STRCAT (
   *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
@@ -4225,6 +4397,9 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
       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
@@ -4523,6 +4698,12 @@ EfiVfrParser::IdEqListDoSpecial (
   }\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