]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync BaseTool trunk (version r2610) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 2a4f7b6488ab15e52710a0f0fa2d94109bba9dac..6f15aaa452a38a4350a146c5231f336933338022 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
-Copyright (c) 2004 - 2010, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -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
@@ -135,6 +136,7 @@ VfrParserStart (
 #token MapTitle("maptitle")                     "maptitle"\r
 #token MapGuid("mapguid")                       "mapguid"\r
 #token Subtitle("subtitle")                     "subtitle"\r
+#token EndSubtitle("endsubtitle")               "endsubtitle"\r
 #token Help("help")                             "help"\r
 #token Text("text")                             "text"\r
 #token Option("option")                         "option"\r
@@ -183,6 +185,7 @@ VfrParserStart (
 #token Goto("goto")                             "goto"\r
 #token FormSetGuid("formsetguid")               "formsetguid"\r
 #token InconsistentIf("inconsistentif")         "inconsistentif"\r
+#token WarningIf("warningif")                   "warningif"\r
 #token NoSubmitIf("nosubmitif")                 "nosubmitif"\r
 #token EndIf("endif")                           "endif"\r
 #token Key("key")                               "key"\r
@@ -233,6 +236,12 @@ VfrParserStart (
 #token Refresh("refresh")                       "refresh"\r
 #token Interval("interval")                     "interval"\r
 #token VarstoreDevice("varstoredevice")         "varstoredevice"\r
+#token GuidOp("guidop")                         "guidop"\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
 //\r
@@ -335,6 +344,7 @@ vfrDataStructFields :
      dataStructFieldString |\r
      dataStructFieldDate   |\r
      dataStructFieldTime   |\r
+     dataStructFieldRef    |\r
      dataStructFieldUser\r
   )*\r
   ;\r
@@ -421,6 +431,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
@@ -476,6 +496,7 @@ vfrFormSetDefinition :
      UINT8       ClassGuidNum = 0;\r
      CIfrFormSet *FSObj = NULL;\r
      UINT16      C, SC;\r
+     CHAR8*      InsertOpcodeAddr = NULL;\r
   >>\r
   L:FormSet\r
   Uuid "=" guidDefinition[Guid] ","\r
@@ -492,19 +513,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
@@ -544,7 +588,38 @@ vfrFormSetDefinition :
                                                         //\r
                                                         _DeclareDefaultFrameworkVarStore (GET_LINENO(E));\r
                                                       }\r
-                                                      CRT_END_OP (E); if (FSObj != NULL) delete FSObj;\r
+                                                      \r
+                                                      //\r
+                                                      // Declare undefined Question so that they can be used in expression.\r
+                                                      //\r
+                                                      if (gCFormPkg.HavePendingUnassigned()) {\r
+                                                        mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
+                                                                    gCVfrVarDataTypeDB,\r
+                                                                    mCVfrDataStorage,\r
+                                                                    mCVfrQuestionDB,\r
+                                                                    &mFormsetGuid,\r
+                                                                    E->getLine(),\r
+                                                                    &InsertOpcodeAddr\r
+                                                                  );\r
+                                                        gNeedAdjustOpcode = TRUE;\r
+                                                      }\r
+\r
+                                                      CRT_END_OP (E);\r
+\r
+                                                      //\r
+                                                      // Adjust the pending question position.\r
+                                                      // Move the position from current to before the end of the last form in the form set.\r
+                                                      //\r
+                                                      if (gNeedAdjustOpcode) {\r
+                                                        gCFormPkg.AdjustDynamicInsertOpcode (\r
+                                                          mLastFormEndAddr,\r
+                                                          InsertOpcodeAddr\r
+                                                        );\r
+                                                      }\r
+\r
+                                                      if (FSObj != NULL) {\r
+                                                        delete FSObj;\r
+                                                      }\r
                                                     >>\r
   ";"\r
   ;\r
@@ -559,10 +634,197 @@ vfrFormSetList :
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
     vfrStatementDisableIfFormSet  |\r
-    vfrStatementSuppressIfFormSet\r
+    vfrStatementSuppressIfFormSet |\r
+    vfrStatementExtension\r
   )*\r
   ;\r
 \r
