]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools: Enable buffer type value for default and oneofoption opcode.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 8e9f32b81598047386ecca16a348d6c39cc6f7fa..891effad79efb750da9b2b0718e0a7081d01b286 100644 (file)
@@ -1,7 +1,7 @@
 /*++ @file\r
 Vfr Syntax\r
 \r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2015, 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
@@ -1393,9 +1393,15 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
   )\r
   ;\r
 \r
-vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
-  <<\r
+vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
+  <<  \r
     EFI_GUID Guid;\r
+    UINT8    *Type8  = (UINT8  *) &Value;\r
+    UINT16   *Type16 = (UINT16 *) &Value;\r
+    UINT32   *Type32 = (UINT32 *) &Value;\r
+    UINT64   *Type64 = (UINT64 *) &Value;\r
+    UINT16   Index = 0;\r
+    ListType = FALSE;\r
   >>\r
     N1:Number                                       <<\r
                                                        switch ($Type) {\r
@@ -1434,6 +1440,49 @@ vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
   | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
                                                     << $Value.ref    = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
   | "STRING_TOKEN" "\(" S1:Number "\)"              << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
+  | "\{"                                            << ListType = TRUE; >>\r
+      L1:Number                                     << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      (\r
+        "," \r
+        L2:Number                                   << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      )*\r
+    "\}"                                           \r
   ;\r
 \r
 //*****************************************************************************\r
@@ -1527,7 +1576,8 @@ vfrStatementRules :
 vfrStatementDefault :\r
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
-     EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
+     UINT64                ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE    *Val           = (EFI_IFR_TYPE_VALUE *) ValueList;\r
      CIfrDefault           *DObj         = NULL;\r
      CIfrDefault2          *DObj2        = NULL;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
@@ -1535,29 +1585,70 @@ vfrStatementDefault :
      EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
      UINT32                Size          = 0;\r
      EFI_GUID              *VarGuid      = NULL;\r
+     BOOLEAN               ArrayType     = FALSE;\r
+     UINT8                 *Type8        = (UINT8  *) ValueList;\r
+     UINT16                *Type16       = (UINT16 *) ValueList;\r
+     UINT32                *Type32       = (UINT32 *) ValueList;\r
+     UINT64                *Type64       = (UINT64 *) ValueList;\r
+\r
   >>\r
   D:Default                                         \r
   (\r
     (\r
-      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  \r
+      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","  \r
                                                     << \r
                                                         if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
                                                           //check default value is valid for Numeric Opcode\r
-                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+                                                          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
                                                         if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
                                                           _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
                                                           Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                        } else if (ArrayType) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                              while (Type8[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                              while (Type16[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT16);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                              while (Type32[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT32);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                              while (Type64[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT64);\r
+                                                              break;\r
+\r
+                                                            default:\r
+                                                              break;\r
+                                                          }\r
                                                         } else {\r
                                                           _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
                                                         }\r
                                                         Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
                                                         DObj = new CIfrDefault ((UINT8)Size);\r
                                                         DObj->SetLineNo(D->getLine());\r
-                                                        DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                        DObj->SetValue(Val);\r
+                                                        if (ArrayType) {\r
+                                                          DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+                                                        } else {\r
+                                                          DObj->SetType (_GET_CURRQEST_DATATYPE());\r
+                                                        }\r
+                                                        DObj->SetValue(*Val);\r
                                                     >>\r
       |                                             << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
         vfrStatementValue ","                       << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
@@ -1587,9 +1678,9 @@ vfrStatementDefault :
                                                                    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
@@ -2565,7 +2656,7 @@ vfrStatementOrderedList :
      CIfrOrderedList OLObj;\r
      UINT32 VarArraySize;\r
   >>\r
-  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
+  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
   vfrQuestionHeader[OLObj] ","\r
                                                        << \r
                                                           VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
@@ -2583,7 +2674,7 @@ vfrStatementOrderedList :
   }\r
   { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
   vfrStatementQuestionOptionList\r
-  E:EndList                                            << CRT_END_OP (E); >>\r
+  E:EndList                                            << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
   ";"\r
   ;\r
 \r
@@ -2975,64 +3066,117 @@ vfrStatementOptions :
 \r
 vfrStatementOneOfOption :\r
   <<\r
-     EFI_IFR_TYPE_VALUE Val           = gZeroEfiIfrTypeValue;\r
+     UINT8              ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE *Val          = (EFI_IFR_TYPE_VALUE *) ValueList;\r
      CHAR8              *VarStoreName = NULL;\r
      UINT32             Size          = 0;\r
      BOOLEAN            TypeError     = FALSE;\r
      EFI_VFR_RETURN_CODE ReturnCode   = VFR_RETURN_SUCCESS;\r
      EFI_GUID           *VarStoreGuid = NULL;\r
-     \r
-     if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
-       TypeError = TRUE;\r
-       Size = sizeof (EFI_IFR_TYPE_VALUE);\r
-     } else {\r
-       ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
-     }\r
-\r
-     Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
-     CIfrOneOfOption    OOOObj ((UINT8)Size);\r
+     BOOLEAN            ArrayType     = FALSE;\r
+     CIfrOneOfOption    *OOOObj;\r
+     UINT8              *Type8        = (UINT8  *) ValueList;\r
+     UINT16             *Type16       = (UINT16 *) ValueList;\r
+     UINT32             *Type32       = (UINT32 *) ValueList;\r
+     UINT64             *Type64       = (UINT64 *) ValueList;\r
   >>\r
   L:Option                                             <<      \r
-                                                          OOOObj.SetLineNo(L->getLine());\r
-                                                          if (TypeError) {\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
                                                             _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
                                                           }\r
-                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
-                                                            _PCATCH (ReturnCode, L->getLine());\r
-                                                          }\r
+\r
                                                        >>\r
-  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \r
+  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      \r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
                                                        << \r
                                                           if (gCurrentMinMaxData != NULL) {\r
                                                             //set min/max value for oneof opcode\r
                                                             UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
                                                             switch (_GET_CURRQEST_DATATYPE()) {\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
                                                               break;\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
                                                               break;\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
                                                               break;\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
                                                               break;\r
                                                             default:\r
                                                               break;\r
                                                             }\r
                                                           }\r
-                                                          OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                          OOOObj.SetValue (Val); \r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                          } else if (ArrayType) {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                                 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                               while (Type8[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                               while (Type16[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT16);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                               while (Type32[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT32);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                               while (Type64[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT64);\r
+                                                               break;\r
+                                                             default:\r
+                                                               break;\r
+                                                            }\r
+                                                          } else {\r
+                                                            ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+                                                          }\r
+                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+                                                            _PCATCH (ReturnCode, L->getLine());\r
+                                                          }\r
+\r
+                                                          Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+                                                          OOOObj = new CIfrOneOfOption((UINT8)Size);\r
+                                                          OOOObj->SetLineNo(L->getLine());\r
+                                                          OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
+                                                          if (ArrayType) {\r
+                                                            OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
+                                                          } else {\r
+                                                            OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                          }\r
+                                                          OOOObj->SetValue (*Val); \r
                                                        >>\r
-  F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+  F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
                                                        <<\r
+                                                          //\r
+                                                          // Array type only for default type OneOfOption.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
+                                                          }\r
+\r
+                                                          //\r
+                                                          // Clear the default flag if the option not use array value but has default flag.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
+                                                            OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
+                                                          }\r
+\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
                                                             _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
                                                             VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                            if (OOOObj.GetFlags () & 0x10) {\r
+                                                            if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
                                                               _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_STANDARD,\r
@@ -3040,10 +3184,10 @@ vfrStatementOneOfOption :
                                                                         VarStoreName,\r
                                                                         VarStoreGuid,\r
                                                                         _GET_CURRQEST_DATATYPE (),\r
-                                                                        Val\r
+                                                                        *Val\r
                                                                         ), L->getLine());\r
                                                             }\r
-                                                            if (OOOObj.GetFlags () & 0x20) {\r
+                                                            if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
                                                               _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
@@ -3051,7 +3195,7 @@ vfrStatementOneOfOption :
                                                                         VarStoreName,\r
                                                                         VarStoreGuid,\r
                                                                         _GET_CURRQEST_DATATYPE (),\r
-                                                                        Val\r
+                                                                        *Val\r
                                                                         ), L->getLine());\r
                                                             }\r
                                                           }\r
@@ -3066,16 +3210,16 @@ vfrStatementOneOfOption :
                                                          //\r
                                                          CIfrOptionKey IfrOptionKey (\r
                                                                          gCurrentQuestion->QUESTION_ID(),\r
-                                                                         Val,\r
+                                                                         *Val,\r
                                                                          _STOQID(KN->getText(), KN->getLine())\r
                                                                          );\r
                                                          SET_LINE_INFO (IfrOptionKey, KN);\r
                                                        >>\r
   }\r
   (\r
-    T:"," vfrImageTag                                  << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
+    T:"," vfrImageTag                                  << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
   )*\r
-  ";"\r
+  ";"                                                  << if (OOOObj != NULL) {delete OOOObj;} >>\r
   ;\r
 \r
 vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r