]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools: resolve initialization order errors in VfrFormPkg.h
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index c01f16e5d58303cf04c08c457eb5fa260dd34d1f..4c7c6f28ff4fdfeb68100b93d84bbf5c1f73a2a6 100644 (file)
@@ -1,6 +1,8 @@
-/*++\r
-Copyright (c) 2004 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+/*++ @file\r
+Vfr Syntax\r
+\r
+Copyright (c) 2004 - 2017, 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
@@ -8,11 +10,6 @@ http://opensource.org/licenses/bsd-license.php
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-Module Name:\r
-  VfrSyntax.g\r
-\r
-Abstract:\r
-\r
 --*/\r
 \r
 #header<<\r
@@ -26,6 +23,9 @@ Abstract:
 >>\r
 \r
 <<\r
+#ifdef UINT8_MAX\r
+#undef UINT8_MAX\r
+#endif\r
 #include "stdio.h"\r
 #include "PBlackBox.h"\r
 #include "DLexerBase.h"\r
@@ -33,8 +33,8 @@ Abstract:
 #include "AToken.h"\r
 \r
 #define GET_LINENO(Obj)       ((Obj)->getLine())\r
-#define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0)\r
-#define CRT_END_OP(Obj)       {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)\r
+#define SET_LINE_INFO(Obj, L) do {(Obj).SetLineNo((L)->getLine());} while (0)\r
+#define CRT_END_OP(Obj)       do {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)\r
 \r
 typedef ANTLRCommonToken ANTLRToken;\r
 \r
@@ -42,7 +42,7 @@ class CVfrDLGLexer : public VfrLexer
 {\r
 public:\r
   CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};\r
-  INT32 errstd (char *Text)\r
+  void errstd (const char *Text)\r
   {\r
     printf ("unrecognized input '%s'\n", Text);\r
   }\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
@@ -131,7 +132,11 @@ VfrParserStart (
 #token EndList("endlist")                       "endlist"\r
 #token EndForm("endform")                       "endform"\r
 #token Form("form")                             "form"\r
+#token FormMap("formmap")                       "formmap"\r
+#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
@@ -152,6 +157,7 @@ VfrParserStart (
 #token Inventory("inventory")                   "inventory"\r
 #token NonNvDataMap("_NON_NV_DATA_MAP")         "_NON_NV_DATA_MAP"\r
 #token Struct("struct")                         "struct"\r
+#token Union("union")                           "union"\r
 #token Boolean("BOOLEAN")                       "BOOLEAN"\r
 #token Uint64("UINT64")                         "UINT64"\r
 #token Uint32("UINT32")                         "UINT32"\r
@@ -180,6 +186,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
@@ -188,6 +195,7 @@ VfrParserStart (
 #token InteractiveFlag("INTERACTIVE")           "INTERACTIVE"\r
 #token NVAccessFlag("NV_ACCESS")                "NV_ACCESS"\r
 #token ResetRequiredFlag("RESET_REQUIRED")      "RESET_REQUIRED"\r
+#token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED"\r
 #token LateCheckFlag("LATE_CHECK")              "LATE_CHECK"\r
 #token ReadOnlyFlag("READ_ONLY")                "READ_ONLY"\r
 #token OptionOnlyFlag("OPTIONS_ONLY")           "OPTIONS_ONLY"\r
@@ -214,6 +222,8 @@ VfrParserStart (
 #token Rule("rule")                             "rule"\r
 #token EndRule("endrule")                       "endrule"\r
 #token Value("value")                           "value"\r
+#token Read("read")                             "read"\r
+#token Write("write")                           "write"\r
 #token ResetButton("resetbutton")               "resetbutton"\r
 #token EndResetButton("endresetbutton")         "endresetbutton"\r
 #token DefaultStore("defaultstore")             "defaultstore"\r
@@ -228,6 +238,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
@@ -250,12 +266,14 @@ VfrParserStart (
 \r
 vfrProgram > [UINT8 Return] :\r
   <<\r
-     mParserStatus = 0;\r
+     mParserStatus   = 0;\r
+     mCIfrOpHdrIndex = 0;\r
      mConstantOnlyInExpression = FALSE;\r
   >>\r
   (\r
       vfrPragmaPackDefinition\r
     | vfrDataStructDefinition\r
+    | vfrDataUnionDefinition\r
   )*\r
   vfrFormSetDefinition\r
   << $Return = mParserStatus; >>\r
@@ -280,7 +298,7 @@ pragmaPackStackDef :
     "," ID:StringIdentifier                         << Identifier = ID->getText(); >>\r
   }\r
   {\r
-    "," N:Number                                    << PackAction |= VFR_PACK_ASSIGN; PackNumber = _STOU32(N->getText()); >>\r
+    "," N:Number                                    << PackAction |= VFR_PACK_ASSIGN; PackNumber = _STOU32(N->getText(), N->getLine()); >>\r
   }\r
                                                     << gCVfrVarDataTypeDB.Pack (LineNum, PackAction, Identifier, PackNumber); >>\r
   ;\r
@@ -290,7 +308,7 @@ pragmaPackNumber :
      UINT32 LineNum;\r
      UINT32 PackNumber = DEFAULT_PACK_ALIGN;\r
   >>\r
-  N:Number                                          << LineNum = N->getLine(); PackNumber = _STOU32(N->getText()); >>\r
+  N:Number                                          << LineNum = N->getLine(); PackNumber = _STOU32(N->getText(), N->getLine()); >>\r
                                                     << gCVfrVarDataTypeDB.Pack (LineNum, VFR_PACK_ASSIGN, NULL, PackNumber); >>\r
   ;\r
 \r
@@ -304,6 +322,21 @@ vfrPragmaPackDefinition :
   "\)"\r
   ;\r
 \r
+  vfrDataUnionDefinition :\r
+  { TypeDef } Union                                << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
+  { NonNvDataMap }\r
+  {\r
+    N1:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
+  }\r
+  OpenBrace\r
+    vfrDataStructFields[TRUE]\r
+  CloseBrace\r
+  {\r
+    N2:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
+  }\r
+  ";"                                               << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>\r
+  ;\r
+\r
 vfrDataStructDefinition :\r
   { TypeDef } Struct                                << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
   { NonNvDataMap }\r
@@ -311,7 +344,7 @@ vfrDataStructDefinition :
     N1:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
   }\r
   OpenBrace\r
-    vfrDataStructFields\r
+    vfrDataStructFields[FALSE]\r
   CloseBrace\r
   {\r
     N2:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
@@ -319,108 +352,202 @@ vfrDataStructDefinition :
   ";"                                               << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r
   ;\r
 \r
-vfrDataStructFields :\r
+vfrDataStructFields [BOOLEAN  FieldInUnion]:\r
   (\r
-     dataStructField64     |\r
-     dataStructField32     |\r
-     dataStructField16     |\r
-     dataStructField8      |\r
-     dataStructFieldBool   |\r
-     dataStructFieldString |\r
-     dataStructFieldDate   |\r
-     dataStructFieldTime   |\r
-     dataStructFieldUser\r
+     dataStructField64 [FieldInUnion]    |\r
+     dataStructField32 [FieldInUnion]    |\r
+     dataStructField16 [FieldInUnion]    |\r
+     dataStructField8  [FieldInUnion]    |\r
+     dataStructFieldBool [FieldInUnion]  |\r
+     dataStructFieldString [FieldInUnion]|\r
+     dataStructFieldDate  [FieldInUnion] |\r
+     dataStructFieldTime  [FieldInUnion] |\r
+     dataStructFieldRef   [FieldInUnion] |\r
+     dataStructFieldUser  [FieldInUnion] |\r
+     dataStructBitField64 [FieldInUnion] |\r
+     dataStructBitField32 [FieldInUnion] |\r
+     dataStructBitField16 [FieldInUnion] |\r
+     dataStructBitField8  [FieldInUnion]\r
   )*\r
   ;\r
 \r
-dataStructField64 :\r
+dataStructField64 [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT64"\r
+  D:"UINT64"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField32 :\r
+dataStructField32 [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT32"\r
+  D:"UINT32"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField16 :\r
-  << UINT32 ArrayNum = 0; >>\r
+dataStructField16 [BOOLEAN  FieldInUnion]:\r
+  << \r
+    UINT32 ArrayNum = 0; \r
+  >>\r
   ("UINT16" | "CHAR16")\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
+  }\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>\r
+  ;\r
+\r
+dataStructField8 [BOOLEAN  FieldInUnion]:\r
+  << UINT32 ArrayNum = 0; >>\r
+  D:"UINT8"\r
+  N:StringIdentifier\r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT16", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField:\r
+dataStructFieldBool [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT8"\r
+  D:"BOOLEAN"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT8", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldBool :\r
+dataStructFieldString [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "BOOLEAN"\r
+  D:"EFI_STRING_ID"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "BOOLEAN", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldString :\r
+dataStructFieldDate [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "EFI_STRING_ID"\r
+  D:"EFI_HII_DATE"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_STRING_ID", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldDate :\r
+dataStructFieldTime [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "EFI_HII_DATE"\r
+  D:"EFI_HII_TIME"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_DATE", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldTime :\r
+dataStructFieldRef [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
-  "EFI_HII_TIME"\r
+  D:"EFI_HII_REF"\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_TIME", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldUser :\r
+dataStructFieldUser [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   T:StringIdentifier\r
   N:StringIdentifier\r
   {\r
-    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
+  }\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>\r
+  ;\r
+\r
+dataStructBitField64[BOOLEAN  FieldInUnion]:\r
+  <<\r
+    UINT32 Width = 0;\r
+    BOOLEAN HasBitFieldName = FALSE;\r
+  >>\r
+  D:"UINT64"\r
+  {\r
+    N:StringIdentifier      << HasBitFieldName = TRUE;>>\r
+  }\r
+  ":" I:Number              << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+  ";"                       << if (HasBitFieldName) {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+                               } else {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+                               }\r
+                            >>\r
+  ;\r
+\r
+dataStructBitField32[BOOLEAN  FieldInUnion]:\r
+  <<\r
+    UINT32 Width = 0;\r
+    BOOLEAN HasBitFieldName = FALSE;\r
+  >>\r
+  D:"UINT32"\r
+  {\r
+    N:StringIdentifier      << HasBitFieldName = TRUE;>>\r
+  }\r
+\r
+  ":" I:Number              << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+  ";"                       << if (HasBitFieldName) {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+                               } else {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+                               }\r
+                            >>\r
+  ;\r
+\r
+dataStructBitField16[BOOLEAN  FieldInUnion]:\r
+  <<\r
+    UINT32 Width = 0;\r
+    BOOLEAN HasBitFieldName = FALSE;\r
+  >>\r
+  D:"UINT16"\r
+  {\r
+    N:StringIdentifier      << HasBitFieldName = TRUE;>>\r
+  }\r
+  ":" I:Number              << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+  ";"                       << if (HasBitFieldName) {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+                               } else {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+                               }\r
+                            >>\r
+  ;\r
+\r
+dataStructBitField8[BOOLEAN  FieldInUnion]:\r
+  <<\r
+    UINT32 Width = 0;\r
+    BOOLEAN  HasBitFieldName = FALSE;\r
+  >>\r
+  D:"UINT8"\r
+  {\r
+    N:StringIdentifier      << HasBitFieldName = TRUE;>>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\r
+  ":" I:Number              << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+  ";"                       << if (HasBitFieldName) {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+                               } else {\r
+                                 _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+                               }\r
+                            >>\r
   ;\r
 \r
 //*****************************************************************************\r
@@ -430,14 +557,14 @@ dataStructFieldUser :
 guidSubDefinition [EFI_GUID &Guid] :\r
   G4:Number "," G5:Number "," G6:Number "," G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
                                                     <<\r
-                                                       Guid.Data4[0] = _STOU8(G4->getText());\r
-                                                       Guid.Data4[1] = _STOU8(G5->getText());\r
-                                                       Guid.Data4[2] = _STOU8(G6->getText());\r
-                                                       Guid.Data4[3] = _STOU8(G7->getText());\r
-                                                       Guid.Data4[4] = _STOU8(G8->getText());\r
-                                                       Guid.Data4[5] = _STOU8(G9->getText());\r
-                                                       Guid.Data4[6] = _STOU8(G10->getText());\r
-                                                       Guid.Data4[7] = _STOU8(G11->getText());\r
+                                                       Guid.Data4[0] = _STOU8(G4->getText(), G4->getLine());\r
+                                                       Guid.Data4[1] = _STOU8(G5->getText(), G5->getLine());\r
+                                                       Guid.Data4[2] = _STOU8(G6->getText(), G6->getLine());\r
+                                                       Guid.Data4[3] = _STOU8(G7->getText(), G7->getLine());\r
+                                                       Guid.Data4[4] = _STOU8(G8->getText(), G8->getLine());\r
+                                                       Guid.Data4[5] = _STOU8(G9->getText(), G9->getLine());\r
+                                                       Guid.Data4[6] = _STOU8(G10->getText(), G10->getLine());\r
+                                                       Guid.Data4[7] = _STOU8(G11->getText(), G11->getLine());\r
                                                     >>\r
   ;\r
 \r
@@ -445,9 +572,9 @@ guidDefinition [EFI_GUID &Guid] :
   OpenBrace\r
     G1:Number "," G2:Number "," G3:Number ","\r
                                                     <<\r
-                                                       Guid.Data1 = _STOU32 (G1->getText());\r
-                                                       Guid.Data2 = _STOU16 (G2->getText());\r
-                                                       Guid.Data3 = _STOU16 (G3->getText());\r
+                                                       Guid.Data1 = _STOU32 (G1->getText(), G1->getLine());\r
+                                                       Guid.Data2 = _STOU16 (G2->getText(), G2->getLine());\r
+                                                       Guid.Data3 = _STOU16 (G3->getText(), G3->getLine());\r
                                                     >>\r
     (\r
         OpenBrace guidSubDefinition[Guid] CloseBrace\r
@@ -468,6 +595,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
@@ -476,34 +604,59 @@ vfrFormSetDefinition :
   {\r
     ClassGuid "=" guidDefinition[ClassGuid1]        << ++ClassGuidNum; >>\r
                   {\r
-                   "\|" guidDefinition[ClassGuid2]  << ++ClassGuidNum; >>\r
-                  }\r
-                  {\r
-                   "\|" guidDefinition[ClassGuid3]  << ++ClassGuidNum; >>\r
+                     "\|" guidDefinition[ClassGuid2]  << ++ClassGuidNum; >>\r
+                     {\r
+                      "\|" guidDefinition[ClassGuid3]  << ++ClassGuidNum; >>\r
+                     }\r
                   }\r
                   ","\r
   }\r
                                                     <<\r
+                                                      if (mOverrideClassGuid != NULL && ClassGuidNum >= 3) {\r
+                                                        _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 3 class guids, can't add extra class guid!");\r
+                                                      }\r
                                                       switch (ClassGuidNum) {\r
                                                       case 0:\r
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\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
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\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
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\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
-                                                      default:\r
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + 2 * sizeof(EFI_GUID));\r
+                                                      case 3:\r
+                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
                                                         FSObj->SetClassGuid(&ClassGuid1);\r
                                                         FSObj->SetClassGuid(&ClassGuid2);\r
                                                         FSObj->SetClassGuid(&ClassGuid3);\r
                                                         break;\r
+                                                      default:\r
+                                                        break;\r
                                                       }\r
 \r
                                                       SET_LINE_INFO (*FSObj, L);\r
@@ -514,8 +667,8 @@ vfrFormSetDefinition :
                                                       if (mCompatibleMode) {\r
                                                         memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID));\r
                                                       }\r
-                                                      FSObj->SetFormSetTitle (_STOSID(S1->getText()));\r
-                                                      FSObj->SetHelp (_STOSID(S2->getText()));\r
+                                                      FSObj->SetFormSetTitle (_STOSID(S1->getText(), S1->getLine()));\r
+                                                      FSObj->SetHelp (_STOSID(S2->getText(), S2->getLine()));\r
                                                     >>\r
   {\r
     FC:Class "=" classDefinition[C] ","             << {CIfrClass CObj;SET_LINE_INFO (CObj, FC); CObj.SetClass(C);} >>\r
@@ -534,7 +687,39 @@ 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
+                                                                    gCVfrDataStorage,\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
+                                                          FALSE\r
+                                                        );\r
+                                                      }\r
+\r
+                                                      if (FSObj != NULL) {\r
+                                                        delete FSObj;\r
+                                                      }\r
                                                     >>\r
   ";"\r
   ;\r
@@ -542,31 +727,271 @@ vfrFormSetDefinition :
 vfrFormSetList :\r
   (\r
     vfrFormDefinition             |\r
+    vfrFormMapDefinition          |\r
     vfrStatementImage             |\r
     vfrStatementVarStoreLinear    |\r
     vfrStatementVarStoreEfi       |\r
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
-    vfrStatementDisableIfFormSet\r
+    vfrStatementDisableIfFormSet  |\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(), AN1->getLine());>>}\r
+                                                      << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+      | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText(), AN2->getLine());>>}\r
+                                                      << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+      | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText(), AN3->getLine());>>}\r
+                                                      << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+      | U8:"UINT8"   {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText(), AN4->getLine());>>}\r
+                                                      << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+      | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText(), AN5->getLine());>>}\r
+                                                      << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
+      | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText(), AN6->getLine());>>}\r
+                                                      << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
+      | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText(), AN7->getLine());>>}\r
+                                                      << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
+      | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>}\r
+                                                      << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
+      | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>}\r
+                                                      << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>>                                                \r
+      | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>}\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
+     BOOLEAN  BitField = FALSE;\r
+     UINT64   Value;\r
+     UINT64   Mask;\r
+     UINT16   Offset;\r
+     UINT8    PreBits;\r
+  >>\r
+(\r
+  ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
+          <<\r
+            ArrayIdx = 0;\r
+            if (IsArray == TRUE) {\r
+              ArrayIdx = _STOU8(IDX1->getText(), IDX1->getLine());\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(), RD->getLine());\r
+                memcpy (ByteOffset, &Data_U64, TypeSize);\r
+              }else if (strcmp ("UINT32", TypeName) == 0) {\r
+                Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
+                memcpy (ByteOffset, &Data_U32, TypeSize);                                                    \r
+              }else if (strcmp ("UINT16", TypeName) == 0) {\r
+                Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
+                memcpy (ByteOffset, &Data_U16, TypeSize);                                                    \r
+              }else if (strcmp ("UINT8", TypeName) == 0) {\r
+                Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
+                memcpy (ByteOffset, &Data_U8, TypeSize);                                                    \r
+              }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
+                Data_BL = _STOU8(RD->getText(), RD->getLine());\r
+                memcpy (ByteOffset, &Data_BL, TypeSize);                                                    \r
+              }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
+                Data_SID = _STOSID(RD->getText(), RD->getLine());\r
+                memcpy (ByteOffset, &Data_SID, TypeSize);                                                    \r
+              }\r
+            } else {\r
+              gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize, BitField);\r
+              if (BitField) {\r
+                Mask = (1 << FieldSize) - 1;\r
+                Offset = FieldOffset / 8;\r
+                PreBits = FieldOffset % 8;\r
+                Mask <<= PreBits;\r
+              }\r
+              switch (FieldType) {\r
+              case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                 Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
+                 if (BitField) {\r
+                   //\r
+                   // Set the value to the bit fileds.\r
+                   //\r
+                   Value = *(UINT8*) (ByteOffset + Offset);\r
+                   Data_U8 <<= PreBits;\r
+                   Value = (Value & (~Mask)) | Data_U8;\r
+                   memcpy (ByteOffset + Offset, &Value, sizeof (UINT8));\r
+                 } else {\r
+                   memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+                 }\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                 Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
+                 if (BitField) {\r
+                   //\r
+                   // Set the value to the bit fileds.\r
+                   //\r
+                   Value = *(UINT16*) (ByteOffset + Offset);\r
+                   Data_U16 <<= PreBits;\r
+                   Value = (Value & (~Mask)) | Data_U16;\r
+                   memcpy (ByteOffset + Offset, &Value, sizeof (UINT16));\r
+                 } else {\r
+                   memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+                 }\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                 Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
+                 if (BitField) {\r
+                   //\r
+                   // Set the value to the bit fileds.\r
+                   //\r
+                   Value = *(UINT32*) (ByteOffset + Offset);\r
+                   Data_U32 <<= PreBits;\r
+                   Value = (Value & (~Mask)) | Data_U32;\r
+                   memcpy (ByteOffset + Offset, &Value, sizeof (UINT32));\r
+                 } else {\r
+                   memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+                 }\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                 Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
+                 if (BitField) {\r
+                   //\r
+                   // Set the value to the bit fileds.\r
+                   //\r
+                   Value = *(UINT64*) (ByteOffset + Offset);\r
+                   Data_U64 <<= PreBits;\r
+                   Value = (Value & (~Mask)) | Data_U64;\r
+                   memcpy (ByteOffset + Offset, &Value, sizeof (UINT64));\r
+                 } else {\r
+                   memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+                 }\r
+                 break;\r
+              case EFI_IFR_TYPE_BOOLEAN:\r
+                 Data_BL = _STOU8(RD->getText(), RD->getLine());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_STRING:\r
+                 Data_SID = _STOSID(RD->getText(), RD->getLine());\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
   Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"\r
   {\r
-    "," Attribute "=" A:Number                      << DefaultId = _STOU16(A->getText()); >>\r
+    "," Attribute "=" A:Number                      << DefaultId = _STOU16(A->getText(), A->getLine()); >>\r
   }\r
                                                     <<\r
-                                                       if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
+                                                       if (gCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
                                                          CIfrDefaultStore DSObj;\r
-                                                         _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText()), DefaultId)), D->getLine();\r
+                                                         _PCATCH(gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr<CHAR8>(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
                                                          DSObj.SetLineNo(D->getLine());\r
-                                                         DSObj.SetDefaultName (_STOSID(S->getText()));\r
+                                                         DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine()));\r
                                                          DSObj.SetDefaultId (DefaultId);\r
                                                        } else {\r
-                                                         _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText()))), D->getLine();\r
+                                                         _PCATCH(gCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
                                                        }\r
                                                     >>\r
   ";"\r