+vfrStatementExtension:\r
+  << \r
+     EFI_GUID Guid;\r
+     CIfrGuid *GuidObj = NULL;\r
+     CHAR8    *TypeName = NULL;\r
+     UINT32   TypeSize = 0;\r
+     UINT8    *DataBuff = NULL;\r
+     UINT32   Size = 0;\r
+     UINT8    Idx = 0;\r
+     UINT32   LineNum;\r
+     BOOLEAN  IsStruct = FALSE;\r
+     UINT32   ArrayNum = 0;\r
+  >>\r
+  L:GuidOp\r
+  Uuid "=" guidDefinition[Guid]\r
+  {"," DataType "=" \r
+    (\r
+        U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText());>>}\r
+                                                      << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+      | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText());>>}\r
+                                                      << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+      | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText());>>}\r
+                                                      << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+      | U8:"UINT8"   {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText());>>}\r
+                                                      << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+      | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText());>>}\r
+                                                      << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
+      | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText());>>}\r
+                                                      << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
+      | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText());>>}\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
+      | 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
+                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);\r
+                                                        if (ArrayNum > 0) {\r
+                                                          Size = TypeSize*ArrayNum;\r
+                                                        } else {\r
+                                                          Size = TypeSize;\r
+                                                        }\r
+                                                        if (Size > (128 - sizeof (EFI_IFR_GUID))) return;\r
+                                                        DataBuff = (UINT8 *)malloc(Size);\r
+                                                        for (Idx = 0; Idx < Size; Idx++) {\r
+                                                          DataBuff[Idx] = 0;\r
+                                                        }\r
+                                                      >>\r
+    vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]\r
+  }\r
+                                                      <<\r
+                                                        {\r
+                                                         GuidObj = new CIfrGuid(Size);\r
+                                                         if (GuidObj != NULL) {\r
+                                                           GuidObj->SetLineNo(L->getLine());\r
+                                                           GuidObj->SetGuid (&Guid);\r
+                                                         }\r
+                                                        }\r
+                                                        if (TypeName != NULL) {\r
+                                                          GuidObj->SetData(DataBuff, Size);\r
+                                                        }\r
+                                                      >>\r
+  {","\r
+    (\r
+      vfrStatementExtension\r
+    )*\r
+  E:EndGuidOp                                         << GuidObj->SetScope(1); CRT_END_OP (E); >>\r
+  }\r
+                                                      <<\r
+                                                         if (GuidObj != NULL) delete GuidObj;\r
+                                                         if (DataBuff != NULL) free(DataBuff);\r
+                                                      >>\r
+  ";"\r
+;\r
+\r
+vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:\r
+  <<\r
+     CHAR8    *TFName = NULL;\r
+     UINT32   ArrayIdx = 0;\r
+     UINT16   FieldOffset;\r
+     UINT8    FieldType;\r
+     UINT32   FieldSize;\r
+     UINT64   Data_U64 = 0;\r
+     UINT32   Data_U32 = 0;\r
+     UINT16   Data_U16 = 0;\r
+     UINT8    Data_U8 = 0;\r
+     BOOLEAN  Data_BL = 0;\r
+     EFI_STRING_ID Data_SID = 0;\r
+     BOOLEAN  IsArray = FALSE;\r
+     UINT8    *ByteOffset = NULL;\r
+  >>\r
+(\r
+  ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
+          <<\r
+            ArrayIdx = 0;\r
+            if (IsArray == TRUE) {\r
+              ArrayIdx = _STOU8(IDX1->getText());\r
+              if (ArrayIdx >= ArrayNum) return;\r
+              IsArray = FALSE;\r
+            }\r
+            ByteOffset = DataBuff + (ArrayIdx * TypeSize);\r
+            if (IsStruct == TRUE) {\r
+              _STRCAT(&TFName, TypeName);\r
+            }\r
+          >>\r
+    ("." FN:StringIdentifier\r
+          <<\r
+            if (IsStruct == TRUE) {\r
+              _STRCAT(&TFName, ".");\r
+              _STRCAT(&TFName, FN->getText());\r
+            }\r
+          >>\r
+        {\r
+          OpenBracket IDX2:Number CloseBracket\r
+            <<\r
+              if (IsStruct == TRUE) {\r
+                _STRCAT(&TFName, "[");\r
+                _STRCAT(&TFName, IDX2->getText());\r
+                _STRCAT(&TFName, "]");\r
+              }\r
+            >>\r
+        }\r
+    )*\r
+    "=" RD:Number\r
+          <<\r
+            if (IsStruct == FALSE) {\r
+              if (strcmp ("UINT64", TypeName) == 0) {\r
+                Data_U64 = _STOU64(RD->getText());\r
+                memcpy (ByteOffset, &Data_U64, TypeSize);\r
+              }else if (strcmp ("UINT32", TypeName) == 0) {\r
+                Data_U32 = _STOU32(RD->getText());\r
+                memcpy (ByteOffset, &Data_U32, TypeSize);                                                    \r
+              }else if (strcmp ("UINT16", TypeName) == 0) {\r
+                Data_U16 = _STOU16(RD->getText());\r
+                memcpy (ByteOffset, &Data_U16, TypeSize);                                                    \r
+              }else if (strcmp ("UINT8", TypeName) == 0) {\r
+                Data_U8 = _STOU8(RD->getText());\r
+                memcpy (ByteOffset, &Data_U8, TypeSize);                                                    \r
+              }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
+                Data_BL = _STOU8(RD->getText());\r
+                memcpy (ByteOffset, &Data_BL, TypeSize);                                                    \r
+              }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
+                Data_SID = _STOSID(RD->getText());\r
+                memcpy (ByteOffset, &Data_SID, TypeSize);                                                    \r
+              }\r
+            } else {\r
+              gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
+              switch (FieldType) {\r
+              case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                 Data_U8 = _STOU8(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                 Data_U16 = _STOU16(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                 Data_U32 = _STOU32(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                 Data_U64 = _STOU64(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_BOOLEAN:\r
+                 Data_BL = _STOU8(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_STRING:\r
+                 Data_SID = _STOSID(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);\r
+                 break;\r
+              default:\r
+                 break;\r
+              }\r
+            }\r
+            if (TFName != NULL) { delete TFName; TFName = NULL; }\r
+          >>\r
+  )*\r
+)\r
+;\r
+\r
+\r
 vfrStatementDefaultStore :\r
   << UINT16  DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
   D:DefaultStore N:StringIdentifier ","\r
@@ -604,6 +866,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
@@ -637,7 +900,7 @@ vfrStatementVarStoreLinear :
                                                                                   VarStoreId\r
                                                                                   ), LineNum);\r
                                                        VSObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                        VSObj.SetVarStoreId (VarStoreId);\r
                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
                                                        VSObj.SetSize ((UINT16) Size);\r
@@ -648,22 +911,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, &Guid), 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, &Guid), 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
@@ -676,17 +1019,34 @@ vfrStatementVarStoreNameValue :
   <<\r
      EFI_GUID              Guid;\r
      CIfrVarStoreNameValue VSNVObj;\r
-     EFI_VARSTORE_ID       VarStoreId;\r
+     EFI_VARSTORE_ID       VarStoreId = EFI_VARSTORE_ID_INVALID;\r
+     BOOLEAN               Created    = FALSE;\r
   >>\r
   L:NameValueVarStore                               << VSNVObj.SetLineNo(L->getLine()); >>\r
