]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 891effad79efb750da9b2b0718e0a7081d01b286..55fd067f8aba8b000119842a56c75cacad25f233 100644 (file)
@@ -1,14 +1,8 @@
 /*++ @file\r
 Vfr Syntax\r
 \r
-Copyright (c) 2004 - 2015, 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
-\r
-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
+Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 --*/\r
 \r
@@ -23,6 +17,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 >>\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
@@ -30,8 +27,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #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
@@ -39,7 +36,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
@@ -52,7 +49,6 @@ VfrParserStart (
   )\r
 {\r
   ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);\r
-  VfrParser.parser()->SetCompatibleMode (InputInfo->CompatibleMode);\r
   VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid);\r
   return VfrParser.parser()->vfrProgram();\r
 }\r
@@ -61,7 +57,7 @@ VfrParserStart (
 //\r
 // Define a lexical class for parsing quoted strings. Basically\r
 // starts with a double quote, and ends with a double quote that\r
-// is not preceeded with a backslash.\r
+// is not preceded with a backslash.\r
 //\r
 #lexclass QUOTED_STRING\r
 #token TheString            "~[\"]*\"" << mode (START); >>\r
@@ -154,6 +150,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
@@ -191,9 +188,11 @@ 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
+#token RestStyleFlag("REST_STYLE")              "REST_STYLE"\r
 #token Class("class")                           "class"\r
 #token Subclass("subclass")                     "subclass"\r
 #token ClassGuid("classguid")                   "classguid"\r
@@ -268,6 +267,7 @@ vfrProgram > [UINT8 Return] :
   (\r
       vfrPragmaPackDefinition\r
     | vfrDataStructDefinition\r
+    | vfrDataUnionDefinition\r
   )*\r
   vfrFormSetDefinition\r
   << $Return = mParserStatus; >>\r
@@ -316,6 +316,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
@@ -323,7 +338,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
@@ -331,42 +346,46 @@ 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
-     dataStructFieldRef    |\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
   D:"UINT64"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), 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
   D:"UINT32"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField16 :\r
+dataStructField16 [BOOLEAN  FieldInUnion]:\r
   << \r
     UINT32 ArrayNum = 0; \r
   >>\r
@@ -375,77 +394,154 @@ dataStructField16 :
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField8 :\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(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldBool :\r
+dataStructFieldBool [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"BOOLEAN"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldString :\r
+dataStructFieldString [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_STRING_ID"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldDate :\r
+dataStructFieldDate [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_HII_DATE"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldTime :\r
+dataStructFieldTime [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_HII_TIME"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldRef :\r
+dataStructFieldRef [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_HII_REF"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), 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(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\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
+  ":" 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
@@ -489,7 +585,7 @@ vfrFormSetDefinition :
   <<\r
      EFI_GUID    Guid;\r
      EFI_GUID    DefaultClassGuid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID;\r
-     EFI_GUID    ClassGuid1, ClassGuid2, ClassGuid3;\r
+     EFI_GUID    ClassGuid1, ClassGuid2, ClassGuid3, ClassGuid4;\r
      UINT8       ClassGuidNum = 0;\r
      CIfrFormSet *FSObj = NULL;\r
      UINT16      C, SC;\r
@@ -505,13 +601,16 @@ vfrFormSetDefinition :
                      "\|" guidDefinition[ClassGuid2]  << ++ClassGuidNum; >>\r
                      {\r
                       "\|" guidDefinition[ClassGuid3]  << ++ClassGuidNum; >>\r
+                       {\r
+                         "\|" guidDefinition[ClassGuid4]  << ++ClassGuidNum; >>\r
+                       }\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
+                                                      if (mOverrideClassGuid != NULL && ClassGuidNum >= 4) {\r
+                                                        _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 4 class guids, can't add extra class guid!");\r
                                                       }\r
                                                       switch (ClassGuidNum) {\r
                                                       case 0:\r
@@ -548,10 +647,23 @@ vfrFormSetDefinition :
                                                         }\r
                                                         break;\r
                                                       case 3:\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
                                                         FSObj->SetClassGuid(&ClassGuid3);\r
+                                                        if (mOverrideClassGuid != NULL) {\r
+                                                          FSObj->SetClassGuid(mOverrideClassGuid);\r
+                                                        }\r
+                                                        break;\r
+                                                      case 4:\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
+                                                        FSObj->SetClassGuid(&ClassGuid4);\r
                                                         break;\r
                                                       default:\r
                                                         break;\r
@@ -559,12 +671,6 @@ vfrFormSetDefinition :
 \r
                                                       SET_LINE_INFO (*FSObj, L);\r
                                                       FSObj->SetGuid (&Guid);\r
-                                                      //\r
-                                                      // for framework vfr to store formset guid used by varstore and efivarstore\r
-                                                      //\r
-                                                      if (mCompatibleMode) {\r
-                                                        memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID));\r
-                                                      }\r
                                                       FSObj->SetFormSetTitle (_STOSID(S1->getText(), S1->getLine()));\r
                                                       FSObj->SetHelp (_STOSID(S2->getText(), S2->getLine()));\r
                                                     >>\r
@@ -579,20 +685,13 @@ vfrFormSetDefinition :
                                                     >>\r
   vfrFormSetList\r
   E:EndFormSet                                      <<\r
-                                                      if (mCompatibleMode) {\r
-                                                        //\r
-                                                        // declare all undefined varstore and efivarstore\r
-                                                        //\r
-                                                        _DeclareDefaultFrameworkVarStore (GET_LINENO(E));\r
-                                                      }\r
-                                                      \r
                                                       //\r
                                                       // Declare undefined Question so that they can be used in expression.\r
                                                       //\r
                                                       if (gCFormPkg.HavePendingUnassigned()) {\r
                                                         mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
                                                                     gCVfrVarDataTypeDB,\r
-                                                                    mCVfrDataStorage,\r
+                                                                    gCVfrDataStorage,\r
                                                                     mCVfrQuestionDB,\r
                                                                     &mFormsetGuid,\r
                                                                     E->getLine(),\r
@@ -610,7 +709,8 @@ vfrFormSetDefinition :
                                                       if (gNeedAdjustOpcode) {\r
                                                         gCFormPkg.AdjustDynamicInsertOpcode (\r
                                                           mLastFormEndAddr,\r
-                                                          InsertOpcodeAddr\r
+                                                          InsertOpcodeAddr,\r
+                                                          FALSE\r
                                                         );\r
                                                       }\r
 \r
@@ -729,6 +829,11 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize,
      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
@@ -785,23 +890,69 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize,
                 memcpy (ByteOffset, &Data_SID, TypeSize);                                                    \r
               }\r
             } else {\r
-              gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\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
-                 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\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
-                 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\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
-                 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\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
-                 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\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
@@ -815,7 +966,7 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize,
                  break;\r
               }\r
             }\r
-            if (TFName != NULL) { delete TFName; TFName = NULL; }\r
+            if (TFName != NULL) { delete[] TFName; TFName = NULL; }\r
           >>\r
   )*\r
 )\r
@@ -830,14 +981,14 @@ vfrStatementDefaultStore :
     "," 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(), S->getLine()), 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(), S->getLine()));\r
                                                          DSObj.SetDefaultId (DefaultId);\r
                                                        } else {\r
-                                                         _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
+                                                         _PCATCH(gCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
                                                        }\r
                                                     >>\r
   ";"\r
@@ -852,10 +1003,11 @@ 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
+      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
@@ -865,12 +1017,6 @@ vfrStatementVarStoreLinear :
     | 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(), FID->getLine());\r
