]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Fixed memory leak and buffer overrun for string op-code.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 2aee307781ea47ea1bc232fe4ee932678f4bc2ff..02a7b5c1f4382752f44efb6b64afcd56e0fbcfb8 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
-Copyright (c) 2004 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -131,6 +131,9 @@ VfrParserStart (
 #token EndList("endlist")                       "endlist"\r
 #token EndForm("endform")                       "endform"\r
 #token Form("form")                             "form"\r
+#token FormMap("formmap")                       "formmap"\r
+#token MapTitle("maptitle")                     "maptitle"\r
+#token MapGuid("mapguid")                       "mapguid"\r
 #token Subtitle("subtitle")                     "subtitle"\r
 #token Help("help")                             "help"\r
 #token Text("text")                             "text"\r
@@ -214,6 +217,8 @@ VfrParserStart (
 #token Rule("rule")                             "rule"\r
 #token EndRule("endrule")                       "endrule"\r
 #token Value("value")                           "value"\r
+#token Read("read")                             "read"\r
+#token Write("write")                           "write"\r
 #token ResetButton("resetbutton")               "resetbutton"\r
 #token EndResetButton("endresetbutton")         "endresetbutton"\r
 #token DefaultStore("defaultstore")             "defaultstore"\r
@@ -228,6 +233,11 @@ VfrParserStart (
 #token Refresh("refresh")                       "refresh"\r
 #token Interval("interval")                     "interval"\r
 #token VarstoreDevice("varstoredevice")         "varstoredevice"\r
+#token GuidOp("guidop")                         "guidop"\r
+#token EndGuidOp("endguidop")                   "endguidop"\r
+#token DataType("datatype")                     "datatype"\r
+#token Data("data")                             "data"\r
+\r
 //\r
 // Define the class and subclass tokens\r
 //\r
@@ -250,7 +260,8 @@ VfrParserStart (
 \r
 vfrProgram > [UINT8 Return] :\r
   <<\r
-     mParserStatus = 0;\r
+     mParserStatus   = 0;\r
+     mCIfrOpHdrIndex = 0;\r
      mConstantOnlyInExpression = FALSE;\r
   >>\r
   (\r
@@ -335,82 +346,84 @@ vfrDataStructFields :
 \r
 dataStructField64 :\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT64"\r
+  D:"UINT64"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructField32 :\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT32"\r
+  D:"UINT32"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructField16 :\r
-  << UINT32 ArrayNum = 0; >>\r
+  << \r
+    UINT32 ArrayNum = 0; \r
+  >>\r
   ("UINT16" | "CHAR16")\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT16", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
   ;\r
 \r
 dataStructField8 :\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT8"\r
+  D:"UINT8"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT8", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructFieldBool :\r
   << UINT32 ArrayNum = 0; >>\r
-  "BOOLEAN"\r
+  D:"BOOLEAN"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "BOOLEAN", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructFieldString :\r
   << UINT32 ArrayNum = 0; >>\r
-  "EFI_STRING_ID"\r
+  D:"EFI_STRING_ID"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_STRING_ID", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructFieldDate :\r
   << UINT32 ArrayNum = 0; >>\r
-  "EFI_HII_DATE"\r
+  D:"EFI_HII_DATE"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_DATE", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructFieldTime :\r
   << UINT32 ArrayNum = 0; >>\r
-  "EFI_HII_TIME"\r
+  D:"EFI_HII_TIME"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_TIME", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructFieldUser :\r
@@ -486,24 +499,26 @@ vfrFormSetDefinition :
                                                     <<\r
                                                       switch (ClassGuidNum) {\r
                                                       case 0:\r
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\r
+                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\r
                                                         FSObj->SetClassGuid(&DefaultClassGuid);\r
                                                         break;\r
                                                       case 1:\r
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\r
+                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
                                                         FSObj->SetClassGuid(&ClassGuid1);\r
                                                         break;\r
                                                       case 2:\r
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\r
+                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
                                                         FSObj->SetClassGuid(&ClassGuid1);\r
                                                         FSObj->SetClassGuid(&ClassGuid2);\r
                                                         break;\r
-                                                      default:\r
-                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + 2 * sizeof(EFI_GUID));\r
+                                                      case 3:\r
+                                                        FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
                                                         FSObj->SetClassGuid(&ClassGuid1);\r
                                                         FSObj->SetClassGuid(&ClassGuid2);\r
                                                         FSObj->SetClassGuid(&ClassGuid3);\r
                                                         break;\r
+                                                      default:\r
+                                                        break;\r
                                                       }\r
 \r
                                                       SET_LINE_INFO (*FSObj, L);\r
@@ -542,15 +557,202 @@ vfrFormSetDefinition :
 vfrFormSetList :\r
   (\r
     vfrFormDefinition             |\r
+    vfrFormMapDefinition          |\r
     vfrStatementImage             |\r
     vfrStatementVarStoreLinear    |\r
     vfrStatementVarStoreEfi       |\r
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
-    vfrStatementDisableIfFormSet\r
+    vfrStatementDisableIfFormSet  |\r
+    vfrStatementSuppressIfFormSet |\r
+    vfrStatementExtension\r
   )*\r
   ;\r
 \r
+vfrStatementExtension:\r
+  << \r
+     EFI_GUID Guid;\r
+     CIfrGuid *GuidObj = NULL;\r
+     CHAR8    *TypeName = NULL;\r
+     UINT32   TypeSize = 0;\r
+     UINT8    *DataBuff = NULL;\r
+     UINT32   Size = 0;\r
+     UINT8    Idx = 0;\r
+     UINT32   LineNum;\r
+     BOOLEAN  IsStruct = FALSE;\r
+     UINT32   ArrayNum = 0;\r
+  >>\r
+  L:GuidOp\r
+  Uuid "=" guidDefinition[Guid]\r
+  {"," DataType "=" \r
+    (\r
+        U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText());>>}\r
+                                                      << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+      | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText());>>}\r
+                                                      << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+      | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText());>>}\r
+                                                      << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+      | U8:"UINT8"   {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText());>>}\r
+                                                      << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+      | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText());>>}\r
+                                                      << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
+      | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText());>>}\r
+                                                      << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
+      | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText());>>}\r
+                                                      << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
+      | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText());>>}\r
+                                                      << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
+      | TN:StringIdentifier {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText());>>}\r
+                                                      << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>\r
+    )\r
+                                                      <<\r
+                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);\r
+                                                        if (ArrayNum > 0) {\r
+                                                          Size = TypeSize*ArrayNum;\r
+                                                        } else {\r
+                                                          Size = TypeSize;\r
+                                                        }\r
+                                                        if (Size > (128 - sizeof (EFI_IFR_GUID))) return;\r
+                                                        DataBuff = (UINT8 *)malloc(Size);\r
+                                                        for (Idx = 0; Idx < Size; Idx++) {\r
+                                                          DataBuff[Idx] = 0;\r
+                                                        }\r
+                                                      >>\r
+    vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]\r
+  }\r
+                                                      <<\r
+                                                        {\r
+                                                         GuidObj = new CIfrGuid(Size);\r
+                                                         if (GuidObj != NULL) {\r
+                                                           GuidObj->SetLineNo(L->getLine());\r
+                                                           GuidObj->SetGuid (&Guid);\r
+                                                         }\r
+                                                        }\r
+                                                        if (TypeName != NULL) {\r
+                                                          GuidObj->SetData(DataBuff, Size);\r
+                                                        }\r
+                                                      >>\r
+  {","\r
+    (\r
+      vfrStatementExtension\r
+    )*\r
+  E:EndGuidOp                                         << GuidObj->SetScope(1); CRT_END_OP (E); >>\r
+  }\r
+                                                      <<\r
+                                                         if (GuidObj != NULL) delete GuidObj;\r
+                                                         if (DataBuff != NULL) free(DataBuff);\r
+                                                      >>\r
+  ";"\r
+;\r
+\r
+vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:\r
+  <<\r
+     CHAR8    *TFName = NULL;\r
+     UINT32   ArrayIdx = 0;\r
+     UINT16   FieldOffset;\r
+     UINT8    FieldType;\r
+     UINT32   FieldSize;\r
+     UINT64   Data_U64 = 0;\r
+     UINT32   Data_U32 = 0;\r
+     UINT16   Data_U16 = 0;\r
+     UINT8    Data_U8 = 0;\r
+     BOOLEAN  Data_BL = 0;\r
+     EFI_STRING_ID Data_SID = 0;\r
+     BOOLEAN  IsArray = FALSE;\r
+     UINT8    *ByteOffset = NULL;\r
+  >>\r
+(\r
+  ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
+          <<\r
+            ArrayIdx = 0;\r
+            if (IsArray == TRUE) {\r
+              ArrayIdx = _STOU8(IDX1->getText());\r
+              if (ArrayIdx >= ArrayNum) return;\r
+              IsArray = FALSE;\r
+            }\r
+            ByteOffset = DataBuff + (ArrayIdx * TypeSize);\r
+            if (IsStruct == TRUE) {\r
+              _STRCAT(&TFName, TypeName);\r
+            }\r
+          >>\r
+    ("." FN:StringIdentifier\r
+          <<\r
+            if (IsStruct == TRUE) {\r
+              _STRCAT(&TFName, ".");\r
+              _STRCAT(&TFName, FN->getText());\r
+            }\r
+          >>\r
+        {\r
+          OpenBracket IDX2:Number CloseBracket\r
+            <<\r
+              if (IsStruct == TRUE) {\r
+                _STRCAT(&TFName, "[");\r
+                _STRCAT(&TFName, IDX2->getText());\r
+                _STRCAT(&TFName, "]");\r
+              }\r
+            >>\r
+        }\r
+    )*\r
+    "=" RD:Number\r
+          <<\r
+            if (IsStruct == FALSE) {\r
+              if (strcmp ("UINT64", TypeName) == 0) {\r
+                Data_U64 = _STOU64(RD->getText());\r
+                memcpy (ByteOffset, &Data_U64, TypeSize);\r
+              }else if (strcmp ("UINT32", TypeName) == 0) {\r
+                Data_U32 = _STOU32(RD->getText());\r
+                memcpy (ByteOffset, &Data_U32, TypeSize);                                                    \r
+              }else if (strcmp ("UINT16", TypeName) == 0) {\r
+                Data_U16 = _STOU16(RD->getText());\r
+                memcpy (ByteOffset, &Data_U16, TypeSize);                                                    \r
+              }else if (strcmp ("UINT8", TypeName) == 0) {\r
+                Data_U8 = _STOU8(RD->getText());\r
+                memcpy (ByteOffset, &Data_U8, TypeSize);                                                    \r
+              }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
+                Data_BL = _STOU8(RD->getText());\r
+                memcpy (ByteOffset, &Data_BL, TypeSize);                                                    \r
+              }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
+                Data_SID = _STOSID(RD->getText());\r
+                memcpy (ByteOffset, &Data_SID, TypeSize);                                                    \r
+              }\r
+            } else {\r
+              gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
+              switch (FieldType) {\r
+              case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                 Data_U8 = _STOU8(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                 Data_U16 = _STOU16(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                 Data_U32 = _STOU32(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                 Data_U64 = _STOU64(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_BOOLEAN:\r
+                 Data_BL = _STOU8(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_STRING:\r
+                 Data_SID = _STOSID(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);\r
+                 break;\r
+              default:\r
+                 break;\r
+              }\r
+            }\r
+            if (TFName != NULL) { delete TFName; TFName = NULL; }\r
+          >>\r
+  )*\r
+)\r
+;\r
+\r
+\r
 vfrStatementDefaultStore :\r
   << UINT16  DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
   D:DefaultStore N:StringIdentifier ","\r
@@ -585,12 +787,13 @@ vfrStatementVarStoreLinear :
   V:Varstore                                        << VSObj.SetLineNo(V->getLine()); >>\r
   (\r
       TN:StringIdentifier ","                       << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
-    | U8:"UINT8" ","                                << TypeName = "UINT8"; LineNum = U8->getLine(); >>\r
-    | U16:"UINT16" ","                              << TypeName = "UINT16"; LineNum = U16->getLine(); >>\r
-    | U32:"UINT32" ","                              << TypeName = "UINT32"; LineNum = U32->getLine(); >>\r
-    | U64:"UINT64" ","                              << TypeName = "UINT64"; LineNum = U64->getLine(); >>\r
-    | D:"EFI_HII_DATE" ","                          << TypeName = "EFI_HII_DATE"; LineNum = D->getLine(); >>\r
-    | T:"EFI_HII_TIME" ","                          << TypeName = "EFI_HII_TIME"; LineNum = T->getLine(); >>\r
+    | U8:"UINT8" ","                                << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+    | U16:"UINT16" ","                              << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+    | C16:"CHAR16" ","                              << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
+    | U32:"UINT32" ","                              << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+    | U64:"UINT64" ","                              << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+    | D:"EFI_HII_DATE" ","                          << TypeName = D->getText(); LineNum = D->getLine(); >>\r
+    | T:"EFI_HII_TIME" ","                          << TypeName = T->getText(); LineNum = T->getLine(); >>\r
   )\r
   { Key "=" FID:Number ","                          << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
                                                        if (mCompatibleMode) {\r
@@ -623,14 +826,12 @@ vfrStatementVarStoreLinear :
                                                                                   TypeName,\r
                                                                                   VarStoreId\r
                                                                                   ), LineNum);\r
-                                                    >>\r
-                                                    <<\r
                                                        VSObj.SetGuid (&Guid);\r
                                                        _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
                                                        VSObj.SetVarStoreId (VarStoreId);\r
                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
-                                                       VSObj.SetSize (Size);\r
-                                                       VSObj.SetName (StoreName);\r
+                                                       VSObj.SetSize ((UINT16) Size);\r
+                                                       VSObj.SetName (SN->getText());\r
                                                     >>\r
   ";"\r
   ;\r
@@ -722,6 +923,21 @@ vfrStatementDisableIfFormSet :
   ";"\r
   ;\r
 \r
+vfrStatementSuppressIfFormSet :\r
+  << CIfrSuppressIf SIObj;>>\r
+  L:SuppressIf                                         <<\r
+                                                           if (mCompatibleMode) {\r
+                                                             _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
+                                                           }\r
+                                                           SIObj.SetLineNo(L->getLine()); \r
+                                                       >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0] ";"\r
+  vfrFormSetList\r
+  E: EndIf \r
+  ";"                                                  << CRT_END_OP (E); >>\r
+  ;\r
+\r
 //*****************************************************************************\r
 //\r
 // the syntax of question header and statement header\r
@@ -757,11 +973,11 @@ vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_
                                                          mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
                                                          break;\r
                                                        case QUESTION_DATE:\r
-                                                       mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
-                                                       break;\r
+                                                         mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
+                                                         break;\r
                                                        case QUESTION_TIME:\r
-                                                       mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
-                                                       break;\r
+                                                         mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
+                                                         break;\r
                                                        default:\r
                                                        _PCATCH(VFR_RETURN_FATAL_ERROR);\r
                                                        }\r
@@ -806,7 +1022,7 @@ questionheaderFlagsField[UINT8 & Flags] :
   | LateCheckFlag\r
   ;\r
 \r
-vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :\r
+vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :\r
   <<\r
      UINT32                Idx;\r
      UINT32                LineNo;\r
@@ -839,9 +1055,11 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
                                                                              );\r
                                                           VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
                                                        }\r