@@ -581,27 +1006,30 @@ vfrStatementVarStoreLinear :
      UINT32          LineNum;\r
      EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
      UINT32          Size;\r
+     BOOLEAN         IsBitVarStore = FALSE;\r
   >>\r
   V:Varstore                                        << VSObj.SetLineNo(V->getLine()); >>\r
   (\r
-      TN:StringIdentifier ","                       << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
-    | U8:"UINT8" ","                                << TypeName = "UINT8"; LineNum = U8->getLine(); >>\r
-    | U16:"UINT16" ","                              << TypeName = "UINT16"; LineNum = U16->getLine(); >>\r
-    | U32:"UINT32" ","                              << TypeName = "UINT32"; LineNum = U32->getLine(); >>\r
-    | U64:"UINT64" ","                              << TypeName = "UINT64"; LineNum = U64->getLine(); >>\r
-    | D:"EFI_HII_DATE" ","                          << TypeName = "EFI_HII_DATE"; LineNum = D->getLine(); >>\r
-    | T:"EFI_HII_TIME" ","                          << TypeName = "EFI_HII_TIME"; LineNum = T->getLine(); >>\r
+      TN:StringIdentifier ","                       << TypeName = TN->getText(); LineNum = TN->getLine(); IsBitVarStore = gCVfrVarDataTypeDB.DataTypeHasBitField (TN->getText());>>\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
   { Key "=" FID:Number ","                          << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
                                                        if (mCompatibleMode) {\r
-                                                         VarStoreId = _STOU16(FID->getText());\r
+                                                         VarStoreId = _STOU16(FID->getText(), FID->getLine());\r
                                                        }\r
                                                     >>\r
   }\r
   {\r
     VarId "=" ID:Number ","                         <<\r
                                                        _PCATCH(\r
-                                                         (INTN)(VarStoreId = _STOU16(ID->getText())) != 0,\r
+                                                         (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
                                                          (INTN)TRUE,\r
                                                          ID,\r
                                                          "varid 0 is not allowed."\r
@@ -616,18 +1044,19 @@ vfrStatementVarStoreLinear :
                                                        } else {\r
                                                          StoreName = SN->getText();\r
                                                        }\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
-                                                                                  StoreName,\r
-                                                                                  &Guid,\r
-                                                                                  &gCVfrVarDataTypeDB,\r
-                                                                                  TypeName,\r
-                                                                                  VarStoreId\r
-                                                                                  ), LineNum);\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
+                                                                                StoreName,\r
+                                                                                &Guid,\r
+                                                                                &gCVfrVarDataTypeDB,\r
+                                                                                TypeName,\r
+                                                                                VarStoreId,\r
+                                                                                IsBitVarStore\r
+                                                                                ), LineNum);\r
                                                        VSObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                        VSObj.SetVarStoreId (VarStoreId);\r
                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
-                                                       VSObj.SetSize (Size);\r
+                                                       VSObj.SetSize ((UINT16) Size);\r
                                                        VSObj.SetName (SN->getText());\r
                                                     >>\r
   ";"\r
@@ -635,45 +1064,150 @@ 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
+     BOOLEAN         CustomizedName = FALSE;\r
+     BOOLEAN         IsBitVarStore = FALSE;\r
   >>\r
   E:Efivarstore                                     << VSEObj.SetLineNo(E->getLine()); >>\r
-  SN:StringIdentifier ","\r
+  (\r
+      TN:StringIdentifier ","                       << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; IsBitVarStore = gCVfrVarDataTypeDB.DataTypeHasBitField (TN->getText());>>\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(), ID->getLine())) != 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
+\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(), VN->getLine()));\r
+                                                       if (StoreName == NULL) {\r
+                                                         _PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!");\r
+                                                       }\r
+                                                       if (!CustomizedName) {\r
+                                                         _PCATCH (VFR_RETURN_UNSUPPORTED, E->getLine(), "Old style efivarstore must have String Identifier!");\r
+                                                         return;\r
+                                                       }\r
+                                                       Size = _STOU32(N->getText(), N->getLine());\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(gCVfrDataStorage.DeclareBufferVarStore (\r
+                                                                                    StoreName,\r
+                                                                                    &Guid,\r
+                                                                                    &gCVfrVarDataTypeDB,\r
+                                                                                    TypeName,\r
+                                                                                    VarStoreId,\r
+                                                                                    IsBitVarStore\r
+                                                                                    ), LineNum);\r
+                                                         _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
+                                                         _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
+                                                       } else {\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
+                                                                                  TN->getText(),\r
+                                                                                  &Guid,\r
+                                                                                  &gCVfrVarDataTypeDB,\r
+                                                                                  TypeName,\r
+                                                                                  VarStoreId,\r
+                                                                                  FALSE\r
+                                                                                  ), LineNum);\r
+                                                         _PCATCH(gCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
+                                                         _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
+                                                       }\r
                                                        VSEObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\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
 \r
 vfrVarStoreEfiAttr [UINT32 & Attr] :\r
-  N:Number                                          << $Attr |= _STOU32(N->getText()); >>\r
+  N:Number                                          << $Attr |= _STOU32(N->getText(), N->getLine()); >>\r
   ;\r
 \r
 vfrStatementVarStoreNameValue :\r
   <<\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(), ID->getLine())) != 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(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
+                                                         Created = TRUE;\r
+                                                       }\r
+                                                       _PCATCH(gCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN);\r
+                                                    >>\r
   )+\r
-  Uuid "=" guidDefinition[Guid]                     << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
+  Uuid "=" guidDefinition[Guid]                     << _PCATCH(gCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
                                                     <<\r
                                                        VSNVObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
                                                        VSNVObj.SetVarStoreId (VarStoreId);\r
                                                     >>\r
   ";"\r
@@ -696,7 +1230,7 @@ validClassNames[UINT16 & Class] :
   | ClassInputDevice                                << $Class |= EFI_INPUT_DEVICE_CLASS; >>\r
   | ClassOnBoardDevice                              << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>\r
   | ClassOtherDevice                                << $Class |= EFI_OTHER_DEVICE_CLASS; >>\r
-  | N:Number                                        << $Class |= _STOU16(N->getText()); >>\r
+  | N:Number                                        << $Class |= _STOU16(N->getText(), N->getLine()); >>\r
   ;\r
 \r
 subclassDefinition[UINT16 & SubClass] :\r
@@ -705,7 +1239,7 @@ subclassDefinition[UINT16 & SubClass] :
   | SubclassGeneralApplication                      << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>\r
   | SubclassFrontPage                               << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>\r
   | SubclassSingleUse                               << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>\r
-  | N:Number                                        << $SubClass |= _STOU16(N->getText()); >>\r
+  | N:Number                                        << $SubClass |= _STOU16(N->getText(), N->getLine()); >>\r
   ;\r
 \r
 vfrStatementDisableIfFormSet :\r
@@ -720,91 +1254,138 @@ vfrStatementDisableIfFormSet :
   ";"\r
   ;\r
 \r
+vfrStatementSuppressIfFormSet :\r
+  << CIfrSuppressIf SIObj;>>\r
+  L:SuppressIf                                         <<\r
+                                                           if (mCompatibleMode) {\r
+                                                             _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
+                                                           }\r
+                                                           SIObj.SetLineNo(L->getLine()); \r
+                                                       >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0] ";"\r
+  vfrFormSetList\r
+  E: EndIf \r
+  ";"                                                  << CRT_END_OP (E); >>\r
+  ;\r
+\r
 //*****************************************************************************\r
 //\r
 // the syntax of question header and statement header\r
 //\r
 vfrStatementHeader[CIfrStatementHeader *SHObj] :\r