-                                                       }\r
-                                                    >>\r
-  }\r
   {\r
     VarId "=" ID:Number ","                         <<\r
                                                        _PCATCH(\r
@@ -884,20 +1030,18 @@ vfrStatementVarStoreLinear :
   Name "=" SN:StringIdentifier ","\r
   Uuid "=" guidDefinition[Guid]\r
                                                     <<\r
-                                                       if (mCompatibleMode) {\r
-                                                         StoreName = TypeName;\r
-                                                       } else {\r
-                                                         StoreName = SN->getText();\r
-                                                       }\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
-                                                                                  StoreName,\r
-                                                                                  &Guid,\r
-                                                                                  &gCVfrVarDataTypeDB,\r
-                                                                                  TypeName,\r
-                                                                                  VarStoreId\r
-                                                                                  ), LineNum);\r
+\r
+                                                       StoreName = SN->getText();\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, &Guid), SN);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                        VSObj.SetVarStoreId (VarStoreId);\r
                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
                                                        VSObj.SetSize ((UINT16) Size);\r
@@ -918,10 +1062,11 @@ vfrStatementVarStoreEfi :
      UINT32          LineNum;\r
      CHAR8           *StoreName = NULL;\r
      BOOLEAN         CustomizedName = FALSE;\r
+     BOOLEAN         IsBitVarStore = FALSE;\r
   >>\r
   E:Efivarstore                                     << VSEObj.SetLineNo(E->getLine()); >>\r
   (\r
-      TN:StringIdentifier ","                       << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >>\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
@@ -981,33 +1126,35 @@ vfrStatementVarStoreEfi :
 \r
   Uuid "=" guidDefinition[Guid]                     << \r
                                                        if (IsUEFI23EfiVarstore) {\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
-                                                                                  StoreName,\r
-                                                                                  &Guid,\r
-                                                                                  &gCVfrVarDataTypeDB,\r
-                                                                                  TypeName,\r
-                                                                                  VarStoreId\r
-                                                                                  ), LineNum);                                                        \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
+                                                       _PCATCH(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(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                                   TN->getText(),\r
                                                                                   &Guid,\r
                                                                                   &gCVfrVarDataTypeDB,\r
                                                                                   TypeName,\r
-                                                                                  VarStoreId\r
-                                                                                  ), LineNum);                                                      \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\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
+                                                       VSEObj.SetGuid (&Guid);\r
                                                        VSEObj.SetVarStoreId (VarStoreId);\r
                                                        \r
                                                        VSEObj.SetSize ((UINT16) Size);\r
                                                        VSEObj.SetName (StoreName);\r
                                                        if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {\r
-                                                         delete StoreName; \r
+                                                         delete[] StoreName;\r
                                                        }\r
                                                     >>\r
   ";"\r
@@ -1039,23 +1186,23 @@ vfrStatementVarStoreNameValue :
   (\r
     Name "=" "STRING_TOKEN" "\(" N:Number "\)" ","  << \r
                                                        if (!Created) {\r
-                                                         _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
+                                                         _PCATCH(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
                                                          Created = TRUE;\r
                                                        }\r
-                                                       _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN); \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, &Guid), SN);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
                                                        VSNVObj.SetVarStoreId (VarStoreId);\r
                                                     >>\r
   ";"\r
   ;\r
 \r
 //\r
-// keep classDeinition and validClassNames for compatibility but not generate\r
+// keep classDefinition and validClassNames for compatibility but not generate\r
 // any IFR object\r
 //\r
 classDefinition[UINT16 & Class] :\r
@@ -1098,9 +1245,6 @@ vfrStatementDisableIfFormSet :
 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