-  SN:StringIdentifier ","                           << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText()), SN); >>\r
+  SN:StringIdentifier ","\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
   (\r
-    Name "=" "STRING_TOKEN" "\(" N:Number "\)" ","  << _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText())), SN); >>\r
+    Name "=" "STRING_TOKEN" "\(" N:Number "\)" ","  << \r
+                                                       if (!Created) {\r
+                                                         _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
+                                                         Created = TRUE;\r
+                                                       }\r
+                                                       _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText())), SN); \r
+                                                    >>\r
   )+\r
   Uuid "=" guidDefinition[Guid]                     << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
                                                     <<\r
                                                        VSNVObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
                                                        VSNVObj.SetVarStoreId (VarStoreId);\r
                                                     >>\r
   ";"\r
@@ -760,9 +1120,14 @@ vfrStatementHeader[CIfrStatementHeader *SHObj] :
 vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
   <<\r
      EFI_VARSTORE_INFO Info;\r
+     Info.mVarType               = EFI_IFR_TYPE_OTHER;\r
+     Info.mVarTotalSize          = 0;\r
+     Info.mInfo.mVarOffset       = EFI_VAROFFSET_INVALID;\r
+     Info.mVarStoreId            = EFI_VARSTORE_ID_INVALID;\r
      EFI_QUESTION_ID   QId       = EFI_QUESTION_ID_INVALID;\r
      CHAR8             *QName    = NULL;\r
      CHAR8             *VarIdStr = NULL;\r
+     mUsedDefaultCount           = 0;\r
   >>\r
   {\r
     Name "=" QN:StringIdentifier ","                <<\r
@@ -788,39 +1153,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
+                                                       }\r
+                                                       _SAVE_CURRQEST_VARINFO (Info);\r
                                                     >>\r
-  vfrStatementHeader[$QHObj]\r
   ;\r
 \r
 questionheaderFlagsField[UINT8 & Flags] :\r
@@ -843,6 +1200,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
      CHAR8                 *TName       = NULL;\r
      EFI_VFR_RETURN_CODE   VfrReturnCode = VFR_RETURN_SUCCESS;\r
      EFI_IFR_TYPE_VALUE    Dummy        = gZeroEfiIfrTypeValue;\r
+     EFI_GUID              *VarGuid     = NULL;\r
   >>\r
   (\r
     SN1:StringIdentifier                            << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r
@@ -853,7 +1211,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                        _STRCAT(&VarIdStr, "]");\r
                                                     >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
                                                           mCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
@@ -863,20 +1221,21 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN1);\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
     SN2:StringIdentifier                            << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
                                                           mCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
@@ -886,13 +1245,13 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN2);\r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
+                                                         VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
+                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
                                                            _STRCAT(&VarStr, TName);\r
                                                          }\r
                                                        }\r
@@ -931,13 +1290,16 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                          break;\r
                                                        case EFI_VFR_VARSTORE_BUFFER:\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
+                                                         VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
                                                          _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
                                                                     SName,\r
+                                                                    VarGuid,\r
                                                                     NULL),\r
                                                                  SN2->getLine());\r
                                                          _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write (\r
                                                                     'a',\r
                                                                     SName,\r
+                                                                    VarGuid,\r
                                                                     NULL,\r
                                                                     $Info.mVarType,\r
                                                                     $Info.mInfo.mVarOffset,\r
@@ -1004,6 +1366,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
@@ -1026,6 +1391,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
@@ -1037,6 +1403,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
@@ -1060,7 +1428,9 @@ vfrFormDefinition :
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
     // Just for framework vfr compatibility\r
-    vfrStatementInvalid\r
+    vfrStatementInvalid                      |\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal\r
   )*\r
   E:EndForm                                         <<\r
                                                       if (mCompatibleMode) {\r
@@ -1076,23 +1446,9 @@ 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
-                                                      // mCVfrQuestionDB.PrintAllQuestion();\r
-                                                      //\r
-                                                      CRT_END_OP (E);\r
+\r
+                                                      {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
                                                     >>\r
   ";"\r
   ;\r
@@ -1118,7 +1474,9 @@ vfrFormMapDefinition :
     vfrStatementQuestions                    |\r
     vfrStatementConditional                  |\r
     vfrStatementLabel                        |\r
-    vfrStatementBanner\r
+    vfrStatementBanner                       |\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal\r
   )*\r
   E:EndForm                                         << CRT_END_OP (E); >>\r
   ";"\r
@@ -1140,42 +1498,72 @@ vfrStatementDefault :
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
      EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
-     CIfrDefault           DObj;\r
+     CIfrDefault           *DObj         = NULL;\r
+     CIfrDefault2          *DObj2        = NULL;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
      CHAR8                 *VarStoreName = NULL;\r
      EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
+     UINT32                Size          = 0;\r
+     EFI_GUID              *VarGuid      = NULL;\r
   >>\r
-  D:Default                                         << DObj.SetLineNo(D->getLine()); >>\r
+  D:Default                                         \r
   (\r
     (\r
-        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
-      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  << \r
+      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  \r
+                                                    << \r
                                                         if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
                                                           //check default value is valid for Numeric Opcode\r
                                                           if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                           }\r
                                                         }\r
-                                                        DObj.SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                        DObj.SetValue(Val);\r
+                                                        if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                          _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
+                                                          Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                        } else {\r
+                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
+                                                        }\r
+                                                        Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
+                                                        DObj = new CIfrDefault ((UINT8)Size);\r
+                                                        DObj->SetLineNo(D->getLine());\r
+                                                        DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                        DObj->SetValue(Val);\r
                                                     >>\r