-                                                       _PCATCH(VfrReturnCode, SN1);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
-                                                       _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+                                                       if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+                                                         _PCATCH(VfrReturnCode, SN1);\r
+                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
+                                                         _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+                                                       }\r
                                                     >>\r
   )\r
   |\r
@@ -860,17 +1078,21 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
                                                                              );\r
                                                           VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
                                                        }\r
-                                                       _PCATCH(VfrReturnCode, SN2);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
-                                                       if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                         _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
-                                                         _STRCAT(&VarStr, TName);\r
+                                                       if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+                                                         _PCATCH(VfrReturnCode, SN2);\r
+                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
+                                                         if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
+                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
+                                                           _STRCAT(&VarStr, TName);\r
+                                                         }\r
                                                        }\r
                                                     >>\r
 \r
     (\r
       "."                                           <<\r
-                                                       _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+                                                       if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+                                                         _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+                                                       }\r
                                                        _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
                                                     >>\r
       SF:StringIdentifier                           << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
@@ -1028,7 +1250,8 @@ vfrFormDefinition :
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
     // Just for framework vfr compatibility\r
-    vfrStatementInvalid\r
+    vfrStatementInvalid                      |\r
+    vfrStatementExtension\r
   )*\r
   E:EndForm                                         <<\r
                                                       if (mCompatibleMode) {\r
@@ -1065,6 +1288,34 @@ vfrFormDefinition :
   ";"\r
   ;\r
 \r
+vfrFormMapDefinition :\r
+  << \r
+    CIfrFormMap *FMapObj = NULL;\r
+    UINT32      FormMapMethodNumber = 0;\r
+    EFI_GUID    Guid;\r
+  >>\r
+  F:FormMap                                         << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>\r
+  FormId "=" S1:Number ","                          << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText())), S1); >>\r
+  (\r
+    MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"\r
+    MapGuid  "=" guidDefinition[Guid] ";"           << FMapObj->SetFormMapMethod (_STOFID(S2->getText()), &Guid); FormMapMethodNumber ++; >>\r
+  )*                                                << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>\r
+  (\r
+    vfrStatementImage                        |\r
+    vfrStatementLocked                       |\r
+    vfrStatementRules                        |\r
+    vfrStatementDefault                      |\r
+    vfrStatementStat                         |\r
+    vfrStatementQuestions                    |\r
+    vfrStatementConditional                  |\r
+    vfrStatementLabel                        |\r
+    vfrStatementBanner                       |\r
+    vfrStatementExtension\r
+  )*\r
+  E:EndForm                                         << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
 vfrStatementRules :\r
   << CIfrRule RObj; >>\r
   R:Rule                                            << RObj.SetLineNo(R->getLine()); >>\r