-  Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText())); >>\r
-  Help   "=" "STRING_TOKEN" "\(" S2:Number "\)"     << $SHObj->SetHelp (_STOSID(S2->getText())); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText(), S1->getLine())); >>\r
+  Help   "=" "STRING_TOKEN" "\(" S2:Number "\)"     << $SHObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); >>\r
+  ;\r
+\r
+vfrQuestionBaseInfo[EFI_VARSTORE_INFO & Info, EFI_QUESTION_ID & QId, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
+ <<\r
+    CHAR8             *QName    = NULL;\r
+    CHAR8             *VarIdStr = NULL;\r
+    mUsedDefaultCount           = 0;\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
+ { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
+ {\r
+   QuestionId "=" ID:Number ","                    <<\r
+                                                      QId = _STOQID(ID->getText(), ID->getLine());\r
+                                                      _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r
+                                                   >>\r
+ }\r
+                                                   <<\r
+                                                      switch (QType) {\r
+                                                      case QUESTION_NORMAL:\r
+                                                        mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
+                                                        break;\r
+                                                      case QUESTION_DATE:\r
+                                                        mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
+                                                        break;\r
+                                                      case QUESTION_TIME:\r
+                                                        mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
+                                                        break;\r
+                                                      case QUESTION_REF:\r
+                                                        //\r
+                                                        // VarIdStr != NULL stand for question with storagae.\r
+                                                        //\r
+                                                        if (VarIdStr != NULL) {\r
+                                                          mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);\r
+                                                        } else {\r
+                                                          mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
+                                                        }\r
+                                                        break;\r
+                                                      default:\r
+                                                      _PCATCH(VFR_RETURN_FATAL_ERROR);\r
+                                                      }\r
+                                                   >>\r
+                                                   <<\r
+                                                      if (VarIdStr != NULL) {\r
+                                                        delete VarIdStr;\r
+                                                      }\r
+                                                      _SAVE_CURRQEST_VARINFO (Info);\r
+                                                   >>\r
   ;\r
 \r
 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
+     Info.mIsBitVar              = FALSE;\r
      EFI_QUESTION_ID   QId       = EFI_QUESTION_ID_INVALID;\r
-     CHAR8             *QName    = NULL;\r
-     CHAR8             *VarIdStr = 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
-  { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
-  {\r
-    QuestionId "=" ID:Number ","                    <<\r
-                                                       QId = _STOQID(ID->getText());\r
-                                                       _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r
-                                                    >>\r
-  }\r
-                                                    <<\r
-                                                       switch (QType) {\r
-                                                       case QUESTION_NORMAL:\r
-                                                         mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
-                                                         break;\r
-                                                       case QUESTION_DATE:\r
-                                                       mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
-                                                       break;\r
-                                                       case QUESTION_TIME:\r
-                                                       mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
-                                                       break;\r
-                                                       default:\r
-                                                       _PCATCH(VFR_RETURN_FATAL_ERROR);\r
-                                                       }\r
-                                                       $QHObj.SetQuestionId (QId);\r
-                                                       $QHObj.SetVarStoreInfo (&Info);\r
+  vfrQuestionBaseInfo[Info, QId, QType]\r
+                                                    << $QHObj.SetQuestionId (QId);\r
+                                                        if (Info.mVarStoreId != EFI_VARSTORE_ID_INVALID) {\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
-  vfrStatementHeader[$QHObj]\r
   ;\r
 \r
 questionheaderFlagsField[UINT8 & Flags] :\r
     ReadOnlyFlag                                    << $Flags |= 0x01; >>\r
   | InteractiveFlag                                 << $Flags |= 0x04; >>\r
   | ResetRequiredFlag                               << $Flags |= 0x10; >>\r
-  | OptionOnlyFlag                                  << $Flags |= 0x80; >>\r
-  | NVAccessFlag\r
-  | LateCheckFlag\r
+  | ReconnectRequiredFlag                           << $Flags |= 0x40; >>\r
+  | O:OptionOnlyFlag                                << \r
+                                                       if (mCompatibleMode) {\r
+                                                         $Flags |= 0x80;\r
+                                                       } else {\r
+                                                         gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            O->getLine(),\r
+                                                            O->getText()\r
+                                                            );\r
+                                                       }\r
+                                                    >>\r
+  | N:NVAccessFlag                                  << \r
+                                                       if (!mCompatibleMode) {\r
+                                                          gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            N->getLine(),\r
+                                                            N->getText()\r
+                                                            );\r
+                                                       }\r
+                                                    >>\r
+  | L:LateCheckFlag                                 << \r
+                                                       if (!mCompatibleMode) {\r
+                                                          gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            L->getLine(),\r
+                                                            L->getText()\r
+                                                            );\r
+                                                       }\r
+                                                    >>\r
   ;\r
 \r
-vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :\r
+vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :\r
   <<\r
      UINT32                Idx;\r
      UINT32                LineNo;\r
@@ -815,40 +1396,45 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
      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
     OpenBracket I1:Number CloseBracket              <<\r
-                                                       Idx = _STOU32(I1->getText());\r
+                                                       Idx = _STOU32(I1->getText(), I1->getLine());\r
                                                        _STRCAT(&VarIdStr, "[");\r
                                                        _STRCAT(&VarIdStr, I1->getText());\r
                                                        _STRCAT(&VarIdStr, "]");\r
                                                     >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                          gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
                                                                              &mFormsetGuid,\r
                                                                              &gCVfrVarDataTypeDB,\r
                                                                              SName,\r
                                                                              EFI_VARSTORE_ID_INVALID,\r
+                                                                             FALSE,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+                                                       }\r
+                                                       if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+                                                         _PCATCH(VfrReturnCode, SN1);\r
+                                                         _PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
                                                        }\r
-                                                       _PCATCH(VfrReturnCode, SN1);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
-                                                       _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\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 = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                          gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
                                                                              &mFormsetGuid,\r
                                                                              &gCVfrVarDataTypeDB,\r
@@ -856,25 +1442,29 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
-                                                       _PCATCH(VfrReturnCode, SN2);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
-                                                       if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                         _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
-                                                         _STRCAT(&VarStr, TName);\r
+                                                       if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+                                                         _PCATCH(VfrReturnCode, SN2);\r
+                                                         VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
+                                                         if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_BUFFER_BITS) {\r
+                                                           _PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
+                                                           _STRCAT(&VarStr, TName);\r
+                                                         }\r
                                                        }\r
                                                     >>\r
 \r
     (\r
       "."                                           <<\r
-                                                       _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+                                                       if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+                                                         _PCATCH((((VarStoreType != EFI_VFR_VARSTORE_BUFFER) && (VarStoreType != EFI_VFR_VARSTORE_BUFFER_BITS))? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+                                                       }\r
                                                        _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
                                                     >>\r
       SF:StringIdentifier                           << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
       {\r
         OpenBracket I2:Number CloseBracket          <<\r
-                                                       Idx = _STOU32(I2->getText());\r
+                                                       Idx = _STOU32(I2->getText(), I2->getLine());\r
                                                        if (mCompatibleMode) Idx --;\r
                                                        if (Idx > 0) {\r
                                                          //\r
@@ -893,23 +1483,28 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
     )*                                              <<\r
                                                        switch (VarStoreType) {\r
                                                        case EFI_VFR_VARSTORE_EFI:\r
-                                                         _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
+                                                         _PCATCH(gCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
                                                          break;\r
                                                        case EFI_VFR_VARSTORE_BUFFER:\r
-                                                         _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
+                                                       case EFI_VFR_VARSTORE_BUFFER_BITS:\r
+                                                         _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize, $Info.mIsBitVar), SN2->getLine(), VarStr);\r
+                                                         VarGuid = gCVfrDataStorage.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
                                                                     $Info.mVarTotalSize,\r
                                                                     Dummy),\r
                                                                  SN2->getLine());\r
+                                                         _PCATCH(gCVfrDataStorage.AddBufferVarStoreFieldInfo(&$Info ),SN2->getLine());\r
                                                          break;\r
                                                        case EFI_VFR_VARSTORE_NAME:\r
                                                        default: break;\r
@@ -951,7 +1546,7 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
       SF:StringIdentifier                           << _STRCAT (&VarIdStr, SF->getText()); >>\r
       {\r
         OpenBracket I2:Number CloseBracket          <<\r
-                                                       Idx = _STOU32(I2->getText());\r
+                                                       Idx = _STOU32(I2->getText(), I2->getLine());\r
                                                        if (mCompatibleMode) Idx --;\r
                                                        if (Idx > 0) {\r
                                                          //\r
@@ -969,41 +1564,169 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
   )\r
   ;\r
 \r
-vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
+vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
+  <<  \r
+    EFI_GUID    Guid;\r
+    BOOLEAN     Negative = FALSE;\r
+    BOOLEAN     IntDecStyle = FALSE;\r
+    CIfrNumeric *NumericQst = NULL;\r
+    if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+      NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+      IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;\r
+    }\r
+    UINT8    *Type8  = (UINT8  *) &Value;\r
+    UINT16   *Type16 = (UINT16 *) &Value;\r
+    UINT32   *Type32 = (UINT32 *) &Value;\r
+    UINT64   *Type64 = (UINT64 *) &Value;\r
+    UINT16   Index = 0;\r
+    ListType = FALSE;\r
+  >>\r
+    {\r
+      "\-"                                          << Negative = TRUE;  >>\r
+    }\r
     N1:Number                                       <<\r
-                                                       switch ($Type) {\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_8 :\r
-                                                         $Value.u8     = _STOU8(N1->getText());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_16 :\r
-                                                         $Value.u16    = _STOU16(N1->getText());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_32 :\r
-                                                         $Value.u32    = _STOU32(N1->getText());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_64 :\r
-                                                         $Value.u64    = _STOU64(N1->getText());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_BOOLEAN :\r
-                                                         $Value.b      = _STOU8(N1->getText());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_STRING :\r
-                                                         $Value.string = _STOU16(N1->getText());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_TIME :\r
-                                                       case EFI_IFR_TYPE_DATE :\r
-                                                       default :\r
-                                                       break;\r
+                                                       //\r
+                                                       // The value stored in bit fields is always set to UINT32 type.\r
+                                                       //\r
+                                                       if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                         $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
+                                                       } else {\r
+                                                         switch ($Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
+                                                           if (IntDecStyle) {\r
+                                                             if (Negative) {\r
+                                                               if ($Value.u8 > 0x80) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+                                                               }\r
+                                                             } else {\r
+                                                               if ($Value.u8 > 0x7F) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+                                                               }\r
+                                                             }\r
+                                                           }\r
+                                                           if (Negative) {\r
+                                                             $Value.u8 = ~$Value.u8 + 1;\r
+                                                           }\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
+                                                           if (IntDecStyle) {\r
+                                                             if (Negative) {\r
+                                                               if ($Value.u16 > 0x8000) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+                                                               }\r
+                                                             } else {\r
+                                                               if ($Value.u16 > 0x7FFF) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+                                                               }\r
+                                                             }\r
+                                                           }\r
+                                                           if (Negative) {\r
+                                                             $Value.u16 = ~$Value.u16 + 1;\r
+                                                           }\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           $Value.u32    = _STOU32(N1->getText(), N1->getLine());\r
+                                                           if (IntDecStyle) {\r
+                                                             if (Negative) {\r
+                                                               if ($Value.u32 > 0x80000000) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+                                                               }\r
+                                                             } else {\r
+                                                               if ($Value.u32 > 0X7FFFFFFF) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+                                                               }\r
+                                                             }\r
+                                                           }\r
+                                                           if (Negative) {\r
+                                                             $Value.u32 = ~$Value.u32 + 1;\r
+                                                           }\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           $Value.u64    = _STOU64(N1->getText(), N1->getLine());\r
+                                                           if (IntDecStyle) {\r
+                                                             if (Negative) {\r
+                                                               if ($Value.u64 > 0x8000000000000000) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+                                                               }\r
+                                                             } else {\r
+                                                               if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {\r
+                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+                                                               }\r
+                                                             }\r
+                                                           }\r
+                                                           if (Negative) {\r
+                                                             $Value.u64 = ~$Value.u64 + 1;\r
+                                                           }\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_BOOLEAN :\r
+                                                           $Value.b      = _STOU8(N1->getText(), N1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_STRING :\r
+                                                           $Value.string = _STOU16(N1->getText(), N1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_TIME :\r
+                                                         case EFI_IFR_TYPE_DATE :\r
+                                                         case EFI_IFR_TYPE_REF  :\r
+                                                         default :\r
+                                                         break;\r
+                                                         }\r
                                                        }\r
                                                     >>\r
   | B1:True                                         << $Value.b      = TRUE; >>\r
   | B2:False                                        << $Value.b      = FALSE; >>\r
-  | O1:One                                          << $Value.u8     = _STOU8(O1->getText()); >>\r
-  | O2:Ones                                         << $Value.u64    = _STOU64(O2->getText()); >>\r
-  | Z:Zero                                          << $Value.u8     = _STOU8(Z->getText()); >>\r
-  | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time   = _STOT(HOUR->getText(), MINUTE->getText(), SECOND->getText()); >>\r
-  | YEAR:Number "/" MONTH:Number "/" DAY:Number     << $Value.date   = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText()); >>\r
-  | "STRING_TOKEN" "\(" S1:Number "\)"              << $Value.string = _STOSID(S1->getText()); >>\r
+  | O1:One                                          << $Value.u8     = _STOU8(O1->getText(), O1->getLine()); >>\r
+  | O2:Ones                                         << $Value.u64    = _STOU64(O2->getText(), O2->getLine()); >>\r
+  | Z:Zero                                          << $Value.u8     = _STOU8(Z->getText(), Z->getLine()); >>\r
+  | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time   = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >>\r
+  | YEAR:Number "/" MONTH:Number "/" DAY:Number     << $Value.date   = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >>\r
+  | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
+                                                    << $Value.ref    = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
+  | "STRING_TOKEN" "\(" S1:Number "\)"              << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
+  | "\{"                                            << ListType = TRUE; >>\r
+      L1:Number                                     << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      (\r
+        "," \r
+        L2:Number                                   << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      )*\r
+    "\}"                                           \r
   ;\r
 \r
 //*****************************************************************************\r
@@ -1013,8 +1736,8 @@ vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
 vfrFormDefinition :\r
   << CIfrForm FObj; >>\r
   F:Form                                            << FObj.SetLineNo(F->getLine()); >>\r
-  FormId "=" S1:Number ","                          << _PCATCH(FObj.SetFormId (_STOFID(S1->getText())), S1); >>\r
-  Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"  << FObj.SetFormTitle (_STOSID(S2->getText())); >>\r
+  FormId "=" S1:Number ","                          << _PCATCH(FObj.SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
+  Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"  << FObj.SetFormTitle (_STOSID(S2->getText(), S2->getLine())); >>\r
   (\r
     vfrStatementImage                        |\r
     vfrStatementLocked                       |\r
@@ -1026,7 +1749,10 @@ vfrFormDefinition :
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
     // Just for framework vfr compatibility\r
-    vfrStatementInvalid\r
+    vfrStatementInvalid                      |\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal                        |\r
+    vfrStatementRefreshEvent ";"\r
   )*\r
   E:EndForm                                         <<\r
                                                       if (mCompatibleMode) {\r
@@ -1042,27 +1768,43 @@ 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<CHAR8>(); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
                                                     >>\r
   ";"\r
   ;\r
 \r
+vfrFormMapDefinition :\r
+  << \r
+    CIfrFormMap *FMapObj = NULL;\r
+    UINT32      FormMapMethodNumber = 0;\r
+    EFI_GUID    Guid;\r
+  >>\r
+  F:FormMap                                         << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>\r
+  FormId "=" S1:Number ","                          << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
+  (\r
+    MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"\r
+    MapGuid  "=" guidDefinition[Guid] ";"           << FMapObj->SetFormMapMethod (_STOFID(S2->getText(), S2->getLine()), &Guid); FormMapMethodNumber ++; >>\r
+  )*                                                << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>\r
+  (\r
+    vfrStatementImage                        |\r
+    vfrStatementLocked                       |\r
+    vfrStatementRules                        |\r
+    vfrStatementDefault                      |\r
+    vfrStatementStat                         |\r
+    vfrStatementQuestions                    |\r
+    vfrStatementConditional                  |\r
+    vfrStatementLabel                        |\r
+    vfrStatementBanner                       |\r
+    vfrStatementExtension                    |\r
+    vfrStatementModal                        |\r
+    vfrStatementRefreshEvent ";"\r
+  )*\r
+  E:EndForm                                         << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
 vfrStatementRules :\r
   << CIfrRule RObj; >>\r
   R:Rule                                            << RObj.SetLineNo(R->getLine()); >>\r
@@ -1078,99 +1820,167 @@ vfrStatementRules :
 vfrStatementDefault :\r
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
-     EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
-     CIfrDefault           DObj;\r
+     UINT64                ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE    *Val           = (EFI_IFR_TYPE_VALUE *) ValueList;\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
+     BOOLEAN               ArrayType     = FALSE;\r
+     UINT8                 *Type8        = (UINT8  *) ValueList;\r
+     UINT16                *Type16       = (UINT16 *) ValueList;\r
+     UINT32                *Type32       = (UINT32 *) ValueList;\r
+     UINT64                *Type64       = (UINT64 *) ValueList;\r
+     CIfrNumeric           *NumericQst   = NULL;\r
+\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
-\r
-                                                        if (gCurrentIfrOpcode != NULL && gCurrentIfrOpcode->GetObjBinAddr() != NULL) {\r
-                                                          EFI_IFR_OP_HEADER *TempOpCode;\r
-                                                          TempOpCode = (EFI_IFR_OP_HEADER *) gCurrentIfrOpcode->GetObjBinAddr();\r
-                                                          switch (TempOpCode->OpCode) {\r
-                                                          case EFI_IFR_NUMERIC_OP:\r
-                                                            EFI_IFR_NUMERIC *TempNumricCode;\r
-                                                            TempNumricCode = (EFI_IFR_NUMERIC *) TempOpCode;\r
+      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","  \r
+                                                    << \r
+                                                        if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+                                                          //check default value is valid for Numeric Opcode\r
+                                                          NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+                                                          if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 && !(_GET_CURRQEST_VARTINFO().mIsBitVar)) {\r
                                                             switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              if (Val.u64 < TempNumricCode->data.u64.MinValue || Val.u64 > TempNumricCode->data.u64.MaxValue) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                              if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+                                                                  ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                               }\r
                                                               break;\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                              if (Val.u32 < TempNumricCode->data.u32.MinValue || Val.u32 > TempNumricCode->data.u32.MaxValue) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                              if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+                                                                  ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                               }\r
                                                               break;\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                              if (Val.u16 < TempNumricCode->data.u16.MinValue || Val.u16 > TempNumricCode->data.u16.MaxValue) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                              if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+                                                                  ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                               }\r
                                                               break;\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                              if (Val.u8 < TempNumricCode->data.u8.MinValue || Val.u8 > TempNumricCode->data.u8.MaxValue) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                                                              if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+                                                                  ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                               }\r
                                                               break;\r
+                                                            default:\r
+                                                              break;\r
                                                             }\r
-                                                            break;\r
-                                                          case EFI_IFR_ONE_OF_OP:\r
-                                                            EFI_IFR_ONE_OF *TempOneOfCode;\r
-                                                            TempOneOfCode = (EFI_IFR_ONE_OF *) TempOpCode;\r
-                                                            if (TempOneOfCode->data.u64.MinValue != 0 || TempOneOfCode->data.u64.MaxValue != 0 || TempOneOfCode->data.u64.Step != 0) {\r
-                                                              //OneOf MinMaxStep Data is set, Val value will be checked for MinMaxStep.\r
-                                                              switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                                if (Val.u64 < TempOneOfCode->data.u64.MinValue || Val.u64 > TempOneOfCode->data.u64.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                                if (Val.u32 < TempOneOfCode->data.u32.MinValue || Val.u32 > TempOneOfCode->data.u32.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                                if (Val.u16 < TempOneOfCode->data.u16.MinValue || Val.u16 > TempOneOfCode->data.u16.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                                if (Val.u8 < TempOneOfCode->data.u8.MinValue || Val.u8 > TempOneOfCode->data.u8.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
+                                                          } else {\r
+                                                            //\r
+                                                            // Value for question stored in bit fields is always set to UINT32 type.\r
+                                                            //\r
+                                                            if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                              if (Val->u32 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), TRUE) || Val->u32 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), TRUE)) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                              }\r
+                                                            } else {\r
+                                                              if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE)) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                               }\r
                                                             }\r
-                                                            break;\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 if (ArrayType) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                              while (Type8[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                              while (Type16[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT16);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                              while (Type32[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT32);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                              while (Type64[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT64);\r
+                                                              break;\r
+\r
+                                                            default:\r
+                                                              break;\r
+                                                          }\r
+                                                        } else {\r
+                                                          if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            Size = sizeof (UINT32);\r
+                                                          } else {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
+                                                          }\r
+                                                        }\r
+                                                        Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
+                                                        DObj = new CIfrDefault ((UINT8)Size);\r
+                                                        DObj->SetLineNo(D->getLine());\r
+                                                        if (ArrayType) {\r
+                                                          DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+                                                        } else if (gIsStringOp) {\r
+                                                          DObj->SetType (EFI_IFR_TYPE_STRING);\r
+                                                        } else {\r
+                                                          if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            DObj->SetType (EFI_IFR_TYPE_NUM_SIZE_32);\r
+                                                          } else {\r
+                                                            DObj->SetType (_GET_CURRQEST_DATATYPE());\r
+                                                          }\r
+                                                        }\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(gCVfrDefaultStore.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
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreType (VarStoreName, VarStoreType), D->getLine());\r
+                                                      CheckDuplicateDefaultValue (DefaultId, D);\r
+                                                      if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
+                                                       VarGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                       VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                        if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
-                                                         _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                         _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                    DefaultId,\r
                                                                    _GET_CURRQEST_VARTINFO(),\r
                                                                    VarStoreName,\r
+                                                                   VarGuid,\r
                                                                    _GET_CURRQEST_DATATYPE (),\r
-                                                                   Val),\r
+                                                                   *Val),\r
                                                                    D->getLine()\r
                                                                    );\r
+                                                         }\r
                                                        }\r
+                                                       if (DObj  != NULL) {delete DObj;} \r
+                                                       if (DObj2 != NULL) {delete DObj2;} \r
                                                     >>\r
   )\r
   ;\r
@@ -1224,8 +2034,30 @@ vfrStatementInvalid :
   ;\r
 \r
 flagsField :\r
-  Number | InteractiveFlag | ManufacturingFlag | DefaultFlag |\r
-  NVAccessFlag | ResetRequiredFlag | LateCheckFlag\r
+  Number \r
+  | InteractiveFlag \r
+  | ManufacturingFlag \r
+  | DefaultFlag \r
+  | ResetRequiredFlag \r
+  | ReconnectRequiredFlag\r
+  | N:NVAccessFlag                                     << \r
+                                                          if (!mCompatibleMode) {\r
+                                                            gCVfrErrorHandle.HandleWarning (\r
+                                                              VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                              N->getLine(),\r
+                                                              N->getText()\r
+                                                              );\r
+                                                          }\r
+                                                       >>\r
+  | L:LateCheckFlag                                    << \r
+                                                          if (!mCompatibleMode) {\r
+                                                            gCVfrErrorHandle.HandleWarning (\r
+                                                              VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                              L->getLine(),\r
+                                                              L->getText()\r
+                                                              );\r
+                                                          }\r
+                                                       >> \r
   ;\r
 \r
 vfrStatementValue :\r
@@ -1234,15 +2066,33 @@ vfrStatementValue :
   "=" vfrStatementExpression[0]                        << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
   ;\r
 \r
+vfrStatementRead :\r
+  << CIfrRead RObj; >>\r
+  R:Read                                               << RObj.SetLineNo(R->getLine()); >>\r
+  vfrStatementExpression[0] ";" \r
+  ;\r
+\r
+vfrStatementWrite :\r
+  << CIfrWrite WObj; >>\r
+  W:Write                                              << WObj.SetLineNo(W->getLine()); >>\r
+  vfrStatementExpression[0] ";" \r
+  ;\r
+\r
 vfrStatementSubTitle :\r
   << CIfrSubtitle SObj; >>\r
   L:Subtitle                                           << SObj.SetLineNo(L->getLine()); >>\r
-  Text "=" "STRING_TOKEN" "\(" S:Number "\)"           << SObj.SetPrompt (_STOSID(S->getText())); >>\r
+  Text "=" "STRING_TOKEN" "\(" S:Number "\)"           << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >>\r
   {\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
+    D: EndSubtitle ";"                                  << CRT_END_OP (D); >>\r
+  )\r
   ;\r
 \r
 vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
@@ -1252,7 +2102,7 @@ vfrSubtitleFlags [CIfrSubtitle & SObj] :
   ;\r
 \r
 subtitleFlagsField [UINT8 & Flags] :\r
-    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+    N:Number                                           << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
   | "HORIZONTAL"                                       << $Flags |= 0x01; >>\r
   ;\r
 \r
@@ -1266,7 +2116,7 @@ vfrStatementStaticText :
   Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
   Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r
   {\r
-    "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)"    << TxtTwo = _STOSID(S3->getText()); >>\r
+    "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)"    << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >>\r
   }\r
   {\r
     "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r
@@ -1274,20 +2124,27 @@ vfrStatementStaticText :
   }\r
                                                        <<\r
                                                           if (Flags & EFI_IFR_FLAG_CALLBACK) {\r
+                                                            if (TxtTwo != EFI_STRING_ID_INVALID) {\r
+                                                              gCVfrErrorHandle.HandleWarning (\r
+                                                                                VFR_WARNING_ACTION_WITH_TEXT_TWO,\r
+                                                                                S3->getLine(),\r
+                                                                                S3->getText()\r
+                                                                                );\r
+                                                            }\r
                                                             CIfrAction AObj;\r
                                                             mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
                                                             AObj.SetLineNo (F->getLine());\r
                                                             AObj.SetQuestionId (QId);\r
-                                                            AObj.SetPrompt (_STOSID(S2->getText()));\r
-                                                            AObj.SetHelp (_STOSID(S1->getText()));\r
+                                                            AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
+                                                            AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
                                                             _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
                                                             AssignQuestionKey (AObj, KN);\r
                                                             CRT_END_OP (KN);\r
                                                           } else {\r
                                                             CIfrText TObj;\r
                                                             TObj.SetLineNo (T->getLine());\r
-                                                            TObj.SetHelp (_STOSID(S1->getText()));\r
-                                                            TObj.SetPrompt (_STOSID(S2->getText()));\r
+                                                            TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
+                                                            TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
                                                             TObj.SetTextTwo (TxtTwo);\r
                                                           }\r
                                                        >>\r
@@ -1296,7 +2153,7 @@ vfrStatementStaticText :
   ;\r
 \r
 staticTextFlagsField[UINT8 & HFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
@@ -1307,20 +2164,22 @@ vfrStatementCrossReference :
 \r
 vfrStatementGoto :\r
   <<\r
-     UINT8               RefType = 1;\r
-     EFI_STRING_ID       DevPath;\r
-     EFI_GUID            FSId;\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
@@ -1328,9 +2187,9 @@ vfrStatementGoto :
       Question "=" QN1:Number ","\r
                                                        <<\r
                                                           RefType = 4;\r
-                                                          DevPath = _STOSID(P->getText());\r
-                                                          FId = _STOFID(F1->getText());\r
-                                                          QId = _STOQID(QN1->getText());\r
+                                                          DevPath = _STOSID(P->getText(), P->getLine());\r
+                                                          FId = _STOFID(F1->getText(), F1->getLine());\r
+                                                          QId = _STOQID(QN1->getText(), QN1->getLine());\r
                                                        >>\r
     )\r
     |\r
@@ -1340,33 +2199,47 @@ vfrStatementGoto :
       Question "=" QN2:Number ","\r
                                                        <<\r
                                                           RefType = 3;\r
-                                                          FId = _STOFID(F2->getText());\r
-                                                          QId = _STOQID(QN2->getText());\r
+                                                          FId = _STOFID(F2->getText(), F2->getLine());\r
+                                                          QId = _STOQID(QN2->getText(), QN2->getLine());\r
                                                        >>\r
     )\r
     |\r
     (\r
-      FormId "=" F3:Number ","                         << RefType = 2; FId = _STOFID(F3->getText()); >>\r
+      FormId "=" F3:Number ","                         << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>\r
       Question "="\r
       (\r
-          QN3:StringIdentifier ","                     << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); >>\r
-        | QN4:Number ","                               << QId = _STOQID(QN4->getText()); >>\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(), QN4->getLine()); >>\r
       )\r
     )\r
     |\r
     (\r
       F4:Number ","                                    <<\r
                                                           RefType = 1;\r
-                                                          FId = _STOFID(F4->getText());\r
+                                                          FId = _STOFID(F4->getText(), F4->getLine());\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
@@ -1378,6 +2251,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
@@ -1388,15 +2262,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
@@ -1404,13 +2280,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
@@ -1420,7 +2303,7 @@ vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :
   ;\r
 \r
 gotoFlagsField[UINT8 & HFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
@@ -1438,7 +2321,7 @@ vfrStatementResetButton :
   L:ResetButton                                        << RBObj.SetLineNo(L->getLine()); >>\r
   DefaultStore\r
   "=" N:StringIdentifier ","                           <<\r
-                                                          _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
+                                                          _PCATCH(gCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
                                                           RBObj.SetDefaultId (DefaultId);\r
                                                        >>\r
   vfrStatementHeader[&RBObj] ","\r
@@ -1466,61 +2349,114 @@ vfrStatementBooleanType :
 //\r
 vfrStatementCheckBox :\r
   <<\r
-     CIfrCheckBox       CBObj;\r
+     CIfrCheckBox       *CBObj = NULL;\r
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
      CHAR8              *VarStoreName = NULL;\r
      UINT32             DataTypeSize;\r
+     EFI_GUID           *VarStoreGuid = NULL;\r
+     CIfrGuid           *GuidObj = NULL;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;;\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
+     Info.mIsBitVar         = FALSE;\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
+  L:CheckBox\r
+  vfrQuestionBaseInfo[Info, QId]                       <<\r
+                                                         //\r
+                                                         // Create a GUID opcode to wrap the checkbox opcode, if it refer to bit varstore.\r
+                                                         //\r
+                                                         if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                           GuidObj = new CIfrGuid(0);\r
+                                                           GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+                                                           GuidObj->SetLineNo(L->getLine());\r
+                                                         }\r
+                                                         CBObj = new CIfrCheckBox;\r
+                                                         CBObj->SetLineNo(L->getLine());\r
+                                                         CBObj->SetQuestionId (QId);\r
+                                                         CBObj->SetVarStoreInfo (&Info);\r
+                                                        >>\r
+  vfrStatementHeader[CBObj]","                           << //check 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
+                                                            //\r
+                                                            // Check whether the question refers to a bit field, if yes. create a Guid to indicate the question refers to a bit field.\r
+                                                            //\r
+                                                            if (_GET_CURRQEST_VARTINFO ().mIsBitVar) {\r
+                                                              _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
+                                                              if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER_BITS) &&\r
+                                                                  (_GET_CURRQEST_VARSIZE() != 1)) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only occupy 1 bit in Bit Varstore");\r
+                                                              }\r
+                                                            } else {\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 ((gCVfrDataStorage.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
   {\r
-    F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\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(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
+                                                            VarStoreGuid = gCVfrDataStorage.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
+                                                                gCVfrDefaultStore.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
+                                                                gCVfrDefaultStore.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
   {\r
-    Key "=" KN:Number  ","                             << AssignQuestionKey (CBObj, KN); >>\r
+    Key "=" KN:Number  ","                             << AssignQuestionKey (*CBObj, KN); >>\r
   }\r
   vfrStatementQuestionOptionList\r
-  E:EndCheckBox                                        << CRT_END_OP (E); >>\r
+  E:EndCheckBox                                        << CRT_END_OP (E);\r
+                                                          if (GuidObj != NULL) {\r
+                                                            GuidObj->SetScope(1);\r
+                                                            CRT_END_OP (E);\r
+                                                            delete GuidObj;\r
+                                                          }\r
+                                                          if (CBObj != NULL) delete CBObj;\r
+                                                       >>\r
   ";"\r
   ;\r
 \r
@@ -1539,9 +2475,9 @@ checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :
                                                             //\r
                                                             // set question flag\r
                                                             //\r
-                                                            $LFlags |= _STOU8(N->getText());\r
+                                                            $LFlags |= _STOU8(N->getText(), N->getLine());\r
                                                           } else {\r
-                                                            _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
+                                                            _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
                                                           }\r
                                                        >>\r
   | D:"DEFAULT"                                        <<\r
@@ -1583,9 +2519,9 @@ 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
+  Config "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>\r
   vfrStatementQuestionTagList\r
   E:EndAction                                          << CRT_END_OP (E); >>\r
   ";"\r
@@ -1598,7 +2534,7 @@ vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :
   ;\r
 \r
 actionFlagsField[UINT8 & HFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
@@ -1608,11 +2544,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
@@ -1635,15 +2576,16 @@ 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
                                                           DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
-                                                          DObj.SetPrompt (_STOSID(YP->getText()));\r
-                                                          DObj.SetHelp (_STOSID(YH->getText()));\r
+                                                          DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));\r
+                                                          DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));\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
@@ -1659,19 +2601,19 @@ minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :
     "default" "=" N:Number ","                         <<\r
                                                           switch (KeyValue) {\r
                                                           case 0: \r
-                                                            D.Year  = _STOU16(N->getText());\r
-                                                            if (D.Year < _STOU16 (MinN->getText()) || D.Year > _STOU16 (MaxN->getText())) {\r
+                                                            D.Year  = _STOU16(N->getText(), N->getLine());\r
+                                                            if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
                                                             }\r
                                                             break;\r
                                                           case 1: \r
-                                                            D.Month = _STOU8(N->getText()); \r
+                                                            D.Month = _STOU8(N->getText(), N->getLine()); \r
                                                             if (D.Month < 1 || D.Month > 12) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
                                                             }\r
                                                             break;\r
                                                           case 2: \r
-                                                            D.Day = _STOU8(N->getText()); \r
+                                                            D.Day = _STOU8(N->getText(), N->getLine()); \r
                                                             if (D.Day < 1 || D.Day > 31) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
                                                             }\r
@@ -1688,7 +2630,7 @@ vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :
   ;\r
 \r
 dateFlagsField [UINT8 & Flags] :\r
-    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+    N:Number                                           << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
   | "YEAR_SUPPRESS"                                    << $Flags |= 0x01; >>\r
   | "MONTH_SUPPRESS"                                   << $Flags |= 0x02; >>\r
   | "DAY_SUPPRESS"                                     << $Flags |= 0x04; >>\r
@@ -1708,135 +2650,553 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
      UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
      UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
      UINT8  MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
+     BOOLEAN IntDecStyle = FALSE;\r
+     CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\r
+     if (((_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() &  EDKII_IFR_DISPLAY_BIT) == 0)) ||\r
+     (!(_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0))) {\r
+       IntDecStyle = TRUE;\r
+     }\r
+     BOOLEAN MinNegative = FALSE;\r
+     BOOLEAN MaxNegative = FALSE;\r
   >>\r
-  Minimum   "=" I:Number ","\r
-                                                       <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MinU1 = _STOU8(I->getText());  break;\r
+  Minimum   "=" \r
+  {\r
+    "\-"                                               << MinNegative = TRUE; >>\r
+  }\r
+  I:Number ","                                         <<\r
+                                                          if (!IntDecStyle &&  MinNegative) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
                                                           }\r
-                                                       >>\r
-  Maximum   "=" A:Number ","\r
-                                                       <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : \r
-                                                            MaxU8 = _STOU64(A->getText()); \r
-                                                            if (MaxU8 < MinU8) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                          //\r
+                                                          // Value for question stored in bit fields is always set to UINT32 type.\r
+                                                          //\r
+                                                          if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            MinU4 = _STOU32(I->getText(), I->getLine());\r
+                                                            if (!IntDecStyle && MinU4 > (1<< _GET_CURRQEST_VARTINFO().mVarTotalSize) -1) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "BIT type minimum can't small than 0, bigger than 2^BitWidth -1");\r
                                                             }\r
-                                                            break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : \r
-                                                            MaxU4 = _STOU32(A->getText()); \r
-                                                            if (MaxU4 < MinU4) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                          } else {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                              MinU8 = _STOU64(I->getText(), I->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MinNegative) {\r
+                                                                  if (MinU8 > 0x8000000000000000) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MinNegative) {\r
+                                                                MinU8 = ~MinU8 + 1;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                              MinU4 = _STOU32(I->getText(), I->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MinNegative) {\r
+                                                                  if (MinU4 > 0x80000000) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MinU4 > 0x7FFFFFFF) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MinNegative) {\r
+                                                                MinU4 = ~MinU4 + 1;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                              MinU2 = _STOU16(I->getText(), I->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MinNegative) {\r
+                                                                  if (MinU2 > 0x8000) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MinU2 > 0x7FFF) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MinNegative) {\r
+                                                                MinU2 = ~MinU2 + 1;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                              MinU1 = _STOU8(I->getText(), I->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MinNegative) {\r
+                                                                  if (MinU1 > 0x80) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MinU1 > 0x7F) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MinNegative) {\r
+                                                                MinU1 = ~MinU1 + 1;\r
+                                                              }\r
+                                                              break;\r
                                                             }\r
-                                                            break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : \r
-                                                            MaxU2 = _STOU16(A->getText()); \r
-                                                            if (MaxU2 < MinU2) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                          }\r
+                                                       >>\r
+  Maximum   "=" \r
+  { \r
+    "\-"                                               << MaxNegative = TRUE; >>\r
+  }\r
+  A:Number ","                                         <<\r
+                                                          if (!IntDecStyle && MaxNegative) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
+                                                          }\r
+                                                          if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            MaxU4 = _STOU32(A->getText(), A->getLine());\r
+                                                            if (!IntDecStyle && MaxU4 > (1<< _GET_CURRQEST_VARTINFO().mVarTotalSize) -1) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "BIT type maximum can't bigger than 2^BitWidth -1");\r
                                                             }\r
-                                                            break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  \r
-                                                            MaxU1 = _STOU8(A->getText());  \r
-                                                            if (MaxU1 < MinU1) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                          } else {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                              MaxU8 = _STOU64(A->getText(), A->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MaxNegative) {\r
+                                                                  if (MaxU8 > 0x8000000000000000) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MaxNegative) {\r
+                                                                MaxU8 = ~MaxU8 + 1;\r
+                                                              }\r
+                                                              if (IntDecStyle) {\r
+                                                                if ((INT64) MaxU8 < (INT64) MinU8) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU8 < MinU8) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                              MaxU4 = _STOU32(A->getText(), A->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MaxNegative) {\r
+                                                                  if (MaxU4 > 0x80000000) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MaxU4 > 0x7FFFFFFF) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MaxNegative) {\r
+                                                                MaxU4 = ~MaxU4 + 1;\r
+                                                              }\r
+                                                              if (IntDecStyle) {\r
+                                                                if ((INT32) MaxU4 < (INT32) MinU4) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU4 < MinU4) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                              MaxU2 = _STOU16(A->getText(), A->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MaxNegative) {\r
+                                                                  if (MaxU2 > 0x8000) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MaxU2 > 0x7FFF) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MaxNegative) {\r
+                                                                MaxU2 = ~MaxU2 + 1;\r
+                                                              }\r
+                                                              if (IntDecStyle) {\r
+                                                                if ((INT16) MaxU2 < (INT16) MinU2) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU2 < MinU2) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                              MaxU1 = _STOU8(A->getText(), A->getLine());\r
+                                                              if (IntDecStyle) {\r
+                                                                if (MaxNegative) {\r
+                                                                  if (MaxU1 > 0x80) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+                                                                  }\r
+                                                                } else {\r
+                                                                  if (MaxU1 > 0x7F) {\r
+                                                                    _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+                                                                  }\r
+                                                                }\r
+                                                              }\r
+                                                              if (MaxNegative) {\r
+                                                                MaxU1 = ~MaxU1 + 1;\r
+                                                              }\r
+                                                              if (IntDecStyle) {\r
+                                                                if ((INT8) MaxU1 < (INT8) MinU1) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU1 < MinU1) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                                }\r
+                                                              }\r
+                                                              break;\r
                                                             }\r
-                                                            break;\r
                                                           }\r
                                                        >>\r
   {\r
     STEP    "=" S:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  StepU1 = _STOU8(S->getText());  break;\r
+                                                          if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            StepU4 = _STOU32(S->getText(), S->getLine());\r
+                                                          } else {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :  StepU1 = _STOU8(S->getText(), S->getLine());  break;\r
+                                                            }\r
                                                           }\r
                                                        >>\r
   }\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1);  break;\r
+                                                          if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4);\r
+                                                          } else {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :  $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1);  break;\r
+                                                            }\r
                                                           }\r
                                                        >>\r
   ;\r
 \r
 vfrStatementNumeric :\r
   <<\r
-     CIfrNumeric NObj;\r
-     UINT32 DataTypeSize;\r
+     CIfrNumeric *NObj = NULL;\r
+     UINT32      DataTypeSize;\r
+     BOOLEAN     IsSupported = TRUE;\r
+     UINT8       ShrinkSize  = 0;\r
+     CIfrGuid    *GuidObj = NULL;\r
+     UINT8       LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;\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
+     Info.mIsBitVar         = FALSE;\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
+  L:Numeric\r
+  vfrQuestionBaseInfo[Info, QId]                       <<\r
+                                                         //\r
+                                                         // Create a GUID opcode to wrap the numeric opcode, if it refer to bit varstore.\r
+                                                         //\r
+                                                         if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                           GuidObj = new CIfrGuid(0);\r
+                                                           GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+                                                           GuidObj->SetLineNo(L->getLine());\r
+                                                         }\r
+                                                         NObj = new CIfrNumeric;\r
+                                                         NObj->SetLineNo(L->getLine());\r
+                                                         NObj->SetQuestionId (QId);\r
+                                                         NObj->SetVarStoreInfo (&Info);\r
+                                                        >>\r
+  vfrStatementHeader[NObj]","\r
+                                                         <<\r
+                                                          // check data type\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                               LFlags = (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+                                                              _PCATCH(NObj->SetFlagsForBitField (NObj->FLAGS(), LFlags), L->getLine());\r
+                                                            } else {\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
                                                           }\r
-                                                          _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                        >>\r
-  { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
+  { F:FLAGS "=" vfrNumericFlags[*NObj, F->getLine()] "," }\r
   {\r
-    Key   "=" KN:Number ","                            << AssignQuestionKey (NObj, KN); >>\r
+    Key   "=" KN:Number ","                            << AssignQuestionKey (*NObj, KN); >>\r
   }\r
-  vfrSetMinMaxStep[NObj]\r
+  vfrSetMinMaxStep[*NObj]                               <<\r
+                                                          if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\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
+                                                          } else {\r
+                                                            //\r
+                                                            // Question stored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32.\r
+                                                            //\r
+                                                            ShrinkSize = 12;\r
+                                                          }\r
+                                                          NObj->ShrinkBinSize (ShrinkSize);\r
+\r
+                                                          if (!IsSupported) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+                                                          }\r
+                                                       >>\r
   vfrStatementQuestionOptionList\r
-  E:EndNumeric                                         << CRT_END_OP (E); >>\r
+  E:EndNumeric                                         << \r
+                                                          CRT_END_OP (E);\r
+                                                          if (GuidObj != NULL) {\r
+                                                            GuidObj->SetScope(1);\r
+                                                            CRT_END_OP (E);\r
+                                                            delete GuidObj;\r
+                                                          }\r
+                                                          if (NObj != NULL) delete NObj;\r
+                                                       >>\r
   ";"\r
   ;\r
 \r
 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
+     BOOLEAN IsSetType = FALSE;\r
+     BOOLEAN IsDisplaySpecified = FALSE;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
   >>\r
-  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
-                                                       << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] )*\r
+                                                       <<\r
+                                                          //check data type flag\r
+                                                          if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\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 if (IsSetType){\r
+                                                              _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            }\r
+                                                            _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
+                                                          } else if ((_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) && (_GET_CURRQEST_VARTINFO().mIsBitVar)) {\r
+                                                            LFlags |= (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+                                                            _PCATCH(NObj.SetFlagsForBitField (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
+                                                          }\r
+                                                       >>\r
   ;\r
 \r
-numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
-  | "DISPLAY_INT_DEC"                                  << $LFlags |= 0x00; >>\r
-  | "DISPLAY_UINT_DEC"                                 << $LFlags |= 0x10; >>\r
-  | "DISPLAY_UINT_HEX"                                 << $LFlags |= 0x20; >>\r
+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified, UINT32 LineNum] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | "NUMERIC_SIZE_1"                                   << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1;IsSetType = TRUE;\r
+                                                          } else {\r
+                                                            _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+                                                          }\r
+                                                       >>\r
+  | "NUMERIC_SIZE_2"                                   << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2;IsSetType = TRUE;\r
+                                                          } else {\r
+                                                            _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+                                                          }\r
+                                                       >>\r
+  | "NUMERIC_SIZE_4"                                   << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;\r
+                                                          } else {\r
+                                                            _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+                                                          }\r
+                                                       >>\r
+  | "NUMERIC_SIZE_8"                                   << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;\r
+                                                          } else {\r
+                                                            _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+                                                          }\r
+                                                       >>\r
+  | "DISPLAY_INT_DEC"                                  << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC;\r
+                                                          } else {\r
+                                                            $LFlags = ($LFlags & ~EDKII_IFR_DISPLAY_BIT) | EDKII_IFR_DISPLAY_INT_DEC_BIT;\r
+                                                          }\r
+                                                          IsDisplaySpecified = TRUE;\r
+                                                       >>\r
+  | "DISPLAY_UINT_DEC"                                 << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC;\r
+                                                          } else {\r
+                                                            $LFlags = ($LFlags & ~EDKII_IFR_DISPLAY_BIT) | EDKII_IFR_DISPLAY_UINT_DEC_BIT;\r
+                                                          }\r
+                                                          IsDisplaySpecified = TRUE;\r
+                                                       >>\r
+  | "DISPLAY_UINT_HEX"                                 << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX;\r
+                                                          } else {\r
+                                                            $LFlags = ($LFlags & ~EDKII_IFR_DISPLAY_BIT) | EDKII_IFR_DISPLAY_UINT_HEX_BIT;\r
+                                                          }\r
+                                                          IsDisplaySpecified = TRUE;\r
+                                                       >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
 vfrStatementOneOf :\r
   <<\r
-     CIfrOneOf OObj;\r
+     CIfrOneOf *OObj = NULL;\r
      UINT32    DataTypeSize;\r
+     BOOLEAN   IsSupported = TRUE;\r
+     UINT8     ShrinkSize  = 0;\r
+     CIfrGuid  *GuidObj = NULL;\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;;\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
+     Info.mIsBitVar              = FALSE;\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
+  L:OneOf\r
+  vfrQuestionBaseInfo[Info, QId]                       <<\r
+                                                         //\r
+                                                         // Create a GUID opcode to wrap the oneof opcode, if it refer to bit varstore.\r
+                                                         //\r
+                                                         if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                           GuidObj = new CIfrGuid(0);\r
+                                                           GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+                                                           GuidObj->SetLineNo(L->getLine());\r
+                                                         }\r
+                                                         OObj = new CIfrOneOf;\r
+                                                         OObj->SetLineNo(L->getLine());\r
+                                                         OObj->SetQuestionId (QId);\r
+                                                         OObj->SetVarStoreInfo (&Info);\r
+                                                        >>\r
+  vfrStatementHeader[OObj]","\r
+                                                        << //check data type\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                               LFlags = (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+                                                              _PCATCH(OObj->SetFlagsForBitField (OObj->FLAGS(), LFlags), L->getLine());\r
+                                                            } else {\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
                                                           }\r
-                                                          _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                        >>\r
-  { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
+  { F:FLAGS "=" vfrOneofFlagsField[*OObj, F->getLine()] "," }\r
   {\r
-    vfrSetMinMaxStep[OObj]\r
+    vfrSetMinMaxStep[*OObj]\r
   }\r
+                                                       <<\r
+                                                          if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\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
+                                                          } else {\r
+                                                            //\r
+                                                            // Question stored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32.\r
+                                                            //\r
+                                                            ShrinkSize = 12;\r
+                                                          }\r
+                                                          OObj->ShrinkBinSize (ShrinkSize);\r
+\r
+                                                          if (!IsSupported) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+                                                          }\r
+                                                       >>\r
   vfrStatementQuestionOptionList\r
-  E:EndOneOf                                           << CRT_END_OP (E); >>\r
+  E:EndOneOf                                           <<\r
+                                                          CRT_END_OP (E);\r
+                                                          if (GuidObj != NULL) {\r
+                                                            GuidObj->SetScope(1);\r
+                                                            CRT_END_OP (E);\r
+                                                            delete GuidObj;\r
+                                                          }\r
+                                                          if (OObj != NULL) delete OObj;\r
+                                                       >>\r
   ";"\r
   ;\r
 \r
 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
+     BOOLEAN IsSetType = FALSE;\r
+     BOOLEAN IsDisplaySpecified = FALSE;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
   >>\r
-  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
-                                                       << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] )*\r
+                                                       <<\r
+                                                          //check data type flag\r
+                                                          if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                            if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\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 if (IsSetType){\r
+                                                              _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            }\r
+                                                            _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
+                                                          } else if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH(OObj.SetFlagsForBitField (HFlags, LFlags), LineNum);\r
+                                                          }\r
+                                                       >>\r
   ;\r
 \r
 vfrStatementStringType :\r
@@ -1847,17 +3207,39 @@ vfrStatementStringType :
 vfrStatementString :\r
   <<\r
      CIfrString SObj;\r
+     UINT32 VarArraySize;\r
+     UINT8 StringMinSize;\r
+     UINT8 StringMaxSize;\r
   >>\r