@@ -1119,6 +1263,58 @@ vfrStatementHeader[CIfrStatementHeader *SHObj] :
   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
@@ -1126,94 +1322,44 @@ vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_
      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
-     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
-                                                       $QHObj.SetQuestionId (QId);\r
-                                                       if (VarIdStr != NULL) {\r
-                                                        $QHObj.SetVarStoreInfo (&Info);\r
-                                                       }\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
-                                                    << \r
-                                                       if (VarIdStr != NULL) {\r
-                                                         delete VarIdStr; \r
-                                                       }\r
-                                                       _SAVE_CURRQEST_VARINFO (Info);\r
-                                                    >>\r
   ;\r
 \r
 questionheaderFlagsField[UINT8 & Flags] :\r
     ReadOnlyFlag                                    << $Flags |= 0x01; >>\r
   | InteractiveFlag                                 << $Flags |= 0x04; >>\r
   | ResetRequiredFlag                               << $Flags |= 0x10; >>\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
+  | RestStyleFlag                                   << $Flags |= 0x20; >>\r
+  | ReconnectRequiredFlag                           << $Flags |= 0x40; >>\r
+  | O:OptionOnlyFlag                                <<\r
+                                                       gCVfrErrorHandle.HandleWarning (\r
+                                                          VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                          O->getLine(),\r
+                                                          O->getText()\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
+  | N:NVAccessFlag                                  <<\r
+                                                        gCVfrErrorHandle.HandleWarning (\r
+                                                          VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                          N->getLine(),\r
+                                                          N->getText()\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
+  | L:LateCheckFlag                                 <<\r
+                                                        gCVfrErrorHandle.HandleWarning (\r
+                                                          VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                          L->getLine(),\r
+                                                          L->getText()\r
+                                                          );\r
                                                     >>\r
   ;\r
 \r
@@ -1239,21 +1385,10 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                        _STRCAT(&VarIdStr, "]");\r
                                                     >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
-                                                       if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
-                                                                             SName,\r
-                                                                             &mFormsetGuid,\r
-                                                                             &gCVfrVarDataTypeDB,\r
-                                                                             SName,\r
-                                                                             EFI_VARSTORE_ID_INVALID,\r
-                                                                             FALSE\r
-                                                                             );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
-                                                       }\r
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN1);\r
-                                                         _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+                                                         _PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
                                                        }\r
 \r
                                                        QuestVarIdStr = VarIdStr;\r
@@ -1263,23 +1398,12 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
   (\r
     SN2:StringIdentifier                            << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
-                                                       if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
-                                                                             SName,\r
-                                                                             &mFormsetGuid,\r
-                                                                             &gCVfrVarDataTypeDB,\r
-                                                                             SName,\r
-                                                                             EFI_VARSTORE_ID_INVALID,\r
-                                                                             FALSE\r
-                                                                             );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
-                                                       }\r
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN2);\r
-                                                         VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
-                                                         if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), 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
@@ -1288,7 +1412,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
     (\r
       "."                                           <<\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
-                                                         _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\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
@@ -1296,7 +1420,6 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
       {\r
         OpenBracket I2:Number CloseBracket          <<\r
                                                        Idx = _STOU32(I2->getText(), I2->getLine());\r
-                                                       if (mCompatibleMode) Idx --;\r
                                                        if (Idx > 0) {\r
                                                          //\r
                                                          // Idx == 0, [0] can be ignored.\r
@@ -1314,11 +1437,12 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
     )*                                              <<\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
-                                                         VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\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
@@ -1334,13 +1458,14 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                     $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
                                                        }\r
 \r
                                                        QuestVarIdStr = VarIdStr;\r
-                                                       if (VarStr != NULL) {delete VarStr;}\r
+                                                       if (VarStr != NULL) {delete[] VarStr;}\r
                                                     >>\r
   )\r
   ;\r
@@ -1376,7 +1501,6 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
       {\r
         OpenBracket I2:Number CloseBracket          <<\r
                                                        Idx = _STOU32(I2->getText(), I2->getLine());\r
-                                                       if (mCompatibleMode) Idx --;\r
                                                        if (Idx > 0) {\r
                                                          //\r
                                                          // Idx == 0, [0] can be ignored.\r
@@ -1395,7 +1519,14 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
 \r
 vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
   <<  \r
-    EFI_GUID Guid;\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
@@ -1403,31 +1534,97 @@ vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType]
     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(), N1->getLine());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_16 :\r
-                                                         $Value.u16    = _STOU16(N1->getText(), N1->getLine());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_32 :\r
-                                                         $Value.u32    = _STOU32(N1->getText(), N1->getLine());\r
-                                                       break;\r
-                                                       case EFI_IFR_TYPE_NUM_SIZE_64 :\r
-                                                         $Value.u64    = _STOU64(N1->getText(), N1->getLine());\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
+                                                       // 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
@@ -1511,22 +1708,7 @@ vfrFormDefinition :
     vfrStatementRefreshEvent ";"\r
   )*\r
   E:EndForm                                         <<\r