@@ -1080,7 +1331,7 @@ vfrStatementRules :
 vfrStatementDefault :\r
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
-     EFI_IFR_TYPE_VALUE    Val = gZeroEfiIfrTypeValue;\r
+     EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
      CIfrDefault           DObj;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
      CHAR8                 *VarStoreName = NULL;\r
@@ -1089,9 +1340,17 @@ vfrStatementDefault :
   D:Default                                         << DObj.SetLineNo(D->getLine()); >>\r
   (\r
     (\r
-        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); >>\r
-      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","\r
-                                                    << DObj.SetType (_GET_CURRQEST_DATATYPE()); DObj.SetValue(Val); >>\r
+        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
+      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  << \r
+                                                        if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+                                                          //check default value is valid for Numeric Opcode\r
+                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                          }\r
+                                                        }\r
+                                                        DObj.SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                        DObj.SetValue(Val);\r
+                                                    >>\r
     )\r
     {\r
       DefaultStore "=" SN:StringIdentifier ","      << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r
@@ -1169,7 +1428,19 @@ flagsField :
 vfrStatementValue :\r
   << CIfrValue VObj; >>\r
   V:Value                                              << VObj.SetLineNo(V->getLine()); >>\r
-  "=" vfrStatementExpression[0]\r
+  "=" vfrStatementExpression[0]                        << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
+  ;\r
+\r
+vfrStatementRead :\r
+  << CIfrRead RObj; >>\r
+  R:Read                                               << RObj.SetLineNo(R->getLine()); >>\r
+  vfrStatementExpression[0] ";" \r
+  ;\r
+\r
+vfrStatementWrite :\r
+  << CIfrWrite WObj; >>\r
+  W:Write                                              << WObj.SetLineNo(W->getLine()); >>\r
+  vfrStatementExpression[0] ";" \r
   ;\r
 \r
 vfrStatementSubTitle :\r
@@ -1246,8 +1517,8 @@ vfrStatementCrossReference :
 vfrStatementGoto :\r
   <<\r
      UINT8               RefType = 1;\r
-     EFI_STRING_ID       DevPath;\r
-     EFI_GUID            FSId;\r
+     EFI_STRING_ID       DevPath = EFI_STRING_ID_INVALID;\r
+     EFI_GUID            FSId = {0,};\r
      EFI_FORM_ID         FId;\r
      EFI_QUESTION_ID     QId    = EFI_QUESTION_ID_INVALID;\r
      UINT32              BitMask;\r
@@ -1590,15 +1861,30 @@ vfrStatementDate :
   ;\r
 \r
 minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
-  Minimum   "=" Number ","\r
-  Maximum   "=" Number ","\r
+  Minimum   "=" MinN:Number ","\r
+  Maximum   "=" MaxN:Number ","\r
   { "step"    "=" Number "," }\r
   {\r
     "default" "=" N:Number ","                         <<\r
                                                           switch (KeyValue) {\r
-                                                          case 0: D.Year  = _STOU16(N->getText()); break;\r
-                                                          case 1: D.Month = _STOU8(N->getText()); break;\r
-                                                          case 2: D.Day   = _STOU8(N->getText()); break;\r
+                                                          case 0: \r
+                                                            D.Year  = _STOU16(N->getText());\r
+                                                            if (D.Year < _STOU16 (MinN->getText()) || D.Year > _STOU16 (MaxN->getText())) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 1: \r
+                                                            D.Month = _STOU8(N->getText()); \r
+                                                            if (D.Month < 1 || D.Month > 12) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 2: \r
+                                                            D.Day = _STOU8(N->getText()); \r
+                                                            if (D.Day < 1 || D.Day > 31) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
   }\r
@@ -1634,7 +1920,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
   >>\r
   Minimum   "=" I:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;\r
@@ -1643,17 +1929,37 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                        >>\r
   Maximum   "=" A:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : MaxU8 = _STOU64(A->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MaxU4 = _STOU32(A->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MaxU2 = _STOU16(A->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MaxU1 = _STOU8(A->getText());  break;\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : \r
+                                                            MaxU8 = _STOU64(A->getText()); \r
+                                                            if (MaxU8 < MinU8) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : \r
+                                                            MaxU4 = _STOU32(A->getText()); \r
+                                                            if (MaxU4 < MinU4) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : \r
+                                                            MaxU2 = _STOU16(A->getText()); \r
+                                                            if (MaxU2 < MinU2) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  \r
+                                                            MaxU1 = _STOU8(A->getText());  \r
+                                                            if (MaxU1 < MinU1) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
   {\r
     STEP    "=" S:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;\r
@@ -1662,7 +1968,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                        >>\r
   }\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
@@ -1696,18 +2002,38 @@ vfrStatementNumeric :
 \r
 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
   >>\r
   numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
-                                                       << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+                                                       <<\r
+                                                          //check data type flag\r
+                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                            }\r
+                                                          } else {\r
+                                                            // update data type for name/value store\r
+                                                            UINT32 DataTypeSize;\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
+                                                          }\r
+                                                          _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum);\r
+                                                       >>\r
   ;\r
 \r
 numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
     N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
-  | "DISPLAY_INT_DEC"                                  << $LFlags |= 0x00; >>\r
-  | "DISPLAY_UINT_DEC"                                 << $LFlags |= 0x10; >>\r
-  | "DISPLAY_UINT_HEX"                                 << $LFlags |= 0x20; >>\r
+  | "NUMERIC_SIZE_1"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; >>\r
+  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; >>\r
+  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; >>\r
+  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; >>\r
+  | "DISPLAY_INT_DEC"                                  << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; >>\r
+  | "DISPLAY_UINT_DEC"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; >>\r
+  | "DISPLAY_UINT_HEX"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
@@ -1735,11 +2061,27 @@ vfrStatementOneOf :
 \r
 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
   >>\r
   numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
-                                                       << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+                                                       <<\r
+                                                          //check data type flag\r
+                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                            }\r
+                                                          } else {\r
+                                                            // update data type for Name/Value store\r
+                                                            UINT32 DataTypeSize;\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
+                                                          }\r
+                                                          _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
+                                                       >>\r
   ;\r
 \r
 vfrStatementStringType :\r