-  L:String                                             << SObj.SetLineNo(L->getLine()); >>\r
+  L:String                                             << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>>\r
   vfrQuestionHeader[SObj] ","\r
   { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
   {\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(), MIN->getLine());\r
+                                                          if (_STOU64(MIN->getText(), MIN->getLine()) > 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(), MAX->getLine());\r
+                                                          if (_STOU64(MAX->getText(), MAX->getLine()) > 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
+  E:EndString                                          << CRT_END_OP (E); gIsStringOp = FALSE;>>\r
   ";"\r
   ;\r
 \r
@@ -1871,7 +3253,7 @@ vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :
   ;\r
 \r
 stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
   | "MULTI_LINE"                                       << $LFlags = 0x01; >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
@@ -1879,6 +3261,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
@@ -1886,8 +3271,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(), MIN->getLine());\r
+                                                          if (_STOU64(MIN->getText(), MIN->getLine()) > 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(), MAX->getLine());\r
+                                                          if (_STOU64(MAX->getText(), MAX->getLine()) > 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
@@ -1901,23 +3305,34 @@ vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :
   ;\r
 \r
 passwordFlagsField [UINT8 & HFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
 vfrStatementOrderedList :\r
   <<\r
      CIfrOrderedList OLObj;\r
+     UINT32 VarArraySize;\r
   >>\r
-  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
+  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
   vfrQuestionHeader[OLObj] ","\r
-                                                       << OLObj.SetMaxContainers ((UINT8)_GET_CURRQEST_VARSIZE()); >>\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(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {\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(), M->getLine()) > 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(), M->getLine()));\r
+                                                       >>\r
   }\r
-  { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r
+  { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
   vfrStatementQuestionOptionList\r
-  E:EndList                                            << CRT_END_OP (E); >>\r
+  E:EndList                                            << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
   ";"\r
   ;\r
 \r
@@ -1931,7 +3346,7 @@ vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :
   ;\r
 \r
 orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
-    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
   | "UNIQUE"                                           << $LFlags |= 0x01; >>\r
   | "NOEMPTY"                                          << $LFlags |= 0x02; >>\r
   | questionheaderFlagsField[HFlags]\r
@@ -1943,13 +3358,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
@@ -1970,15 +3390,16 @@ 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
                                                           TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
-                                                          TObj.SetPrompt (_STOSID(HP->getText()));\r
-                                                          TObj.SetHelp (_STOSID(HH->getText()));\r
+                                                          TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));\r
+                                                          TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));\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
@@ -1994,19 +3415,19 @@ minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :
     "default" "=" N:Number ","                         <<\r
                                                           switch (KeyValue) {\r
                                                           case 0: \r
-                                                            T.Hour   = _STOU8(N->getText()); \r
+                                                            T.Hour   = _STOU8(N->getText(), N->getLine()); \r
                                                             if (T.Hour > 23) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
                                                             }\r
                                                             break;\r
                                                           case 1: \r
-                                                            T.Minute = _STOU8(N->getText()); \r
+                                                            T.Minute = _STOU8(N->getText(), N->getLine()); \r
                                                             if (T.Minute > 59) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
                                                             }\r
                                                             break;\r
                                                           case 2: \r
-                                                            T.Second = _STOU8(N->getText());\r
+                                                            T.Second = _STOU8(N->getText(), N->getLine());\r
                                                             if (T.Second > 59) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
                                                             }\r
@@ -2023,7 +3444,7 @@ vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :
   ;\r
 \r
 timeFlagsField [UINT8 & Flags] :\r
-    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+    N:Number                                           << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
   | "HOUR_SUPPRESS"                                    << $Flags |= 0x01; >>\r
   | "MINUTE_SUPPRESS"                                  << $Flags |= 0x02; >>\r
   | "SECOND_SUPPRESS"                                  << $Flags |= 0x04; >>\r
@@ -2038,7 +3459,10 @@ vfrStatementQuestionTag :
   vfrStatementNoSubmitIf        |\r
   vfrStatementDisableIfQuest    |\r
   vfrStatementRefresh           |\r
-  vfrStatementVarstoreDevice\r
+  vfrStatementVarstoreDevice    |\r
+  vfrStatementExtension         |\r
+  vfrStatementRefreshEvent ","  |\r
+  vfrStatementWarningIf\r
   ;\r
 \r
 vfrStatementQuestionTagList :\r
@@ -2050,6 +3474,8 @@ vfrStatementQuestionOptionTag :
   vfrStatementGrayOutIfQuest    |\r
   vfrStatementValue             |\r
   vfrStatementDefault           |\r
+  vfrStatementRead              |\r
+  vfrStatementWrite             |\r
   vfrStatementOptions\r
   ;\r
 \r
@@ -2065,6 +3491,7 @@ vfrStatementStatList :
   vfrStatementQuestions                   |\r
   vfrStatementConditionalNew              |\r
   vfrStatementLabel                       |\r
+  vfrStatementExtension                   |\r
   // Just for framework vfr compatibility\r
   vfrStatementInvalid\r
   ;\r
@@ -2080,10 +3507,9 @@ vfrStatementStatListOld :
 vfrStatementDisableIfStat :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
-  vfrStatementExpression[0] ";"                        << mConstantOnlyInExpression = FALSE; >>\r
+  vfrStatementExpression[0] ";" \r
   ( vfrStatementStatList )*\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ";"\r
@@ -2097,7 +3523,7 @@ vfrStatementInconsistentIfStat :
                                                           }\r
                                                           IIObj.SetLineNo(L->getLine());\r
                                                        >>\r
-  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << IIObj.SetError (_STOSID(S->getText())); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
   { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
   vfrStatementExpression[0]\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
@@ -2179,7 +3605,7 @@ vfrStatementGrayOutIfStatOld :
 \r
 vfrImageTag :\r
   << CIfrImage IObj; >>\r
-  L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)"        << IObj.SetImageId (_STOSID(S1->getText())); IObj.SetLineNo(L->getLine()); >>\r
+  L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)"        << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
   ;\r
 \r
 vfrLockedTag :\r
@@ -2187,6 +3613,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
@@ -2201,6 +3632,11 @@ vfrStatementImage :
   ";"\r
   ;\r
 \r
+vfrStatementModal :\r
+  vfrModalTag\r
+  ";"\r
+  ;\r
+\r
 vfrStatementLocked :\r
   vfrLockedTag\r
   ";"\r
@@ -2209,42 +3645,59 @@ vfrStatementLocked :
 vfrStatementInconsistentIf :\r
   << CIfrInconsistentIf IIObj; >>\r
   L:InconsistentIf                                     << IIObj.SetLineNo(L->getLine()); >>\r
-  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << IIObj.SetError (_STOSID(S->getText())); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
   { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
   vfrStatementExpression[0]\r
-  E:EndIf                                              << CRT_END_OP (E); >>\r
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementNoSubmitIf :\r
   << CIfrNoSubmitIf NSIObj; >>\r
   L:NoSubmitIf                                         << NSIObj.SetLineNo(L->getLine()); >>\r
-  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << NSIObj.SetError (_STOSID(S->getText())); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
   { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
   vfrStatementExpression[0]\r
-  E:EndIf                                              << CRT_END_OP (E); >>\r
+  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(), S->getLine())); >>\r
+  {Timeout "=" T:Number ","                            << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
+  vfrStatementExpression[0]\r
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementDisableIfQuest :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
-  vfrStatementExpression[0] ";"                        << mConstantOnlyInExpression = FALSE; >>\r
+  vfrStatementExpression[0] ";"\r
   vfrStatementQuestionOptionList\r
-  E:EndIf                                              << CRT_END_OP (E); >>\r
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementRefresh :\r
   << CIfrRefresh RObj; >>\r
   L:Refresh                                            << RObj.SetLineNo(L->getLine()); >>\r
-  Interval "=" I:Number                                << RObj.SetRefreshInterval (_STOU8(I->getText())); >>\r
+  Interval "=" I:Number                                << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>\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
-  "=" "STRING_TOKEN" "\(" S:Number "\)" ","            << VDObj.SetDevicePath (_STOSID(S->getText())); >>\r
+  "=" "STRING_TOKEN" "\(" S:Number "\)" ","            << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>\r
   ;\r
 \r
 vfrStatementSuppressIfQuest :\r
@@ -2253,7 +3706,7 @@ vfrStatementSuppressIfQuest :
   { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
   vfrStatementExpression[0] ";"\r
   vfrStatementQuestionOptionList\r
-  E:EndIf                                              << CRT_END_OP (E); >>\r
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementGrayOutIfQuest :\r
@@ -2262,7 +3715,7 @@ vfrStatementGrayOutIfQuest :
   { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
   vfrStatementExpression[0] ";"\r
   vfrStatementQuestionOptionList\r
-  E:EndIf                                              << CRT_END_OP (E); >>\r
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementOptions :\r
@@ -2271,33 +3724,153 @@ vfrStatementOptions :
 \r
 vfrStatementOneOfOption :\r
   <<\r
-     EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
-     CIfrOneOfOption    OOOObj;\r
+     UINT8              ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE *Val          = (EFI_IFR_TYPE_VALUE *) ValueList;\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
+     BOOLEAN            ArrayType     = FALSE;\r
+     CIfrOneOfOption    *OOOObj;\r
+     UINT8              *Type8        = (UINT8  *) ValueList;\r
+     UINT16             *Type16       = (UINT16 *) ValueList;\r
+     UINT32             *Type32       = (UINT32 *) ValueList;\r
+     UINT64             *Type64       = (UINT64 *) ValueList;\r
   >>\r
-  L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
-  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r
-  F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+  L:Option                                             <<      \r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
+                                                          }\r
+\r
+                                                       >>\r
+  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      \r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
+                                                       << \r
+                                                          if (gCurrentMinMaxData != NULL) {\r
+                                                            //set min/max value for oneof opcode\r
+                                                            UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE(), _GET_CURRQEST_VARTINFO().mIsBitVar);\r
+                                                            if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
+                                                            } else {\r
+                                                              switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                              case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                                                                gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
+                                                                break;\r
+                                                              case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                                gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
+                                                                break;\r
+                                                              case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                                gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
+                                                                break;\r
+                                                              case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                                gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
+                                                                break;\r
+                                                              default:\r
+                                                                break;\r
+                                                              }\r
+                                                            }\r
+                                                          }\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                          } else if (ArrayType) {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                                 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                               while (Type8[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                               while (Type16[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT16);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                               while (Type32[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT32);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                               while (Type64[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT64);\r
+                                                               break;\r
+                                                             default:\r
+                                                               break;\r
+                                                            }\r
+                                                          } else {\r
+                                                            //\r
+                                                            // For the oneof stored in bit fields, set the option type as UINT32.\r
+                                                            //\r
+                                                            if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                              Size = sizeof (UINT32);\r
+                                                            } else {\r
+                                                              ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+                                                            }\r
+                                                          }\r
+                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+                                                            _PCATCH (ReturnCode, L->getLine());\r
+                                                          }\r
+\r
+                                                          Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+                                                          OOOObj = new CIfrOneOfOption((UINT8)Size);\r
+                                                          OOOObj->SetLineNo(L->getLine());\r
+                                                          OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
+                                                          if (ArrayType) {\r
+                                                            OOOObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+                                                          } else {\r
+                                                            if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+                                                              OOOObj->SetType ( EFI_IFR_TYPE_NUM_SIZE_32);\r
+                                                            } else {\r
+                                                              OOOObj->SetType (_GET_CURRQEST_DATATYPE());\r
+                                                            }\r
+                                                          }\r
+                                                          OOOObj->SetValue (*Val); \r
+                                                       >>\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
+                                                          //\r
+                                                          // Array type only for default type OneOfOption.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
+                                                          }\r
+\r
+                                                          //\r
+                                                          // Clear the default flag if the option not use array value but has default flag.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
+                                                            OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
+                                                          }\r
+\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
+                                                            VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
+                                                              _PCATCH(gCVfrDefaultStore.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 () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
+                                                              _PCATCH(gCVfrDefaultStore.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
@@ -2310,16 +3883,16 @@ vfrStatementOneOfOption :
                                                          //\r
                                                          CIfrOptionKey IfrOptionKey (\r
                                                                          gCurrentQuestion->QUESTION_ID(),\r
-                                                                         Val,\r
-                                                                         _STOQID(KN->getText())\r
+                                                                         *Val,\r
+                                                                         _STOQID(KN->getText(), KN->getLine())\r
                                                                          );\r
                                                          SET_LINE_INFO (IfrOptionKey, KN);\r
                                                        >>\r
   }\r
   (\r
-    T:"," vfrImageTag                                  << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
+    T:"," vfrImageTag                                  << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
   )*\r
-  ";"\r
+  ";"                                                  << if (OOOObj != NULL) {delete OOOObj;} >>\r
   ;\r
 \r
 vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
@@ -2333,15 +3906,36 @@ vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :
   ;\r
 \r
 oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
-    N:Number                                           << $LFlags |= _STOU8(N->getText()); >>\r
+    N:Number                                           << $LFlags |= _STOU8(N->getText(), N->getLine()); >>\r
   | "OPTION_DEFAULT"                                   << $LFlags |= 0x10; >>\r
   | "OPTION_DEFAULT_MFG"                               << $LFlags |= 0x20; >>\r
   | InteractiveFlag                                    << $HFlags |= 0x04; >>\r
-  | NVAccessFlag                                       << $HFlags |= 0x08; >>\r
   | ResetRequiredFlag                                  << $HFlags |= 0x10; >>\r
-  | LateCheckFlag                                      << $HFlags |= 0x20; >>\r
+  | ReconnectRequiredFlag                              << $HFlags |= 0x40; >>\r
   | ManufacturingFlag                                  << $LFlags |= 0x20; >>\r
   | DefaultFlag                                        << $LFlags |= 0x10; >>\r
+  | A:NVAccessFlag                                     << \r
+                                                          if (mCompatibleMode) {\r
+                                                            $HFlags |= 0x08;\r
+                                                          } else {\r
+                                                            gCVfrErrorHandle.HandleWarning (\r
+                                                              VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                              A->getLine(),\r
+                                                              A->getText()\r
+                                                              );\r
+                                                          }\r
+                                                       >>\r
+  | L:LateCheckFlag                                    << \r
+                                                          if (mCompatibleMode) {\r
+                                                            $HFlags |= 0x20;\r
+                                                          } else {\r
+                                                            gCVfrErrorHandle.HandleWarning (\r
+                                                              VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                              L->getLine(),\r
+                                                              L->getText()\r
+                                                              );\r
+                                                          }\r
+                                                       >>\r
   ;\r
 \r
 vfrStatementLabel :\r
@@ -2359,7 +3953,7 @@ vfrStatementLabel :
                                                           {\r
                                                             CIfrLabel LObj2;\r
                                                             LObj2.SetLineNo(L->getLine());\r
-                                                            LObj2.SetNumber (_STOU16(N->getText()));\r
+                                                            LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));\r
                                                           }\r
                                                        >>\r
   ";"\r
@@ -2368,10 +3962,10 @@ vfrStatementLabel :
 vfrStatementBanner :\r
   << CIfrBanner BObj; >>\r
   B:Banner { "," }                                     << BObj.SetLineNo(B->getLine()); >>\r
