From: "Ni, Ruiyu" <ruiyu.ni@intel.com>
To: "Bi, Dandan" <dandan.bi@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Dong, Eric" <eric.dong@intel.com>, "Gao, Liming" <liming.gao@intel.com>
Subject: Re: [RFC v3 1/2] BaseTool/VfrCompile: Support Union type in VFR
Date: Tue, 6 Jun 2017 07:16:02 +0000 [thread overview]
Message-ID: <734D49CCEBEEF84792F5B80ED585239D5B988BF9@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <1496717906-372916-2-git-send-email-dandan.bi@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Thanks/Ray
> -----Original Message-----
> From: Bi, Dandan
> Sent: Tuesday, June 6, 2017 10:58 AM
> To: edk2-devel@lists.01.org
> Cc: Dong, Eric <eric.dong@intel.com>; Gao, Liming <liming.gao@intel.com>; Ni,
> Ruiyu <ruiyu.ni@intel.com>
> Subject: [RFC v3 1/2] BaseTool/VfrCompile: Support Union type in VFR
>
> V3: Avoid adding new member in current stucture to indicate indicate whether
> current date type is Union or not. We can directly paas the data type info to sub-
> statement/function during parsing phase.
>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Dandan Bi <dandan.bi@intel.com>
> ---
> 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..1dc9477 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 = FALSE;
> >>
> (
> vfrPragmaPackDefinition
> | vfrDataStructDefinition
> + | vfrDataUnionDefinition
> )*
> vfrFormSetDefinition
> << $Return = mParserStatus; >>
> ;
>
> @@ -318,140 +320,155 @@ vfrPragmaPackDefinition :
> | pragmaPackNumber
> }
> "\)"
> ;
>
> + 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 :
> { TypeDef } Struct <<
> gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
> { NonNvDataMap }
> {
> N1:StringIdentifier <<
> _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
> }
> OpenBrace
> - vfrDataStructFields
> + vfrDataStructFields[FALSE]
> CloseBrace
> {
> N2:StringIdentifier <<
> _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
> }
> ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
> ;
>
> -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]
> )*
> ;
>
> -dataStructField64 :
> +dataStructField64 [BOOLEAN FieldInUnion] :
> << UINT32 ArrayNum = 0; >>
> D:"UINT64"
> N:StringIdentifier
> {
> 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; >>
> D:"UINT32"
> N:StringIdentifier
> {
> 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;
> >>
> ("UINT16" | "CHAR16")
> N:StringIdentifier
> {
> 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; >>
> D:"UINT8"
> N:StringIdentifier
> {
> 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; >>
> D:"BOOLEAN"
> N:StringIdentifier
> {
> 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; >>
> D:"EFI_STRING_ID"
> N:StringIdentifier
> {
> 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; >>
> D:"EFI_HII_DATE"
> N:StringIdentifier
> {
> 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; >>
> D:"EFI_HII_TIME"
> N:StringIdentifier
> {
> 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; >>
> D:"EFI_HII_REF"
> N:StringIdentifier
> {
> 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; >>
> T:StringIdentifier
> N:StringIdentifier
> {
> 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); >>
> ;
>
>
> //***************************************************************
> **************
> //
> // the syntax of GUID definition
> diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
> b/BaseTools/Source/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
>
> 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
> 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
> http://opensource.org/licenses/bsd-license.php
>
> @@ -1011,19 +1011,22 @@ CVfrVarDataTypeDB::SetNewTypeName (
>
> EFI_VFR_RETURN_CODE
> CVfrVarDataTypeDB::DataTypeAddField (
> IN CHAR8 *FieldName,
> IN CHAR8 *TypeName,
> - IN UINT32 ArrayNum
> + IN UINT32 ArrayNum,
> + IN BOOLEAN FieldInUnion
> )
> {
> SVfrDataField *pNewField = NULL;
> SVfrDataType *pFieldType = NULL;
> SVfrDataField *pTmp;
> UINT32 Align;
> + UINT32 MaxDataTypeSize;
>
> CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType),
> VFR_RETURN_SUCCESS);
> + MaxDataTypeSize = mNewDataType->mTotalSize;
>
> if (strlen (FieldName) >= MAX_NAME_LEN) {
> return VFR_RETURN_INVALID_PARAMETER;
> }
>
> @@ -1055,11 +1058,19 @@ CVfrVarDataTypeDB::DataTypeAddField (
> pTmp->mNext = pNewField;
> pNewField->mNext = NULL;
> }
>
> 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;
> }
>
> VOID
> diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h
> b/BaseTools/Source/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
>
> 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
> 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
> http://opensource.org/licenses/bsd-license.php
>
> @@ -203,11 +203,11 @@ public:
> CVfrVarDataTypeDB (VOID);
> ~CVfrVarDataTypeDB (VOID);
>
> 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
> + UINT32, IN BOOLEAN);
> VOID DeclareDataTypeEnd (VOID);
>
> 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
next prev parent reply other threads:[~2017-06-06 7:15 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-06 2:58 [RFC v3 0/2] Support Union type in VFR Dandan Bi
2017-06-06 2:58 ` [RFC v3 1/2] BaseTool/VfrCompile: " Dandan Bi
2017-06-06 7:16 ` Ni, Ruiyu [this message]
2017-06-06 2:58 ` [RFC v3 2/2] MdeModulePkg/DriverSample: Add sample questions to refer union type Dandan Bi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=734D49CCEBEEF84792F5B80ED585239D5B988BF9@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox