]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync BaseTool trunk (version r2599) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index d55a80672be10fac8b3804492d06b81fe848538c..253834508ac42a49c61dfcedb548120735d6e010 100644 (file)
@@ -1,5 +1,5 @@
 /*++\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -494,6 +494,7 @@ vfrFormSetDefinition :
      UINT8       ClassGuidNum = 0;\r
      CIfrFormSet *FSObj = NULL;\r
      UINT16      C, SC;\r
+     CHAR8*      InsertOpcodeAddr = NULL;\r
   >>\r
   L:FormSet\r
   Uuid "=" guidDefinition[Guid] ","\r
@@ -585,7 +586,38 @@ vfrFormSetDefinition :
                                                         //\r
                                                         _DeclareDefaultFrameworkVarStore (GET_LINENO(E));\r
                                                       }\r
-                                                      CRT_END_OP (E); if (FSObj != NULL) delete FSObj;\r
+                                                      \r
+                                                      //\r
+                                                      // Declare undefined Question so that they can be used in expression.\r
+                                                      //\r
+                                                      if (gCFormPkg.HavePendingUnassigned()) {\r
+                                                        mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
+                                                                    gCVfrVarDataTypeDB,\r
+                                                                    mCVfrDataStorage,\r
+                                                                    mCVfrQuestionDB,\r
+                                                                    &mFormsetGuid,\r
+                                                                    E->getLine(),\r
+                                                                    &InsertOpcodeAddr\r
+                                                                  );\r
+                                                        gNeedAdjustOpcode = TRUE;\r
+                                                      }\r
+\r
+                                                      CRT_END_OP (E);\r
+\r
+                                                      //\r
+                                                      // Adjust the pending question position.\r
+                                                      // Move the position from current to before the end of the last form in the form set.\r
+                                                      //\r
+                                                      if (gNeedAdjustOpcode) {\r
+                                                        gCFormPkg.AdjustDynamicInsertOpcode (\r
+                                                          mLastFormEndAddr,\r
+                                                          InsertOpcodeAddr\r
+                                                        );\r
+                                                      }\r
+\r
+                                                      if (FSObj != NULL) {\r
+                                                        delete FSObj;\r
+                                                      }\r
                                                     >>\r
   ";"\r
   ;\r
@@ -866,7 +898,7 @@ vfrStatementVarStoreLinear :
                                                                                   VarStoreId\r
                                                                                   ), LineNum);\r
                                                        VSObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                        VSObj.SetVarStoreId (VarStoreId);\r
                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
                                                        VSObj.SetSize ((UINT16) Size);\r
@@ -952,7 +984,7 @@ vfrStatementVarStoreEfi :
                                                                                   TypeName,\r
                                                                                   VarStoreId\r
                                                                                   ), LineNum);                                                        \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
+                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
                                                        } else {\r
                                                         _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
@@ -962,7 +994,7 @@ vfrStatementVarStoreEfi :
                                                                                   TypeName,\r
                                                                                   VarStoreId\r
                                                                                   ), LineNum);                                                      \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId), VN);\r
+                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
                                                        }\r
                                                        VSEObj.SetGuid (&Guid);                                                       \r
@@ -995,7 +1027,7 @@ vfrStatementVarStoreNameValue :
   Uuid "=" guidDefinition[Guid]                     << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
                                                     <<\r
                                                        VSNVObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
                                                        VSNVObj.SetVarStoreId (VarStoreId);\r
                                                     >>\r
   ";"\r
@@ -1069,9 +1101,14 @@ vfrStatementHeader[CIfrStatementHeader *SHObj] :
 vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
   <<\r
      EFI_VARSTORE_INFO Info;\r
+     Info.mVarType               = EFI_IFR_TYPE_OTHER;\r
+     Info.mVarTotalSize          = 0;\r
+     Info.mInfo.mVarOffset       = EFI_VAROFFSET_INVALID;\r
+     Info.mVarStoreId            = EFI_VARSTORE_ID_INVALID;\r
      EFI_QUESTION_ID   QId       = EFI_QUESTION_ID_INVALID;\r
      CHAR8             *QName    = NULL;\r
      CHAR8             *VarIdStr = NULL;\r
+     mUsedDefaultCount           = 0;\r
   >>\r
   {\r
     Name "=" QN:StringIdentifier ","                <<\r
@@ -1119,8 +1156,8 @@ vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_
                                                     << \r
                                                        if (VarIdStr != NULL) {\r
                                                          delete VarIdStr; \r
-                                                         _SAVE_CURRQEST_VARINFO (Info);\r
                                                        }\r
+                                                       _SAVE_CURRQEST_VARINFO (Info);\r
                                                     >>\r
   ;\r
 \r
@@ -1144,6 +1181,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
      CHAR8                 *TName       = NULL;\r
      EFI_VFR_RETURN_CODE   VfrReturnCode = VFR_RETURN_SUCCESS;\r
      EFI_IFR_TYPE_VALUE    Dummy        = gZeroEfiIfrTypeValue;\r
+     EFI_GUID              *VarGuid     = NULL;\r
   >>\r
   (\r
     SN1:StringIdentifier                            << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r
@@ -1154,7 +1192,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                        _STRCAT(&VarIdStr, "]");\r
                                                     >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
                                                           mCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
@@ -1164,11 +1202,10 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN1);\r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
                                                          _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
                                                        }\r
 \r
@@ -1179,7 +1216,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
   (\r
     SN2:StringIdentifier                            << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
                                                           mCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
@@ -1189,13 +1226,13 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
+                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN2);\r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
+                                                         VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
+                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
                                                            _STRCAT(&VarStr, TName);\r
                                                          }\r
                                                        }\r
@@ -1234,13 +1271,16 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                          break;\r
                                                        case EFI_VFR_VARSTORE_BUFFER:\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
+                                                         VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
                                                          _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
                                                                     SName,\r
+                                                                    VarGuid,\r
                                                                     NULL),\r
                                                                  SN2->getLine());\r
                                                          _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write (\r
                                                                     'a',\r
                                                                     SName,\r
+                                                                    VarGuid,\r
                                                                     NULL,\r
                                                                     $Info.mVarType,\r
                                                                     $Info.mInfo.mVarOffset,\r
@@ -1389,23 +1429,7 @@ vfrFormDefinition :
                                                         LObj3.SetNumber (0xffff);  //add end label for UEFI, label number hardcode 0xffff\r
                                                       }\r
 \r
-                                                      //\r
-                                                      // Declare undefined Question so that they can be used in expression.\r
-                                                      //\r
-                                                      if (gCFormPkg.HavePendingUnassigned()) {\r
-                                                        gCFormPkg.DeclarePendingQuestion (\r
-                                                                    gCVfrVarDataTypeDB,\r
-                                                                    mCVfrDataStorage,\r
-                                                                    mCVfrQuestionDB,\r
-                                                                    &mFormsetGuid,\r
-                                                                    E->getLine()\r
-                                                                  );\r
-                                                      }\r
-\r
-                                                      //\r
-                                                      // mCVfrQuestionDB.PrintAllQuestion();\r
-                                                      //\r
-                                                      CRT_END_OP (E);\r
+                                                      {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
                                                     >>\r
   ";"\r
   ;\r
@@ -1455,42 +1479,72 @@ vfrStatementDefault :
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
      EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
-     CIfrDefault           DObj;\r
+     CIfrDefault           *DObj         = NULL;\r
+     CIfrDefault2          *DObj2        = NULL;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
      CHAR8                 *VarStoreName = NULL;\r
      EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
+     UINT32                Size          = 0;\r
+     EFI_GUID              *VarGuid      = NULL;\r
   >>\r
-  D:Default                                         << DObj.SetLineNo(D->getLine()); >>\r
+  D:Default                                         \r
   (\r
     (\r
-        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
-      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  << \r
+      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  \r
+                                                    << \r
                                                         if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
                                                           //check default value is valid for Numeric Opcode\r
                                                           if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
                                                           }\r
                                                         }\r
-                                                        DObj.SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                        DObj.SetValue(Val);\r
+                                                        if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                          _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
+                                                          Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                        } else {\r
+                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
+                                                        }\r
+                                                        Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
+                                                        DObj = new CIfrDefault ((UINT8)Size);\r
+                                                        DObj->SetLineNo(D->getLine());\r
+                                                        DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                        DObj->SetValue(Val);\r
                                                     >>\r
+      |                                             << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
+        vfrStatementValue ","                       << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
     )\r
     {\r
-      DefaultStore "=" SN:StringIdentifier ","      << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r
+      DefaultStore "=" SN:StringIdentifier ","      << \r
+                                                        _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
+                                                        if (DObj != NULL) {\r
+                                                          DObj->SetDefaultId (DefaultId); \r
+                                                        } \r
+\r
+                                                        if (DObj2 != NULL) {\r
+                                                          DObj2->SetDefaultId (DefaultId); \r
+                                                        }\r
+                                                    >>\r
     }\r
                                                     <<\r
+                                                      CheckDuplicateDefaultValue (DefaultId, D);\r
+                                                      if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
                                                        _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreType (VarStoreName, VarStoreType), D->getLine());\r
+                                                       VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                       VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                        if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
                                                          _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                    DefaultId,\r
                                                                    _GET_CURRQEST_VARTINFO(),\r
                                                                    VarStoreName,\r
+                                                                   VarGuid,\r
                                                                    _GET_CURRQEST_DATATYPE (),\r
-                                                                   Val),\r
-                                                                   D->getLine()\r
-                                                                   );\r
+                                                                     Val),\r
+                                                                     D->getLine()\r
+                                                                     );\r
+                                                         }\r
                                                        }\r
+                                                       if (DObj  != NULL) {delete DObj;} \r
+                                                       if (DObj2 != NULL) {delete DObj2;} \r
                                                     >>\r
   )\r
   ;\r
@@ -1755,7 +1809,11 @@ vfrStatementGoto :
                                                           default: break;\r
                                                           }\r
                                                        >>\r
-  vfrQuestionHeader[*QHObj, QUESTION_REF]\r
+  vfrQuestionHeader[*QHObj, QUESTION_REF]              <<\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
+                                                          }\r
+                                                       >>\r
   { "," F:FLAGS  "=" vfrGotoFlags[QHObj, F->getLine()] }\r
   {\r
     "," Key "=" KN:Number                              << AssignQuestionKey (*QHObj, KN); >>\r
@@ -1824,49 +1882,62 @@ vfrStatementCheckBox :
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
      CHAR8              *VarStoreName = NULL;\r
      UINT32             DataTypeSize;\r
+     EFI_GUID           *VarStoreGuid = NULL;\r
   >>\r
   L:CheckBox                                           << CBObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[CBObj] ","                         << //check data type\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
-                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
-                                                          } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
-                                                                    (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
+                                                          }\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
+                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
+                                                            } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
+                                                                      (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+                                                            }\r
                                                           }\r
                                                        >>\r
   {\r
     F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
                                                        <<\r
-                                                          _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
-                                                          Val.b = TRUE;\r
-                                                          if (CBObj.GetFlags () & 0x01) {\r
-                                                            _PCATCH(\r
-                                                              mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                                  EFI_HII_DEFAULT_CLASS_STANDARD,\r
-                                                                                  _GET_CURRQEST_VARTINFO(),\r
-                                                                                  VarStoreName,\r
-                                                                                  _GET_CURRQEST_DATATYPE (),\r
-                                                                                  Val\r
-                                                                                  ),\r
-                                                              VFR_RETURN_SUCCESS,\r
-                                                              L,\r
-                                                              "No standard default storage found"\r
-                                                              );\r
-                                                          }\r
-                                                          if (CBObj.GetFlags () & 0x02) {\r
-                                                            _PCATCH(\r
-                                                              mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                                  EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
-                                                                                  _GET_CURRQEST_VARTINFO(),\r
-                                                                                  VarStoreName,\r
-                                                                                  _GET_CURRQEST_DATATYPE (),\r
-                                                                                  Val\r
-                                                                                  ),\r
-                                                              VFR_RETURN_SUCCESS,\r
-                                                              L,\r
-                                                              "No manufacturing default storage found"\r
-                                                              );\r
+                                                         if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
+                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            Val.b = TRUE;\r
+                                                            if (CBObj.GetFlags () & 0x01) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
+                                                              _PCATCH(\r
+                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                                    EFI_HII_DEFAULT_CLASS_STANDARD,\r
+                                                                                    _GET_CURRQEST_VARTINFO(),\r
+                                                                                    VarStoreName,\r
+                                                                                    VarStoreGuid,\r
+                                                                                    _GET_CURRQEST_DATATYPE (),\r
+                                                                                    Val\r
+                                                                                    ),\r
+                                                                VFR_RETURN_SUCCESS,\r
+                                                                L,\r
+                                                                "No standard default storage found"\r
+                                                                );\r
+                                                            }\r
+                                                            if (CBObj.GetFlags () & 0x02) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
+                                                              _PCATCH(\r
+                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                                    EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
+                                                                                    _GET_CURRQEST_VARTINFO(),\r
+                                                                                    VarStoreName,\r
+                                                                                    VarStoreGuid,\r
+                                                                                    _GET_CURRQEST_DATATYPE (),\r
+                                                                                    Val\r
+                                                                                    ),\r
+                                                                VFR_RETURN_SUCCESS,\r
+                                                                L,\r
+                                                                "No manufacturing default storage found"\r
+                                                                );\r
+                                                            }\r
                                                           }\r
                                                         >>\r
   }\r
@@ -1962,11 +2033,16 @@ vfrStatementDate :
      CHAR8              *VarIdStr[3] = {NULL, };\r
      CIfrDate           DObj;\r
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+     UINT8              Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
   >>\r
   L:Date                                               << DObj.SetLineNo(L->getLine()); >>\r
   (\r
     (\r
-      vfrQuestionHeader[DObj, QUESTION_DATE] ","\r
+      vfrQuestionHeader[DObj, QUESTION_DATE] ","       <<\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
+                                                          }\r
+                                                       >>\r
     { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
       vfrStatementQuestionOptionList\r
     )\r
@@ -1998,7 +2074,7 @@ vfrStatementDate :
                                                           DObj.SetHelp (_STOSID(YH->getText()));\r
                                                           if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
                                                        >>\r
-                                                       << {CIfrDefault DefaultObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
+                                                       << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
     )\r
     ( vfrStatementInconsistentIf )*\r
   )\r
@@ -2126,38 +2202,45 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
 vfrStatementNumeric :\r
   <<\r
      CIfrNumeric NObj;\r
-     UINT32 DataTypeSize;\r
-     BOOLEAN IsSupported;\r
+     UINT32      DataTypeSize;\r
+     BOOLEAN     IsSupported = TRUE;\r
+     UINT8       ShrinkSize  = 0;\r
   >>\r
   L:Numeric                                            << NObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[NObj] ","                          << // check data type\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
-                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
+                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+                                                            }\r
+                                                            _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                           }\r
-                                                          _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                        >>\r
   { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
   {\r
     Key   "=" KN:Number ","                            << AssignQuestionKey (NObj, KN); >>\r
   }\r
-  vfrSetMinMaxStep[NObj]\r
-  vfrStatementQuestionOptionList\r
-  E:EndNumeric                                         << \r
-                                                          IsSupported = FALSE;\r
+  vfrSetMinMaxStep[NObj]                               <<\r
                                                           switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              IsSupported = TRUE;\r
-                                                              break;\r
-                                                            default:\r
+                                                            //\r
+                                                            // Base on the type to know the actual used size,shrink the buffer \r
+                                                            // size allocate before.\r
+                                                            //\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
+                                                            default: \r
+                                                              IsSupported = FALSE;\r
                                                               break;\r
                                                           }\r
+                                                          NObj.ShrinkBinSize (ShrinkSize);\r
                                                           if (!IsSupported) {\r
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
                                                           }\r
+                                                       >>\r
+  vfrStatementQuestionOptionList\r
+  E:EndNumeric                                         << \r
                                                           CRT_END_OP (E); \r
                                                        >>\r
   ";"\r
@@ -2168,32 +2251,37 @@ vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
      UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
      EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+     BOOLEAN IsSetType = FALSE;\r
   >>\r
-  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
+  numericFlagsField[HFlags, LFlags, IsSetType] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType] )*\r
                                                        <<\r
                                                           //check data type flag\r
-                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
-                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                              if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                                _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                              }\r
+                                                            } else {\r
+                                                              // update data type for name/value store\r
+                                                              UINT32 DataTypeSize;\r
+                                                              _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                              gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                              _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                             }\r
-                                                          } else {\r
-                                                            // update data type for name/value store\r
-                                                            UINT32 DataTypeSize;\r
+                                                          } else if (IsSetType){\r
                                                             _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
-                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
-                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                           }\r
                                                           _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum);\r
                                                        >>\r
   ;\r
 \r
-numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType] :\r
     N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
-  | "NUMERIC_SIZE_1"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; >>\r
-  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; >>\r
-  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; >>\r
-  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; >>\r
+  | "NUMERIC_SIZE_1"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
+  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
+  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
+  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
   | "DISPLAY_INT_DEC"                                  << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; >>\r
   | "DISPLAY_UINT_DEC"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; >>\r
   | "DISPLAY_UINT_HEX"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; >>\r
@@ -2204,36 +2292,44 @@ vfrStatementOneOf :
   <<\r
      CIfrOneOf OObj;\r
      UINT32    DataTypeSize;\r
-     BOOLEAN   IsSupported;\r
+     BOOLEAN   IsSupported = TRUE;\r
+     UINT8     ShrinkSize  = 0;\r
   >>\r
   L:OneOf                                              << OObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OObj] ","                          << //check data type\r
-                                                          _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
-                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
+                                                            if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+                                                            }\r
+                                                            _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                           }\r
-                                                          _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
                                                        >>\r
   { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
   {\r
     vfrSetMinMaxStep[OObj]\r
   }\r
-  vfrStatementQuestionOptionList\r
-  E:EndOneOf                                           << \r
-                                                          IsSupported = FALSE;\r
+                                                       <<\r
                                                           switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              IsSupported = TRUE;\r
-                                                              break;\r
+                                                            //\r
+                                                            // Base on the type to know the actual used size,shrink the buffer \r
+                                                            // size allocate before.\r
+                                                            //\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
                                                             default:\r
+                                                              IsSupported = FALSE;\r
                                                               break;\r
                                                           }\r
+                                                          OObj.ShrinkBinSize (ShrinkSize);\r
                                                           if (!IsSupported) {\r
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
                                                           }\r
+                                                       >>\r
+  vfrStatementQuestionOptionList\r
+  E:EndOneOf                                           <<\r
                                                           CRT_END_OP (E); \r
                                                        >>\r
   ";"\r
@@ -2244,21 +2340,26 @@ vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
      UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
      EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+     BOOLEAN IsSetType = FALSE;\r
   >>\r
-  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
+  numericFlagsField[HFlags, LFlags, IsSetType] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType] )*\r
                                                        <<\r
                                                           //check data type flag\r
-                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
-                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                              if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                                _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                              }\r
+                                                            } else {\r
+                                                              // update data type for Name/Value store\r
+                                                              UINT32 DataTypeSize;\r
+                                                              _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                              gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                              _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                             }\r
-                                                          } else {\r
-                                                            // update data type for Name/Value store\r
-                                                            UINT32 DataTypeSize;\r
+                                                          } else if (IsSetType){\r
                                                             _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
-                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
-                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
                                                           }\r
                                                           _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
                                                        >>\r
@@ -2423,11 +2524,16 @@ vfrStatementTime :
      CHAR8              *VarIdStr[3] = {NULL, };\r
      CIfrTime           TObj;\r
      EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+     UINT8              Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
   >>\r
   L:Time                                               << TObj.SetLineNo(L->getLine()); >>\r
   (\r
     (\r
-      vfrQuestionHeader[TObj, QUESTION_TIME] ","\r
+      vfrQuestionHeader[TObj, QUESTION_TIME] ","       <<\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
+                                                          }\r
+                                                       >>\r
     { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
       vfrStatementQuestionOptionList\r
     )\r
@@ -2459,7 +2565,7 @@ vfrStatementTime :
                                                           TObj.SetHelp (_STOSID(HH->getText()));\r
                                                           if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
                                                        >>\r
-                                                       << {CIfrDefault DefaultObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
+                                                       << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
     )\r
     ( vfrStatementInconsistentIf )*\r
   )\r
@@ -2774,11 +2880,32 @@ vfrStatementOptions :
 \r
 vfrStatementOneOfOption :\r
   <<\r
-     EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
-     CIfrOneOfOption    OOOObj;\r
+     EFI_IFR_TYPE_VALUE Val           = gZeroEfiIfrTypeValue;\r
      CHAR8              *VarStoreName = NULL;\r
+     UINT32             Size          = 0;\r
+     BOOLEAN            TypeError     = FALSE;\r
+     EFI_VFR_RETURN_CODE ReturnCode   = VFR_RETURN_SUCCESS;\r
+     EFI_GUID           *VarStoreGuid = NULL;\r
+     \r
+     if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+       TypeError = TRUE;\r
+       Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+     } else {\r
+       ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+     }\r
+\r
+     Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+     CIfrOneOfOption    OOOObj ((UINT8)Size);\r
   >>\r
-  L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
+  L:Option                                             <<      \r
+                                                          OOOObj.SetLineNo(L->getLine());\r
+                                                          if (TypeError) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
+                                                          }\r
+                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+                                                            _PCATCH (ReturnCode, L->getLine());\r
+                                                          }\r
+                                                       >>\r
   Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
   Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \r
                                                        << \r
@@ -2807,24 +2934,31 @@ vfrStatementOneOfOption :
                                                        >>\r
   F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
                                                        <<\r
-                                                          _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
-                                                          if (OOOObj.GetFlags () & 0x10) {\r
-                                                            _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                      EFI_HII_DEFAULT_CLASS_STANDARD,\r
-                                                                       _GET_CURRQEST_VARTINFO(),\r
-                                                                      VarStoreName,\r
-                                                                      _GET_CURRQEST_DATATYPE (),\r
-                                                                      Val\r
-                                                                      ), L->getLine());\r
-                                                          }\r
-                                                          if (OOOObj.GetFlags () & 0x20) {\r
-                                                            _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
-                                                                      EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
-                                                                       _GET_CURRQEST_VARTINFO(),\r
-                                                                      VarStoreName,\r
-                                                                      _GET_CURRQEST_DATATYPE (),\r
-                                                                      Val\r
-                                                                      ), L->getLine());\r
+                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
+                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            if (OOOObj.GetFlags () & 0x10) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
+                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                        EFI_HII_DEFAULT_CLASS_STANDARD,\r
+                                                                         _GET_CURRQEST_VARTINFO(),\r
+                                                                        VarStoreName,\r
+                                                                        VarStoreGuid,\r
+                                                                        _GET_CURRQEST_DATATYPE (),\r
+                                                                        Val\r
+                                                                        ), L->getLine());\r
+                                                            }\r
+                                                            if (OOOObj.GetFlags () & 0x20) {\r
+                                                              CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
+                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                        EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
+                                                                         _GET_CURRQEST_VARTINFO(),\r
+                                                                        VarStoreName,\r
+                                                                        VarStoreGuid,\r
+                                                                        _GET_CURRQEST_DATATYPE (),\r
+                                                                        Val\r
+                                                                        ), L->getLine());\r
+                                                            }\r
                                                           }\r
                                                        >>\r
   {\r
@@ -3237,8 +3371,8 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
      UINT16          ConstVal;\r
      CHAR8           *VarIdStr;\r
      UINT32          LineNo;\r
-     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
      EFI_VFR_RETURN_CODE   VfrReturnCode = VFR_RETURN_SUCCESS;\r
+     EFI_VARSTORE_ID       VarStoreId   = EFI_VARSTORE_ID_INVALID;\r
   >>\r
   L:VarEqVal                                          <<\r
                                                         if (!mCompatibleMode) {\r
@@ -3249,7 +3383,7 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   OpenParen\r
   VN:Number                                           <<\r
                                                           VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreType (VarIdStr, VarStoreType);\r
+                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
                                                           if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
                                                             _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
                                                                                         VarIdStr,\r
@@ -3887,6 +4021,13 @@ private:
 \r
   EFI_VARSTORE_INFO   mCurrQestVarInfo;\r
   EFI_GUID            *mOverrideClassGuid;\r
+  CHAR8*              mLastFormEndAddr;\r
+\r
+//\r
+// Whether the question already has default value.\r
+//\r
+  UINT16              mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
+  UINT16              mUsedDefaultCount;\r
 \r
 //\r
 // For framework vfr compatibility\r
@@ -3902,6 +4043,7 @@ private:
   UINT8               _GET_CURRQEST_DATATYPE ();\r
   UINT32              _GET_CURRQEST_VARSIZE ();\r
   UINT32              _GET_CURRQEST_ARRAY_SIZE();\r
+  VOID                CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
 \r
 public:\r
   VOID                _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
@@ -4485,7 +4627,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
                        TypeNameList[Index],\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4510,7 +4652,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
                        (CHAR8 *) DateType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4531,7 +4673,7 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
                        (CHAR8 *) TimeType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId);\r
+    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -4762,4 +4904,25 @@ EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)
   mCompatibleMode = Mode;\r
   mCVfrQuestionDB.SetCompatibleMode (Mode);\r
 }\r
+\r
+VOID\r
+EfiVfrParser::CheckDuplicateDefaultValue (\r
+  IN EFI_DEFAULT_ID      DefaultId,\r
+  IN ANTLRTokenPtr       Tok\r
+  )\r
+{\r
+  UINT16    Index;\r
+\r
+  for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
+    if (mUsedDefaultArray[Index] == DefaultId) {\r
+      gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
+    }\r
+  }\r
+\r
+  if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
+    gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
+  }\r
+\r
+  mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
+}\r
 >>\r