]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync BaseTools Branch (version r2149) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index fc0215134dad408ac7ffb3154c787f3a3623be34..02a7b5c1f4382752f44efb6b64afcd56e0fbcfb8 100644 (file)
@@ -1,5 +1,5 @@
 /*++\r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -233,6 +233,11 @@ VfrParserStart (
 #token Refresh("refresh")                       "refresh"\r
 #token Interval("interval")                     "interval"\r
 #token VarstoreDevice("varstoredevice")         "varstoredevice"\r
+#token GuidOp("guidop")                         "guidop"\r
+#token EndGuidOp("endguidop")                   "endguidop"\r
+#token DataType("datatype")                     "datatype"\r
+#token Data("data")                             "data"\r
+\r
 //\r
 // Define the class and subclass tokens\r
 //\r
@@ -559,10 +564,195 @@ vfrFormSetList :
     vfrStatementVarStoreNameValue |\r
     vfrStatementDefaultStore      |\r
     vfrStatementDisableIfFormSet  |\r
-    vfrStatementSuppressIfFormSet\r
+    vfrStatementSuppressIfFormSet |\r
+    vfrStatementExtension\r
   )*\r
   ;\r
 \r
+vfrStatementExtension:\r
+  << \r
+     EFI_GUID Guid;\r
+     CIfrGuid *GuidObj = NULL;\r
+     CHAR8    *TypeName = NULL;\r
+     UINT32   TypeSize = 0;\r
+     UINT8    *DataBuff = NULL;\r
+     UINT32   Size = 0;\r
+     UINT8    Idx = 0;\r
+     UINT32   LineNum;\r
+     BOOLEAN  IsStruct = FALSE;\r
+     UINT32   ArrayNum = 0;\r
+  >>\r
+  L:GuidOp\r
+  Uuid "=" guidDefinition[Guid]\r
+  {"," DataType "=" \r
+    (\r
+        U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText());>>}\r
+                                                      << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+      | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText());>>}\r
+                                                      << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+      | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText());>>}\r
+                                                      << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+      | U8:"UINT8"   {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText());>>}\r
+                                                      << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+      | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText());>>}\r
+                                                      << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
+      | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText());>>}\r
+                                                      << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
+      | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText());>>}\r
+                                                      << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
+      | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText());>>}\r
+                                                      << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
+      | TN:StringIdentifier {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText());>>}\r
+                                                      << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>\r
+    )\r
+                                                      <<\r
+                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);\r
+                                                        if (ArrayNum > 0) {\r
+                                                          Size = TypeSize*ArrayNum;\r
+                                                        } else {\r
+                                                          Size = TypeSize;\r
+                                                        }\r
+                                                        if (Size > (128 - sizeof (EFI_IFR_GUID))) return;\r
+                                                        DataBuff = (UINT8 *)malloc(Size);\r
+                                                        for (Idx = 0; Idx < Size; Idx++) {\r
+                                                          DataBuff[Idx] = 0;\r
+                                                        }\r
+                                                      >>\r
+    vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]\r
+  }\r
+                                                      <<\r
+                                                        {\r
+                                                         GuidObj = new CIfrGuid(Size);\r
+                                                         if (GuidObj != NULL) {\r
+                                                           GuidObj->SetLineNo(L->getLine());\r
+                                                           GuidObj->SetGuid (&Guid);\r
+                                                         }\r
+                                                        }\r
+                                                        if (TypeName != NULL) {\r
+                                                          GuidObj->SetData(DataBuff, Size);\r
+                                                        }\r
+                                                      >>\r
+  {","\r
+    (\r
+      vfrStatementExtension\r
+    )*\r
+  E:EndGuidOp                                         << GuidObj->SetScope(1); CRT_END_OP (E); >>\r
+  }\r
+                                                      <<\r
+                                                         if (GuidObj != NULL) delete GuidObj;\r
+                                                         if (DataBuff != NULL) free(DataBuff);\r
+                                                      >>\r
+  ";"\r
+;\r
+\r
+vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:\r
+  <<\r
+     CHAR8    *TFName = NULL;\r
+     UINT32   ArrayIdx = 0;\r
+     UINT16   FieldOffset;\r
+     UINT8    FieldType;\r
+     UINT32   FieldSize;\r
+     UINT64   Data_U64 = 0;\r
+     UINT32   Data_U32 = 0;\r
+     UINT16   Data_U16 = 0;\r
+     UINT8    Data_U8 = 0;\r
+     BOOLEAN  Data_BL = 0;\r
+     EFI_STRING_ID Data_SID = 0;\r
+     BOOLEAN  IsArray = FALSE;\r
+     UINT8    *ByteOffset = NULL;\r
+  >>\r
+(\r
+  ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
+          <<\r
+            ArrayIdx = 0;\r
+            if (IsArray == TRUE) {\r
+              ArrayIdx = _STOU8(IDX1->getText());\r
+              if (ArrayIdx >= ArrayNum) return;\r
+              IsArray = FALSE;\r
+            }\r
+            ByteOffset = DataBuff + (ArrayIdx * TypeSize);\r
+            if (IsStruct == TRUE) {\r
+              _STRCAT(&TFName, TypeName);\r
+            }\r
+          >>\r
+    ("." FN:StringIdentifier\r
+          <<\r
+            if (IsStruct == TRUE) {\r
+              _STRCAT(&TFName, ".");\r
+              _STRCAT(&TFName, FN->getText());\r
+            }\r
+          >>\r
+        {\r
+          OpenBracket IDX2:Number CloseBracket\r
+            <<\r
+              if (IsStruct == TRUE) {\r
+                _STRCAT(&TFName, "[");\r
+                _STRCAT(&TFName, IDX2->getText());\r
+                _STRCAT(&TFName, "]");\r
+              }\r
+            >>\r
+        }\r
+    )*\r
+    "=" RD:Number\r
+          <<\r
+            if (IsStruct == FALSE) {\r
+              if (strcmp ("UINT64", TypeName) == 0) {\r
+                Data_U64 = _STOU64(RD->getText());\r
+                memcpy (ByteOffset, &Data_U64, TypeSize);\r
+              }else if (strcmp ("UINT32", TypeName) == 0) {\r
+                Data_U32 = _STOU32(RD->getText());\r
+                memcpy (ByteOffset, &Data_U32, TypeSize);                                                    \r
+              }else if (strcmp ("UINT16", TypeName) == 0) {\r
+                Data_U16 = _STOU16(RD->getText());\r
+                memcpy (ByteOffset, &Data_U16, TypeSize);                                                    \r
+              }else if (strcmp ("UINT8", TypeName) == 0) {\r
+                Data_U8 = _STOU8(RD->getText());\r
+                memcpy (ByteOffset, &Data_U8, TypeSize);                                                    \r
+              }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
+                Data_BL = _STOU8(RD->getText());\r
+                memcpy (ByteOffset, &Data_BL, TypeSize);                                                    \r
+              }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
+                Data_SID = _STOSID(RD->getText());\r
+                memcpy (ByteOffset, &Data_SID, TypeSize);                                                    \r
+              }\r
+            } else {\r
+              gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
+              switch (FieldType) {\r
+              case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                 Data_U8 = _STOU8(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                 Data_U16 = _STOU16(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                 Data_U32 = _STOU32(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                 Data_U64 = _STOU64(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_BOOLEAN:\r
+                 Data_BL = _STOU8(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
+                 break;\r
+              case EFI_IFR_TYPE_STRING:\r
+                 Data_SID = _STOSID(RD->getText());\r
+                 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);\r
+                 break;\r
+              default:\r
+                 break;\r
+              }\r
+            }\r
+            if (TFName != NULL) { delete TFName; TFName = NULL; }\r
+          >>\r
+  )*\r
+)\r
+;\r
+\r
+\r
 vfrStatementDefaultStore :\r
   << UINT16  DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
   D:DefaultStore N:StringIdentifier ","\r
@@ -1060,7 +1250,8 @@ vfrFormDefinition :
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
     // Just for framework vfr compatibility\r
-    vfrStatementInvalid\r
+    vfrStatementInvalid                      |\r
+    vfrStatementExtension\r
   )*\r
   E:EndForm                                         <<\r
                                                       if (mCompatibleMode) {\r
@@ -1118,7 +1309,8 @@ vfrFormMapDefinition :
     vfrStatementQuestions                    |\r
     vfrStatementConditional                  |\r
     vfrStatementLabel                        |\r
-    vfrStatementBanner\r
+    vfrStatementBanner                       |\r
+    vfrStatementExtension\r
   )*\r
   E:EndForm                                         << CRT_END_OP (E); >>\r
   ";"\r
@@ -2146,7 +2338,8 @@ vfrStatementQuestionTag :
   vfrStatementNoSubmitIf        |\r
   vfrStatementDisableIfQuest    |\r
   vfrStatementRefresh           |\r
-  vfrStatementVarstoreDevice\r
+  vfrStatementVarstoreDevice    |\r
+  vfrStatementExtension\r
   ;\r
 \r
 vfrStatementQuestionTagList :\r
@@ -2175,6 +2368,7 @@ vfrStatementStatList :
   vfrStatementQuestions                   |\r
   vfrStatementConditionalNew              |\r
   vfrStatementLabel                       |\r
+  vfrStatementExtension                   |\r
   // Just for framework vfr compatibility\r
   vfrStatementInvalid\r
   ;\r