]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync BaseTools Trunk (version r2387) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 02a7b5c1f4382752f44efb6b64afcd56e0fbcfb8..f27f05b68910a9430379082bcd65992b2e436298 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
@@ -1267,19 +1387,21 @@ vfrFormDefinition :
                                                         CIfrLabel LObj3;\r
                                                         LObj3.SetLineNo(E->getLine());\r
                                                         LObj3.SetNumber (0xffff);  //add end label for UEFI, label number hardcode 0xffff\r
-                                                        //\r
-                                                        // Declare undefined Question\r
-                                                        //\r
-                                                        if (gCFormPkg.HavePendingUnassigned()) {\r
-                                                          gCFormPkg.DeclarePendingQuestion (\r
-                                                                      gCVfrVarDataTypeDB,\r
-                                                                      mCVfrDataStorage,\r
-                                                                      mCVfrQuestionDB,\r
-                                                                      &mFormsetGuid,\r
-                                                                      E->getLine()\r
-                                                                    );\r
-                                                        }\r
                                                       }\r
+\r
+                                                      //\r
+                                                      // Declare undefined Question so that they can be used in expression.\r
+                                                      //\r
+                                                      if (gCFormPkg.HavePendingUnassigned()) {\r
+                                                        gCFormPkg.DeclarePendingQuestion (\r
+                                                                    gCVfrVarDataTypeDB,\r
+                                                                    mCVfrDataStorage,\r
+                                                                    mCVfrQuestionDB,\r
+                                                                    &mFormsetGuid,\r
+                                                                    E->getLine()\r
+                                                                  );\r
+                                                      }\r
+\r
                                                       //\r
                                                       // mCVfrQuestionDB.PrintAllQuestion();\r
                                                       //\r
@@ -1310,7 +1432,8 @@ vfrFormMapDefinition :
     vfrStatementConditional                  |\r
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
-    vfrStatementExtension\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal\r
   )*\r
   E:EndForm                                         << CRT_END_OP (E); >>\r
   ";"\r
@@ -1516,20 +1639,22 @@ 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
      EFI_QUESTION_ID     QId    = EFI_QUESTION_ID_INVALID;\r
      UINT32              BitMask;\r
      CIfrQuestionHeader  *QHObj = NULL;\r
+     CIfrOpHeader        *OHObj = NULL;\r
      CIfrRef             *R1Obj = NULL;\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
@@ -1558,7 +1683,12 @@ vfrStatementGoto :
       FormId "=" F3:Number ","                         << RefType = 2; FId = _STOFID(F3->getText()); >>\r
       Question "="\r
       (\r
-          QN3:StringIdentifier ","                     << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); >>\r
+          QN3:StringIdentifier ","                     << \r
+                                                          mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
+                                                          if (QId == EFI_QUESTION_ID_INVALID) {\r
+                                                            _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
+                                                          }\r
+                                                       >>\r
         | QN4:Number ","                               << QId = _STOQID(QN4->getText()); >>\r
       )\r
     )\r
