]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync tool code to BuildTools project r1783.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index ea529a5e15e84b4224ed83c872e645614e5dc629..09ec6919eca5bf325367a8396797bf05a6007451 100644 (file)
@@ -1,5 +1,5 @@
 /*++\r
 /*++\r
-Copyright (c) 2004 - 2008, Intel Corporation\r
+Copyright (c) 2004 - 2009, Intel Corporation\r
 All rights reserved. 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
 All rights reserved. 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
@@ -547,7 +547,8 @@ vfrFormSetList :
     vfrStatementVarStoreEfi       |\r
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
     vfrStatementVarStoreEfi       |\r
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
-    vfrStatementDisableIfFormSet\r
+    vfrStatementDisableIfFormSet  |\r
+    vfrStatementSuppressIfFormSet\r
   )*\r
   ;\r
 \r
   )*\r
   ;\r
 \r
@@ -720,6 +721,21 @@ vfrStatementDisableIfFormSet :
   ";"\r
   ;\r
 \r
   ";"\r
   ;\r
 \r
+vfrStatementSuppressIfFormSet :\r
+  << CIfrSuppressIf SIObj;>>\r
+  L:SuppressIf                                         <<\r
+                                                           if (mCompatibleMode) {\r
+                                                             _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
+                                                           }\r
+                                                           SIObj.SetLineNo(L->getLine()); \r
+                                                       >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0] ";"\r
+  vfrFormSetList\r
+  E: EndIf \r
+  ";"                                                  << CRT_END_OP (E); >>\r
+  ;\r
+\r
 //*****************************************************************************\r
 //\r
 // the syntax of question header and statement header\r
 //*****************************************************************************\r
 //\r
 // the syntax of question header and statement header\r
@@ -1089,66 +1105,10 @@ vfrStatementDefault :
     (\r
         vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
       | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  << \r
     (\r
         vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
       | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  << \r
-\r
-                                                        if (gCurrentIfrOpcode != NULL && gCurrentIfrOpcode->GetObjBinAddr() != NULL) {\r
-                                                          EFI_IFR_OP_HEADER *TempOpCode;\r
-                                                          TempOpCode = (EFI_IFR_OP_HEADER *) gCurrentIfrOpcode->GetObjBinAddr();\r
-                                                          switch (TempOpCode->OpCode) {\r
-                                                          case EFI_IFR_NUMERIC_OP:\r
-                                                            EFI_IFR_NUMERIC *TempNumricCode;\r
-                                                            TempNumricCode = (EFI_IFR_NUMERIC *) TempOpCode;\r
-                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              if (Val.u64 < TempNumricCode->data.u64.MinValue || Val.u64 > TempNumricCode->data.u64.MaxValue) {\r
-                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
-                                                              }\r
-                                                              break;\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                              if (Val.u32 < TempNumricCode->data.u32.MinValue || Val.u32 > TempNumricCode->data.u32.MaxValue) {\r
-                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
-                                                              }\r
-                                                              break;\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                              if (Val.u16 < TempNumricCode->data.u16.MinValue || Val.u16 > TempNumricCode->data.u16.MaxValue) {\r
-                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
-                                                              }\r
-                                                              break;\r
-                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                              if (Val.u8 < TempNumricCode->data.u8.MinValue || Val.u8 > TempNumricCode->data.u8.MaxValue) {\r
-                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
-                                                              }\r
-                                                              break;\r
-                                                            }\r
-                                                            break;\r
-                                                          case EFI_IFR_ONE_OF_OP:\r
-                                                            EFI_IFR_ONE_OF *TempOneOfCode;\r
-                                                            TempOneOfCode = (EFI_IFR_ONE_OF *) TempOpCode;\r
-                                                            if (TempOneOfCode->data.u64.MinValue != 0 || TempOneOfCode->data.u64.MaxValue != 0 || TempOneOfCode->data.u64.Step != 0) {\r
-                                                              //OneOf MinMaxStep Data is set, Val value will be checked for MinMaxStep.\r
-                                                              switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                                if (Val.u64 < TempOneOfCode->data.u64.MinValue || Val.u64 > TempOneOfCode->data.u64.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                                if (Val.u32 < TempOneOfCode->data.u32.MinValue || Val.u32 > TempOneOfCode->data.u32.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                                if (Val.u16 < TempOneOfCode->data.u16.MinValue || Val.u16 > TempOneOfCode->data.u16.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                                if (Val.u8 < TempOneOfCode->data.u8.MinValue || Val.u8 > TempOneOfCode->data.u8.MaxValue) {\r
-                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r
-                                                                }\r
-                                                                break;\r
-                                                              }\r
-                                                            }\r
-                                                            break;\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
                                                           }\r
                                                         }\r
                                                         DObj.SetType (_GET_CURRQEST_DATATYPE()); \r
@@ -1711,7 +1671,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
   >>\r
   Minimum   "=" I:Number ","\r
                                                        <<\r
   >>\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
                                                           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
@@ -1720,7 +1680,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                        >>\r
   Maximum   "=" A:Number ","\r
                                                        <<\r
                                                        >>\r
   Maximum   "=" A:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : \r
                                                             MaxU8 = _STOU64(A->getText()); \r
                                                             if (MaxU8 < MinU8) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : \r
                                                             MaxU8 = _STOU64(A->getText()); \r
                                                             if (MaxU8 < MinU8) {\r
@@ -1750,7 +1710,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
   {\r
     STEP    "=" S:Number ","\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
                                                           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
@@ -1759,7 +1719,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                        >>\r
   }\r
                                                        <<\r
                                                        >>\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
                                                           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
@@ -1793,18 +1753,38 @@ vfrStatementNumeric :
 \r
 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
   <<\r
 \r
 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
      UINT8 HFlags = 0;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
   >>\r
   numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\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
   ;\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
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
@@ -1832,11 +1812,27 @@ vfrStatementOneOf :
 \r
 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
   <<\r
 \r
 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
      UINT8 HFlags = 0;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
   >>\r
   numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\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
   ;\r
 \r
 vfrStatementStringType :\r
@@ -2080,10 +2076,9 @@ vfrStatementStatListOld :
 vfrStatementDisableIfStat :\r
   << \r
     CIfrDisableIf DIObj; \r
 vfrStatementDisableIfStat :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\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
   ( vfrStatementStatList )*\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ";"\r
@@ -2227,10 +2222,9 @@ vfrStatementNoSubmitIf :
 vfrStatementDisableIfQuest :\r
   << \r
     CIfrDisableIf DIObj; \r
 vfrStatementDisableIfQuest :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\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
   vfrStatementQuestionOptionList\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ;\r
@@ -2277,7 +2271,31 @@ vfrStatementOneOfOption :
   >>\r
   L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
   Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
   >>\r
   L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
   Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r
+  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
   F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
                                                        <<\r
                                                           _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
@@ -2460,6 +2478,7 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token RuleRef("ruleref")                       "ruleref"\r
 #token StringRef("stringref")                   "stringref"\r
 #token PushThis("pushthis")                     "pushthis"\r
 #token RuleRef("ruleref")                       "ruleref"\r
 #token StringRef("stringref")                   "stringref"\r
 #token PushThis("pushthis")                     "pushthis"\r
+#token Security("security")                     "security"\r
 #token True("TRUE")                             "TRUE"\r
 #token False("FALSE")                           "FALSE"\r
 #token One("ONE")                               "ONE"\r
 #token True("TRUE")                             "TRUE"\r
 #token False("FALSE")                           "FALSE"\r
 #token One("ONE")                               "ONE"\r
@@ -2685,6 +2704,7 @@ vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | rulerefExp[$RootLevel, $ExpOpCount]\r
   | stringref1Exp[$RootLevel, $ExpOpCount]\r
   | pushthisExp[$RootLevel, $ExpOpCount]\r
   | rulerefExp[$RootLevel, $ExpOpCount]\r
   | stringref1Exp[$RootLevel, $ExpOpCount]\r
   | pushthisExp[$RootLevel, $ExpOpCount]\r
+  | securityExp[$RootLevel, $ExpOpCount]\r
   ;\r
 \r
 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
   ;\r
 \r
 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -2978,6 +2998,14 @@ pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   L:PushThis                                           << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \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
 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
 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