-                                                      if (mCompatibleMode) {\r
-                                                        //\r
-                                                        // Add Label for Framework Vfr\r
-                                                        //\r
-                                                        CIfrLabel LObj1;\r
-                                                        LObj1.SetLineNo(E->getLine());\r
-                                                        LObj1.SetNumber (0xffff);  //add end label for UEFI, label number hardcode 0xffff\r
-                                                        CIfrLabel LObj2;\r
-                                                        LObj2.SetLineNo(E->getLine());\r
-                                                        LObj2.SetNumber (0x0);     //add dummy label for UEFI, label number hardcode 0x0\r
-                                                        CIfrLabel LObj3;\r
-                                                        LObj3.SetLineNo(E->getLine());\r
-                                                        LObj3.SetNumber (0xffff);  //add end label for UEFI, label number hardcode 0xffff\r
-                                                      }\r
-\r
-                                                      {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
+                                                      {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr<CHAR8>(); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
                                                     >>\r
   ";"\r
   ;\r
@@ -1590,6 +1772,7 @@ vfrStatementDefault :
      UINT16                *Type16       = (UINT16 *) ValueList;\r
      UINT32                *Type32       = (UINT32 *) ValueList;\r
      UINT64                *Type64       = (UINT64 *) ValueList;\r
+     CIfrNumeric           *NumericQst   = NULL;\r
 \r
   >>\r
   D:Default                                         \r
@@ -1599,8 +1782,49 @@ vfrStatementDefault :
                                                     << \r
                                                         if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
                                                           //check default value is valid for Numeric Opcode\r
-                                                          if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                          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_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_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_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_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
+                                                          } 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
                                                           }\r
                                                         }\r
                                                         if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
@@ -1638,15 +1862,25 @@ vfrStatementDefault :
                                                               break;\r
                                                           }\r
                                                         } else {\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\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
-                                                          DObj->SetType (_GET_CURRQEST_DATATYPE());\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
@@ -1655,7 +1889,7 @@ vfrStatementDefault :
     )\r
     {\r
       DefaultStore "=" SN:StringIdentifier ","      << \r
-                                                        _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
+                                                        _PCATCH(gCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN);\r
                                                         if (DObj != NULL) {\r
                                                           DObj->SetDefaultId (DefaultId); \r
                                                         } \r
@@ -1668,11 +1902,11 @@ vfrStatementDefault :
                                                     <<\r
                                                       CheckDuplicateDefaultValue (DefaultId, D);\r
                                                       if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
-                                                       VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                       VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\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
@@ -1719,13 +1953,11 @@ vfrStatementConditionalNew :
   ;\r
 \r
 vfrStatementSuppressIfStat :\r
-  <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r
-  | vfrStatementSuppressIfStatNew\r
+  vfrStatementSuppressIfStatNew\r
   ;\r
 \r
 vfrStatementGrayOutIfStat :\r
-  <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r
-  | vfrStatementGrayOutIfStatNew\r
+  vfrStatementGrayOutIfStatNew\r
   ;\r
 \r
 vfrStatementInvalid :\r
@@ -1743,23 +1975,20 @@ flagsField :
   | ManufacturingFlag \r
   | DefaultFlag \r
   | ResetRequiredFlag \r
-  | N:NVAccessFlag                                     << \r
-                                                          if (!mCompatibleMode) {\r
-                                                            gCVfrErrorHandle.HandleWarning (\r
-                                                              VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
-                                                              N->getLine(),\r
-                                                              N->getText()\r
-                                                              );\r
-                                                          }\r
+  | ReconnectRequiredFlag\r
+  | N:NVAccessFlag                                     <<\r
+                                                          gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            N->getLine(),\r
+                                                            N->getText()\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
+  | L:LateCheckFlag                                    <<\r
+                                                          gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            L->getLine(),\r
+                                                            L->getText()\r
+                                                            );\r
                                                        >> \r
   ;\r
 \r
@@ -2024,7 +2253,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
@@ -2052,38 +2281,71 @@ 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
+  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
-                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
-                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
-                                                            } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
-                                                                      (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+                                                            //\r
+                                                            // 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
                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
-                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            _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
+                                                            if (CBObj->GetFlags () & 0x01) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
                                                               _PCATCH(\r
-                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                                     EFI_HII_DEFAULT_CLASS_STANDARD,\r
                                                                                     _GET_CURRQEST_VARTINFO(),\r
                                                                                     VarStoreName,\r
@@ -2096,10 +2358,10 @@ vfrStatementCheckBox :
                                                                 "No standard default storage found"\r
                                                                 );\r
                                                             }\r
-                                                            if (CBObj.GetFlags () & 0x02) {\r
+                                                            if (CBObj->GetFlags () & 0x02) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
                                                               _PCATCH(\r
-                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                                     EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
                                                                                     _GET_CURRQEST_VARTINFO(),\r
                                                                                     VarStoreName,\r
@@ -2116,10 +2378,17 @@ vfrStatementCheckBox :
                                                         >>\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
@@ -2134,34 +2403,13 @@ vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :
 \r
 checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
     N:Number                                           <<\r
-                                                          if (mCompatibleMode) {\r
-                                                            //\r
-                                                            // set question flag\r
-                                                            //\r
-                                                            $LFlags |= _STOU8(N->getText(), N->getLine());\r
-                                                          } else {\r
-                                                            _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
-                                                          }\r
+                                                          _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
                                                        >>\r
   | D:"DEFAULT"                                        <<\r
-                                                          if (mCompatibleMode) {\r
-                                                            //\r
-                                                            // set question Default flag\r
-                                                            //\r
-                                                            $LFlags |= 0x01;\r
-                                                          } else {\r
-                                                            _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
-                                                          }\r
+                                                          _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
                                                        >>\r
   | M:"MANUFACTURING"                                  <<\r
-                                                          if (mCompatibleMode) {\r
-                                                            //\r
-                                                            // set question MFG flag\r
-                                                            //\r
-                                                            $LFlags |= 0x02;\r
-                                                          } else {\r
-                                                            _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
-                                                          }\r
+                                                          _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
                                                        >>\r
   | "CHECKBOX_DEFAULT"                                 << $LFlags |= 0x01; >>\r
   | "CHECKBOX_DEFAULT_MFG"                             << $LFlags |= 0x02; >>\r
@@ -2313,109 +2561,342 @@ 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(), I->getLine()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MinU1 = _STOU8(I->getText(), I->getLine());  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(), A->getLine()); \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(), A->getLine()); \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(), A->getLine()); \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(), A->getLine());  \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(), 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
+                                                          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
+     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
+  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
-                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
-                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+                                                            if (_GET_CURRQEST_VARTINFO().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
-                                                            _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                           }\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
-                                                          switch (_GET_CURRQEST_DATATYPE()) {\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
-                                                            // Base on the type to know the actual used size,shrink the buffer \r
-                                                            // size allocate before.\r
+                                                            // Question stored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32.\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
+                                                            ShrinkSize = 12;\r
                                                           }\r