+      |                                             << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
+        vfrStatementValue ","                       << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
     )\r
     {\r
-      DefaultStore "=" SN:StringIdentifier ","      << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r
+      DefaultStore "=" SN:StringIdentifier ","      << \r
+                                                        _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
+                                                        if (DObj != NULL) {\r
+                                                          DObj->SetDefaultId (DefaultId); \r
+                                                        } \r
+\r
+                                                        if (DObj2 != NULL) {\r
+                                                          DObj2->SetDefaultId (DefaultId); \r
+                                                        }\r
+                                                    >>\r
     }\r
                                                     <<\r
+                                                      CheckDuplicateDefaultValue (DefaultId, D);\r
+                                                      if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
                                                        _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreType (VarStoreName, VarStoreType), D->getLine());\r
+                                                       VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                       VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                        if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
                                                          _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                    DefaultId,\r
                                                                    _GET_CURRQEST_VARTINFO(),\r
                                                                    VarStoreName,\r
+                                                                   VarGuid,\r
                                                                    _GET_CURRQEST_DATATYPE (),\r
-                                                                   Val),\r
-                                                                   D->getLine()\r
-                                                                   );\r
+                                                                     Val),\r
+                                                                     D->getLine()\r
+                                                                     );\r
+                                                         }\r
                                                        }\r
+                                                       if (DObj  != NULL) {delete DObj;} \r
+                                                       if (DObj2 != NULL) {delete DObj2;} \r
                                                     >>\r
   )\r
   ;\r
@@ -1258,8 +1646,14 @@ vfrStatementSubTitle :
   {\r
     "," FLAGS "=" vfrSubtitleFlags[SObj]\r
   }\r
-  { vfrStatementStatTagList "," }\r
-  E:";"                                                << CRT_END_OP (E); >>\r
+  (\r
+    {vfrStatementStatTagList "," }\r
+    E:";"                                               << CRT_END_OP (E); >>\r
+  |\r
+    { "," vfrStatementStatTagList}\r
+    { "," (vfrStatementStat | vfrStatementQuestions)*}\r
+    E: EndSubtitle ";"                                  << CRT_END_OP (E); >>\r
+  )\r
   ;\r
 \r
 vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
@@ -1324,20 +1718,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
@@ -1366,7 +1762,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
@@ -1377,13 +1778,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
@@ -1395,6 +1805,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
@@ -1405,15 +1816,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
@@ -1421,13 +1834,20 @@ vfrStatementGoto :
                                                           default: break;\r
                                                           }\r
                                                        >>\r
-  vfrQuestionHeaderWithNoStorage[QHObj]\r
-  { "," vfrStatementStatTagList }\r
+  vfrQuestionHeader[*QHObj, QUESTION_REF]              <<\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
+                                                          }\r
+                                                       >>\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
@@ -1487,49 +1907,62 @@ vfrStatementCheckBox :
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
      CHAR8              *VarStoreName = NULL;\r
      UINT32             DataTypeSize;\r
+     EFI_GUID           *VarStoreGuid = NULL;\r
   >>\r
   L:CheckBox                                           << CBObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[CBObj] ","                         << //check data type\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
-                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
-                                                          } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
-                                                                    (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
+                                                          }\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
+                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
+                                                            } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
+                                                                      (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+                                                            }\r
                                                           }\r
                                                        >>\r
   {\r
     F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
                                                        <<\r
-                                                          _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
-                                                          Val.b = TRUE;\r
-                                                          if (CBObj.GetFlags () & 0x01) {\r
-                                                            _PCATCH(\r
-                                                              mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                                  EFI_HII_DEFAULT_CLASS_STANDARD,\r
-                                                                                  _GET_CURRQEST_VARTINFO(),\r
-                                                                                  VarStoreName,\r
-                                                                                  _GET_CURRQEST_DATATYPE (),\r
-                                                                                  Val\r
-                                                                                  ),\r
-                                                              VFR_RETURN_SUCCESS,\r
-                                                              L,\r
-                                                              "No standard default storage found"\r
-                                                              );\r
-                                                          }\r
-                                                          if (CBObj.GetFlags () & 0x02) {\r
-                                                            _PCATCH(\r
-                                                              mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                                  EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
-                                                                                  _GET_CURRQEST_VARTINFO(),\r
-                                                                                  VarStoreName,\r
-                                                                                  _GET_CURRQEST_DATATYPE (),\r
-                                                                                  Val\r
-                                                                                  ),\r
-                                                              VFR_RETURN_SUCCESS,\r
-                                                              L,\r
-                                                              "No manufacturing default storage found"\r
-                                                              );\r
+                                                         if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
+                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            Val.b = TRUE;\r
+                                                            if (CBObj.GetFlags () & 0x01) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
+                                                              _PCATCH(\r
+                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                                    EFI_HII_DEFAULT_CLASS_STANDARD,\r
+                                                                                    _GET_CURRQEST_VARTINFO(),\r
+                                                                                    VarStoreName,\r
+                                                                                    VarStoreGuid,\r
+                                                                                    _GET_CURRQEST_DATATYPE (),\r
+                                                                                    Val\r
+                                                                                    ),\r
+                                                                VFR_RETURN_SUCCESS,\r
+                                                                L,\r
+                                                                "No standard default storage found"\r
+                                                                );\r
+                                                            }\r
+                                                            if (CBObj.GetFlags () & 0x02) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
+                                                              _PCATCH(\r
+                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                                    EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
+                                                                                    _GET_CURRQEST_VARTINFO(),\r
+                                                                                    VarStoreName,\r
+                                                                                    VarStoreGuid,\r
+                                                                                    _GET_CURRQEST_DATATYPE (),\r
+                                                                                    Val\r
+                                                                                    ),\r
+                                                                VFR_RETURN_SUCCESS,\r
+                                                                L,\r
+                                                                "No manufacturing default storage found"\r
+                                                                );\r
+                                                            }\r
                                                           }\r
                                                         >>\r
   }\r
