]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools: Extend the Macro used in the FDF !include statement
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 8e9f32b81598047386ecca16a348d6c39cc6f7fa..4b42d3ca8c4ba6f88c49417619b81957df8f252f 100644 (file)
@@ -1,7 +1,7 @@
 /*++ @file\r
 Vfr Syntax\r
 \r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, 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
@@ -23,6 +23,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
@@ -191,6 +194,7 @@ VfrParserStart (
 #token InteractiveFlag("INTERACTIVE")           "INTERACTIVE"\r
 #token NVAccessFlag("NV_ACCESS")                "NV_ACCESS"\r
 #token ResetRequiredFlag("RESET_REQUIRED")      "RESET_REQUIRED"\r
+#token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED"\r
 #token LateCheckFlag("LATE_CHECK")              "LATE_CHECK"\r
 #token ReadOnlyFlag("READ_ONLY")                "READ_ONLY"\r
 #token OptionOnlyFlag("OPTIONS_ONLY")           "OPTIONS_ONLY"\r
@@ -592,7 +596,7 @@ vfrFormSetDefinition :
                                                       if (gCFormPkg.HavePendingUnassigned()) {\r
                                                         mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
                                                                     gCVfrVarDataTypeDB,\r
-                                                                    mCVfrDataStorage,\r
+                                                                    gCVfrDataStorage,\r
                                                                     mCVfrQuestionDB,\r
                                                                     &mFormsetGuid,\r
                                                                     E->getLine(),\r
@@ -610,7 +614,8 @@ vfrFormSetDefinition :
                                                       if (gNeedAdjustOpcode) {\r
                                                         gCFormPkg.AdjustDynamicInsertOpcode (\r
                                                           mLastFormEndAddr,\r
-                                                          InsertOpcodeAddr\r
+                                                          InsertOpcodeAddr,\r
+                                                          FALSE\r
                                                         );\r
                                                       }\r
 \r
@@ -830,14 +835,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(), 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
@@ -889,7 +894,7 @@ vfrStatementVarStoreLinear :
                                                        } else {\r
                                                          StoreName = SN->getText();\r
                                                        }\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                                   StoreName,\r
                                                                                   &Guid,\r
                                                                                   &gCVfrVarDataTypeDB,\r
@@ -897,7 +902,7 @@ vfrStatementVarStoreLinear :
                                                                                   VarStoreId\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
@@ -981,24 +986,24 @@ vfrStatementVarStoreEfi :
 \r
   Uuid "=" guidDefinition[Guid]                     << \r
                                                        if (IsUEFI23EfiVarstore) {\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                                   StoreName,\r
                                                                                   &Guid,\r
                                                                                   &gCVfrVarDataTypeDB,\r
                                                                                   TypeName,\r
                                                                                   VarStoreId\r
                                                                                   ), LineNum);                                                        \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\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
+                                                         _PCATCH(gCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
                                                        }\r
                                                        VSEObj.SetGuid (&Guid);                                                       \r
@@ -1039,16 +1044,16 @@ 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
@@ -1186,6 +1191,7 @@ questionheaderFlagsField[UINT8 & Flags] :
     ReadOnlyFlag                                    << $Flags |= 0x01; >>\r
   | InteractiveFlag                                 << $Flags |= 0x04; >>\r
   | ResetRequiredFlag                               << $Flags |= 0x10; >>\r
+  | ReconnectRequiredFlag                           << $Flags |= 0x40; >>\r
   | O:OptionOnlyFlag                                << \r
                                                        if (mCompatibleMode) {\r
                                                          $Flags |= 0x80;\r
@@ -1239,9 +1245,9 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                        _STRCAT(&VarIdStr, "]");\r
                                                     >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                          gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
                                                                              &mFormsetGuid,\r
                                                                              &gCVfrVarDataTypeDB,\r
@@ -1249,11 +1255,11 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\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,9 +1269,9 @@ 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
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                          gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
                                                                              &mFormsetGuid,\r
                                                                              &gCVfrVarDataTypeDB,\r
@@ -1273,13 +1279,13 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN2);\r
-                                                         VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
+                                                         VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
+                                                           _PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
                                                            _STRCAT(&VarStr, TName);\r
                                                          }\r
                                                        }\r
@@ -1314,11 +1320,11 @@ 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
+                                                         VarGuid = gCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
                                                          _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
                                                                     SName,\r
                                                                     VarGuid,\r
@@ -1334,6 +1340,7 @@ 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
@@ -1393,23 +1400,95 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
   )\r
   ;\r
 \r
-vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
-  <<\r
-    EFI_GUID Guid;\r
+vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
+  <<  \r
+    EFI_GUID    Guid;\r
+    BOOLEAN     Negative = FALSE;\r
+    BOOLEAN     IntDecStyle = FALSE;\r
+    CIfrNumeric *NumericQst = NULL;\r
+    if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+      NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+      IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;\r
+    }\r
+    UINT8    *Type8  = (UINT8  *) &Value;\r
+    UINT16   *Type16 = (UINT16 *) &Value;\r
+    UINT32   *Type32 = (UINT32 *) &Value;\r
+    UINT64   *Type64 = (UINT64 *) &Value;\r
+    UINT16   Index = 0;\r
+    ListType = FALSE;\r
   >>\r
+    {\r
+      "\-"                                          << Negative = TRUE;  >>\r
+    }\r
     N1:Number                                       <<\r
                                                        switch ($Type) {\r
                                                        case EFI_IFR_TYPE_NUM_SIZE_8 :\r
-                                                         $Value.u8     = _STOU8(N1->getText(), N1->getLine());\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
+                                                         $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
@@ -1434,6 +1513,49 @@ vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
   | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
                                                     << $Value.ref    = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
   | "STRING_TOKEN" "\(" S1:Number "\)"              << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
+  | "\{"                                            << ListType = TRUE; >>\r
+      L1:Number                                     << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      (\r
+        "," \r
+        L2:Number                                   << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      )*\r
+    "\}"                                           \r
   ;\r
 \r
 //*****************************************************************************\r
@@ -1527,7 +1649,8 @@ vfrStatementRules :
 vfrStatementDefault :\r
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
-     EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
+     UINT64                ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE    *Val           = (EFI_IFR_TYPE_VALUE *) ValueList;\r
      CIfrDefault           *DObj         = NULL;\r
      CIfrDefault2          *DObj2        = NULL;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
@@ -1535,36 +1658,112 @@ vfrStatementDefault :
      EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
      UINT32                Size          = 0;\r
      EFI_GUID              *VarGuid      = NULL;\r
+     BOOLEAN               ArrayType     = FALSE;\r
+     UINT8                 *Type8        = (UINT8  *) ValueList;\r
+     UINT16                *Type16       = (UINT16 *) ValueList;\r
+     UINT32                *Type32       = (UINT32 *) ValueList;\r
+     UINT64                *Type64       = (UINT64 *) ValueList;\r
+     CIfrNumeric           *NumericQst   = NULL;\r
+\r
   >>\r
   D:Default                                         \r
   (\r
     (\r
-      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  \r
+      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","  \r
                                                     << \r
                                                         if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
                                                           //check default value is valid for Numeric Opcode\r
-                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                          NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+                                                          if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                              if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+                                                                  ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\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())) || \r
+                                                                  ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\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())) || \r
+                                                                  ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\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())) || \r
+                                                                  ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\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
+                                                            if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                            }\r
                                                           }\r
                                                         }\r
                                                         if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
                                                           _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
                                                           Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                        } else if (ArrayType) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                              while (Type8[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                              while (Type16[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT16);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                              while (Type32[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT32);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                              while (Type64[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT64);\r
+                                                              break;\r
+\r
+                                                            default:\r
+                                                              break;\r
+                                                          }\r
                                                         } else {\r
                                                           _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
                                                         }\r
                                                         Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
                                                         DObj = new CIfrDefault ((UINT8)Size);\r
                                                         DObj->SetLineNo(D->getLine());\r
-                                                        DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                        DObj->SetValue(Val);\r
+                                                        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
+                                                        }\r
+                                                        DObj->SetValue(*Val);\r
                                                     >>\r
       |                                             << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
         vfrStatementValue ","                       << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
     )\r
     {\r
       DefaultStore "=" SN:StringIdentifier ","      << \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
@@ -1577,19 +1776,19 @@ 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
                                                                    VarGuid,\r
                                                                    _GET_CURRQEST_DATATYPE (),\r
-                                                                     Val),\r
-                                                                     D->getLine()\r
-                                                                     );\r
+                                                                   *Val),\r
+                                                                   D->getLine()\r
+                                                                   );\r
                                                          }\r
                                                        }\r
                                                        if (DObj  != NULL) {delete DObj;} \r
@@ -1652,6 +1851,7 @@ flagsField :
   | ManufacturingFlag \r
   | DefaultFlag \r
   | ResetRequiredFlag \r
+  | ReconnectRequiredFlag\r
   | N:NVAccessFlag                                     << \r
                                                           if (!mCompatibleMode) {\r
                                                             gCVfrErrorHandle.HandleWarning (\r
@@ -1933,7 +2133,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
@@ -1976,7 +2176,7 @@ vfrStatementCheckBox :
                                                             _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
+                                                            } 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
@@ -1986,13 +2186,13 @@ vfrStatementCheckBox :
     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
                                                               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
@@ -2008,7 +2208,7 @@ vfrStatementCheckBox :
                                                             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
@@ -2222,41 +2422,205 @@ 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 ((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
+  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
                                                           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
+                                                          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
                                                        >>\r
-  Maximum   "=" A:Number ","\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
+\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
+                                                            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 (MaxU4 < MinU4) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\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 (MaxU2 < MinU2) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\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 (MaxU1 < MinU1) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\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
@@ -2341,7 +2705,7 @@ vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
                                                        <<\r
                                                           //check data type flag\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            VarStoreType = gCVfrDataStorage.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
@@ -2431,7 +2795,7 @@ vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
                                                        <<\r
                                                           //check data type flag\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            VarStoreType = gCVfrDataStorage.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
@@ -2462,7 +2826,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
@@ -2490,7 +2854,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
@@ -2565,7 +2929,7 @@ vfrStatementOrderedList :
      CIfrOrderedList OLObj;\r
      UINT32 VarArraySize;\r
   >>\r
-  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
+  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
   vfrQuestionHeader[OLObj] ","\r
                                                        << \r
                                                           VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
@@ -2583,7 +2947,7 @@ vfrStatementOrderedList :
   }\r
   { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
   vfrStatementQuestionOptionList\r
-  E:EndList                                            << CRT_END_OP (E); >>\r
+  E:EndList                                            << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
   ";"\r
   ;\r
 \r
@@ -2899,7 +3263,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
@@ -2908,7 +3272,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
@@ -2917,7 +3281,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
@@ -2927,7 +3291,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
@@ -2957,7 +3321,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
@@ -2966,7 +3330,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
@@ -2975,83 +3339,136 @@ vfrStatementOptions :
 \r
 vfrStatementOneOfOption :\r
   <<\r
-     EFI_IFR_TYPE_VALUE Val           = gZeroEfiIfrTypeValue;\r
+     UINT8              ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE *Val          = (EFI_IFR_TYPE_VALUE *) ValueList;\r
      CHAR8              *VarStoreName = NULL;\r
      UINT32             Size          = 0;\r
      BOOLEAN            TypeError     = FALSE;\r
      EFI_VFR_RETURN_CODE ReturnCode   = VFR_RETURN_SUCCESS;\r
      EFI_GUID           *VarStoreGuid = NULL;\r
-     \r
-     if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
-       TypeError = TRUE;\r
-       Size = sizeof (EFI_IFR_TYPE_VALUE);\r
-     } else {\r
-       ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
-     }\r
-\r
-     Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
-     CIfrOneOfOption    OOOObj ((UINT8)Size);\r
+     BOOLEAN            ArrayType     = FALSE;\r
+     CIfrOneOfOption    *OOOObj;\r
+     UINT8              *Type8        = (UINT8  *) ValueList;\r
+     UINT16             *Type16       = (UINT16 *) ValueList;\r
+     UINT32             *Type32       = (UINT32 *) ValueList;\r
+     UINT64             *Type64       = (UINT64 *) ValueList;\r
   >>\r
   L:Option                                             <<      \r
-                                                          OOOObj.SetLineNo(L->getLine());\r
-                                                          if (TypeError) {\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
                                                             _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
                                                           }\r
-                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
-                                                            _PCATCH (ReturnCode, L->getLine());\r
-                                                          }\r
+\r
                                                        >>\r
-  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \r
+  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      \r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
                                                        << \r
                                                           if (gCurrentMinMaxData != NULL) {\r
                                                             //set min/max value for oneof opcode\r
                                                             UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
                                                             switch (_GET_CURRQEST_DATATYPE()) {\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\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
+                                                              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
+                                                              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
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
                                                               break;\r
                                                             default:\r
                                                               break;\r
                                                             }\r
                                                           }\r
-                                                          OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                          OOOObj.SetValue (Val); \r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                          } else if (ArrayType) {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                                 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                               while (Type8[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                               while (Type16[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT16);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                               while (Type32[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT32);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                               while (Type64[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT64);\r
+                                                               break;\r
+                                                             default:\r
+                                                               break;\r
+                                                            }\r
+                                                          } else {\r
+                                                            ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+                                                          }\r
+                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+                                                            _PCATCH (ReturnCode, L->getLine());\r
+                                                          }\r
+\r
+                                                          Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+                                                          OOOObj = new CIfrOneOfOption((UINT8)Size);\r
+                                                          OOOObj->SetLineNo(L->getLine());\r
+                                                          OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
+                                                          if (ArrayType) {\r
+                                                            OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
+                                                          } else {\r
+                                                            OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                          }\r
+                                                          OOOObj->SetValue (*Val); \r
                                                        >>\r
-  F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+  F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
                                                        <<\r
+                                                          //\r
+                                                          // Array type only for default type OneOfOption.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
+                                                          }\r
+\r
+                                                          //\r
+                                                          // Clear the default flag if the option not use array value but has default flag.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
+                                                            OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
+                                                          }\r
+\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
-                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                            if (OOOObj.GetFlags () & 0x10) {\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
                                                                         VarStoreGuid,\r
                                                                         _GET_CURRQEST_DATATYPE (),\r
-                                                                        Val\r
+                                                                        *Val\r
                                                                         ), L->getLine());\r
                                                             }\r
-                                                            if (OOOObj.GetFlags () & 0x20) {\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
                                                                         VarStoreGuid,\r
                                                                         _GET_CURRQEST_DATATYPE (),\r
-                                                                        Val\r
+                                                                        *Val\r
                                                                         ), L->getLine());\r
                                                             }\r
                                                           }\r
@@ -3066,16 +3483,16 @@ vfrStatementOneOfOption :
                                                          //\r
                                                          CIfrOptionKey IfrOptionKey (\r
                                                                          gCurrentQuestion->QUESTION_ID(),\r
-                                                                         Val,\r
+                                                                         *Val,\r
                                                                          _STOQID(KN->getText(), KN->getLine())\r
                                                                          );\r
                                                          SET_LINE_INFO (IfrOptionKey, KN);\r
                                                        >>\r
   }\r
   (\r
-    T:"," vfrImageTag                                  << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
+    T:"," vfrImageTag                                  << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
   )*\r
-  ";"\r
+  ";"                                                  << if (OOOObj != NULL) {delete OOOObj;} >>\r
   ;\r
 \r
 vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
@@ -3094,6 +3511,7 @@ oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
   | "OPTION_DEFAULT_MFG"                               << $LFlags |= 0x20; >>\r
   | InteractiveFlag                                    << $HFlags |= 0x04; >>\r
   | ResetRequiredFlag                                  << $HFlags |= 0x10; >>\r
+  | ReconnectRequiredFlag                              << $HFlags |= 0x40; >>\r
   | ManufacturingFlag                                  << $LFlags |= 0x20; >>\r
   | DefaultFlag                                        << $LFlags |= 0x10; >>\r
   | A:NVAccessFlag                                     << \r
@@ -3257,6 +3675,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
@@ -3425,6 +3844,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
@@ -3455,6 +3875,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
@@ -3498,9 +3932,9 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   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
@@ -3817,7 +4251,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
@@ -3992,7 +4426,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
@@ -4121,8 +4555,6 @@ private:
   UINT8               mParserStatus;\r
   BOOLEAN             mConstantOnlyInExpression;\r
 \r
-  CVfrDefaultStore    mCVfrDefaultStore;\r
-  CVfrDataStorage     mCVfrDataStorage;\r
   CVfrQuestionDB      mCVfrQuestionDB;\r
   CVfrRulesDB         mCVfrRulesDB;\r
 \r
@@ -4683,7 +5115,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
   CONST CHAR8           VarName[] = "Setup";\r
 \r
   FirstNode = TRUE;\r
-  pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
+  pNode = gCVfrDataStorage.GetBufferVarStoreList();\r
   if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
     //\r
     // Create the default Buffer Var Store when no VarStore is defined.\r
@@ -4725,7 +5157,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
     }\r
   }\r
 \r
-  pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
+  pNode = gCVfrDataStorage.GetEfiVarStoreList();\r
   for (; pNode != NULL; pNode = pNode->mNext) {\r
     //\r
     // create the default efi varstore opcode for not exist varstore\r
@@ -4768,14 +5200,14 @@ 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
                        );\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
@@ -4793,14 +5225,14 @@ 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
                        );\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
@@ -4814,14 +5246,14 @@ 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
                        );\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
@@ -4840,7 +5272,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 *) "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
@@ -4850,7 +5282,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 *) "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