#token Inventory("inventory") "inventory"\r
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"\r
#token Struct("struct") "struct"\r
+#token Union("union") "union"\r
#token Boolean("BOOLEAN") "BOOLEAN"\r
#token Uint64("UINT64") "UINT64"\r
#token Uint32("UINT32") "UINT32"\r
(\r
vfrPragmaPackDefinition\r
| vfrDataStructDefinition\r
+ | vfrDataUnionDefinition\r
)*\r
vfrFormSetDefinition\r
<< $Return = mParserStatus; >>\r
"\)"\r
;\r
\r
+ vfrDataUnionDefinition :\r
+ { TypeDef } Union << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
+ { NonNvDataMap }\r
+ {\r
+ N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
+ }\r
+ OpenBrace\r
+ vfrDataStructFields[TRUE]\r
+ CloseBrace\r
+ {\r
+ N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
+ }\r
+ ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>\r
+ ;\r
+\r
vfrDataStructDefinition :\r
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
{ NonNvDataMap }\r
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
}\r
OpenBrace\r
- vfrDataStructFields\r
+ vfrDataStructFields[FALSE]\r
CloseBrace\r
{\r
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r
;\r
\r
-vfrDataStructFields :\r
+vfrDataStructFields [BOOLEAN FieldInUnion]:\r
(\r
- dataStructField64 |\r
- dataStructField32 |\r
- dataStructField16 |\r
- dataStructField8 |\r
- dataStructFieldBool |\r
- dataStructFieldString |\r
- dataStructFieldDate |\r
- dataStructFieldTime |\r
- dataStructFieldRef |\r
- dataStructFieldUser\r
+ dataStructField64 [FieldInUnion] |\r
+ dataStructField32 [FieldInUnion] |\r
+ dataStructField16 [FieldInUnion] |\r
+ dataStructField8 [FieldInUnion] |\r
+ dataStructFieldBool [FieldInUnion] |\r
+ dataStructFieldString [FieldInUnion]|\r
+ dataStructFieldDate [FieldInUnion] |\r
+ dataStructFieldTime [FieldInUnion] |\r
+ dataStructFieldRef [FieldInUnion] |\r
+ dataStructFieldUser [FieldInUnion]\r
)*\r
;\r
\r
-dataStructField64 :\r
+dataStructField64 [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"UINT64"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructField32 :\r
+dataStructField32 [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"UINT32"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructField16 :\r
+dataStructField16 [BOOLEAN FieldInUnion]:\r
<< \r
UINT32 ArrayNum = 0; \r
>>\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructField8 :\r
+dataStructField8 [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"UINT8"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldBool :\r
+dataStructFieldBool [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"BOOLEAN"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldString :\r
+dataStructFieldString [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_STRING_ID"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldDate :\r
+dataStructFieldDate [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_HII_DATE"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldTime :\r
+dataStructFieldTime [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_HII_TIME"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldRef :\r
+dataStructFieldRef [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_HII_REF"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldUser :\r
+dataStructFieldUser [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
T:StringIdentifier\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>\r
;\r
\r
//*****************************************************************************\r
\r
Vfr common library functions.\r
\r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, 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
CVfrVarDataTypeDB::DataTypeAddField (\r
IN CHAR8 *FieldName,\r
IN CHAR8 *TypeName,\r
- IN UINT32 ArrayNum\r
+ IN UINT32 ArrayNum,\r
+ IN BOOLEAN FieldInUnion\r
)\r
{\r
SVfrDataField *pNewField = NULL;\r
SVfrDataType *pFieldType = NULL;\r
SVfrDataField *pTmp;\r
UINT32 Align;\r
+ UINT32 MaxDataTypeSize;\r
\r
CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
+ MaxDataTypeSize = mNewDataType->mTotalSize;\r
\r
if (strlen (FieldName) >= MAX_NAME_LEN) {\r
return VFR_RETURN_INVALID_PARAMETER;\r
}\r
\r
mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
- mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
+\r
+ if (FieldInUnion) {\r
+ if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {\r
+ mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;\r
+ }\r
+ pNewField->mOffset = 0;\r
+ } else {\r
+ mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
+ }\r
\r
return VFR_RETURN_SUCCESS;\r
}\r