From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 57BE121EA35D6 for ; Mon, 4 Sep 2017 22:03:07 -0700 (PDT) Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Sep 2017 22:05:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,478,1498546800"; d="scan'208";a="147494789" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga005.fm.intel.com with ESMTP; 04 Sep 2017 22:05:53 -0700 Received: from fmsmsx126.amr.corp.intel.com (10.18.125.43) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 4 Sep 2017 22:05:51 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX126.amr.corp.intel.com (10.18.125.43) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 4 Sep 2017 22:05:51 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.39]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.219]) with mapi id 14.03.0319.002; Tue, 5 Sep 2017 13:05:33 +0800 From: "Dong, Eric" To: "Bi, Dandan" , "edk2-devel@lists.01.org" CC: "Gao, Liming" Thread-Topic: [patch 1/6] BaseTool/VfrCompile: Support Union type in VFR Thread-Index: AQHTJU3RwnXMr/v3vEC7fZ3JaWZeDKKlvn5Q Date: Tue, 5 Sep 2017 05:05:32 +0000 Message-ID: References: <1504509388-369768-1-git-send-email-dandan.bi@intel.com> <1504509388-369768-2-git-send-email-dandan.bi@intel.com> In-Reply-To: <1504509388-369768-2-git-send-email-dandan.bi@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [patch 1/6] BaseTool/VfrCompile: Support Union type in VFR X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Sep 2017 05:03:07 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Eric Dong -----Original Message----- From: Bi, Dandan=20 Sent: Monday, September 4, 2017 3:16 PM To: edk2-devel@lists.01.org Cc: Dong, Eric ; Gao, Liming Subject: [patch 1/6] BaseTool/VfrCompile: Support Union type in VFR https://bugzilla.tianocore.org/show_bug.cgi?id=3D603 Update VfrCompiler to parse the UNION type in vfr file Cc: Eric Dong Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Dandan Bi --- BaseTools/Source/C/VfrCompile/VfrSyntax.g | 81 +++++++++++++++------= ---- BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp | 17 +++++- BaseTools/Source/C/VfrCompile/VfrUtilityLib.h | 4 +- 3 files changed, 65 insertions(+), 37 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C= /VfrCompile/VfrSyntax.g index 406dbc5..24e0538 100644 --- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g +++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g @@ -155,10 +155,11 @@ VfrParserStart ( #token Label("label") "label" #token Timeout("timeout") "timeout" #token Inventory("inventory") "inventory" #token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP" #token Struct("struct") "struct" +#token Union("union") "union" #token Boolean("BOOLEAN") "BOOLEAN" #token Uint64("UINT64") "UINT64" #token Uint32("UINT32") "UINT32" #token Uint16("UINT16") "UINT16" #token Char16("CHAR16") "CHAR16" @@ -270,10 +271,11 @@ vfrProgram > [UINT8 Return] : mConstantOnlyInExpression =3D FALSE; >> ( vfrPragmaPackDefinition | vfrDataStructDefinition + | vfrDataUnionDefinition )* vfrFormSetDefinition << $Return =3D mParserStatus; >> ; =20 @@ -318,140 +320,155 @@ vfrPragmaPackDefinition : | pragmaPackNumber } "\)" ; =20 + vfrDataUnionDefinition : + { TypeDef } Union << gCVfrVarDataTypeDB.D= eclareDataTypeBegin (); >> + { NonNvDataMap } + { + N1:StringIdentifier << _PCATCH(gCVfrVarDat= aTypeDB.SetNewTypeName (N1->getText()), N1); >> + } + OpenBrace + vfrDataStructFields[TRUE] + CloseBrace + { + N2:StringIdentifier << _PCATCH(gCVfrVarDat= aTypeDB.SetNewTypeName (N2->getText()), N2); >> + } + ";" << gCVfrVarDataTypeDB.= DeclareDataTypeEnd ();>> + ; + vfrDataStructDefinition : { TypeDef } Struct << gCVfrVarDataTypeDB.= DeclareDataTypeBegin (); >> { NonNvDataMap } { N1:StringIdentifier << _PCATCH(gCVfrVarDat= aTypeDB.SetNewTypeName (N1->getText()), N1); >> } OpenBrace - vfrDataStructFields + vfrDataStructFields[FALSE] CloseBrace { N2:StringIdentifier << _PCATCH(gCVfrVarDat= aTypeDB.SetNewTypeName (N2->getText()), N2); >> } ";" << gCVfrVarDataTypeDB.= DeclareDataTypeEnd (); >> ; =20 -vfrDataStructFields : +vfrDataStructFields [BOOLEAN FieldInUnion]: ( - dataStructField64 | - dataStructField32 | - dataStructField16 | - dataStructField8 | - dataStructFieldBool | - dataStructFieldString | - dataStructFieldDate | - dataStructFieldTime | - dataStructFieldRef | - dataStructFieldUser + dataStructField64 [FieldInUnion] | + dataStructField32 [FieldInUnion] | + dataStructField16 [FieldInUnion] | + dataStructField8 [FieldInUnion] | + dataStructFieldBool [FieldInUnion] | + dataStructFieldString [FieldInUnion]| + dataStructFieldDate [FieldInUnion] | + dataStructFieldTime [FieldInUnion] | + dataStructFieldRef [FieldInUnion] | + dataStructFieldUser [FieldInUnion] )* ; =20 -dataStructField64 : +dataStructField64 [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"UINT64" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructField32 : +dataStructField32 [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"UINT32" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructField16 : +dataStructField16 [BOOLEAN FieldInUnion]: <<=20 UINT32 ArrayNum =3D 0;=20 >> ("UINT16" | "CHAR16") N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); = >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, Field= InUnion), N); >> ; =20 -dataStructField8 : +dataStructField8 [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"UINT8" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructFieldBool : +dataStructFieldBool [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"BOOLEAN" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructFieldString : +dataStructFieldString [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"EFI_STRING_ID" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructFieldDate : +dataStructFieldDate [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"EFI_HII_DATE" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructFieldTime : +dataStructFieldTime [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"EFI_HII_TIME" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructFieldRef : +dataStructFieldRef [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> D:"EFI_HII_REF" N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnio= n), N); >> ; =20 -dataStructFieldUser : +dataStructFieldUser [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> T:StringIdentifier N:StringIdentifier { OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } - ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >> + ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnio= n), T); >> ; =20 //************************************************************************= ***** // // the syntax of GUID definition diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp b/BaseTools/So= urce/C/VfrCompile/VfrUtilityLib.cpp index 2f97975..37b58e2 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp @@ -1,10 +1,10 @@ /** @file =20 Vfr common library functions. =20 -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials =20 are licensed and made available under the terms and conditions of the BSD = License =20 which accompanies this distribution. The full text of the license may be = found at =20 http://opensource.org/licenses/bsd-license.php = =20 = =20 @@ -1011,19 +1011,22 @@ CVfrVarDataTypeDB::SetNewTypeName ( =20 EFI_VFR_RETURN_CODE CVfrVarDataTypeDB::DataTypeAddField ( IN CHAR8 *FieldName, IN CHAR8 *TypeName, - IN UINT32 ArrayNum + IN UINT32 ArrayNum, + IN BOOLEAN FieldInUnion ) { SVfrDataField *pNewField =3D NULL; SVfrDataType *pFieldType =3D NULL; SVfrDataField *pTmp; UINT32 Align; + UINT32 MaxDataTypeSize; =20 CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCC= ESS); + MaxDataTypeSize =3D mNewDataType->mTotalSize; =20 if (strlen (FieldName) >=3D MAX_NAME_LEN) { return VFR_RETURN_INVALID_PARAMETER; } =20 @@ -1055,11 +1058,19 @@ CVfrVarDataTypeDB::DataTypeAddField ( pTmp->mNext =3D pNewField; pNewField->mNext =3D NULL; } =20 mNewDataType->mAlign =3D MIN (mPackAlign, MAX (pFieldType->mAlign, m= NewDataType->mAlign)); - mNewDataType->mTotalSize =3D pNewField->mOffset + (pNewField->mFieldType= ->mTotalSize) * ((ArrayNum =3D=3D 0) ? 1 : ArrayNum); + + if (FieldInUnion) { + if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) { + mNewDataType->mTotalSize =3D pNewField->mFieldType->mTotalSize; + } + pNewField->mOffset =3D 0; + } else { + mNewDataType->mTotalSize =3D pNewField->mOffset +=20 + (pNewField->mFieldType->mTotalSize) * ((ArrayNum =3D=3D 0) ? 1 :=20 + ArrayNum); } =20 return VFR_RETURN_SUCCESS; } =20 VOID diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h b/BaseTools/Sour= ce/C/VfrCompile/VfrUtilityLib.h index 59509c3..0c67d73 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h @@ -1,10 +1,10 @@ /** @file =20 Vfr common library functions. =20 -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials =20 are licensed and made available under the terms and conditions of the BSD = License =20 which accompanies this distribution. The full text of the license may be = found at =20 http://opensource.org/licenses/bsd-license.php = =20 = =20 @@ -203,11 +203,11 @@ public: CVfrVarDataTypeDB (VOID); ~CVfrVarDataTypeDB (VOID); =20 VOID DeclareDataTypeBegin (VOID); 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=20 + UINT32, IN BOOLEAN); VOID DeclareDataTypeEnd (VOID); =20 EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **); EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *); EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *); -- 1.9.5.msysgit.1