@@ -1569,13 +1699,22 @@ 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
+                                                              OHObj = R5Obj;\r
+                                                              R5Obj->SetLineNo(G->getLine());\r
+                                                              break;\r
+                                                            }\r
                                                           case 4:\r
                                                             {\r
                                                               R4Obj = new CIfrRef4;\r
                                                               QHObj = R4Obj;\r
+                                                              OHObj = R4Obj;\r
                                                               R4Obj->SetLineNo(G->getLine());\r
                                                               R4Obj->SetDevicePath (DevPath);\r
                                                               R4Obj->SetFormSetId (FSId);\r
@@ -1587,6 +1726,7 @@ vfrStatementGoto :
                                                             {\r
                                                               R3Obj = new CIfrRef3;\r
                                                               QHObj = R3Obj;\r
+                                                              OHObj = R3Obj;\r
                                                               R3Obj->SetLineNo(G->getLine());\r
                                                               R3Obj->SetFormSetId (FSId);\r
                                                               R3Obj->SetFormId (FId);\r
@@ -1597,15 +1737,17 @@ vfrStatementGoto :
                                                             {\r
                                                               R2Obj = new CIfrRef2;\r
                                                               QHObj = R2Obj;\r
+                                                              OHObj = R2Obj;\r
                                                               R2Obj->SetLineNo(G->getLine());\r
                                                               R2Obj->SetFormId (FId);\r
-                                                              _PCATCH(R2Obj->SetQuestionId (QId), QN3);\r
+                                                              R2Obj->SetQuestionId (QId);\r
                                                               break;\r
                                                             }\r
                                                           case 1:\r
                                                             {\r
                                                               R1Obj = new CIfrRef;\r
                                                               QHObj = R1Obj;\r
+                                                              OHObj = R1Obj;\r
                                                               R1Obj->SetLineNo(G->getLine());\r
                                                               R1Obj->SetFormId (FId);\r
                                                               break;\r
@@ -1613,13 +1755,16 @@ vfrStatementGoto :
                                                           default: break;\r
                                                           }\r
                                                        >>\r
-  vfrQuestionHeaderWithNoStorage[QHObj]\r
-  { "," vfrStatementStatTagList }\r
+  vfrQuestionHeader[*QHObj, QUESTION_REF]\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
+  {\r
+    E:"," \r
+      vfrStatementQuestionOptionList                   << OHObj->SetScope(1); CRT_END_OP (E);>>\r
+  }\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 +1937,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
@@ -1981,6 +2126,7 @@ vfrStatementNumeric :
   <<\r
      CIfrNumeric NObj;\r
      UINT32 DataTypeSize;\r
+     BOOLEAN IsSupported;\r
   >>\r
   L:Numeric                                            << NObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[NObj] ","                          << // check data type\r
@@ -1996,7 +2142,23 @@ vfrStatementNumeric :
   }\r
   vfrSetMinMaxStep[NObj]\r
   vfrStatementQuestionOptionList\r
-  E:EndNumeric                                         << CRT_END_OP (E); >>\r
+  E:EndNumeric                                         << \r
+                                                          IsSupported = FALSE;\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                                                              IsSupported = TRUE;\r
+                                                              break;\r
+                                                            default:\r
+                                                              break;\r
+                                                          }\r
+                                                          if (!IsSupported) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+                                                          }\r
+                                                          CRT_END_OP (E); \r
+                                                       >>\r
   ";"\r
   ;\r
 \r
@@ -2041,6 +2203,7 @@ vfrStatementOneOf :
   <<\r
      CIfrOneOf OObj;\r
      UINT32    DataTypeSize;\r
+     BOOLEAN   IsSupported;\r
   >>\r
   L:OneOf                                              << OObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OObj] ","                          << //check data type\r
@@ -2055,7 +2218,23 @@ vfrStatementOneOf :
     vfrSetMinMaxStep[OObj]\r
   }\r
   vfrStatementQuestionOptionList\r
-  E:EndOneOf                                           << CRT_END_OP (E); >>\r
+  E:EndOneOf                                           << \r
+                                                          IsSupported = FALSE;\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                                                              IsSupported = TRUE;\r
+                                                              break;\r
+                                                            default:\r
+                                                              break;\r
+                                                          }\r
+                                                          if (!IsSupported) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+                                                          }\r
+                                                          CRT_END_OP (E); \r
+                                                       >>\r
   ";"\r
   ;\r
 \r
@@ -2339,7 +2518,8 @@ vfrStatementQuestionTag :
   vfrStatementDisableIfQuest    |\r
   vfrStatementRefresh           |\r
   vfrStatementVarstoreDevice    |\r
-  vfrStatementExtension\r
+  vfrStatementExtension         |\r
+  vfrStatementRefreshEvent\r
   ;\r
 \r
 vfrStatementQuestionTagList :\r
@@ -2490,6 +2670,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 +2689,11 @@ vfrStatementImage :
   ";"\r
   ;\r
 \r
+vfrStatementModal :\r
+  vfrModalTag\r
+  ";"\r
+  ;\r
+\r
 vfrStatementLocked :\r
   vfrLockedTag\r
   ";"\r
@@ -2543,6 +2733,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 +3010,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
@@ -3429,6 +3629,7 @@ vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | question2refExp[$RootLevel, $ExpOpCount]\r
   | stringref2Exp[$RootLevel, $ExpOpCount]\r
   | toboolExp[$RootLevel, $ExpOpCount]\r
+  | tostringExp[$RootLevel, $ExpOpCount]\r
   | unintExp[$RootLevel, $ExpOpCount]\r
   | toupperExp[$RootLevel, $ExpOpCount]\r
   | tolwerExp[$RootLevel, $ExpOpCount]\r
@@ -3687,6 +3888,7 @@ private:
 \r
 \r
   EFI_VARSTORE_INFO   mCurrQestVarInfo;\r
+  EFI_GUID            *mOverrideClassGuid;\r
 \r
 //\r
 // For framework vfr compatibility\r
@@ -3720,6 +3922,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 +3940,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 +4362,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 +4448,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 +4749,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