+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(), AN1->getLine());>>}\r
+ << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+ | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText(), AN2->getLine());>>}\r
+ << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+ | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText(), AN3->getLine());>>}\r
+ << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+ | U8:"UINT8" {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText(), AN4->getLine());>>}\r
+ << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+ | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText(), AN5->getLine());>>}\r
+ << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
+ | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText(), AN6->getLine());>>}\r
+ << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
+ | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText(), AN7->getLine());>>}\r
+ << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
+ | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>}\r
+ << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
+ | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>}\r
+ << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> \r
+ | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>}\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
+ BOOLEAN BitField = FALSE;\r
+ UINT64 Value;\r
+ UINT64 Mask;\r
+ UINT16 Offset;\r
+ UINT8 PreBits;\r
+ >>\r
+(\r
+ ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
+ <<\r
+ ArrayIdx = 0;\r
+ if (IsArray == TRUE) {\r
+ ArrayIdx = _STOU8(IDX1->getText(), IDX1->getLine());\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(), RD->getLine());\r
+ memcpy (ByteOffset, &Data_U64, TypeSize);\r
+ }else if (strcmp ("UINT32", TypeName) == 0) {\r
+ Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
+ memcpy (ByteOffset, &Data_U32, TypeSize); \r
+ }else if (strcmp ("UINT16", TypeName) == 0) {\r
+ Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
+ memcpy (ByteOffset, &Data_U16, TypeSize); \r
+ }else if (strcmp ("UINT8", TypeName) == 0) {\r
+ Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
+ memcpy (ByteOffset, &Data_U8, TypeSize); \r
+ }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
+ Data_BL = _STOU8(RD->getText(), RD->getLine());\r
+ memcpy (ByteOffset, &Data_BL, TypeSize); \r
+ }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
+ Data_SID = _STOSID(RD->getText(), RD->getLine());\r
+ memcpy (ByteOffset, &Data_SID, TypeSize); \r
+ }\r
+ } else {\r
+ gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize, BitField);\r
+ if (BitField) {\r
+ Mask = (1 << FieldSize) - 1;\r
+ Offset = FieldOffset / 8;\r
+ PreBits = FieldOffset % 8;\r
+ Mask <<= PreBits;\r
+ }\r
+ switch (FieldType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT8*) (ByteOffset + Offset);\r
+ Data_U8 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U8;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT8));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT16*) (ByteOffset + Offset);\r
+ Data_U16 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U16;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT16));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT32*) (ByteOffset + Offset);\r
+ Data_U32 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U32;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT32));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT64*) (ByteOffset + Offset);\r
+ Data_U64 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U64;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT64));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_BOOLEAN:\r
+ Data_BL = _STOU8(RD->getText(), RD->getLine());\r
+ memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
+ break;\r
+ case EFI_IFR_TYPE_STRING:\r
+ Data_SID = _STOSID(RD->getText(), RD->getLine());\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