-                                                          NObj.ShrinkBinSize (ShrinkSize);\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                                         << \r
-                                                          CRT_END_OP (E); \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
@@ -2424,88 +2905,174 @@ vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
   <<\r
      UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
-     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
      BOOLEAN IsSetType = FALSE;\r
      BOOLEAN IsDisplaySpecified = FALSE;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
   >>\r
-  numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
+  numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] )*\r
                                                        <<\r
                                                           //check data type flag\r
-                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                            if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-                                                              if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
-                                                                _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                          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 {\r
-                                                              // update data type for name/value store\r
-                                                              UINT32 DataTypeSize;\r
+                                                            } else if (IsSetType){\r
                                                               _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
-                                                              gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
-                                                              _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                             }\r
-                                                          } else if (IsSetType){\r
-                                                            _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\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_DISPLAY_BIT;\r
+                                                            LFlags |= (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+                                                            _PCATCH(NObj.SetFlagsForBitField (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
                                                           }\r
-                                                          _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
                                                        >>\r
   ;\r
 \r
-numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\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"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
-  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
-  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
-  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
-  | "DISPLAY_INT_DEC"                                  << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
-  | "DISPLAY_UINT_DEC"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
-  | "DISPLAY_UINT_HEX"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\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
+  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
-                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
-                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+                                                            if (_GET_CURRQEST_VARTINFO().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
-                                                            _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                           }\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
-                                                          switch (_GET_CURRQEST_DATATYPE()) {\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
-                                                            // Base on the type to know the actual used size,shrink the buffer \r
-                                                            // size allocate before.\r
+                                                            // Question stored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32.\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
+                                                            ShrinkSize = 12;\r
                                                           }\r
-                                                          OObj.ShrinkBinSize (ShrinkSize);\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                                           <<\r
-                                                          CRT_END_OP (E); \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
@@ -2514,30 +3081,35 @@ vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
   <<\r
      UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
-     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
      BOOLEAN IsSetType = FALSE;\r
      BOOLEAN IsDisplaySpecified = FALSE;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
   >>\r
-  numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
+  numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] )*\r
                                                        <<\r
                                                           //check data type flag\r
-                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                            if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-                                                              if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
-                                                                _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                          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 {\r
-                                                              // update data type for Name/Value store\r
-                                                              UINT32 DataTypeSize;\r
+                                                            } else if (IsSetType){\r
                                                               _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
-                                                              gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
-                                                              _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                             }\r
-                                                          } else if (IsSetType){\r
-                                                            _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
+                                                          } else if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            LFlags &= EDKII_IFR_DISPLAY_BIT;\r
+                                                            LFlags |= (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+                                                            _PCATCH(OObj.SetFlagsForBitField (HFlags, LFlags), LineNum);\r
                                                           }\r
-                                                          _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
                                                        >>\r
   ;\r
 \r
@@ -2553,7 +3125,7 @@ vfrStatementString :
      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
@@ -2581,7 +3153,7 @@ vfrStatementString :
                                                           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
@@ -2860,9 +3432,7 @@ vfrStatementDisableIfStat :
 vfrStatementInconsistentIfStat :\r
   << CIfrInconsistentIf IIObj; >>\r
   L:InconsistentIf                                     <<\r
-                                                          if (!mCompatibleMode) {\r
-                                                            _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
-                                                          }\r
+                                                          _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
                                                           IIObj.SetLineNo(L->getLine());\r
                                                        >>\r
   Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
@@ -2911,40 +3481,6 @@ vfrStatementGrayOutIfStatNew :
   E: EndIf ";"                                       << CRT_END_OP (E); >>\r
   ;\r
 \r
-vfrStatementSuppressIfStatOld :\r
-  <<\r
-    CIfrSuppressIf SIObj;\r
-    BOOLEAN        GrayOutExist = FALSE;\r
-  >>\r
-  L:SuppressIf                                       << SIObj.SetLineNo(L->getLine()); >>\r
-  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
-  vfrStatementExpression[0]\r
-  ";"\r
-  {\r
-    vfrStatementsuppressIfGrayOutIf\r
-                                                     << GrayOutExist = TRUE; >>\r
-  }\r
-  ( vfrStatementStatListOld )*\r
-  E: EndIf ";"                                       << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
-  ;\r
-\r
-vfrStatementGrayOutIfStatOld :\r
-  <<\r
-    CIfrGrayOutIf  GOIObj;\r
-    BOOLEAN        SuppressExist = FALSE;\r
-  >>\r
-  L:GrayOutIf                                          << GOIObj.SetLineNo(L->getLine()); >>\r
-  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
-  vfrStatementExpression[0]\r
-  ";"\r
-  {\r
-    vfrStatementgrayoutIfSuppressIf\r
-                                                       << SuppressExist = TRUE; >>\r
-  }\r
-  ( vfrStatementStatListOld )*\r
-  E: EndIf ";"                                         << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
-  ;\r
-\r
 vfrImageTag :\r
   << CIfrImage IObj; >>\r
   L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)"        << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