@@ -1600,7 +2033,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
@@ -1625,11 +2058,16 @@ vfrStatementDate :
      CHAR8              *VarIdStr[3] = {NULL, };\r
      CIfrDate           DObj;\r
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+     UINT8              Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
   >>\r
   L:Date                                               << DObj.SetLineNo(L->getLine()); >>\r
   (\r
     (\r
-      vfrQuestionHeader[DObj, QUESTION_DATE] ","\r
+      vfrQuestionHeader[DObj, QUESTION_DATE] ","       <<\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
+                                                          }\r
+                                                       >>\r
     { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
       vfrStatementQuestionOptionList\r
     )\r
@@ -1652,6 +2090,7 @@ vfrStatementDate :
       Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
       Help   "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
       minMaxDateStepDefault[Val.date, 2]\r
+      { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }\r
                                                        <<\r
                                                           mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
                                                           DObj.SetQuestionId (QId);\r
@@ -1660,7 +2099,7 @@ vfrStatementDate :
                                                           DObj.SetHelp (_STOSID(YH->getText()));\r
                                                           if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
                                                        >>\r
-                                                       << {CIfrDefault DefaultObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
+                                                       << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
     )\r
     ( vfrStatementInconsistentIf )*\r
   )\r
@@ -1788,23 +2227,47 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
 vfrStatementNumeric :\r
   <<\r
      CIfrNumeric NObj;\r
-     UINT32 DataTypeSize;\r
+     UINT32      DataTypeSize;\r
+     BOOLEAN     IsSupported = TRUE;\r
+     UINT8       ShrinkSize  = 0;\r
   >>\r
   L:Numeric                                            << NObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[NObj] ","                          << // check data type\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
-                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
+                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+                                                            }\r
+                                                            _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                           }\r
-                                                          _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                        >>\r
   { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
   {\r
     Key   "=" KN:Number ","                            << AssignQuestionKey (NObj, KN); >>\r
   }\r
-  vfrSetMinMaxStep[NObj]\r
+  vfrSetMinMaxStep[NObj]                               <<\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            //\r
+                                                            // Base on the type to know the actual used size,shrink the buffer \r
+                                                            // size allocate before.\r
+                                                            //\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
+                                                            default: \r
+                                                              IsSupported = FALSE;\r
+                                                              break;\r
+                                                          }\r
+                                                          NObj.ShrinkBinSize (ShrinkSize);\r
+                                                          if (!IsSupported) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+                                                          }\r
+                                                       >>\r
   vfrStatementQuestionOptionList\r
-  E:EndNumeric                                         << CRT_END_OP (E); >>\r
+  E:EndNumeric                                         << \r
+                                                          CRT_END_OP (E); \r
+                                                       >>\r
   ";"\r
   ;\r
 \r
@@ -1813,32 +2276,37 @@ vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
      UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
      EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+     BOOLEAN IsSetType = FALSE;\r
   >>\r
-  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
+  numericFlagsField[HFlags, LFlags, IsSetType] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType] )*\r
                                                        <<\r
                                                           //check data type flag\r
-                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
-                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                              if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                                _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                              }\r
+                                                            } else {\r
+                                                              // update data type for name/value store\r
+                                                              UINT32 DataTypeSize;\r
+                                                              _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                              gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                              _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                             }\r
-                                                          } else {\r
-                                                            // update data type for name/value store\r
-                                                            UINT32 DataTypeSize;\r
+                                                          } else if (IsSetType){\r
                                                             _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
-                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
-                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                           }\r
                                                           _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum);\r
                                                        >>\r
   ;\r
 \r
-numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType] :\r
     N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
-  | "NUMERIC_SIZE_1"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; >>\r
-  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; >>\r
-  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; >>\r
-  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; >>\r
+  | "NUMERIC_SIZE_1"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
+  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
+  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
+  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
   | "DISPLAY_INT_DEC"                                  << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; >>\r
   | "DISPLAY_UINT_DEC"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; >>\r
   | "DISPLAY_UINT_HEX"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; >>\r
@@ -1849,21 +2317,46 @@ vfrStatementOneOf :
   <<\r
      CIfrOneOf OObj;\r
      UINT32    DataTypeSize;\r
+     BOOLEAN   IsSupported = TRUE;\r
+     UINT8     ShrinkSize  = 0;\r
   >>\r
   L:OneOf                                              << OObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OObj] ","                          << //check data type\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
-                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
+                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+                                                            }\r
+                                                            _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                           }\r
-                                                          _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                        >>\r
   { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
   {\r
     vfrSetMinMaxStep[OObj]\r
   }\r
+                                                       <<\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            //\r
+                                                            // Base on the type to know the actual used size,shrink the buffer \r
+                                                            // size allocate before.\r
+                                                            //\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
+                                                            default:\r
+                                                              IsSupported = FALSE;\r
+                                                              break;\r
+                                                          }\r
+                                                          OObj.ShrinkBinSize (ShrinkSize);\r
+                                                          if (!IsSupported) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+                                                          }\r
+                                                       >>\r
   vfrStatementQuestionOptionList\r
-  E:EndOneOf                                           << CRT_END_OP (E); >>\r
+  E:EndOneOf                                           <<\r
+                                                          CRT_END_OP (E); \r
+                                                       >>\r
   ";"\r
   ;\r
 \r
@@ -1872,21 +2365,26 @@ vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
      UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
      EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+     BOOLEAN IsSetType = FALSE;\r
   >>\r
-  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
+  numericFlagsField[HFlags, LFlags, IsSetType] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType] )*\r
                                                        <<\r
                                                           //check data type flag\r
