BaseTool/VfrCompile: Support Union type in VFR
https://bugzilla.tianocore.org/show_bug.cgi?id=603 Update VfrCompiler to parse the UNION type in vfr file Cc: Eric Dong <eric.dong@intel.com> Cc: Liming Gao <liming.gao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@ -157,6 +157,7 @@ VfrParserStart (
|
|||||||
#token Inventory("inventory") "inventory"
|
#token Inventory("inventory") "inventory"
|
||||||
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
|
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
|
||||||
#token Struct("struct") "struct"
|
#token Struct("struct") "struct"
|
||||||
|
#token Union("union") "union"
|
||||||
#token Boolean("BOOLEAN") "BOOLEAN"
|
#token Boolean("BOOLEAN") "BOOLEAN"
|
||||||
#token Uint64("UINT64") "UINT64"
|
#token Uint64("UINT64") "UINT64"
|
||||||
#token Uint32("UINT32") "UINT32"
|
#token Uint32("UINT32") "UINT32"
|
||||||
@ -272,6 +273,7 @@ vfrProgram > [UINT8 Return] :
|
|||||||
(
|
(
|
||||||
vfrPragmaPackDefinition
|
vfrPragmaPackDefinition
|
||||||
| vfrDataStructDefinition
|
| vfrDataStructDefinition
|
||||||
|
| vfrDataUnionDefinition
|
||||||
)*
|
)*
|
||||||
vfrFormSetDefinition
|
vfrFormSetDefinition
|
||||||
<< $Return = mParserStatus; >>
|
<< $Return = mParserStatus; >>
|
||||||
@ -320,6 +322,21 @@ vfrPragmaPackDefinition :
|
|||||||
"\)"
|
"\)"
|
||||||
;
|
;
|
||||||
|
|
||||||
|
vfrDataUnionDefinition :
|
||||||
|
{ TypeDef } Union << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
|
||||||
|
{ NonNvDataMap }
|
||||||
|
{
|
||||||
|
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
|
||||||
|
}
|
||||||
|
OpenBrace
|
||||||
|
vfrDataStructFields[TRUE]
|
||||||
|
CloseBrace
|
||||||
|
{
|
||||||
|
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
|
||||||
|
}
|
||||||
|
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>
|
||||||
|
;
|
||||||
|
|
||||||
vfrDataStructDefinition :
|
vfrDataStructDefinition :
|
||||||
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
|
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
|
||||||
{ NonNvDataMap }
|
{ NonNvDataMap }
|
||||||
@ -327,7 +344,7 @@ vfrDataStructDefinition :
|
|||||||
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
|
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
|
||||||
}
|
}
|
||||||
OpenBrace
|
OpenBrace
|
||||||
vfrDataStructFields
|
vfrDataStructFields[FALSE]
|
||||||
CloseBrace
|
CloseBrace
|
||||||
{
|
{
|
||||||
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
|
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
|
||||||
@ -335,42 +352,42 @@ vfrDataStructDefinition :
|
|||||||
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
|
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
vfrDataStructFields :
|
vfrDataStructFields [BOOLEAN FieldInUnion]:
|
||||||
(
|
(
|
||||||
dataStructField64 |
|
dataStructField64 [FieldInUnion] |
|
||||||
dataStructField32 |
|
dataStructField32 [FieldInUnion] |
|
||||||
dataStructField16 |
|
dataStructField16 [FieldInUnion] |
|
||||||
dataStructField8 |
|
dataStructField8 [FieldInUnion] |
|
||||||
dataStructFieldBool |
|
dataStructFieldBool [FieldInUnion] |
|
||||||
dataStructFieldString |
|
dataStructFieldString [FieldInUnion]|
|
||||||
dataStructFieldDate |
|
dataStructFieldDate [FieldInUnion] |
|
||||||
dataStructFieldTime |
|
dataStructFieldTime [FieldInUnion] |
|
||||||
dataStructFieldRef |
|
dataStructFieldRef [FieldInUnion] |
|
||||||
dataStructFieldUser
|
dataStructFieldUser [FieldInUnion]
|
||||||
)*
|
)*
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructField64 :
|
dataStructField64 [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"UINT64"
|
D:"UINT64"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructField32 :
|
dataStructField32 [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"UINT32"
|
D:"UINT32"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructField16 :
|
dataStructField16 [BOOLEAN FieldInUnion]:
|
||||||
<<
|
<<
|
||||||
UINT32 ArrayNum = 0;
|
UINT32 ArrayNum = 0;
|
||||||
>>
|
>>
|
||||||
@ -379,77 +396,77 @@ dataStructField16 :
|
|||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructField8 :
|
dataStructField8 [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"UINT8"
|
D:"UINT8"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructFieldBool :
|
dataStructFieldBool [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"BOOLEAN"
|
D:"BOOLEAN"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructFieldString :
|
dataStructFieldString [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"EFI_STRING_ID"
|
D:"EFI_STRING_ID"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructFieldDate :
|
dataStructFieldDate [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"EFI_HII_DATE"
|
D:"EFI_HII_DATE"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructFieldTime :
|
dataStructFieldTime [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"EFI_HII_TIME"
|
D:"EFI_HII_TIME"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructFieldRef :
|
dataStructFieldRef [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
D:"EFI_HII_REF"
|
D:"EFI_HII_REF"
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
dataStructFieldUser :
|
dataStructFieldUser [BOOLEAN FieldInUnion]:
|
||||||
<< UINT32 ArrayNum = 0; >>
|
<< UINT32 ArrayNum = 0; >>
|
||||||
T:StringIdentifier
|
T:StringIdentifier
|
||||||
N:StringIdentifier
|
N:StringIdentifier
|
||||||
{
|
{
|
||||||
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
|
||||||
}
|
}
|
||||||
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>
|
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>
|
||||||
;
|
;
|
||||||
|
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Vfr common library functions.
|
Vfr common library functions.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -1013,15 +1013,18 @@ EFI_VFR_RETURN_CODE
|
|||||||
CVfrVarDataTypeDB::DataTypeAddField (
|
CVfrVarDataTypeDB::DataTypeAddField (
|
||||||
IN CHAR8 *FieldName,
|
IN CHAR8 *FieldName,
|
||||||
IN CHAR8 *TypeName,
|
IN CHAR8 *TypeName,
|
||||||
IN UINT32 ArrayNum
|
IN UINT32 ArrayNum,
|
||||||
|
IN BOOLEAN FieldInUnion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
SVfrDataField *pNewField = NULL;
|
SVfrDataField *pNewField = NULL;
|
||||||
SVfrDataType *pFieldType = NULL;
|
SVfrDataType *pFieldType = NULL;
|
||||||
SVfrDataField *pTmp;
|
SVfrDataField *pTmp;
|
||||||
UINT32 Align;
|
UINT32 Align;
|
||||||
|
UINT32 MaxDataTypeSize;
|
||||||
|
|
||||||
CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);
|
CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);
|
||||||
|
MaxDataTypeSize = mNewDataType->mTotalSize;
|
||||||
|
|
||||||
if (strlen (FieldName) >= MAX_NAME_LEN) {
|
if (strlen (FieldName) >= MAX_NAME_LEN) {
|
||||||
return VFR_RETURN_INVALID_PARAMETER;
|
return VFR_RETURN_INVALID_PARAMETER;
|
||||||
@ -1057,7 +1060,15 @@ CVfrVarDataTypeDB::DataTypeAddField (
|
|||||||
}
|
}
|
||||||
|
|
||||||
mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));
|
mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));
|
||||||
mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);
|
|
||||||
|
if (FieldInUnion) {
|
||||||
|
if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {
|
||||||
|
mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;
|
||||||
|
}
|
||||||
|
pNewField->mOffset = 0;
|
||||||
|
} else {
|
||||||
|
mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);
|
||||||
|
}
|
||||||
|
|
||||||
return VFR_RETURN_SUCCESS;
|
return VFR_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Vfr common library functions.
|
Vfr common library functions.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -205,7 +205,7 @@ public:
|
|||||||
|
|
||||||
VOID DeclareDataTypeBegin (VOID);
|
VOID DeclareDataTypeBegin (VOID);
|
||||||
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
|
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
|
||||||
EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32);
|
EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32, IN BOOLEAN);
|
||||||
VOID DeclareDataTypeEnd (VOID);
|
VOID DeclareDataTypeEnd (VOID);
|
||||||
|
|
||||||
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
|
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
|
||||||
|
Reference in New Issue
Block a user