-  Title "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << BObj.SetTitle (_STOSID(S->getText())); >>\r
+  Title "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>\r
   (\r
     (\r
-      Line L:Number ","                                << BObj.SetLine (_STOU16(L->getText())); >>\r
+      Line L:Number ","                                << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>\r
       Align\r
       (\r
           Left                                         << BObj.SetAlign (0); >>\r
@@ -2381,7 +3975,7 @@ vfrStatementBanner :
     )\r
     |\r
     (\r
-      Timeout "=" T:Number ";"                         << {CIfrTimeout TObj(_STOU16(T->getText()));} >>\r
+      Timeout "=" T:Number ";"                         << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>\r
     )\r
   )\r
   ;\r
@@ -2460,6 +4054,8 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token RuleRef("ruleref")                       "ruleref"\r
 #token StringRef("stringref")                   "stringref"\r
 #token PushThis("pushthis")                     "pushthis"\r
+#token Security("security")                     "security"\r
+#token Get("get")                               "get"\r
 #token True("TRUE")                             "TRUE"\r
 #token False("FALSE")                           "FALSE"\r
 #token One("ONE")                               "ONE"\r
@@ -2471,6 +4067,7 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token AND("AND")                               "AND"\r
 #token OR("OR")                                 "OR"\r
 #token NOT("NOT")                               "NOT"\r
+#token Set("set")                               "set"\r
 #token BitWiseNot("~")                          "\~"\r
 #token BoolVal("boolval")                       "boolval"\r
 #token StringVal("stringval")                   "stringval"\r
@@ -2478,15 +4075,18 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token ToUpper("toupper")                       "toupper"\r
 #token ToLower("tolower")                       "tolower"\r
 #token Match("match")                           "match"\r
+#token Match2("match2")                         "match2"\r
 #token Catenate("catenate")                     "catenate"\r
 #token QuestionRefVal("questionrefval")         "questionrefval"\r
 #token StringRefVal("stringrefval")             "stringrefval"\r
+#token Map("map")                               "map"\r
+#token RefreshGuid("refreshguid")               "refreshguid"\r
 \r
 //\r
 // Root expression extension function called by other function.\r
 //\r
 vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
-  << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>\r
+  << if ($RootLevel == 0) {mCIfrOpHdrIndex ++; if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!"); _CLEAR_SAVED_OPHDR ();} >>\r
   andTerm[$RootLevel, $ExpOpCount]\r
   (\r
     L:OR andTerm[$RootLevel, $ExpOpCount]              << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
@@ -2498,11 +4098,15 @@ vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
                                                           if ($ExpOpCount > 1 && $RootLevel == 0) {\r
                                                             if (_SET_SAVED_OPHDR_SCOPE()) {\r
                                                               CIfrEnd EObj;\r
-                                                              if (mCIfrOpHdrLineNo != 0) {\r
-                                                                EObj.SetLineNo (mCIfrOpHdrLineNo);\r
+                                                              if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
+                                                                EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
                                                               }\r
                                                             }\r
                                                           }\r
+                                                          \r
+                                                          if ($RootLevel == 0) {\r
+                                                            mCIfrOpHdrIndex --;\r
+                                                          }\r
                                                        >>\r
   ;\r
 \r
@@ -2640,11 +4244,13 @@ castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
 atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
     vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
   | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
   | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
   | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
   | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
   | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
   | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
   | (\r
       L:NOT\r
       atomTerm[$RootLevel, $ExpOpCount]                 << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
@@ -2669,6 +4275,20 @@ vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:
   "\)"                                                 << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
+vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  <<\r
+    EFI_GUID      Guid;\r
+  >>\r
+  L:Match2\r
+  "\("\r
+  vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  guidDefinition[Guid]\r
+  "\)"                                                 << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
+  ;\r
+\r
 vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
   "\("\r
   vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
@@ -2681,10 +4301,12 @@ 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
+  | securityExp[$RootLevel, $ExpOpCount]\r
+  | getExp[$RootLevel, $ExpOpCount]\r
   ;\r
 \r
 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -2698,8 +4320,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
@@ -2710,12 +4332,12 @@ 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 = gCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
                                                           if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                            _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
+                                                            _PCATCH (gCVfrDataStorage.DeclareEfiVarStore (\r
                                                                                         VarIdStr,\r
                                                                                         &mFormsetGuid,\r
-                                                                                        _STOSID(VN->getText()),\r
+                                                                                        _STOSID(VN->getText(), VN->getLine()),\r
                                                                                         0x2,   //default type is UINT16\r
                                                                                         FALSE\r
                                                                                         ), VN);\r
@@ -2729,7 +4351,7 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   (\r
     (\r
       "=="\r
-      V1:Number                                        << ConstVal = _STOU16(V1->getText()); >>\r
+      V1:Number                                        << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
                                                        <<\r
                                                           if (Mask == 0) {\r
                                                             CIfrEqIdVal EIVObj (L->getLine());\r
@@ -2745,25 +4367,25 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
     |\r
     (\r
       "<="\r
-      V2:Number                                        << ConstVal = _STOU16(V2->getText()); >>\r
+      V2:Number                                        << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
     )\r
     |\r
     (\r
       "<"\r
-      V3:Number                                        << ConstVal = _STOU16(V3->getText()); >>\r
+      V3:Number                                        << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
     )\r
     |\r
     (\r
       ">="\r
-      V4:Number                                        << ConstVal = _STOU16(V4->getText()); >>\r
+      V4:Number                                        << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
     )\r
     |\r
     (\r
       ">"\r
-      V5:Number                                        << ConstVal = _STOU16(V5->getText()); >>\r
+      V5:Number                                        << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
     )\r
   )\r
@@ -2782,7 +4404,7 @@ ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   (\r
     (\r
       "=="\r
-      V1:Number                                        << ConstVal = _STOU16(V1->getText()); >>\r
+      V1:Number                                        << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
                                                        <<\r
                                                           if (Mask == 0) {\r
                                                             CIfrEqIdVal EIVObj (L->getLine());\r
@@ -2798,25 +4420,25 @@ ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
     |\r
     (\r
       "<="\r
-      V2:Number                                        << ConstVal = _STOU16(V2->getText()); >>\r
+      V2:Number                                        << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
     )\r
     |\r
     (\r
       "<"\r
-      V3:Number                                        << ConstVal = _STOU16(V3->getText()); >>\r
+      V3:Number                                        << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
     )\r
     |\r
     (\r
       ">="\r
-      V4:Number                                        << ConstVal = _STOU16(V4->getText()); >>\r
+      V4:Number                                        << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
     )\r
     |\r
     (\r
       ">"\r
-      V5:Number                                        << ConstVal = _STOU16(V5->getText()); >>\r
+      V5:Number                                        << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
     )\r
   )\r
@@ -2887,7 +4509,7 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
   "=="\r
   (\r
-    V:Number                                           << ValueList[ListLen] = _STOU16(V->getText()); ListLen++; >>\r
+    V:Number                                           << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
   )+\r
                                                        <<\r
                                                           if (Mask != 0) {\r
@@ -2914,50 +4536,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;\r
-     EFI_GUID        Guid;\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
+        | ID:Number                                    << QId = _STOQID(ID->getText(), ID->getLine()); >>\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
@@ -2970,14 +4568,111 @@ rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
 //   stringref (STR_FORM_SET_TITLE)\r
 //\r
 stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+    EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
+  >>\r
   L:StringRef\r
-  "\(" S:Number "\)"                                   << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (_STOSID(S->getText())); $ExpOpCount++; } >>\r
+  "\("\r
+      ( \r
+        "STRING_TOKEN"\r
+        "\(" \r
+          S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
+        "\)"\r
+        | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
+      )\r
+  "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
   ;\r
 \r
 pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
   L:PushThis                                           << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
+securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_GUID Guid;\r
+  >>\r
+  L:Security\r
+  "\(" guidDefinition[Guid] "\)"                       << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
+  ;\r
+\r
+numericVarStoreType [UINT8 & VarType] :\r
+    "NUMERIC_SIZE_1"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
+  | "NUMERIC_SIZE_2"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
+  | "NUMERIC_SIZE_4"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
+  | "NUMERIC_SIZE_8"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
+  ;\r
+\r
+getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_VARSTORE_INFO Info;\r
+     CHAR8             *VarIdStr = NULL;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;\r
+     UINT32            Mask = 0;\r
+     EFI_QUESION_TYPE  QType = QUESTION_NORMAL;\r
+     UINT8             VarType = EFI_IFR_TYPE_UNDEFINED;\r
+     UINT32            VarSize = 0;\r
+     Info.mVarStoreId = 0;\r
+  >>\r
+  L:Get\r
+  "\(" \r
+      vfrStorageVarId[Info, VarIdStr, FALSE]\r
+      {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
+  "\)"                                                 << \r
+                                                          {\r
+                                                            if (Info.mVarStoreId == 0) {\r
+                                                              // support Date/Time question\r
+                                                              mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
+                                                              if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                              }\r
+                                                              if (QType == QUESTION_DATE) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_DATE;\r
+                                                              } else if (QType == QUESTION_TIME) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_TIME;\r
+                                                              }\r
+                                                              switch (Mask) {\r
+                                                              case DATE_YEAR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case DATE_DAY_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 3;\r
+                                                                break;\r
+                                                              case TIME_HOUR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case TIME_MINUTE_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 1;\r
+                                                                break;\r
+                                                              case TIME_SECOND_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 2;\r
+                                                                break;\r
+                                                              default:\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                                break;\r
+                                                              }\r
+                                                            } else {\r
+                                                              if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
+                                                              }\r
+                                                              if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
+                                                                Info.mVarType = VarType;\r
+                                                                _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                                Info.mVarTotalSize = VarSize;\r
+                                                              }\r
+                                                              _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                              if (VarSize != Info.mVarTotalSize) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
+                                                              }\r
+                                                            }\r
+                                                            CIfrGet GObj(L->getLine()); \r
+                                                            _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
+                                                            GObj.SetVarInfo (&Info); \r
+                                                            delete VarIdStr; \r
+                                                            $ExpOpCount++;\r
+                                                          }\r
+                                                       >>\r
+  ;\r
+\r
 vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
     L1:True                                            << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
   | L2:False                                           << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
@@ -2986,18 +4681,20 @@ vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | L5:Zero                                            << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
   | L6:Undefined                                       << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
   | L7:Version                                         << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
-  | V:Number                                           << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0), V->getLine()); $ExpOpCount++; >>\r
+  | V:Number                                           << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText(), V->getLine())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0), V->getLine()); $ExpOpCount++; >>\r
   ;\r
 \r
 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
+  | setExp[$RootLevel, $ExpOpCount]\r
   ;\r
 \r
 lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -3012,10 +4709,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(), S->getLine()); >>\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
@@ -3034,7 +4751,7 @@ tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   << UINT8 Fmt = 0; >>\r
   L:StringVal\r
   {\r
-    Format "=" F:Number ","                            << Fmt = _STOU8(F->getText()); >>\r
+    Format "=" F:Number ","                            << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
   }\r
   "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
                                                        << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
@@ -3058,6 +4775,78 @@ tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
+setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_VARSTORE_INFO Info;\r
+     CHAR8             *VarIdStr = NULL;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;\r
+     UINT32            Mask = 0;\r
+     EFI_QUESION_TYPE  QType = QUESTION_NORMAL;\r
+     UINT8             VarType = EFI_IFR_TYPE_UNDEFINED;\r
+     UINT32            VarSize = 0;\r
+     Info.mVarStoreId = 0;\r
+  >>\r
+  L:Set\r
+  "\("\r
+     vfrStorageVarId[Info, VarIdStr, FALSE]\r
+     {"\|" FLAG "=" numericVarStoreType [VarType] }\r
+     "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
+  "\)"\r
+                                                       << \r
+                                                          {\r
+                                                            if (Info.mVarStoreId == 0) {\r
+                                                              // support Date/Time question\r
+                                                              mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
+                                                              if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                              }\r
+                                                              if (QType == QUESTION_DATE) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_DATE;\r
+                                                              } else if (QType == QUESTION_TIME) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_TIME;\r
+                                                              }\r
+                                                              switch (Mask) {\r
+                                                              case DATE_YEAR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case DATE_DAY_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 3;\r
+                                                                break;\r
+                                                              case TIME_HOUR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case TIME_MINUTE_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 1;\r
+                                                                break;\r
+                                                              case TIME_SECOND_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 2;\r
+                                                                break;\r
+                                                              default:\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                                break;\r
+                                                              }\r
+                                                            } else {\r
+                                                              if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
+                                                              }\r
+                                                              if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
+                                                                Info.mVarType = VarType;\r
+                                                                _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                                Info.mVarTotalSize = VarSize;\r
+                                                              }\r
+                                                              _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                              if (VarSize != Info.mVarTotalSize) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
+                                                              }\r
+                                                            }\r
+                                                            CIfrSet TSObj(L->getLine()); \r
+                                                            TSObj.SetVarInfo (&Info); \r
+                                                            delete VarIdStr; \r
+                                                            $ExpOpCount++;\r
+                                                          }\r
+                                                       >>\r
+  ;\r
+\r
 vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
     conditionalExp[$RootLevel, $ExpOpCount]\r
   | findExp[$RootLevel, $ExpOpCount]\r
@@ -3133,8 +4922,22 @@ spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   "\)"                                                 << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
   ;\r
 \r
+vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  L:Map                                                   \r
+  "\(" \r
+  vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]  \r
+  ":"                                                     << { CIfrMap MObj(L->getLine()); } >>\r
+  (\r
+    vfrStatementExpression[0]\r
+    ","\r
+    vfrStatementExpression[0]\r
+    ";"\r
+  ) *\r
+  E:"\)"                                                  << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
 spanFlags [UINT8 & Flags] :\r
-    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+    N:Number                                           << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
   | "LAST_NON_MATCH"                                   << $Flags |= 0x00; >>\r
   | "FIRST_NON_MATCH"                                  << $Flags |= 0x01; >>\r
   ;\r
@@ -3152,19 +4955,26 @@ private:
   UINT8               mParserStatus;\r
   BOOLEAN             mConstantOnlyInExpression;\r
 \r
-  CVfrDefaultStore    mCVfrDefaultStore;\r
-  CVfrDataStorage     mCVfrDataStorage;\r
   CVfrQuestionDB      mCVfrQuestionDB;\r
   CVfrRulesDB         mCVfrRulesDB;\r
 \r
-  CIfrOpHeader        *mCIfrOpHdr;\r
-  UINT32              mCIfrOpHdrLineNo;\r
+  CIfrOpHeader *      mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
+  UINT32              mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
+  UINT8               mCIfrOpHdrIndex;\r
   VOID                _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
   VOID                _CLEAR_SAVED_OPHDR (VOID);\r
   BOOLEAN             _SET_SAVED_OPHDR_SCOPE (VOID);\r
 \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
@@ -3179,30 +4989,33 @@ private:
 \r
   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 CHAR8 *);\r
+  VOID                _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
   VOID                _PCATCH (IN EFI_VFR_RETURN_CODE);\r
   VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
   VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