@@ -1750,6 +2092,9 @@ vfrStatementStringType :
 vfrStatementString :\r
   <<\r
      CIfrString SObj;\r
+     UINT32 VarArraySize;\r
+     UINT8 StringMinSize;\r
+     UINT8 StringMaxSize;\r
   >>\r
   L:String                                             << SObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[SObj] ","\r
@@ -1757,8 +2102,27 @@ vfrStatementString :
   {\r
     Key "=" KN:Number ","                              << AssignQuestionKey (SObj, KN); >>\r
   }\r
-  MinSize "=" MIN:Number ","                           << SObj.SetMinSize (_STOU8(MIN->getText())); >>\r
-  MaxSize "=" MAX:Number ","                           << SObj.SetMaxSize (_STOU8(MAX->getText())); >>\r
+  MinSize "=" MIN:Number ","                           << \r
+                                                          VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+                                                          StringMinSize = _STOU8(MIN->getText());\r
+                                                          if (_STOU64(MIN->getText()) > StringMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
+                                                          } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
+                                                          }\r
+                                                          SObj.SetMinSize (StringMinSize);\r
+                                                       >>\r
+  MaxSize "=" MAX:Number ","                           << \r
+                                                          StringMaxSize = _STOU8(MAX->getText());\r
+                                                          if (_STOU64(MAX->getText()) > StringMaxSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
+                                                          } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
+                                                          } else if (StringMaxSize < StringMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
+                                                          }\r
+                                                          SObj.SetMaxSize (StringMaxSize);\r
+                                                       >>\r
   vfrStatementQuestionOptionList\r
   E:EndString                                          << CRT_END_OP (E); >>\r
   ";"\r
@@ -1782,6 +2146,9 @@ stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
 vfrStatementPassword :\r
   <<\r
      CIfrPassword PObj;\r
+     UINT32 VarArraySize;\r
+     UINT16 PasswordMinSize;\r
+     UINT16 PasswordMaxSize;\r
   >>\r
   L:Password                                           << PObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[PObj] ","\r
@@ -1789,8 +2156,27 @@ vfrStatementPassword :
   {\r
     Key "=" KN:Number ","                              << AssignQuestionKey (PObj, KN); >>\r
   }\r