@@ -2990,7 +3526,7 @@ vfrStatementInconsistentIf :
   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
@@ -2999,7 +3535,7 @@ vfrStatementNoSubmitIf :
   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
@@ -3008,7 +3544,7 @@ vfrStatementWarningIf :
   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
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementDisableIfQuest :\r
@@ -3018,7 +3554,7 @@ vfrStatementDisableIfQuest :
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
   vfrStatementExpression[0] ";"\r
   vfrStatementQuestionOptionList\r
-  E:EndIf                                              << CRT_END_OP (E); >>\r
+  E:EndIf {";"}                                        << CRT_END_OP (E); >>\r
   ;\r
 \r
 vfrStatementRefresh :\r
@@ -3048,7 +3584,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
@@ -3057,7 +3593,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
@@ -3091,22 +3627,26 @@ vfrStatementOneOfOption :
                                                        << \r
                                                           if (gCurrentMinMaxData != NULL) {\r
                                                             //set min/max value for oneof opcode\r
-                                                            UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\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
+                                                            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
-                                                              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
+                                                            } 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
@@ -3140,7 +3680,14 @@ vfrStatementOneOfOption :
                                                                break;\r
                                                             }\r
                                                           } else {\r
-                                                            ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\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
@@ -3151,9 +3698,13 @@ vfrStatementOneOfOption :
                                                           OOOObj->SetLineNo(L->getLine());\r
                                                           OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
                                                           if (ArrayType) {\r
-                                                            OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
+                                                            OOOObj->SetType (EFI_IFR_TYPE_BUFFER);\r
                                                           } else {\r
-                                                            OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \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
@@ -3174,11 +3725,11 @@ vfrStatementOneOfOption :
                                                           }\r
 \r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
-                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            _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(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                              _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_STANDARD,\r
                                                                          _GET_CURRQEST_VARTINFO(),\r
                                                                         VarStoreName,\r
@@ -3189,7 +3740,7 @@ vfrStatementOneOfOption :
                                                             }\r
                                                             if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
-                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                              _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
                                                                          _GET_CURRQEST_VARTINFO(),\r
                                                                         VarStoreName,\r
@@ -3202,9 +3753,7 @@ vfrStatementOneOfOption :
                                                        >>\r
   {\r
     "," Key "=" KN:Number                              <<\r
-                                                         if (!mCompatibleMode) {\r
-                                                           _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
-                                                         }\r
+                                                         _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
                                                          //\r
                                                          // Guid Option Key\r
                                                          //\r
@@ -3238,44 +3787,29 @@ oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
   | "OPTION_DEFAULT_MFG"                               << $LFlags |= 0x20; >>\r
   | InteractiveFlag                                    << $HFlags |= 0x04; >>\r
   | ResetRequiredFlag                                  << $HFlags |= 0x10; >>\r
+  | RestStyleFlag                                      << $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
+  | A:NVAccessFlag                                     <<\r
+                                                          gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            A->getLine(),\r
+                                                            A->getText()\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
+  | L:LateCheckFlag                                    <<\r
+                                                          gCVfrErrorHandle.HandleWarning (\r
+                                                            VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+                                                            L->getLine(),\r
+                                                            L->getText()\r
+                                                            );\r
                                                        >>\r
   ;\r
 \r
 vfrStatementLabel :\r
   L:Label\r
   N:Number                                             <<\r
-                                                          if (mCompatibleMode) {\r
-                                                            //\r
-                                                            // Add end Label for Framework Vfr\r
-                                                            //\r
-                                                            CIfrLabel LObj1;\r
-                                                            LObj1.SetLineNo(L->getLine());\r
-                                                            LObj1.SetNumber (0xffff);  //add end label for UEFI, label number hardcode 0xffff\r
-                                                          }\r
-\r
                                                           {\r
                                                             CIfrLabel LObj2;\r
                                                             LObj2.SetLineNo(L->getLine());\r
@@ -3312,9 +3846,7 @@ vfrStatementBanner :
 //\r
 vfrStatementInvalidHidden :\r
   L:Hidden               <<\r
-                            if (!mCompatibleMode) {\r
-                              _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
-                            }\r
+                            _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
                          >>\r
   Value "=" Number ","\r
   Key "=" Number ";"\r
@@ -3331,9 +3863,7 @@ vfrStatementInvalidInconsistentIf :
 \r
 vfrStatementInvalidInventory :\r
   L:Inventory                                      <<\r
-                                                      if (!mCompatibleMode) {\r
-                                                        _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
-                                                      }\r
+                                                      _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
                                                    >>\r
   Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
   Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
@@ -3346,15 +3876,11 @@ vfrStatementInvalidInventory :
 vfrStatementInvalidSaveRestoreDefaults :\r
   (\r
    L:Save                                          <<\r
-                                                      if (!mCompatibleMode) {\r
-                                                        _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
-                                                      }\r
+                                                      _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
                                                    >>\r
   |\r
    K:Restore                                       <<\r
-                                                      if (!mCompatibleMode) {\r
-                                                        _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
-                                                      }\r
+                                                      _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
                                                    >>\r
   )\r
   Defaults ","\r
@@ -3401,6 +3927,7 @@ 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
@@ -3411,7 +3938,15 @@ vfrStatementInvalidSaveRestoreDefaults :
 // Root expression extension function called by other function.\r
 //\r
 vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\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
+                                                       <<\r
+                                                          if ($RootLevel == 0) {\r
+                                                            mCIfrOpHdrIndex ++;\r
+                                                            if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!");\r
+                                                            }\r
+                                                            _INIT_OPHDR_COND ();\r
+                                                          }\r
+                                                       >>\r
   andTerm[$RootLevel, $ExpOpCount]\r
   (\r
     L:OR andTerm[$RootLevel, $ExpOpCount]              << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
@@ -3430,6 +3965,7 @@ vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
                                                           }\r
                                                           \r
                                                           if ($RootLevel == 0) {\r
+                                                            _CLEAR_SAVED_OPHDR ();\r
                                                             mCIfrOpHdrIndex --;\r
                                                           }\r
                                                        >>\r
@@ -3437,7 +3973,7 @@ vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
 \r
 //\r
 // Add new sub function for the sub expression extension to remember the ExpOpCount\r
-// This funciton is only called by sub expression.\r
+// This function is only called by sub expression.\r
 //\r
 vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
   andTerm[$RootLevel, $ExpOpCount]\r
@@ -3569,6 +4105,7 @@ 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
@@ -3599,6 +4136,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
@@ -3634,17 +4185,15 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
      EFI_VARSTORE_ID       VarStoreId   = EFI_VARSTORE_ID_INVALID;\r
   >>\r
   L:VarEqVal                                          <<\r
-                                                        if (!mCompatibleMode) {\r
                                                           _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
-                                                        }\r
                                                       >>\r
   VK:Var\r
   OpenParen\r
   VN:Number                                           <<\r
                                                           VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\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(), VN->getLine()),\r
@@ -3699,6 +4248,12 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
     )\r
   )\r