-  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CHAR8 *);\r
+  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
 \r
   VOID                syn     (ANTLRAbstractToken  *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
 \r
   CHAR8*              TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r
   CHAR8*              _U32TOS (IN UINT32);\r
-  UINT8               _STOU8  (IN CHAR8 *);\r
-  UINT16              _STOU16 (IN CHAR8 *);\r
-  UINT32              _STOU32 (IN CHAR8 *);\r
-  UINT64              _STOU64 (IN CHAR8 *);\r
-  EFI_HII_DATE        _STOD   (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *);\r
-  EFI_HII_TIME        _STOT   (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *);\r
+  UINT8               _STOU8  (IN CHAR8 *, IN UINT32);\r
+  UINT16              _STOU16 (IN CHAR8 *, IN UINT32);\r
+  UINT32              _STOU32 (IN CHAR8 *, IN UINT32);\r
+  UINT64              _STOU64 (IN CHAR8 *, IN UINT32);\r
+  EFI_HII_DATE        _STOD   (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
+  EFI_HII_TIME        _STOT   (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
+  EFI_HII_REF         _STOR   (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);\r
 \r
-  EFI_STRING_ID       _STOSID (IN CHAR8 *);\r
-  EFI_FORM_ID         _STOFID (IN CHAR8 *);\r
-  EFI_QUESTION_ID     _STOQID (IN CHAR8 *);\r
+  EFI_STRING_ID       _STOSID (IN CHAR8 *, IN UINT32);\r
+  EFI_FORM_ID         _STOFID (IN CHAR8 *, IN UINT32);\r
+  EFI_QUESTION_ID     _STOQID (IN CHAR8 *, IN UINT32);\r
 \r
-  VOID                _STRCAT (IN OUT CHAR8 **, IN CHAR8 *);\r
+  VOID                _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
 \r
   VOID                _DeclareDefaultLinearVarStore (IN UINT32);\r
   VOID                _DeclareStandardDefaultStorage (IN UINT32);\r
@@ -3214,6 +5027,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
@@ -3230,11 +5044,11 @@ EfiVfrParser::_SAVE_OPHDR_COND (
   )\r
 {\r
   if (Cond == TRUE) {\r
-    if (mCIfrOpHdr != NULL) {\r
+    if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
       return ;\r
     }\r
-    mCIfrOpHdr       = new CIfrOpHeader(OpHdr);\r
-    mCIfrOpHdrLineNo = LineNo;\r
+    mCIfrOpHdr[mCIfrOpHdrIndex]       = new CIfrOpHeader(OpHdr);\r
+    mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
   }\r
 }\r
 \r
@@ -3243,8 +5057,8 @@ EfiVfrParser::_CLEAR_SAVED_OPHDR (
   VOID\r
   )\r
 {\r
-  mCIfrOpHdr       = NULL;\r
-  mCIfrOpHdrLineNo = 0;\r
+  mCIfrOpHdr[mCIfrOpHdrIndex]       = NULL;\r
+  mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
 }\r
 \r
 BOOLEAN\r
@@ -3252,10 +5066,11 @@ EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (
   VOID\r
   )\r
 {\r
-  if (mCIfrOpHdr != NULL) {\r
-    mCIfrOpHdr->SetScope (1);\r
+  if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+    mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
     return TRUE;\r
   }\r
+\r
   //\r
   // IfrOpHdr is not set, FALSE is return.\r
   //\r
@@ -3286,6 +5101,37 @@ EfiVfrParser::_GET_CURRQEST_VARTINFO (
   return mCurrQestVarInfo;\r
 }\r
 \r
+UINT32\r
+EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
+  VOID\r
+  )\r
+{\r
+  UINT8 Size = 1;\r
+\r
+  switch (mCurrQestVarInfo.mVarType) {\r
+  case EFI_IFR_TYPE_NUM_SIZE_8:\r
+    Size = 1;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_16:\r
+    Size = 2;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_32:\r
+    Size = 4;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_64:\r
+    Size = 8;\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+\r
+  return (mCurrQestVarInfo.mVarTotalSize / Size);\r
+}\r
+\r
 UINT8\r
 EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
   VOID\r
@@ -3307,7 +5153,7 @@ EfiVfrParser::_PCATCH (
   IN INTN                ReturnCode,\r
   IN INTN                ExpectCode,\r
   IN ANTLRTokenPtr       Tok,\r
-  IN CHAR8               *ErrorMsg\r
+  IN CONST CHAR8         *ErrorMsg\r
   )\r
 {\r
   if (ReturnCode != ExpectCode) {\r
@@ -3321,7 +5167,7 @@ EfiVfrParser::_PCATCH (
   IN EFI_VFR_RETURN_CODE ReturnCode\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode);\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
 }\r
 \r
 VOID\r
@@ -3330,7 +5176,7 @@ EfiVfrParser::_PCATCH (
   IN ANTLRTokenPtr       Tok\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
 }\r
 \r
 VOID\r
@@ -3339,17 +5185,17 @@ EfiVfrParser::_PCATCH (
   IN UINT32              LineNum\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
 }\r
 \r
 VOID\r
 EfiVfrParser::_PCATCH (\r
   IN EFI_VFR_RETURN_CODE ReturnCode,\r
   IN UINT32              LineNum,\r
-  IN CHAR8               *ErrorMsg\r
+  IN CONST CHAR8         *ErrorMsg\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum, ErrorMsg);\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
 }\r
 \r
 VOID\r
@@ -3401,18 +5247,21 @@ EfiVfrParser::_U32TOS (
 \r
 UINT8\r
 EfiVfrParser::_STOU8 (\r
-  IN CHAR8*Str\r
+  IN CHAR8  *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
   BOOLEAN IsHex;\r
   UINT8   Value;\r
   CHAR8   c;\r
 \r
+  UINT8 PreviousValue;\r
+  CHAR8 *OrigString = Str;\r
+  CHAR8 ErrorMsg[100];\r
+\r
   Str = TrimHex (Str, &IsHex);\r
   for (Value = 0; (c = *Str) != '\0'; Str++) {\r
-    //\r
-    // BUG: does not handle overflow here\r
-    //\r
+    PreviousValue = Value;\r
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
 \r
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
@@ -3424,6 +5273,10 @@ EfiVfrParser::_STOU8 (
     if (c >= '0' && c <= '9') {\r
       Value += (c - '0');\r
     }\r
+    if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
+      gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+    }\r
   }\r
 \r
   return Value;\r
@@ -3431,18 +5284,21 @@ EfiVfrParser::_STOU8 (
 \r
 UINT16\r
 EfiVfrParser::_STOU16 (\r
-  IN CHAR8*Str\r
+  IN CHAR8  *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
   BOOLEAN IsHex;\r
   UINT16  Value;\r
   CHAR8   c;\r
 \r
+  UINT16 PreviousValue;\r
+  CHAR8 *OrigString = Str;\r
+  CHAR8 ErrorMsg[100];\r
+\r
   Str = TrimHex (Str, &IsHex);\r
   for (Value = 0; (c = *Str) != '\0'; Str++) {\r
-    //\r
-    // BUG: does not handle overflow here\r
-    //\r
+    PreviousValue = Value;\r
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
 \r
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
@@ -3454,6 +5310,10 @@ EfiVfrParser::_STOU16 (
     if (c >= '0' && c <= '9') {\r
       Value += (c - '0');\r
     }\r
+    if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
+      gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+    }\r
   }\r
 \r
   return Value;\r
@@ -3461,18 +5321,21 @@ EfiVfrParser::_STOU16 (
 \r
 UINT32\r
 EfiVfrParser::_STOU32 (\r
-  IN CHAR8*Str\r
+  IN CHAR8  *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
   BOOLEAN IsHex;\r
   UINT32  Value;\r
   CHAR8   c;\r
 \r
+  UINT32 PreviousValue;\r
+  CHAR8 *OrigString = Str;\r
+  CHAR8 ErrorMsg[100];\r
+\r
   Str = TrimHex (Str, &IsHex);\r
   for (Value = 0; (c = *Str) != '\0'; Str++) {\r
-    //\r
-    // BUG: does not handle overflow here\r
-    //\r
+    PreviousValue = Value;\r
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
 \r
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
@@ -3484,6 +5347,10 @@ EfiVfrParser::_STOU32 (
     if (c >= '0' && c <= '9') {\r
       Value += (c - '0');\r
     }\r
+    if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
+      gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+    }\r
   }\r
 \r
   return Value;\r
@@ -3491,18 +5358,20 @@ EfiVfrParser::_STOU32 (
 \r
 UINT64\r
 EfiVfrParser::_STOU64 (\r
-  IN CHAR8*Str\r
+  IN CHAR8  *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
   BOOLEAN IsHex;\r
   UINT64  Value;\r
   CHAR8   c;\r
+  UINT64 PreviousValue;\r
+  CHAR8 *OrigString = Str;\r
+  CHAR8 ErrorMsg[100];\r
 \r
   Str = TrimHex (Str, &IsHex);\r
   for (Value = 0; (c = *Str) != '\0'; Str++) {\r
-    //\r
-    // BUG: does not handle overflow here\r
-    //\r
+    PreviousValue = Value;\r
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
 \r
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
@@ -3514,6 +5383,10 @@ EfiVfrParser::_STOU64 (
     if (c >= '0' && c <= '9') {\r
       Value += (c - '0');\r
     }\r
+    if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
+      gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+    }\r
   }\r
 \r
   return Value;\r
@@ -3523,14 +5396,15 @@ EFI_HII_DATE
 EfiVfrParser::_STOD (\r
   IN CHAR8 *Year,\r
   IN CHAR8 *Month,\r
-  IN CHAR8 *Day\r
+  IN CHAR8 *Day,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
   EFI_HII_DATE Date;\r
 \r
-  Date.Year  = _STOU16 (Year);\r
-  Date.Month = _STOU8 (Month);\r
-  Date.Day   = _STOU8 (Day);\r
+  Date.Year  = _STOU16 (Year, LineNum);\r
+  Date.Month = _STOU8 (Month, LineNum);\r
+  Date.Day   = _STOU8 (Day, LineNum);\r
 \r
   return Date;\r
 }\r
@@ -3539,46 +5413,50 @@ EFI_HII_TIME
 EfiVfrParser::_STOT (\r
   IN CHAR8 *Hour,\r
   IN CHAR8 *Minute,\r
-  IN CHAR8 *Second\r
+  IN CHAR8 *Second,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
   EFI_HII_TIME Time;\r
 \r
-  Time.Hour   = _STOU8 (Hour);\r
-  Time.Minute = _STOU8 (Minute);\r
-  Time.Second = _STOU8 (Second);\r
+  Time.Hour   = _STOU8 (Hour, LineNum);\r
+  Time.Minute = _STOU8 (Minute, LineNum);\r
+  Time.Second = _STOU8 (Second, LineNum);\r
 \r
   return Time;\r
 }\r
 \r
 EFI_STRING_ID\r
 EfiVfrParser::_STOSID (\r
-  IN CHAR8 *Str\r
+  IN CHAR8  *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
-  return (EFI_STRING_ID)_STOU16(Str);\r
+  return (EFI_STRING_ID)_STOU16(Str, LineNum);\r
 }\r
 \r
 EFI_FORM_ID\r
 EfiVfrParser::_STOFID (\r
-  IN CHAR8 *Str\r
+  IN CHAR8 *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
-  return (EFI_FORM_ID)_STOU16(Str);\r
+  return (EFI_FORM_ID)_STOU16(Str, LineNum);\r
 }\r
 \r
 EFI_QUESTION_ID\r
 EfiVfrParser::_STOQID (\r
-  IN CHAR8 *Str\r
+  IN CHAR8 *Str,\r
+  IN UINT32 LineNum\r
   )\r
 {\r
-  return (EFI_QUESTION_ID)_STOU16(Str);\r
+  return (EFI_QUESTION_ID)_STOU16(Str, LineNum);\r
 }\r
 \r
 VOID\r
 EfiVfrParser::_STRCAT (\r
   IN OUT CHAR8 **Dest,\r
-  IN CHAR8     *Src\r
+  IN CONST CHAR8 *Src\r
   )\r
 {\r
   CHAR8   *NewStr;\r
@@ -3603,6 +5481,26 @@ 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
+  IN UINT32   LineNum\r
+  )\r
+{\r
+  EFI_HII_REF Ref;\r
+  UINT32      Index;\r
+\r
+  memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
+  Ref.QuestionId  = _STOQID (QuestionId, LineNum);\r
+  Ref.FormId      = _STOFID (FormId, LineNum);\r
+  Ref.DevicePath  = _STOSID (DevicePath, LineNum);\r
+\r
+  return Ref;\r
+}\r
+\r
 //\r
 // framework vfr to default declare varstore for each structure\r
 //\r
@@ -3614,9 +5512,10 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
   SVfrVarStorageNode    *pNode;\r
   UINT32                TypeSize;\r
   BOOLEAN               FirstNode;\r
+  CONST CHAR8           VarName[] = "Setup";\r
 \r
   FirstNode = TRUE;\r
-  pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
+  pNode = gCVfrDataStorage.GetBufferVarStoreList();\r
   if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
     //\r
     // Create the default Buffer Var Store when no VarStore is defined.\r
@@ -3626,9 +5525,9 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
     CIfrVarStore      VSObj;\r
     VSObj.SetLineNo (LineNo);\r
     VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
-    VSObj.SetSize (TypeSize);\r
+    VSObj.SetSize ((UINT16) TypeSize);\r
     //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
-    VSObj.SetName ("Setup");\r
+    VSObj.SetName ((CHAR8 *) VarName);\r
     VSObj.SetGuid (&mFormsetGuid);\r
 #ifdef VFREXP_DEBUG\r
     printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
@@ -3643,9 +5542,9 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
         CIfrVarStore      VSObj;\r
         VSObj.SetLineNo (LineNo);\r
         VSObj.SetVarStoreId (pNode->mVarStoreId);\r
-        VSObj.SetSize (pNode->mStorageInfo.mDataType->mTotalSize);\r
+        VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
         if (FirstNode) {\r
-          VSObj.SetName ("Setup");\r
+          VSObj.SetName ((CHAR8 *) VarName);\r
           FirstNode = FALSE;\r
         } else {\r
           VSObj.SetName (pNode->mVarStoreName);\r
@@ -3658,7 +5557,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
     }\r
   }\r
 \r
-  pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
+  pNode = gCVfrDataStorage.GetEfiVarStoreList();\r
   for (; pNode != NULL; pNode = pNode->mNext) {\r
     //\r
     // create the default efi varstore opcode for not exist varstore\r
@@ -3669,6 +5568,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
@@ -3685,6 +5587,10 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
   UINT32            Index;\r
   CHAR8             **TypeNameList;\r
   UINT32            ListSize;\r
+  CONST CHAR8       DateName[] = "Date";\r
+  CONST CHAR8       TimeName[] = "Time";\r
+  CONST CHAR8       DateType[] = "EFI_HII_DATE";\r
+  CONST CHAR8       TimeType[] = "EFI_HII_TIME";\r
 \r
   gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
 \r
@@ -3694,17 +5600,18 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
                        TypeNameList[Index],\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
                        TypeNameList[Index],\r
-                       EFI_VARSTORE_ID_INVALID\r
+                       EFI_VARSTORE_ID_INVALID,\r
+                       FALSE\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r
+    gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
-    VSObj.SetSize (Size);\r
+    VSObj.SetSize ((UINT16) Size);\r
     VSObj.SetName (TypeNameList[Index]);\r
     VSObj.SetGuid (&mFormsetGuid);\r
   }\r
@@ -3713,45 +5620,47 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
 // not required to declare Date and Time VarStore,\r
 // because code to support old format Data and Time\r
 //\r
-  if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Date") == FALSE) {\r
+  if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
     UINT32            Size;\r
     EFI_VARSTORE_ID   VarStoreId;\r
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
-                       "Date",\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
+                       (CHAR8 *) DateName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
-                       "EFI_HII_DATE",\r
-                       EFI_VARSTORE_ID_INVALID\r
+                       (CHAR8 *) DateType,\r
+                       EFI_VARSTORE_ID_INVALID,\r
+                       FALSE\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId("Date", &VarStoreId);\r
+    gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
-    gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_DATE", &Size);\r
-    VSObj.SetSize (Size);\r
-    VSObj.SetName ("Date");\r
+    gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
+    VSObj.SetSize ((UINT16) Size);\r
+    VSObj.SetName ((CHAR8 *) DateName);\r
     VSObj.SetGuid (&mFormsetGuid);\r
   }\r
 \r
-  if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Time") == FALSE) {\r
+  if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
     UINT32            Size;\r
     EFI_VARSTORE_ID   VarStoreId;\r
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
-                       "Time",\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
+                       (CHAR8 *) TimeName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
-                       "EFI_HII_TIME",\r
-                       EFI_VARSTORE_ID_INVALID\r
+                       (CHAR8 *) TimeType,\r
+                       EFI_VARSTORE_ID_INVALID,\r
+                       FALSE\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId("Time", &VarStoreId);\r
+    gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
-    gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_TIME", &Size);\r
-    VSObj.SetSize (Size);\r
-    VSObj.SetName ("Time");\r
+    gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
+    VSObj.SetSize ((UINT16) Size);\r
+    VSObj.SetName ((CHAR8 *) TimeName);\r
     VSObj.SetGuid (&mFormsetGuid);\r
   }\r
 }\r
@@ -3766,7 +5675,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObj;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+  gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr<CHAR8>(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
   DSObj.SetLineNo (LineNo);\r
   DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
   DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
@@ -3776,7 +5685,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObjMF;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
+  gCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr<CHAR8>(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
   DSObjMF.SetLineNo (LineNo);\r
   DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
   DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
@@ -3794,7 +5703,7 @@ EfiVfrParser::AssignQuestionKey (
     return;\r
   }\r
 \r
-  KeyValue = _STOU16 (KeyTok->getText());\r
+  KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());\r
 \r
   if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
     /*\r
@@ -3963,6 +5872,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
@@ -3972,4 +5887,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