-  MinSize "=" MIN:Number ","                           << PObj.SetMinSize (_STOU16(MIN->getText())); >>\r
-  MaxSize "=" MAX:Number ","                           << PObj.SetMaxSize (_STOU16(MAX->getText())); >>\r
+  MinSize "=" MIN:Number ","                           << \r
+                                                          VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+                                                          PasswordMinSize = _STOU16(MIN->getText());\r
+                                                          if (_STOU64(MIN->getText()) > PasswordMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
+                                                          } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
+                                                          }\r
+                                                          PObj.SetMinSize (PasswordMinSize);\r
+                                                       >>\r
+  MaxSize "=" MAX:Number ","                           << \r
+                                                          PasswordMaxSize = _STOU16(MAX->getText());\r
+                                                          if (_STOU64(MAX->getText()) > PasswordMaxSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
+                                                          } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
+                                                          } else if (PasswordMaxSize < PasswordMinSize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
+                                                          }\r
+                                                          PObj.SetMaxSize (PasswordMaxSize);\r
+                                                       >>\r
   { Encoding "=" Number "," }\r
   vfrStatementQuestionOptionList\r
   E:EndPassword                                        << CRT_END_OP (E); >>\r
@@ -1811,12 +2197,23 @@ passwordFlagsField [UINT8 & HFlags] :
 vfrStatementOrderedList :\r
   <<\r
      CIfrOrderedList OLObj;\r
+     UINT32 VarArraySize;\r
   >>\r
   L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OLObj] ","\r