+  <<\r
+     if (VarIdStr != NULL) {\r
+       delete[] VarIdStr;\r
+       VarIdStr = NULL;\r
+     }\r
+  >>\r
   ;\r
 \r
 ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -3752,6 +4307,12 @@ ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
     )\r
   )\r
+  <<\r
+     if (VarIdStr != NULL) {\r
+       delete[] VarIdStr;\r
+       VarIdStr = NULL;\r
+     }\r
+  >>\r
   ;\r
 \r
 ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -3804,6 +4365,16 @@ ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
     )\r
   )\r
+  <<\r
+     if (VarIdStr[0] != NULL) {\r
+       delete[] VarIdStr[0];\r
+       VarIdStr[0] = NULL;\r
+     }\r
+     if (VarIdStr[1] != NULL) {\r
+       delete[] VarIdStr[1];\r
+       VarIdStr[1] = NULL;\r
+     }\r
+  >>\r
   ;\r
 \r
 ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -3843,6 +4414,10 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                             }\r
                                                             $ExpOpCount++;\r
                                                           }\r
+                                                          if (VarIdStr != NULL) {\r
+                                                            delete[] VarIdStr;\r
+                                                            VarIdStr = NULL;\r
+                                                          }\r
                                                         >>\r
   ;\r
 \r
@@ -3961,7 +4536,7 @@ getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                                 break;\r
                                                               }\r
                                                             } else {\r
-                                                              if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\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
@@ -3977,7 +4552,7 @@ getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                             CIfrGet GObj(L->getLine()); \r
                                                             _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
                                                             GObj.SetVarInfo (&Info); \r
-                                                            delete VarIdStr; \r
+                                                            delete[] VarIdStr;\r
                                                             $ExpOpCount++;\r
                                                           }\r
                                                        >>\r
@@ -4136,7 +4711,7 @@ setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                                 break;\r
                                                               }\r
                                                             } else {\r
-                                                              if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\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
@@ -4151,7 +4726,7 @@ setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                             }\r
                                                             CIfrSet TSObj(L->getLine()); \r
                                                             TSObj.SetVarInfo (&Info); \r
-                                                            delete VarIdStr; \r
+                                                            delete[] VarIdStr;\r
                                                             $ExpOpCount++;\r
                                                           }\r
                                                        >>\r
@@ -4265,8 +4840,6 @@ private:
   UINT8               mParserStatus;\r
   BOOLEAN             mConstantOnlyInExpression;\r
 \r
-  CVfrDefaultStore    mCVfrDefaultStore;\r
-  CVfrDataStorage     mCVfrDataStorage;\r
   CVfrQuestionDB      mCVfrQuestionDB;\r
   CVfrRulesDB         mCVfrRulesDB;\r
 \r
@@ -4275,6 +4848,7 @@ private:
   UINT8               mCIfrOpHdrIndex;\r
   VOID                _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
   VOID                _CLEAR_SAVED_OPHDR (VOID);\r
+  VOID                _INIT_OPHDR_COND (VOID);\r
   BOOLEAN             _SET_SAVED_OPHDR_SCOPE (VOID);\r
 \r
 \r
@@ -4288,10 +4862,6 @@ private:
   UINT16              mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
   UINT16              mUsedDefaultCount;\r
 \r
-//\r
-// For framework vfr compatibility\r
-//\r
-  BOOLEAN             mCompatibleMode;\r
   EFI_GUID            mFormsetGuid;\r
 \r
   VOID                _CRT_OP (IN BOOLEAN);\r
@@ -4331,7 +4901,6 @@ public:
 \r
   VOID                _DeclareDefaultLinearVarStore (IN UINT32);\r
   VOID                _DeclareStandardDefaultStorage (IN UINT32);\r
-  VOID                _DeclareDefaultFrameworkVarStore (IN UINT32);\r
 \r
   VOID                AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
 \r
@@ -4340,10 +4909,6 @@ public:
   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
