]> 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 f91a2c3ceaf88c9dfaa4ce2f59754e0681ff38c4..09ec6919eca5bf325367a8396797bf05a6007451 100644 (file)
@@ -1,5 +1,5 @@
 /*++\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
@@ -547,7 +547,8 @@ vfrFormSetList :
     vfrStatementVarStoreEfi       |\r
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
-    vfrStatementDisableIfFormSet\r
+    vfrStatementDisableIfFormSet  |\r
+    vfrStatementSuppressIfFormSet\r
   )*\r
   ;\r
 \r
@@ -720,6 +721,21 @@ vfrStatementDisableIfFormSet :
   ";"\r
   ;\r
 \r
+vfrStatementSuppressIfFormSet :\r
+  << CIfrSuppressIf SIObj;>>\r
+  L:SuppressIf                                         <<\r
+                                                           if (mCompatibleMode) {\r
+                                                             _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
+                                                           }\r
+                                                           SIObj.SetLineNo(L->getLine()); \r
+                                                       >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0] ";"\r
+  vfrFormSetList\r
+  E: EndIf \r
+  ";"                                                  << CRT_END_OP (E); >>\r
+  ;\r
+\r
 //*****************************************************************************\r
 //\r
 // the syntax of question header and statement header\r
@@ -1078,7 +1094,7 @@ vfrStatementRules :
 vfrStatementDefault :\r
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
-     EFI_IFR_TYPE_VALUE    Val = gZeroEfiIfrTypeValue;\r
+     EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
      CIfrDefault           DObj;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
      CHAR8                 *VarStoreName = NULL;\r
@@ -1087,9 +1103,17 @@ vfrStatementDefault :
   D:Default                                         << DObj.SetLineNo(D->getLine()); >>\r
   (\r
     (\r
-        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); >>\r
-      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","\r
-                                                    << DObj.SetType (_GET_CURRQEST_DATATYPE()); DObj.SetValue(Val); >>\r
+        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
+      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  << \r
+                                                        if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+                                                          //check default value is valid for Numeric Opcode\r
+                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                          }\r
+                                                        }\r
+                                                        DObj.SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                        DObj.SetValue(Val);\r
+                                                    >>\r
     )\r
     {\r
       DefaultStore "=" SN:StringIdentifier ","      << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r
@@ -1167,7 +1191,7 @@ flagsField :
 vfrStatementValue :\r
   << CIfrValue VObj; >>\r
   V:Value                                              << VObj.SetLineNo(V->getLine()); >>\r
-  "=" vfrStatementExpression[0]\r
+  "=" vfrStatementExpression[0]                        << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
   ;\r
 \r
 vfrStatementSubTitle :\r
@@ -1588,15 +1612,30 @@ vfrStatementDate :
   ;\r
 \r
 minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
-  Minimum   "=" Number ","\r
-  Maximum   "=" Number ","\r
+  Minimum   "=" MinN:Number ","\r
+  Maximum   "=" MaxN:Number ","\r
   { "step"    "=" Number "," }\r
   {\r
     "default" "=" N:Number ","                         <<\r
                                                           switch (KeyValue) {\r
-                                                          case 0: D.Year  = _STOU16(N->getText()); break;\r
-                                                          case 1: D.Month = _STOU8(N->getText()); break;\r
-                                                          case 2: D.Day   = _STOU8(N->getText()); break;\r
+                                                          case 0: \r
+                                                            D.Year  = _STOU16(N->getText());\r
+                                                            if (D.Year < _STOU16 (MinN->getText()) || D.Year > _STOU16 (MaxN->getText())) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 1: \r
+                                                            D.Month = _STOU8(N->getText()); \r
+                                                            if (D.Month < 1 || D.Month > 12) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 2: \r
+                                                            D.Day = _STOU8(N->getText()); \r
+                                                            if (D.Day < 1 || D.Day > 31) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
   }\r
@@ -1632,7 +1671,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
   >>\r
   Minimum   "=" I:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;\r
@@ -1641,17 +1680,37 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                        >>\r
   Maximum   "=" A:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : MaxU8 = _STOU64(A->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MaxU4 = _STOU32(A->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MaxU2 = _STOU16(A->getText()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MaxU1 = _STOU8(A->getText());  break;\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : \r
+                                                            MaxU8 = _STOU64(A->getText()); \r
+                                                            if (MaxU8 < MinU8) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : \r
+                                                            MaxU4 = _STOU32(A->getText()); \r
+                                                            if (MaxU4 < MinU4) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : \r
+                                                            MaxU2 = _STOU16(A->getText()); \r
+                                                            if (MaxU2 < MinU2) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  \r
+                                                            MaxU1 = _STOU8(A->getText());  \r
+                                                            if (MaxU1 < MinU1) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
   {\r
     STEP    "=" S:Number ","\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;\r
@@ -1660,7 +1719,7 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                        >>\r
   }\r
                                                        <<\r
-                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
@@ -1694,18 +1753,38 @@ vfrStatementNumeric :
 \r
 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
   >>\r
   numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
-                                                       << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+                                                       <<\r
+                                                          //check data type flag\r
+                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                            }\r
+                                                          } else {\r
+                                                            // update data type for name/value store\r
+                                                            UINT32 DataTypeSize;\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
+                                                          }\r
+                                                          _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum);\r
+                                                       >>\r
   ;\r
 \r
 numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
     N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
-  | "DISPLAY_INT_DEC"                                  << $LFlags |= 0x00; >>\r
-  | "DISPLAY_UINT_DEC"                                 << $LFlags |= 0x10; >>\r
-  | "DISPLAY_UINT_HEX"                                 << $LFlags |= 0x20; >>\r
+  | "NUMERIC_SIZE_1"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; >>\r
+  | "NUMERIC_SIZE_2"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; >>\r
+  | "NUMERIC_SIZE_4"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; >>\r
+  | "NUMERIC_SIZE_8"                                   << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; >>\r
+  | "DISPLAY_INT_DEC"                                  << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; >>\r
+  | "DISPLAY_UINT_DEC"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; >>\r
+  | "DISPLAY_UINT_HEX"                                 << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; >>\r
   | questionheaderFlagsField[HFlags]\r
   ;\r
 \r
@@ -1733,11 +1812,27 @@ vfrStatementOneOf :
 \r
 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
   <<\r
-     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
      UINT8 HFlags = 0;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
   >>\r
   numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
-                                                       << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+                                                       <<\r
+                                                          //check data type flag\r
+                                                          VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+                                                            if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+                                                              _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+                                                            }\r
+                                                          } else {\r
+                                                            // update data type for Name/Value store\r
+                                                            UINT32 DataTypeSize;\r
+                                                            _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+                                                            gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+                                                            _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
+                                                          }\r
+                                                          _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
+                                                       >>\r
   ;\r
 \r
 vfrStatementStringType :\r
@@ -1812,7 +1907,7 @@ vfrStatementOrderedList :
   >>\r
   L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OLObj] ","\r
-                                                       << OLObj.SetMaxContainers ((UINT8)_GET_CURRQEST_VARSIZE()); >>\r
+                                                       << OLObj.SetMaxContainers ((UINT8) _GET_CURRQEST_ARRAY_SIZE()); >>\r
   {\r
     MaxContainers "=" M:Number ","                     << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r
   }\r
@@ -1894,9 +1989,24 @@ minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :
   {\r
     "default" "=" N:Number ","                         <<\r
                                                           switch (KeyValue) {\r
-                                                          case 0: T.Hour   = _STOU8(N->getText()); break;\r
-                                                          case 1: T.Minute = _STOU8(N->getText()); break;\r
-                                                          case 2: T.Second = _STOU8(N->getText()); break;\r
+                                                          case 0: \r
+                                                            T.Hour   = _STOU8(N->getText()); \r
+                                                            if (T.Hour > 23) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 1: \r
+                                                            T.Minute = _STOU8(N->getText()); \r
+                                                            if (T.Minute > 59) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
+                                                            }\r
+                                                            break;\r
+                                                          case 2: \r
+                                                            T.Second = _STOU8(N->getText());\r
+                                                            if (T.Second > 59) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
   }\r
@@ -1966,10 +2076,9 @@ vfrStatementStatListOld :
 vfrStatementDisableIfStat :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
-  vfrStatementExpression[0] ";"                        << mConstantOnlyInExpression = FALSE; >>\r
+  vfrStatementExpression[0] ";" \r
   ( vfrStatementStatList )*\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ";"\r
@@ -2113,10 +2222,9 @@ vfrStatementNoSubmitIf :
 vfrStatementDisableIfQuest :\r
   << \r
     CIfrDisableIf DIObj; \r
-    mConstantOnlyInExpression = TRUE;\r
   >>\r
   L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
-  vfrStatementExpression[0] ";"                        << mConstantOnlyInExpression = FALSE; >>\r
+  vfrStatementExpression[0] ";"\r
   vfrStatementQuestionOptionList\r
   E:EndIf                                              << CRT_END_OP (E); >>\r
   ;\r
@@ -2163,7 +2271,31 @@ vfrStatementOneOfOption :
   >>\r
   L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
   Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \r
+                                                       << \r
+                                                          if (gCurrentMinMaxData != NULL) {\r
+                                                            //set min/max value for oneof opcode\r
+                                                            UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
+                                                              break;\r
+                                                            default:\r
+                                                              break;\r
+                                                            }\r
+                                                          }\r
+                                                          OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                          OOOObj.SetValue (Val); \r
+                                                       >>\r
   F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
                                                        <<\r
                                                           _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
@@ -2346,6 +2478,7 @@ vfrStatementInvalidSaveRestoreDefaults :
 #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
@@ -2571,6 +2704,7 @@ vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | rulerefExp[$RootLevel, $ExpOpCount]\r
   | stringref1Exp[$RootLevel, $ExpOpCount]\r
   | pushthisExp[$RootLevel, $ExpOpCount]\r
+  | securityExp[$RootLevel, $ExpOpCount]\r
   ;\r
 \r
 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -2864,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
+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
@@ -3065,6 +3207,7 @@ private:
 \r
   UINT8               _GET_CURRQEST_DATATYPE ();\r
   UINT32              _GET_CURRQEST_VARSIZE ();\r
+  UINT32              _GET_CURRQEST_ARRAY_SIZE();\r
 \r
 public:\r
   VOID                _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CHAR8 *);\r
@@ -3090,7 +3233,6 @@ public:
 \r
   VOID                _STRCAT (IN OUT CHAR8 **, IN CHAR8 *);\r
 \r
-  VOID                _CRGUID (EFI_GUID *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *);\r
   VOID                _DeclareDefaultLinearVarStore (IN UINT32);\r
   VOID                _DeclareStandardDefaultStorage (IN UINT32);\r
   VOID                _DeclareDefaultFrameworkVarStore (IN UINT32);\r
@@ -3173,6 +3315,37 @@ EfiVfrParser::_GET_CURRQEST_VARTINFO (
   return mCurrQestVarInfo;\r
 }\r
 \r
+UINT32\r
+EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
+  VOID\r
+  )\r
+{\r
+  UINT8 Size = 1;\r
+\r
+  switch (mCurrQestVarInfo.mVarType) {\r
+  case EFI_IFR_TYPE_NUM_SIZE_8:\r
+    Size = 1;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_16:\r
+    Size = 2;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_32:\r
+    Size = 4;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_64:\r
+    Size = 8;\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+\r
+  return (mCurrQestVarInfo.mVarTotalSize / Size);\r
+}\r
+\r
 UINT8\r
 EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
   VOID\r
@@ -3490,35 +3663,6 @@ EfiVfrParser::_STRCAT (
   *Dest = NewStr;\r
 }\r
 \r
-VOID\r
-EfiVfrParser::_CRGUID (\r
-  IN EFI_GUID *Guid,\r
-  IN CHAR8    *G1,\r
-  IN CHAR8    *G2,\r
-  IN CHAR8    *G3,\r
-  IN CHAR8    *G4,\r
-  IN CHAR8    *G5,\r
-  IN CHAR8    *G6,\r
-  IN CHAR8    *G7,\r
-  IN CHAR8    *G8,\r
-  IN CHAR8    *G9,\r
-  IN CHAR8    *G10,\r
-  IN CHAR8    *G11\r
-  )\r
-{\r
-  Guid->Data1 = _STOU32 (G1);\r
-  Guid->Data2 = _STOU16 (G2);\r
-  Guid->Data3 = _STOU16 (G3);\r
-  Guid->Data4[0] = _STOU8(G4);\r
-  Guid->Data4[1] = _STOU8(G5);\r
-  Guid->Data4[2] = _STOU8(G6);\r
-  Guid->Data4[3] = _STOU8(G7);\r
-  Guid->Data4[4] = _STOU8(G8);\r
-  Guid->Data4[5] = _STOU8(G9);\r
-  Guid->Data4[6] = _STOU8(G10);\r
-  Guid->Data4[7] = _STOU8(G11);\r
-}\r
-\r
 //\r
 // framework vfr to default declare varstore for each structure\r
 //\r