-                                                       << OLObj.SetMaxContainers ((UINT8)_GET_CURRQEST_VARSIZE()); >>\r
+                                                       << \r
+                                                          VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+                                                          OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
+                                                       >>\r
   {\r
-    MaxContainers "=" M:Number ","                     << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r
+    MaxContainers "=" M:Number ","                     << \r
+                                                          if (_STOU64(M->getText()) > _STOU8(M->getText())) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
+                                                          } else if (VarArraySize != 0 && _STOU8(M->getText()) > VarArraySize) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
+                                                          }\r
+                                                          OLObj.SetMaxContainers (_STOU8(M->getText()));\r
+                                                       >>\r
   }\r
   { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r
   vfrStatementQuestionOptionList\r
@@ -1852,7 +2249,7 @@ vfrStatementTime :
     (\r
       vfrQuestionHeader[TObj, QUESTION_TIME] ","\r
     { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
-      vfrStatementDefault\r
+      vfrStatementQuestionOptionList\r
     )\r
     |\r
     (\r
@@ -1896,9 +2293,24 @@ minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :
   {\r
     "default" "=" N:Number ","                         <<\r
                                                           switch (KeyValue) {\r
-                                                          case 0: T.Hour   = _STOU8(N->getText()); break;\r
-                                                          case 1: T.Minute = _STOU8(N->getText()); break;\r
-                                                          case 2: T.Second = _STOU8(N->getText()); break;\r
+                                                          case 0: \r
+                                                            T.Hour   = _STOU8(N->getText()); \r
+                                                            if (T.Hour > 23) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 1: \r
+                                                            T.Minute = _STOU8(N->getText()); \r
+                                                            if (T.Minute > 59) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 2: \r
+                                                            T.Second = _STOU8(N->getText());\r
+                                                            if (T.Second > 59) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
   }\r
@@ -1926,7 +2338,8 @@ vfrStatementQuestionTag :
   vfrStatementNoSubmitIf        |\r
   vfrStatementDisableIfQuest    |\r
   vfrStatementRefresh           |\r
-  vfrStatementVarstoreDevice\r
+  vfrStatementVarstoreDevice    |\r
+  vfrStatementExtension\r
   ;\r
 \r
 vfrStatementQuestionTagList :\r
@@ -1938,6 +2351,8 @@ vfrStatementQuestionOptionTag :
   vfrStatementGrayOutIfQuest    |\r
   vfrStatementValue             |\r
   vfrStatementDefault           |\r
+  vfrStatementRead              |\r
+  vfrStatementWrite             |\r
   vfrStatementOptions\r
   ;\r
 \r
@@ -1953,6 +2368,7 @@ vfrStatementStatList :
   vfrStatementQuestions                   |\r
   vfrStatementConditionalNew              |\r
   vfrStatementLabel                       |\r
+  vfrStatementExtension                   |\r
   // Just for framework vfr compatibility\r
   vfrStatementInvalid\r
   ;\r
@@ -1968,10 +2384,9 @@ vfrStatementStatListOld :
 vfrStatementDisableIfStat :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
-  vfrStatementExpression[0] ";"                        << mConstantOnlyInExpression = FALSE; >>\r
+  vfrStatementExpression[0] ";" \r
   ( vfrStatementStatList )*\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ";"\r
@@ -2115,10 +2530,9 @@ vfrStatementNoSubmitIf :
 vfrStatementDisableIfQuest :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
-  vfrStatementExpression[0] ";"                        << mConstantOnlyInExpression = FALSE; >>\r
+  vfrStatementExpression[0] ";"\r
   vfrStatementQuestionOptionList\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ;\r
@@ -2165,7 +2579,31 @@ vfrStatementOneOfOption :
   >>\r
   L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
   Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \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
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
+                                                              break;\r
+                                                            default:\r
+                                                              break;\r
+                                                            }\r
+                                                          }\r
+                                                          OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                          OOOObj.SetValue (Val); \r
+                                                       >>\r
   F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
                                                        <<\r
                                                           _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
@@ -2348,6 +2786,8 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token RuleRef("ruleref")                       "ruleref"\r
 #token StringRef("stringref")                   "stringref"\r
 #token PushThis("pushthis")                     "pushthis"\r
+#token Security("security")                     "security"\r
+#token Get("get")                               "get"\r
 #token True("TRUE")                             "TRUE"\r
 #token False("FALSE")                           "FALSE"\r
 #token One("ONE")                               "ONE"\r
@@ -2359,6 +2799,7 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token AND("AND")                               "AND"\r
 #token OR("OR")                                 "OR"\r
 #token NOT("NOT")                               "NOT"\r
+#token Set("set")                               "set"\r
 #token BitWiseNot("~")                          "\~"\r
 #token BoolVal("boolval")                       "boolval"\r
 #token StringVal("stringval")                   "stringval"\r
@@ -2369,12 +2810,13 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token Catenate("catenate")                     "catenate"\r
 #token QuestionRefVal("questionrefval")         "questionrefval"\r
 #token StringRefVal("stringrefval")             "stringrefval"\r
+#token Map("map")                               "map"\r
 \r
 //\r
 // Root expression extension function called by other function.\r
 //\r
 vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
-  << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>\r
+  << if ($RootLevel == 0) {mCIfrOpHdrIndex ++; if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!"); _CLEAR_SAVED_OPHDR ();} >>\r
   andTerm[$RootLevel, $ExpOpCount]\r
   (\r
     L:OR andTerm[$RootLevel, $ExpOpCount]              << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
@@ -2386,11 +2828,15 @@ vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
                                                           if ($ExpOpCount > 1 && $RootLevel == 0) {\r
                                                             if (_SET_SAVED_OPHDR_SCOPE()) {\r
                                                               CIfrEnd EObj;\r
-                                                              if (mCIfrOpHdrLineNo != 0) {\r
-                                                                EObj.SetLineNo (mCIfrOpHdrLineNo);\r
+                                                              if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
+                                                                EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
                                                               }\r
                                                             }\r
                                                           }\r
+                                                          \r
+                                                          if ($RootLevel == 0) {\r
+                                                            mCIfrOpHdrIndex --;\r
+                                                          }\r
                                                        >>\r
   ;\r
 \r
@@ -2533,6 +2979,7 @@ atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
   | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
   | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
   | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
   | (\r
       L:NOT\r
       atomTerm[$RootLevel, $ExpOpCount]                 << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
@@ -2573,6 +3020,8 @@ vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | rulerefExp[$RootLevel, $ExpOpCount]\r
   | stringref1Exp[$RootLevel, $ExpOpCount]\r
   | pushthisExp[$RootLevel, $ExpOpCount]\r
+  | securityExp[$RootLevel, $ExpOpCount]\r
+  | getExp[$RootLevel, $ExpOpCount]\r
   ;\r
 \r
 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -2805,8 +3254,8 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
 questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
   <<\r
      UINT8           Type = 0x1;\r
-     EFI_STRING_ID   DevPath;\r
-     EFI_GUID        Guid;\r
+     EFI_STRING_ID   DevPath = EFI_STRING_ID_INVALID;\r
+     EFI_GUID        Guid = {0,};\r
      EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
      UINT32          BitMask;\r
      CHAR8           *QName = NULL;\r
@@ -2858,14 +3307,111 @@ rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
 //   stringref (STR_FORM_SET_TITLE)\r
 //\r
 stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+    EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
+  >>\r
   L:StringRef\r
-  "\(" S:Number "\)"                                   << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (_STOSID(S->getText())); $ExpOpCount++; } >>\r
+  "\("\r
+      ( \r
+        "STRING_TOKEN"\r
+        "\(" \r
+          S:Number << RefStringId = _STOSID(S->getText()); >>\r
+        "\)"\r
+        | I:Number << RefStringId = _STOSID(I->getText()); >>\r
+      )\r
+  "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
   ;\r
 \r
 pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
   L:PushThis                                           << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
+securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_GUID Guid;\r
+  >>\r
+  L:Security\r
+  "\(" guidDefinition[Guid] "\)"                       << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
+  ;\r
+\r
+numericVarStoreType [UINT8 & VarType] :\r
+    "NUMERIC_SIZE_1"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
+  | "NUMERIC_SIZE_2"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
+  | "NUMERIC_SIZE_4"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
+  | "NUMERIC_SIZE_8"                                   << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
+  ;\r
+\r
+getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_VARSTORE_INFO Info;\r
+     CHAR8             *VarIdStr = NULL;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;\r
+     UINT32            Mask = 0;\r
+     EFI_QUESION_TYPE  QType = QUESTION_NORMAL;\r
+     UINT8             VarType = EFI_IFR_TYPE_UNDEFINED;\r
+     UINT32            VarSize = 0;\r
+     Info.mVarStoreId = 0;\r
+  >>\r
+  L:Get\r
+  "\(" \r
+      vfrStorageVarId[Info, VarIdStr, FALSE]\r
+      {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
+  "\)"                                                 << \r
+                                                          {\r
+                                                            if (Info.mVarStoreId == 0) {\r
+                                                              // support Date/Time question\r
+                                                              mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
+                                                              if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                              }\r
+                                                              if (QType == QUESTION_DATE) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_DATE;\r
+                                                              } else if (QType == QUESTION_TIME) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_TIME;\r
+                                                              }\r
+                                                              switch (Mask) {\r
+                                                              case DATE_YEAR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case DATE_DAY_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 3;\r
+                                                                break;\r
+                                                              case TIME_HOUR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case TIME_MINUTE_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 1;\r
+                                                                break;\r
+                                                              case TIME_SECOND_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 2;\r
+                                                                break;\r
+                                                              default:\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                                break;\r
+                                                              }\r
+                                                            } else {\r
+                                                              if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
+                                                              }\r
+                                                              if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
+                                                                Info.mVarType = VarType;\r
+                                                                _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                                Info.mVarTotalSize = VarSize;\r
+                                                              }\r
+                                                              _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                              if (VarSize != Info.mVarTotalSize) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
+                                                              }\r
+                                                            }\r
+                                                            CIfrGet GObj(L->getLine()); \r
+                                                            _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
+                                                            GObj.SetVarInfo (&Info); \r
+                                                            delete VarIdStr; \r
+                                                            $ExpOpCount++;\r
+                                                          }\r
+                                                       >>\r
+  ;\r
+\r
 vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
     L1:True                                            << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
   | L2:False                                           << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
@@ -2886,6 +3432,7 @@ vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | unintExp[$RootLevel, $ExpOpCount]\r
   | toupperExp[$RootLevel, $ExpOpCount]\r
   | tolwerExp[$RootLevel, $ExpOpCount]\r
+  | setExp[$RootLevel, $ExpOpCount]\r
   ;\r
 \r
 lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -2946,6 +3493,78 @@ tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
+setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_VARSTORE_INFO Info;\r
+     CHAR8             *VarIdStr = NULL;\r
+     EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;\r
+     UINT32            Mask = 0;\r
+     EFI_QUESION_TYPE  QType = QUESTION_NORMAL;\r
+     UINT8             VarType = EFI_IFR_TYPE_UNDEFINED;\r
+     UINT32            VarSize = 0;\r
+     Info.mVarStoreId = 0;\r
+  >>\r
+  L:Set\r
+  "\("\r
+     vfrStorageVarId[Info, VarIdStr, FALSE]\r
+     {"\|" FLAG "=" numericVarStoreType [VarType] }\r
+     "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
+  "\)"\r
+                                                       << \r
+                                                          {\r
+                                                            if (Info.mVarStoreId == 0) {\r
+                                                              // support Date/Time question\r
+                                                              mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
+                                                              if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                              }\r
+                                                              if (QType == QUESTION_DATE) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_DATE;\r
+                                                              } else if (QType == QUESTION_TIME) {\r
+                                                                Info.mVarType = EFI_IFR_TYPE_TIME;\r
+                                                              }\r
+                                                              switch (Mask) {\r
+                                                              case DATE_YEAR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case DATE_DAY_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 3;\r
+                                                                break;\r
+                                                              case TIME_HOUR_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 0;\r
+                                                                break;\r
+                                                              case TIME_MINUTE_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 1;\r
+                                                                break;\r
+                                                              case TIME_SECOND_BITMASK:\r
+                                                                Info.mInfo.mVarOffset = 2;\r
+                                                                break;\r
+                                                              default:\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+                                                                break;\r
+                                                              }\r
+                                                            } else {\r
+                                                              if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
+                                                              }\r
+                                                              if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
+                                                                Info.mVarType = VarType;\r
+                                                                _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                                Info.mVarTotalSize = VarSize;\r
+                                                              }\r
+                                                              _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+                                                              if (VarSize != Info.mVarTotalSize) {\r
+                                                                _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
+                                                              }\r
+                                                            }\r
+                                                            CIfrSet TSObj(L->getLine()); \r
+                                                            TSObj.SetVarInfo (&Info); \r
+                                                            delete VarIdStr; \r
+                                                            $ExpOpCount++;\r
+                                                          }\r
+                                                       >>\r
+  ;\r
+\r
 vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
     conditionalExp[$RootLevel, $ExpOpCount]\r
   | findExp[$RootLevel, $ExpOpCount]\r
@@ -3021,6 +3640,20 @@ spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   "\)"                                                 << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
   ;\r
 \r
+vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  L:Map                                                   \r
+  "\(" \r
+  vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]  \r
+  ":"                                                     << { CIfrMap MObj(L->getLine()); } >>\r
+  (\r
+    vfrStatementExpression[0]\r
+    ","\r
+    vfrStatementExpression[0]\r
+    ";"\r
+  ) *\r
+  E:"\)"                                                  << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
 spanFlags [UINT8 & Flags] :\r
     N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
   | "LAST_NON_MATCH"                                   << $Flags |= 0x00; >>\r
@@ -3045,8 +3678,9 @@ private:
   CVfrQuestionDB      mCVfrQuestionDB;\r
   CVfrRulesDB         mCVfrRulesDB;\r
 \r
-  CIfrOpHeader        *mCIfrOpHdr;\r
-  UINT32              mCIfrOpHdrLineNo;\r
+  CIfrOpHeader *      mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
+  UINT32              mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
+  UINT8               mCIfrOpHdrIndex;\r
   VOID                _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
   VOID                _CLEAR_SAVED_OPHDR (VOID);\r
   BOOLEAN             _SET_SAVED_OPHDR_SCOPE (VOID);\r
@@ -3067,13 +3701,14 @@ private:
 \r
   UINT8               _GET_CURRQEST_DATATYPE ();\r
   UINT32              _GET_CURRQEST_VARSIZE ();\r
+  UINT32              _GET_CURRQEST_ARRAY_SIZE();\r
 \r
 public:\r
-  VOID                _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CHAR8 *);\r
+  VOID                _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
   VOID                _PCATCH (IN EFI_VFR_RETURN_CODE);\r
   VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
   VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