-  VOID                SetCompatibleMode (IN BOOLEAN);\r
 >>\r
 }\r
 \r
@@ -4365,7 +4930,7 @@ EfiVfrParser::_SAVE_OPHDR_COND (
 }\r
 \r
 VOID\r
-EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
+EfiVfrParser::_INIT_OPHDR_COND (\r
   VOID\r
   )\r
 {\r
@@ -4373,6 +4938,17 @@ EfiVfrParser::_CLEAR_SAVED_OPHDR (
   mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
 }\r
 \r
+VOID\r
+EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
+  VOID\r
+  )\r
+{\r
+  if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+    delete mCIfrOpHdr[mCIfrOpHdrIndex];\r
+    mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
+  }\r
+}\r
+\r
 BOOLEAN\r
 EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
   VOID\r
@@ -4587,7 +5163,7 @@ EfiVfrParser::_STOU8 (
     }\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
+      mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
     }\r
   }\r
 \r
@@ -4624,7 +5200,7 @@ EfiVfrParser::_STOU16 (
     }\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
+      mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
     }\r
   }\r
 \r
@@ -4661,7 +5237,7 @@ EfiVfrParser::_STOU32 (
     }\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
+      mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
     }\r
   }\r
 \r
@@ -4697,7 +5273,7 @@ EfiVfrParser::_STOU64 (
     }\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
+      mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
     }\r
   }\r
 \r
@@ -4786,7 +5362,7 @@ EfiVfrParser::_STRCAT (
   NewStr[0] = '\0';\r
   if (*Dest != NULL) {\r
     strcpy (NewStr, *Dest);\r
-    delete *Dest;\r
+    delete[] *Dest;\r
   }\r
   strcat (NewStr, Src);\r
 \r
@@ -4813,84 +5389,6 @@ EfiVfrParser::_STOR (
   return Ref;\r
 }\r
 \r
-//\r
-// framework vfr to default declare varstore for each structure\r
-//\r
-VOID\r
-EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
-  IN UINT32 LineNo\r
-  )\r
-{\r
-  SVfrVarStorageNode    *pNode;\r
-  UINT32                TypeSize;\r
-  BOOLEAN               FirstNode;\r
-  CONST CHAR8           VarName[] = "Setup";\r
-\r
-  FirstNode = TRUE;\r
-  pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
-  if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
-    //\r
-    // Create the default Buffer Var Store when no VarStore is defined.\r
-    // its name should be "Setup"\r
-    //\r
-    gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
-    CIfrVarStore      VSObj;\r
-    VSObj.SetLineNo (LineNo);\r
-    VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
-    VSObj.SetSize ((UINT16) TypeSize);\r
-    //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\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
-#endif\r
-  } else {\r
-    for (; pNode != NULL; pNode = pNode->mNext) {\r
-      //\r
-      // create the default varstore opcode for not declared varstore\r
-      // the first varstore name should be "Setup"\r
-      //\r
-      if (!pNode->mAssignedFlag) {\r
-        CIfrVarStore      VSObj;\r
-        VSObj.SetLineNo (LineNo);\r
-        VSObj.SetVarStoreId (pNode->mVarStoreId);\r
-        VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
-        if (FirstNode) {\r
-          VSObj.SetName ((CHAR8 *) VarName);\r
-          FirstNode = FALSE;\r
-        } else {\r
-          VSObj.SetName (pNode->mVarStoreName);\r
-        }\r
-        VSObj.SetGuid (&pNode->mGuid);\r
-#ifdef VFREXP_DEBUG\r
-        printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
-#endif\r
-      }\r
-    }\r
-  }\r
-\r
-  pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
-  for (; pNode != NULL; pNode = pNode->mNext) {\r
-    //\r
-    // create the default efi varstore opcode for not exist varstore\r
-    //\r
-    if (!pNode->mAssignedFlag) {\r
-      CIfrVarStoreEfi VSEObj;\r
-      VSEObj.SetLineNo (LineNo);\r
-      VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
-      VSEObj.SetGuid (&pNode->mGuid);\r
-      VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
-      // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
-      // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
-      VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
-#ifdef VFREXP_DEBUG\r
-      printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
-#endif\r
-    }\r
-  }\r
-\r
-}\r
-\r
 VOID\r
 EfiVfrParser::_DeclareDefaultLinearVarStore (\r
   IN UINT32 LineNo\r
@@ -4912,14 +5410,15 @@ 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, &mFormsetGuid);\r
+    gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4937,14 +5436,15 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
                        (CHAR8 *) DateName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
                        (CHAR8 *) DateType,\r
-                       EFI_VARSTORE_ID_INVALID\r
+                       EFI_VARSTORE_ID_INVALID,\r
+                       FALSE\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
+    gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4958,14 +5458,15 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
                        (CHAR8 *) TimeName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
                        (CHAR8 *) TimeType,\r
-                       EFI_VARSTORE_ID_INVALID\r
+                       EFI_VARSTORE_ID_INVALID,\r
+                       FALSE\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
+    gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4984,7 +5485,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObj;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "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
@@ -4994,7 +5495,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObjMF;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "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
@@ -5187,16 +5688,6 @@ EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)
   mOverrideClassGuid = OverrideClassGuid;\r
 }\r
 \r
-//\r
-// For framework vfr compatibility\r
-//\r
-VOID\r
-EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
-{\r
-  mCompatibleMode = Mode;\r
-  mCVfrQuestionDB.SetCompatibleMode (Mode);\r
-}\r
-\r
 VOID\r
 EfiVfrParser::CheckDuplicateDefaultValue (\r
   IN EFI_DEFAULT_ID      DefaultId,\r