-                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
-                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                              if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                                _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                              }\r
+                                                            } else {\r
+                                                              // update data type for Name/Value store\r
+                                                              UINT32 DataTypeSize;\r
+                                                              _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                              gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                              _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                             }\r
-                                                          } else {\r
-                                                            // update data type for Name/Value store\r
-                                                            UINT32 DataTypeSize;\r
+                                                          } else if (IsSetType){\r
                                                             _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
-                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
-                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                           }\r
                                                           _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
                                                        >>\r
@@ -1900,6 +2398,9 @@ vfrStatementStringType :
 vfrStatementString :\r
   <<\r
      CIfrString SObj;\r
+     UINT32 VarArraySize;\r
+     UINT8 StringMinSize;\r
+     UINT8 StringMaxSize;\r
   >>\r
   L:String                                             << SObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[SObj] ","\r
@@ -1907,8 +2408,27 @@ vfrStatementString :
   {\r
     Key "=" KN:Number ","                              << AssignQuestionKey (SObj, KN); >>\r
   }\r
-  MinSize "=" MIN:Number ","                           << SObj.SetMinSize (_STOU8(MIN->getText())); >>\r
-  MaxSize "=" MAX:Number ","                           << SObj.SetMaxSize (_STOU8(MAX->getText())); >>\r
+  MinSize "=" MIN:Number ","                           << \r
+                                                          VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+                                                          StringMinSize = _STOU8(MIN->getText());\r
+                                                          if (_STOU64(MIN->getText()) > StringMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
+                                                          } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
+                                                          }\r
+                                                          SObj.SetMinSize (StringMinSize);\r
+                                                       >>\r
+  MaxSize "=" MAX:Number ","                           << \r
+                                                          StringMaxSize = _STOU8(MAX->getText());\r
+                                                          if (_STOU64(MAX->getText()) > StringMaxSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
+                                                          } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
+                                                          } else if (StringMaxSize < StringMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
+                                                          }\r
+                                                          SObj.SetMaxSize (StringMaxSize);\r
+                                                       >>\r
   vfrStatementQuestionOptionList\r
   E:EndString                                          << CRT_END_OP (E); >>\r
   ";"\r
@@ -1932,6 +2452,9 @@ stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
 vfrStatementPassword :\r
   <<\r
      CIfrPassword PObj;\r
+     UINT32 VarArraySize;\r
+     UINT16 PasswordMinSize;\r
+     UINT16 PasswordMaxSize;\r
   >>\r
   L:Password                                           << PObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[PObj] ","\r
@@ -1939,8 +2462,27 @@ vfrStatementPassword :
   {\r
     Key "=" KN:Number ","                              << AssignQuestionKey (PObj, KN); >>\r
   }\r
-  MinSize "=" MIN:Number ","                           << PObj.SetMinSize (_STOU16(MIN->getText())); >>\r
-  MaxSize "=" MAX:Number ","                           << PObj.SetMaxSize (_STOU16(MAX->getText())); >>\r
+  MinSize "=" MIN:Number ","                           << \r
+                                                          VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+                                                          PasswordMinSize = _STOU16(MIN->getText());\r
+                                                          if (_STOU64(MIN->getText()) > PasswordMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
+                                                          } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
+                                                          }\r
+                                                          PObj.SetMinSize (PasswordMinSize);\r
+                                                       >>\r
+  MaxSize "=" MAX:Number ","                           << \r
+                                                          PasswordMaxSize = _STOU16(MAX->getText());\r
+                                                          if (_STOU64(MAX->getText()) > PasswordMaxSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
+                                                          } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
+                                                          } else if (PasswordMaxSize < PasswordMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
+                                                          }\r
+                                                          PObj.SetMaxSize (PasswordMaxSize);\r
+                                                       >>\r
   { Encoding "=" Number "," }\r
   vfrStatementQuestionOptionList\r
   E:EndPassword                                        << CRT_END_OP (E); >>\r
@@ -1961,12 +2503,23 @@ passwordFlagsField [UINT8 & HFlags] :
 vfrStatementOrderedList :\r
   <<\r
      CIfrOrderedList OLObj;\r
+     UINT32 VarArraySize;\r
   >>\r
   L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OLObj] ","\r