-  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CHAR8 *);\r
+  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
 \r
   VOID                syn     (ANTLRAbstractToken  *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
 \r
@@ -3090,9 +3725,8 @@ public:
   EFI_FORM_ID         _STOFID (IN CHAR8 *);\r
   EFI_QUESTION_ID     _STOQID (IN CHAR8 *);\r
 \r
-  VOID                _STRCAT (IN OUT CHAR8 **, IN CHAR8 *);\r
+  VOID                _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
 \r
-  VOID                _CRGUID (EFI_GUID *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *);\r
   VOID                _DeclareDefaultLinearVarStore (IN UINT32);\r
   VOID                _DeclareStandardDefaultStorage (IN UINT32);\r
   VOID                _DeclareDefaultFrameworkVarStore (IN UINT32);\r
@@ -3119,11 +3753,11 @@ EfiVfrParser::_SAVE_OPHDR_COND (
   )\r
 {\r
   if (Cond == TRUE) {\r
-    if (mCIfrOpHdr != NULL) {\r
+    if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
       return ;\r
     }\r
-    mCIfrOpHdr       = new CIfrOpHeader(OpHdr);\r
-    mCIfrOpHdrLineNo = LineNo;\r
+    mCIfrOpHdr[mCIfrOpHdrIndex]       = new CIfrOpHeader(OpHdr);\r
+    mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
   }\r
 }\r
 \r
@@ -3132,8 +3766,8 @@ EfiVfrParser::_CLEAR_SAVED_OPHDR (
   VOID\r
   )\r
 {\r
-  mCIfrOpHdr       = NULL;\r
-  mCIfrOpHdrLineNo = 0;\r
+  mCIfrOpHdr[mCIfrOpHdrIndex]       = NULL;\r
+  mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
 }\r
 \r
 BOOLEAN\r
@@ -3141,10 +3775,11 @@ EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (
   VOID\r
   )\r
 {\r
-  if (mCIfrOpHdr != NULL) {\r
-    mCIfrOpHdr->SetScope (1);\r
+  if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+    mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
     return TRUE;\r
   }\r
+\r
   //\r
   // IfrOpHdr is not set, FALSE is return.\r
   //\r
@@ -3175,6 +3810,37 @@ EfiVfrParser::_GET_CURRQEST_VARTINFO (
   return mCurrQestVarInfo;\r
 }\r
 \r
+UINT32\r
+EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
+  VOID\r
+  )\r
+{\r
+  UINT8 Size = 1;\r
+\r
+  switch (mCurrQestVarInfo.mVarType) {\r
+  case EFI_IFR_TYPE_NUM_SIZE_8:\r
+    Size = 1;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_16:\r
+    Size = 2;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_32:\r
+    Size = 4;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_64:\r
+    Size = 8;\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+\r
+  return (mCurrQestVarInfo.mVarTotalSize / Size);\r
+}\r
+\r
 UINT8\r
 EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
   VOID\r
@@ -3196,7 +3862,7 @@ EfiVfrParser::_PCATCH (
   IN INTN                ReturnCode,\r
   IN INTN                ExpectCode,\r
   IN ANTLRTokenPtr       Tok,\r
-  IN CHAR8               *ErrorMsg\r
+  IN CONST CHAR8         *ErrorMsg\r
   )\r
 {\r
   if (ReturnCode != ExpectCode) {\r
@@ -3210,7 +3876,7 @@ EfiVfrParser::_PCATCH (
   IN EFI_VFR_RETURN_CODE ReturnCode\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode);\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
 }\r
 \r
 VOID\r
@@ -3219,7 +3885,7 @@ EfiVfrParser::_PCATCH (
   IN ANTLRTokenPtr       Tok\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
 }\r
 \r
 VOID\r
@@ -3228,17 +3894,17 @@ EfiVfrParser::_PCATCH (
   IN UINT32              LineNum\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
 }\r
 \r
 VOID\r
 EfiVfrParser::_PCATCH (\r
   IN EFI_VFR_RETURN_CODE ReturnCode,\r
   IN UINT32              LineNum,\r
-  IN CHAR8               *ErrorMsg\r
+  IN CONST CHAR8         *ErrorMsg\r
   )\r
 {\r
-  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum, ErrorMsg);\r
+  mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
 }\r
 \r
 VOID\r
@@ -3467,7 +4133,7 @@ EfiVfrParser::_STOQID (
 VOID\r
 EfiVfrParser::_STRCAT (\r
   IN OUT CHAR8 **Dest,\r
-  IN CHAR8     *Src\r
+  IN CONST CHAR8 *Src\r
   )\r
 {\r
   CHAR8   *NewStr;\r
@@ -3492,35 +4158,6 @@ EfiVfrParser::_STRCAT (
   *Dest = NewStr;\r
 }\r
 \r
-VOID\r
-EfiVfrParser::_CRGUID (\r
-  IN EFI_GUID *Guid,\r
-  IN CHAR8    *G1,\r
-  IN CHAR8    *G2,\r
-  IN CHAR8    *G3,\r
-  IN CHAR8    *G4,\r
-  IN CHAR8    *G5,\r
-  IN CHAR8    *G6,\r
-  IN CHAR8    *G7,\r
-  IN CHAR8    *G8,\r
-  IN CHAR8    *G9,\r
-  IN CHAR8    *G10,\r
-  IN CHAR8    *G11\r
-  )\r
-{\r
-  Guid->Data1 = _STOU32 (G1);\r
-  Guid->Data2 = _STOU16 (G2);\r
-  Guid->Data3 = _STOU16 (G3);\r
-  Guid->Data4[0] = _STOU8(G4);\r
-  Guid->Data4[1] = _STOU8(G5);\r
-  Guid->Data4[2] = _STOU8(G6);\r
-  Guid->Data4[3] = _STOU8(G7);\r
-  Guid->Data4[4] = _STOU8(G8);\r
-  Guid->Data4[5] = _STOU8(G9);\r
-  Guid->Data4[6] = _STOU8(G10);\r
-  Guid->Data4[7] = _STOU8(G11);\r
-}\r
-\r
 //\r
 // framework vfr to default declare varstore for each structure\r
 //\r
@@ -3532,6 +4169,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
   SVfrVarStorageNode    *pNode;\r
   UINT32                TypeSize;\r
   BOOLEAN               FirstNode;\r
+  CONST CHAR8           VarName[] = "Setup";\r
 \r
   FirstNode = TRUE;\r
   pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
@@ -3544,9 +4182,9 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
     CIfrVarStore      VSObj;\r
     VSObj.SetLineNo (LineNo);\r
     VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
-    VSObj.SetSize (TypeSize);\r
+    VSObj.SetSize ((UINT16) TypeSize);\r
     //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
-    VSObj.SetName ("Setup");\r
+    VSObj.SetName ((CHAR8 *) VarName);\r
     VSObj.SetGuid (&mFormsetGuid);\r
 #ifdef VFREXP_DEBUG\r
     printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
@@ -3561,9 +4199,9 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
         CIfrVarStore      VSObj;\r
         VSObj.SetLineNo (LineNo);\r
         VSObj.SetVarStoreId (pNode->mVarStoreId);\r
-        VSObj.SetSize (pNode->mStorageInfo.mDataType->mTotalSize);\r
+        VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
         if (FirstNode) {\r
-          VSObj.SetName ("Setup");\r
+          VSObj.SetName ((CHAR8 *) VarName);\r
           FirstNode = FALSE;\r
         } else {\r
           VSObj.SetName (pNode->mVarStoreName);\r
@@ -3603,6 +4241,10 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
   UINT32            Index;\r
   CHAR8             **TypeNameList;\r
   UINT32            ListSize;\r
+  CONST CHAR8       DateName[] = "Date";\r
+  CONST CHAR8       TimeName[] = "Time";\r
+  CONST CHAR8       DateType[] = "EFI_HII_DATE";\r
+  CONST CHAR8       TimeType[] = "EFI_HII_TIME";\r
 \r
   gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
 \r
@@ -3622,7 +4264,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
-    VSObj.SetSize (Size);\r
+    VSObj.SetSize ((UINT16) Size);\r
     VSObj.SetName (TypeNameList[Index]);\r
     VSObj.SetGuid (&mFormsetGuid);\r
   }\r
@@ -3631,45 +4273,45 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
 // not required to declare Date and Time VarStore,\r
 // because code to support old format Data and Time\r
 //\r
-  if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Date") == FALSE) {\r
+  if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
     UINT32            Size;\r
     EFI_VARSTORE_ID   VarStoreId;\r
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
     mCVfrDataStorage.DeclareBufferVarStore (\r
-                       "Date",\r
+                       (CHAR8 *) DateName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
-                       "EFI_HII_DATE",\r
+                       (CHAR8 *) DateType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId("Date", &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId);\r
     VSObj.SetVarStoreId (VarStoreId);\r
-    gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_DATE", &Size);\r
-    VSObj.SetSize (Size);\r
-    VSObj.SetName ("Date");\r
+    gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
+    VSObj.SetSize ((UINT16) Size);\r
+    VSObj.SetName ((CHAR8 *) DateName);\r
     VSObj.SetGuid (&mFormsetGuid);\r
   }\r
 \r
-  if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Time") == FALSE) {\r
+  if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
     UINT32            Size;\r
     EFI_VARSTORE_ID   VarStoreId;\r
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
     mCVfrDataStorage.DeclareBufferVarStore (\r
-                       "Time",\r
+                       (CHAR8 *) TimeName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
-                       "EFI_HII_TIME",\r
+                       (CHAR8 *) TimeType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId("Time", &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId);\r
     VSObj.SetVarStoreId (VarStoreId);\r
-    gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_TIME", &Size);\r
-    VSObj.SetSize (Size);\r
-    VSObj.SetName ("Time");\r
+    gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
+    VSObj.SetSize ((UINT16) Size);\r
+    VSObj.SetName ((CHAR8 *) TimeName);\r
     VSObj.SetGuid (&mFormsetGuid);\r
   }\r
 }\r
@@ -3684,7 +4326,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObj;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+  mCVfrDefaultStore.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
@@ -3694,7 +4336,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObjMF;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
+  mCVfrDefaultStore.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