-                                                       << OLObj.SetMaxContainers ((UINT8) _GET_CURRQEST_ARRAY_SIZE()); >>\r
+                                                       << \r
+                                                          VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+                                                          OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
+                                                       >>\r
   {\r
-    MaxContainers "=" M:Number ","                     << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r
+    MaxContainers "=" M:Number ","                     << \r
+                                                          if (_STOU64(M->getText()) > _STOU8(M->getText())) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
+                                                          } else if (VarArraySize != 0 && _STOU8(M->getText()) > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
+                                                          }\r
+                                                          OLObj.SetMaxContainers (_STOU8(M->getText()));\r
+                                                       >>\r
   }\r
   { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r
   vfrStatementQuestionOptionList\r
@@ -1996,13 +2549,18 @@ vfrStatementTime :
      CHAR8              *VarIdStr[3] = {NULL, };\r
      CIfrTime           TObj;\r
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+     UINT8              Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
   >>\r
   L:Time                                               << TObj.SetLineNo(L->getLine()); >>\r
   (\r
     (\r
-      vfrQuestionHeader[TObj, QUESTION_TIME] ","\r
+      vfrQuestionHeader[TObj, QUESTION_TIME] ","       <<\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
+                                                          }\r
+                                                       >>\r
     { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
-      vfrStatementDefault\r
+      vfrStatementQuestionOptionList\r
     )\r
     |\r
     (\r
@@ -2023,6 +2581,7 @@ vfrStatementTime :
       Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
       Help   "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
       minMaxTimeStepDefault[Val.time, 2]\r
+      { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }\r
                                                        <<\r
                                                           mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
                                                           TObj.SetQuestionId (QId);\r
@@ -2031,7 +2590,7 @@ vfrStatementTime :
                                                           TObj.SetHelp (_STOSID(HH->getText()));\r
                                                           if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
                                                        >>\r
-                                                       << {CIfrDefault DefaultObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
+                                                       << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
     )\r
     ( vfrStatementInconsistentIf )*\r
   )\r
@@ -2091,7 +2650,10 @@ vfrStatementQuestionTag :
   vfrStatementNoSubmitIf        |\r
   vfrStatementDisableIfQuest    |\r
   vfrStatementRefresh           |\r
-  vfrStatementVarstoreDevice\r
+  vfrStatementVarstoreDevice    |\r
+  vfrStatementExtension         |\r
+  vfrStatementRefreshEvent      |\r
+  vfrStatementWarningIf\r
   ;\r
 \r
 vfrStatementQuestionTagList :\r
@@ -2120,6 +2682,7 @@ vfrStatementStatList :
   vfrStatementQuestions                   |\r
   vfrStatementConditionalNew              |\r
   vfrStatementLabel                       |\r
+  vfrStatementExtension                   |\r
   // Just for framework vfr compatibility\r
   vfrStatementInvalid\r
   ;\r
@@ -2241,6 +2804,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
@@ -2255,6 +2823,11 @@ vfrStatementImage :
   ";"\r
   ;\r
 \r
+vfrStatementModal :\r
+  vfrModalTag\r
+  ";"\r
+  ;\r
+\r
 vfrStatementLocked :\r
   vfrLockedTag\r
   ";"\r
@@ -2278,6 +2851,15 @@ vfrStatementNoSubmitIf :
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ;\r
 \r
+vfrStatementWarningIf :\r
+  << CIfrWarningIf WIObj; >>\r
+  L:WarningIf                                          << WIObj.SetLineNo(L->getLine()); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << WIObj.SetWarning (_STOSID(S->getText())); >>\r
+  {Timeout "=" T:Number ","                            << WIObj.SetTimeOut (_STOU8(T->getText())); >>}\r
+  vfrStatementExpression[0]\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ;\r
+\r
 vfrStatementDisableIfQuest :\r
   << \r
     CIfrDisableIf DIObj; \r
@@ -2294,6 +2876,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
@@ -2324,11 +2915,32 @@ vfrStatementOptions :
 \r
 vfrStatementOneOfOption :\r
   <<\r
-     EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
-     CIfrOneOfOption    OOOObj;\r
+     EFI_IFR_TYPE_VALUE Val           = gZeroEfiIfrTypeValue;\r
      CHAR8              *VarStoreName = NULL;\r
+     UINT32             Size          = 0;\r
+     BOOLEAN            TypeError     = FALSE;\r
+     EFI_VFR_RETURN_CODE ReturnCode   = VFR_RETURN_SUCCESS;\r
+     EFI_GUID           *VarStoreGuid = NULL;\r
+     \r
+     if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+       TypeError = TRUE;\r
+       Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+     } else {\r
+       ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+     }\r
+\r
+     Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+     CIfrOneOfOption    OOOObj ((UINT8)Size);\r
   >>\r
-  L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
+  L:Option                                             <<      \r
+                                                          OOOObj.SetLineNo(L->getLine());\r
+                                                          if (TypeError) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
+                                                          }\r
+                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+                                                            _PCATCH (ReturnCode, L->getLine());\r
+                                                          }\r
+                                                       >>\r
   Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
   Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \r
                                                        << \r
@@ -2357,24 +2969,31 @@ vfrStatementOneOfOption :
                                                        >>\r
   F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
                                                        <<\r
-                                                          _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
-                                                          if (OOOObj.GetFlags () & 0x10) {\r
-                                                            _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                      EFI_HII_DEFAULT_CLASS_STANDARD,\r
-                                                                       _GET_CURRQEST_VARTINFO(),\r
-                                                                      VarStoreName,\r
-                                                                      _GET_CURRQEST_DATATYPE (),\r
-                                                                      Val\r
-                                                                      ), L->getLine());\r
-                                                          }\r
-                                                          if (OOOObj.GetFlags () & 0x20) {\r
-                                                            _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                      EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
-                                                                       _GET_CURRQEST_VARTINFO(),\r
-                                                                      VarStoreName,\r
-                                                                      _GET_CURRQEST_DATATYPE (),\r
-                                                                      Val\r
-                                                                      ), L->getLine());\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
+                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (OOOObj.GetFlags () & 0x10) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
+                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                        EFI_HII_DEFAULT_CLASS_STANDARD,\r
+                                                                         _GET_CURRQEST_VARTINFO(),\r
+                                                                        VarStoreName,\r
+                                                                        VarStoreGuid,\r
+                                                                        _GET_CURRQEST_DATATYPE (),\r
+                                                                        Val\r
+                                                                        ), L->getLine());\r
+                                                            }\r
+                                                            if (OOOObj.GetFlags () & 0x20) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
+                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                        EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
+                                                                         _GET_CURRQEST_VARTINFO(),\r
+                                                                        VarStoreName,\r
+                                                                        VarStoreGuid,\r
+                                                                        _GET_CURRQEST_DATATYPE (),\r
+                                                                        Val\r
+                                                                        ), L->getLine());\r
+                                                            }\r
                                                           }\r
                                                        >>\r
   {\r
@@ -2562,6 +3181,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
@@ -2767,7 +3387,7 @@ vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | ideqvalExp[$RootLevel, $ExpOpCount]\r
   | ideqidExp[$RootLevel, $ExpOpCount]\r
   | ideqvallistExp[$RootLevel, $ExpOpCount]\r
-  | questionref13Exp[$RootLevel, $ExpOpCount]\r
+  | questionref1Exp[$RootLevel, $ExpOpCount]\r
   | rulerefExp[$RootLevel, $ExpOpCount]\r
   | stringref1Exp[$RootLevel, $ExpOpCount]\r
   | pushthisExp[$RootLevel, $ExpOpCount]\r
@@ -2786,8 +3406,8 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
      UINT16          ConstVal;\r
      CHAR8           *VarIdStr;\r
      UINT32          LineNo;\r
-     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
      EFI_VFR_RETURN_CODE   VfrReturnCode = VFR_RETURN_SUCCESS;\r
+     EFI_VARSTORE_ID       VarStoreId   = EFI_VARSTORE_ID_INVALID;\r
   >>\r
   L:VarEqVal                                          <<\r
                                                         if (!mCompatibleMode) {\r
@@ -2798,7 +3418,7 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   OpenParen\r
   VN:Number                                           <<\r
                                                           VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (VarIdStr, VarStoreType);\r
+                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
                                                           if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
                                                             _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
                                                                                         VarIdStr,\r
@@ -3002,50 +3622,26 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                         >>\r
   ;\r
 \r
-questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
   <<\r
-     UINT8           Type = 0x1;\r
-     EFI_STRING_ID   DevPath = EFI_STRING_ID_INVALID;\r
-     EFI_GUID        Guid = {0,};\r
      EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
      UINT32          BitMask;\r
      CHAR8           *QName = NULL;\r
      UINT32          LineNo = 0;\r
   >>\r
   L:QuestionRef\r
-  (\r
-    (\r
-                                                       << Type = 0x3; >>\r
-      {\r
-        Path "=" "STRING_TOKEN" "\(" S:Number "\)"     << Type = 0x4; DevPath = _STOSID(S->getText()); >>\r
-      }\r
-      {\r
-        Uuid "=" guidDefinition[Guid]                  << Type = 0x5; >>\r
-      }\r
-    )\r
-    |\r
-    (\r
-      "\("\r
-    (\r
+  "\("\r
+      (\r
           QN:StringIdentifier                          <<\r
                                                           QName  = QN->getText();\r
-                              LineNo = QN->getLine();\r
+                                                          LineNo = QN->getLine();\r
                                                           mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
                                                        >>\r
         | ID:Number                                    << QId = _STOQID(ID->getText()); >>\r
       )\r
-      "\)"\r
-    )\r
-  )\r
+  "\)"\r
                                                        <<\r
-                                                          switch (Type) {\r
-                                                          case 0x1: {CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); break;}\r
-                                                          case 0x3: {CIfrQuestionRef3 QR3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
-                                                          case 0x4: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
-                                                          case 0x5: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0), L->getLine()); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}\r
-                                                          }\r
-                                                          $ExpOpCount++;\r
-                                                       >>\r
+                                                          { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
   ;\r
 \r
 rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -3177,9 +3773,10 @@ vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :
 vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
     lengthExp[$RootLevel, $ExpOpCount]\r
   | bitwisenotExp[$RootLevel, $ExpOpCount]\r
-  | question2refExp[$RootLevel, $ExpOpCount]\r
+  | question23refExp[$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
@@ -3198,10 +3795,30 @@ bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
-question2refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     UINT8           Type = 0x1;\r
+     EFI_STRING_ID   DevPath = EFI_STRING_ID_INVALID;\r
+     EFI_GUID        Guid = {0,};\r
+  >>\r
   L:QuestionRefVal\r
-  "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
-                                                       << { CIfrQuestionRef2 QR2Obj(L->getLine()); $ExpOpCount++; } >>\r
+  "\("\r
+      {\r
+        DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" ","    << Type = 0x2; DevPath = _STOSID(S->getText()); >>\r
+      }\r
+      {\r
+        Uuid "=" guidDefinition[Guid] ","                       << Type = 0x3; >>\r
+      }\r
+      vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
+  "\)"\r
+                                                       <<\r
+                                                          switch (Type) {\r
+                                                          case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
+                                                          case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
+                                                          case 0x3: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0), L->getLine()); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}\r
+                                                          }\r
+                                                          $ExpOpCount++;\r
+                                                       >>\r
   ;\r
 \r
 stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -3438,6 +4055,14 @@ private:
 \r
 \r
   EFI_VARSTORE_INFO   mCurrQestVarInfo;\r
+  EFI_GUID            *mOverrideClassGuid;\r
+  CHAR8*              mLastFormEndAddr;\r
+\r
+//\r
+// Whether the question already has default value.\r
+//\r
+  UINT16              mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
+  UINT16              mUsedDefaultCount;\r
 \r
 //\r
 // For framework vfr compatibility\r
@@ -3453,6 +4078,7 @@ private:
   UINT8               _GET_CURRQEST_DATATYPE ();\r
   UINT32              _GET_CURRQEST_VARSIZE ();\r
   UINT32              _GET_CURRQEST_ARRAY_SIZE();\r
+  VOID                CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
 \r
 public:\r
   VOID                _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
@@ -3471,6 +4097,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
@@ -3488,6 +4115,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
@@ -3909,6 +4537,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
@@ -3976,6 +4623,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
@@ -4012,7 +4662,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
                        TypeNameList[Index],\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4037,7 +4687,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
                        (CHAR8 *) DateType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4058,7 +4708,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
                        (CHAR8 *) TimeType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4274,6 +4924,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
@@ -4283,4 +4939,25 @@ EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)
   mCompatibleMode = Mode;\r
   mCVfrQuestionDB.SetCompatibleMode (Mode);\r
 }\r
+\r
+VOID\r
+EfiVfrParser::CheckDuplicateDefaultValue (\r
+  IN EFI_DEFAULT_ID      DefaultId,\r
+  IN ANTLRTokenPtr       Tok\r
+  )\r
+{\r
+  UINT16    Index;\r
+\r
+  for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
+    if (mUsedDefaultArray[Index] == DefaultId) {\r
+      gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
+    }\r
+  }\r
+\r
+  if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
+    gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
+  }\r
+\r
+  mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
+}\r
 >>\r