From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (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 E5D4E21E945F9 for ; Sun, 17 Sep 2017 22:51:05 -0700 (PDT) Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Sep 2017 22:54:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.42,411,1500966000"; d="scan'208";a="152441578" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga005.fm.intel.com with ESMTP; 17 Sep 2017 22:54:08 -0700 Received: from fmsmsx122.amr.corp.intel.com (10.18.125.37) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 17 Sep 2017 22:54:07 -0700 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by fmsmsx122.amr.corp.intel.com (10.18.125.37) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 17 Sep 2017 22:54:06 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.175]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.159]) with mapi id 14.03.0319.002; Mon, 18 Sep 2017 13:54:04 +0800 From: "Dong, Eric" To: "Bi, Dandan" , "edk2-devel@lists.01.org" CC: "Gao, Liming" Thread-Topic: [edk2] [PATCH v3 1/6] BaseTool/VfrCompiler: Support Bit fields in EFI/Buffer VarStore Thread-Index: AQHTLetQ21FH+lEuOEK/ZHrHj3gQiKK6KPrg Date: Mon, 18 Sep 2017 05:54:03 +0000 Message-ID: References: <1505456623-414328-1-git-send-email-dandan.bi@intel.com> <1505456623-414328-2-git-send-email-dandan.bi@intel.com> In-Reply-To: <1505456623-414328-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 v3 1/6] BaseTool/VfrCompiler: Support Bit fields in EFI/Buffer VarStore 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: Mon, 18 Sep 2017 05:51:06 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Eric Dong for this series. -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Dand= an Bi Sent: Friday, September 15, 2017 2:24 PM To: edk2-devel@lists.01.org Cc: Dong, Eric ; Gao, Liming Subject: [edk2] [PATCH v3 1/6] BaseTool/VfrCompiler: Support Bit fields in = EFI/Buffer VarStore REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D545 Enhance VfrCompiler to parse following case: 1. EFI/Buffer VarStore can contain bit fields in their structure. 2. For question Oneof/Checkbox/numeric, their storage can be bit fields of an EFI VarStore/Buffer VarStore. Cc: Eric Dong Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- BaseTools/Source/C/Include/Common/MdeModuleHii.h | 13 +- BaseTools/Source/C/VfrCompile/VfrError.cpp | 3 +- BaseTools/Source/C/VfrCompile/VfrError.h | 3 +- BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp | 105 +- BaseTools/Source/C/VfrCompile/VfrFormPkg.h | 52 +- BaseTools/Source/C/VfrCompile/VfrSyntax.g | 1238 ++++++++++++++----= ---- BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp | 241 ++++- BaseTools/Source/C/VfrCompile/VfrUtilityLib.h | 23 +- 8 files changed, 1188 insertions(+), 490 deletions(-) diff --git a/BaseTools/Source/C/Include/Common/MdeModuleHii.h b/BaseTools/S= ource/C/Include/Common/MdeModuleHii.h index 21c8387..8f4e81b 100644 --- a/BaseTools/Source/C/Include/Common/MdeModuleHii.h +++ b/BaseTools/Source/C/Include/Common/MdeModuleHii.h @@ -1,9 +1,9 @@ /** @file EDK II specific HII relative definition. =20 - Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
=20 This program and the accompanying materials are licensed and made availa= ble 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 @@ -210,10 +210,21 @@ typedef struct _EFI_IFR_GUID_VAREQNAME { /// The the Unicode String will be used as a EFI Variable Name. /// UINT16 NameId; } EFI_IFR_GUID_VAREQNAME; =20 +/// +/// EDKII implementation extension flags, used to indaicate the disply sty= le and bit width for bit filed storage. +/// Two high bits for display style and the low six bits for bit width. +/// +#define EFI_IFR_DISPLAY_BIT 0xC0 +#define EFI_IFR_DISPLAY_INT_DEC_BIT 0x00 +#define EFI_IFR_DISPLAY_UINT_DEC_BIT 0x40 +#define EFI_IFR_DISPLAY_UINT_HEX_BIT 0x80 + +#define EFI_IFR_NUMERIC_SIZE_BIT 0x3F + #pragma pack() =20 extern EFI_GUID gEfiIfrTianoGuid; extern EFI_GUID gEfiIfrFrameworkGuid; =20 diff --git a/BaseTools/Source/C/VfrCompile/VfrError.cpp b/BaseTools/Source/= C/VfrCompile/VfrError.cpp index 285e175..0f8f7dd 100644 --- a/BaseTools/Source/C/VfrCompile/VfrError.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrError.cpp @@ -1,10 +1,10 @@ /** @file =20 VfrCompiler error handler. =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 @@ -44,10 +44,11 @@ static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] =3D = { { VFR_RETURN_ERROR_ARRARY_NUM, ": array number error, the valid value is= in (0 ~ MAX_INDEX-1) for UEFI vfr and in (1 ~ MAX_INDEX) for Framework Vfr= " }, { VFR_RETURN_DATA_STRING_ERROR, ": data field string error or not suppor= t"}, { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with d= ifferent value"}, { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the expressio= n"}, { VFR_RETURN_VARSTORE_NAME_REDEFINED_ERROR, ": Varstore name is defined = by more than one varstores, it can't be referred as varstore, only varstore= strucure name could be used."}, + { VFR_RETURN_BIT_WIDTH_ERROR, ": bit width must be <=3D sizeof (type) * = 8 and the max width can not > 32" }, { VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" } }; =20 static SVFR_WARNING_HANDLE VFR_WARNING_HANDLE_TABLE [] =3D { { VFR_WARNING_DEFAULT_VALUE_REDEFINED, ": default value re-defined with = different value"}, diff --git a/BaseTools/Source/C/VfrCompile/VfrError.h b/BaseTools/Source/C/= VfrCompile/VfrError.h index 4dbc54c..8bae049 100644 --- a/BaseTools/Source/C/VfrCompile/VfrError.h +++ b/BaseTools/Source/C/VfrCompile/VfrError.h @@ -1,10 +1,10 @@ /** @file =20 VfrCompiler Error definition =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 @@ -42,10 +42,11 @@ typedef enum { VFR_RETURN_ERROR_ARRARY_NUM, VFR_RETURN_DATA_STRING_ERROR, VFR_RETURN_DEFAULT_VALUE_REDEFINED, VFR_RETURN_CONSTANT_ONLY, VFR_RETURN_VARSTORE_NAME_REDEFINED_ERROR, + VFR_RETURN_BIT_WIDTH_ERROR, VFR_RETURN_CODEUNDEFINED } EFI_VFR_RETURN_CODE; =20 typedef enum { VFR_WARNING_DEFAULT_VALUE_REDEFINED =3D 0, diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp b/BaseTools/Sourc= e/C/VfrCompile/VfrFormPkg.cpp index 2be0c38..c0a3894 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp @@ -1,10 +1,10 @@ /** @file =20 The definition of CFormPkg's member function =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 @@ -827,10 +827,13 @@ CFormPkg::DeclarePendingQuestion ( CHAR8 *SName; CHAR8 *NewStr; UINT32 ShrinkSize =3D 0; EFI_VFR_RETURN_CODE ReturnCode; EFI_VFR_VARSTORE_TYPE VarStoreType =3D EFI_VFR_VARSTORE_INVALID; + UINT8 LFlags; + UINT32 MaxValue; + CIfrGuid *GuidObj =3D NULL; =20 // // Declare all questions as Numeric in DisableIf True // // DisableIf @@ -842,18 +845,12 @@ CFormPkg::DeclarePendingQuestion ( CIfrTrue TObj (LineNo); =20 // Declare Numeric qeustion for each undefined question. for (pNode =3D PendingAssignList; pNode !=3D NULL; pNode =3D pNode->mNex= t) { if (pNode->mFlag =3D=3D PENDING) { - CIfrNumeric CNObj; EFI_VARSTORE_INFO Info;=20 EFI_QUESTION_ID QId =3D EFI_QUESTION_ID_INVALID; - - CNObj.SetLineNo (LineNo); - CNObj.SetPrompt (0x0); - CNObj.SetHelp (0x0); - // // Register this question, assume it is normal question, not date or= time question // VarStr =3D pNode->mKey; ReturnCode =3D lCVfrQuestionDB.RegisterQuestion (NULL, VarStr, QId); @@ -886,63 +883,87 @@ CFormPkg::DeclarePendingQuestion ( if (*VarStr =3D=3D '\0' && ArrayIdx !=3D INVALID_ARRAY_INDEX) { ReturnCode =3D lCVfrDataStorage.GetNameVarStoreInfo (&Info, ArrayI= dx); } else { if (VarStoreType =3D=3D EFI_VFR_VARSTORE_EFI) { ReturnCode =3D lCVfrDataStorage.GetEfiVarStoreInfo (&Info); - } else if (VarStoreType =3D=3D EFI_VFR_VARSTORE_BUFFER) { + } else if (VarStoreType =3D=3D EFI_VFR_VARSTORE_BUFFER || VarStore= Type =3D=3D EFI_VFR_VARSTORE_BUFFER_BITS) { VarStr =3D pNode->mKey; //convert VarStr with store name to VarStr with structure name ReturnCode =3D lCVfrDataStorage.GetBufferVarStoreDataTypeName (I= nfo.mVarStoreId, &SName); if (ReturnCode =3D=3D VFR_RETURN_SUCCESS) { NewStr =3D new CHAR8[strlen (VarStr) + strlen (SName) + 1]; NewStr[0] =3D '\0'; strcpy (NewStr, SName); strcat (NewStr, VarStr + strlen (FName)); - ReturnCode =3D lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, In= fo.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize); + ReturnCode =3D lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, In= fo.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize, Info.mIsBitVar); delete[] NewStr; } } else { ReturnCode =3D VFR_RETURN_UNSUPPORTED; } } if (ReturnCode !=3D VFR_RETURN_SUCCESS) { gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->m= Key); return ReturnCode; } - - CNObj.SetQuestionId (QId); - CNObj.SetVarStoreInfo (&Info); // - // Numeric doesn't support BOOLEAN data type.=20 - // BOOLEAN type has the same data size to UINT8.=20 + // If the storage is bit fields, create Guid opcode to wrap the nume= ric opcode. // - if (Info.mVarType =3D=3D EFI_IFR_TYPE_BOOLEAN) { - Info.mVarType =3D EFI_IFR_TYPE_NUM_SIZE_8; + if (Info.mIsBitVar) { + GuidObj =3D new CIfrGuid(0); + GuidObj->SetGuid (&gEfiIfrBitvarstoreGuid); + GuidObj->SetLineNo(LineNo); } - CNObj.SetFlags (0, Info.mVarType); + + CIfrNumeric CNObj; + CNObj.SetLineNo (LineNo); + CNObj.SetPrompt (0x0); + CNObj.SetHelp (0x0); + CNObj.SetQuestionId (QId); + CNObj.SetVarStoreInfo (&Info); + // - // Use maximum value not to limit the vaild value for the undefined = question. + // Set Min/Max/Step Data and flags for the question with bit fields.= Min/Max/Step Data are saved as UINT32 type for bit question. // - switch (Info.mVarType) { - case EFI_IFR_TYPE_NUM_SIZE_64: - CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0); - ShrinkSize =3D 0; - break; - case EFI_IFR_TYPE_NUM_SIZE_32: - CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0); + if (Info.mIsBitVar) { + MaxValue =3D (1 << Info.mVarTotalSize) -1; + CNObj.SetMinMaxStepData ((UINT32) 0, MaxValue, (UINT32) 0); ShrinkSize =3D 12; - break; - case EFI_IFR_TYPE_NUM_SIZE_16: - CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0); - ShrinkSize =3D 18; - break; - case EFI_IFR_TYPE_NUM_SIZE_8: - CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0); - ShrinkSize =3D 21; - break; - default: - break; + LFlags =3D (EFI_IFR_NUMERIC_SIZE_BIT & Info.mVarTotalSize); + CNObj.SetFlagsForBitField (0, LFlags); + } else { + // + // Numeric doesn't support BOOLEAN data type. + // BOOLEAN type has the same data size to UINT8. + // + if (Info.mVarType =3D=3D EFI_IFR_TYPE_BOOLEAN) { + Info.mVarType =3D EFI_IFR_TYPE_NUM_SIZE_8; + } + CNObj.SetFlags (0, Info.mVarType); + // + // Use maximum value not to limit the vaild value for the undefine= d question. + // + switch (Info.mVarType) { + case EFI_IFR_TYPE_NUM_SIZE_64: + CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0); + ShrinkSize =3D 0; + break; + case EFI_IFR_TYPE_NUM_SIZE_32: + CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0); + ShrinkSize =3D 12; + break; + case EFI_IFR_TYPE_NUM_SIZE_16: + CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0); + ShrinkSize =3D 18; + break; + case EFI_IFR_TYPE_NUM_SIZE_8: + CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0); + ShrinkSize =3D 21; + break; + default: + break; + } } CNObj.ShrinkBinSize (ShrinkSize); =20 // // For undefined Efi VarStore type question @@ -954,12 +975,22 @@ CFormPkg::DeclarePendingQuestion ( } =20 // // End for Numeric // - CIfrEnd CEObj;=20 + CIfrEnd CEObj; CEObj.SetLineNo (LineNo); + // + // End for Guided opcode + // + CIfrEnd CEObjGuid; + CEObjGuid.SetLineNo (LineNo); + if (GuidObj !=3D NULL) { + GuidObj->SetScope(1); + delete GuidObj; + GuidObj =3D NULL; + } } } =20 // // End for DisableIf diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h b/BaseTools/Source/= C/VfrCompile/VfrFormPkg.h index 17ab14c..fec3743 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h @@ -1,10 +1,10 @@ /** @file =20 The definition of CFormPkg's member function =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 @@ -565,12 +565,16 @@ public: } } mMinMaxStepData->u8.Step =3D Step; } =20 - UINT64 GetMinData (UINT8 VarType) { + UINT64 GetMinData (UINT8 VarType, BOOLEAN IsBitVar) { UINT64 MinValue =3D 0; + if (IsBitVar) { + MinValue =3D mMinMaxStepData->u32.MinValue; + return MinValue; + } switch (VarType) { case EFI_IFR_TYPE_NUM_SIZE_64: MinValue =3D mMinMaxStepData->u64.MinValue; break; case EFI_IFR_TYPE_NUM_SIZE_32: @@ -586,12 +590,16 @@ public: break; } return MinValue; } =20 - UINT64 GetMaxData (UINT8 VarType) { + UINT64 GetMaxData (UINT8 VarType, BOOLEAN IsBitVar) { UINT64 MaxValue =3D 0; + if (IsBitVar) { + MaxValue =3D mMinMaxStepData->u32.MaxValue; + return MaxValue; + } switch (VarType) { case EFI_IFR_TYPE_NUM_SIZE_64: MaxValue =3D mMinMaxStepData->u64.MaxValue; break; case EFI_IFR_TYPE_NUM_SIZE_32: @@ -607,12 +615,16 @@ public: break; } return MaxValue; } =20 - UINT64 GetStepData (UINT8 VarType) { + UINT64 GetStepData (UINT8 VarType, BOOLEAN IsBitVar) { UINT64 MaxValue =3D 0; + if (IsBitVar) { + MaxValue =3D mMinMaxStepData->u32.Step; + return MaxValue; + } switch (VarType) { case EFI_IFR_TYPE_NUM_SIZE_64: MaxValue =3D mMinMaxStepData->u64.Step; break; case EFI_IFR_TYPE_NUM_SIZE_32: @@ -1405,10 +1417,26 @@ public: mNumeric->Flags =3D LFlags; } return VFR_RETURN_SUCCESS; } =20 + EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 LFlag= s, BOOLEAN DisplaySettingsSpecified =3D FALSE) { + EFI_VFR_RETURN_CODE Ret; + + Ret =3D CIfrQuestionHeader::SetFlags (HFlags); + if (Ret !=3D VFR_RETURN_SUCCESS) { + return Ret; + } + + if (DisplaySettingsSpecified =3D=3D FALSE) { + mNumeric->Flags =3D LFlags | EFI_IFR_DISPLAY_UINT_DEC_BIT; + } else { + mNumeric->Flags =3D LFlags; + } + return VFR_RETURN_SUCCESS; + } + UINT8 GetNumericFlags () { return mNumeric->Flags; } }; =20 @@ -1445,10 +1473,26 @@ public: mOneOf->Flags =3D LFlags | EFI_IFR_DISPLAY_UINT_DEC; } return VFR_RETURN_SUCCESS; } =20 + EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 LFlag= s) { + EFI_VFR_RETURN_CODE Ret; + + Ret =3D CIfrQuestionHeader::SetFlags (HFlags); + if (Ret !=3D VFR_RETURN_SUCCESS) { + return Ret; + } + + if (LFlags & EFI_IFR_DISPLAY) { + mOneOf->Flags =3D LFlags; + } else { + mOneOf->Flags =3D LFlags | EFI_IFR_DISPLAY_UINT_DEC_BIT; + } + return VFR_RETURN_SUCCESS; + } + VOID ShrinkBinSize (IN UINT16 Size) { // // Update the buffer size which is truly be used later. // ShrinkObjBin(Size); diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C= /VfrCompile/VfrSyntax.g index 24e0538..4647f64 100644 --- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g +++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g @@ -361,11 +361,15 @@ vfrDataStructFields [BOOLEAN FieldInUnion]: dataStructFieldBool [FieldInUnion] | dataStructFieldString [FieldInUnion]| dataStructFieldDate [FieldInUnion] | dataStructFieldTime [FieldInUnion] | dataStructFieldRef [FieldInUnion] | - dataStructFieldUser [FieldInUnion] + dataStructFieldUser [FieldInUnion] | + dataStructBitField64 [FieldInUnion] | + dataStructBitField32 [FieldInUnion] | + dataStructBitField16 [FieldInUnion] | + dataStructBitField8 [FieldInUnion] )* ; =20 dataStructField64 [BOOLEAN FieldInUnion]: << UINT32 ArrayNum =3D 0; >> @@ -467,10 +471,87 @@ dataStructFieldUser [BOOLEAN FieldInUnion]: OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU3= 2(I->getText(), I->getLine()); >> } ";" << _PCATCH(gCVfrVarDat= aTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnio= n), T); >> ; =20 +dataStructBitField64[BOOLEAN FieldInUnion]: + << + UINT32 Width =3D 0; + BOOLEAN HasBitFieldName =3D FALSE; + >> + D:"UINT64" + { + N:StringIdentifier << HasBitFieldName =3D TRUE;>> + } + ":" I:Number << Width =3D _STOU32(I->getText(), I->getLine(= ));>> + + ";" << if (HasBitFieldName) { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (N->getText(), D->getText(), Width, FieldInUnion), N); + } else { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (" ", D->getText(), Width, FieldInUnion), D); + } + >> + ; + +dataStructBitField32[BOOLEAN FieldInUnion]: + << + UINT32 Width =3D 0; + BOOLEAN HasBitFieldName =3D FALSE; + >> + D:"UINT32" + { + N:StringIdentifier << HasBitFieldName =3D TRUE;>> + } + + ":" I:Number << Width =3D _STOU32(I->getText(), I->getLine(= ));>> + + ";" << if (HasBitFieldName) { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (N->getText(), D->getText(), Width, FieldInUnion), N); + } else { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (" ", D->getText(), Width, FieldInUnion), D); + } + >> + ; + +dataStructBitField16[BOOLEAN FieldInUnion]: + << + UINT32 Width =3D 0; + BOOLEAN HasBitFieldName =3D FALSE; + >> + D:"UINT16" + { + N:StringIdentifier << HasBitFieldName =3D TRUE;>> + } + ":" I:Number << Width =3D _STOU32(I->getText(), I->getLine(= ));>> + + ";" << if (HasBitFieldName) { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (N->getText(), D->getText(), Width, FieldInUnion), N); + } else { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (" ", D->getText(), Width, FieldInUnion), D); + } + >> + ; + +dataStructBitField8[BOOLEAN FieldInUnion]: + << + UINT32 Width =3D 0; + BOOLEAN HasBitFieldName =3D FALSE; + >> + D:"UINT8" + { + N:StringIdentifier << HasBitFieldName =3D TRUE;>> + } + ":" I:Number << Width =3D _STOU32(I->getText(), I->getLine(= ));>> + + ";" << if (HasBitFieldName) { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (N->getText(), D->getText(), Width, FieldInUnion), N); + } else { + _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBit= Field (" ", D->getText(), Width, FieldInUnion), D); + } + >> + ; + //************************************************************************= ***** // // the syntax of GUID definition // guidSubDefinition [EFI_GUID &Guid] : @@ -749,10 +830,15 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 = *TypeName, UINT32 TypeSize, UINT8 Data_U8 =3D 0; BOOLEAN Data_BL =3D 0; EFI_STRING_ID Data_SID =3D 0; BOOLEAN IsArray =3D FALSE; UINT8 *ByteOffset =3D NULL; + BOOLEAN BitField =3D FALSE; + UINT64 Value; + UINT64 Mask; + UINT16 Offset; + UINT8 PreBits; >> ( ("," "data" {OpenBracket IDX1:Number CloseBracket <>} << ArrayIdx =3D 0; @@ -805,27 +891,73 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 = *TypeName, UINT32 TypeSize, }else if (strcmp ("EFI_STRING_ID", TypeName) =3D=3D 0) { Data_SID =3D _STOSID(RD->getText(), RD->getLine()); memcpy (ByteOffset, &Data_SID, TypeSize); = =20 } } else { - gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, Fie= ldType, FieldSize); + gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, Fie= ldType, FieldSize, BitField); + if (BitField) { + Mask =3D (1 << FieldSize) - 1; + Offset =3D FieldOffset / 8; + PreBits =3D FieldOffset % 8; + Mask <<=3D PreBits; + } switch (FieldType) { case EFI_IFR_TYPE_NUM_SIZE_8: Data_U8 =3D _STOU8(RD->getText(), RD->getLine()); - memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize); + if (BitField) { + // + // Set the value to the bit fileds. + // + Value =3D *(UINT8*) (ByteOffset + Offset); + Data_U8 <<=3D PreBits; + Value =3D (Value & (~Mask)) | Data_U8; + memcpy (ByteOffset + Offset, &Value, sizeof (UINT8)); + } else { + memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize); + } break; case EFI_IFR_TYPE_NUM_SIZE_16: Data_U16 =3D _STOU16(RD->getText(), RD->getLine()); - memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize); + if (BitField) { + // + // Set the value to the bit fileds. + // + Value =3D *(UINT16*) (ByteOffset + Offset); + Data_U16 <<=3D PreBits; + Value =3D (Value & (~Mask)) | Data_U16; + memcpy (ByteOffset + Offset, &Value, sizeof (UINT16)); + } else { + memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize)= ; + } break; case EFI_IFR_TYPE_NUM_SIZE_32: Data_U32 =3D _STOU32(RD->getText(), RD->getLine()); - memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize); + if (BitField) { + // + // Set the value to the bit fileds. + // + Value =3D *(UINT32*) (ByteOffset + Offset); + Data_U32 <<=3D PreBits; + Value =3D (Value & (~Mask)) | Data_U32; + memcpy (ByteOffset + Offset, &Value, sizeof (UINT32)); + } else { + memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize)= ; + } break; case EFI_IFR_TYPE_NUM_SIZE_64: Data_U64 =3D _STOU64(RD->getText(), RD->getLine()); - memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize); + if (BitField) { + // + // Set the value to the bit fileds. + // + Value =3D *(UINT64*) (ByteOffset + Offset); + Data_U64 <<=3D PreBits; + Value =3D (Value & (~Mask)) | Data_U64; + memcpy (ByteOffset + Offset, &Value, sizeof (UINT64)); + } else { + memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize)= ; + } break; case EFI_IFR_TYPE_BOOLEAN: Data_BL =3D _STOU8(RD->getText(), RD->getLine()); memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize); break; @@ -872,14 +1004,15 @@ vfrStatementVarStoreLinear : CHAR8 *TypeName; CHAR8 *StoreName; UINT32 LineNum; EFI_VARSTORE_ID VarStoreId =3D EFI_VARSTORE_ID_INVALID; UINT32 Size; + BOOLEAN IsBitVarStore =3D FALSE; >> V:Varstore << VSObj.SetLineNo(V->= getLine()); >> ( - TN:StringIdentifier "," << TypeName =3D TN->ge= tText(); LineNum =3D TN->getLine(); >> + TN:StringIdentifier "," << TypeName =3D TN->ge= tText(); LineNum =3D TN->getLine(); IsBitVarStore =3D gCVfrVarDataTypeDB.Da= taTypeHasBitField (TN->getText());>> | U8:"UINT8" "," << TypeName =3D U8->ge= tText(); LineNum =3D U8->getLine(); >> | U16:"UINT16" "," << TypeName =3D U16->g= etText(); LineNum =3D U16->getLine(); >> | C16:"CHAR16" "," << TypeName =3D (CHAR8= *) "UINT16"; LineNum =3D C16->getLine(); >> | U32:"UINT32" "," << TypeName =3D U32->g= etText(); LineNum =3D U32->getLine(); >> | U64:"UINT64" "," << TypeName =3D U64->g= etText(); LineNum =3D U64->getLine(); >> @@ -910,16 +1043,17 @@ vfrStatementVarStoreLinear : StoreName =3D Typ= eName; } else { StoreName =3D SN-= >getText(); } _PCATCH(gCVfrDataSt= orage.DeclareBufferVarStore ( - = StoreName, - = &Guid, - = &gCVfrVarDataTypeDB, - = TypeName, - = VarStoreId - = ), LineNum); + = StoreName, + = &Guid, + = &gCVfrVarDataTypeDB, + = TypeName, + = VarStoreId, + = IsBitVarStore + = ), LineNum); VSObj.SetGuid (&Gui= d); _PCATCH(gCVfrDataSt= orage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN); VSObj.SetVarStoreId= (VarStoreId); _PCATCH(gCVfrVarDat= aTypeDB.GetDataTypeSize(TypeName, &Size), LineNum); VSObj.SetSize ((UIN= T16) Size); @@ -938,14 +1072,15 @@ vfrStatementVarStoreEfi : UINT32 Size; CHAR8 *TypeName; UINT32 LineNum; CHAR8 *StoreName =3D NULL; BOOLEAN CustomizedName =3D FALSE; + BOOLEAN IsBitVarStore =3D FALSE; >> E:Efivarstore << VSEObj.SetLineNo(E-= >getLine()); >> ( - TN:StringIdentifier "," << TypeName =3D TN->ge= tText(); LineNum =3D TN->getLine(); CustomizedName =3D TRUE; >> + TN:StringIdentifier "," << TypeName =3D TN->ge= tText(); LineNum =3D TN->getLine(); CustomizedName =3D TRUE; IsBitVarStore = =3D gCVfrVarDataTypeDB.DataTypeHasBitField (TN->getText());>> | U8:"UINT8" "," << TypeName =3D U8->ge= tText(); LineNum =3D U8->getLine(); >> | U16:"UINT16" "," << TypeName =3D U16->g= etText(); LineNum =3D U16->getLine(); >> | C16:"CHAR16" "," << TypeName =3D (CHAR8= *) "UINT16"; LineNum =3D C16->getLine(); >> | U32:"UINT32" "," << TypeName =3D U32->g= etText(); LineNum =3D U32->getLine(); >> | U64:"UINT64" "," << TypeName =3D U64->g= etText(); LineNum =3D U64->getLine(); >> @@ -1002,30 +1137,32 @@ vfrStatementVarStoreEfi : ) =20 Uuid "=3D" guidDefinition[Guid] <<=20 if (IsUEFI23EfiVars= tore) { _PCATCH(gCVfrDataSt= orage.DeclareBufferVarStore ( - = StoreName, - = &Guid, - = &gCVfrVarDataTypeDB, - = TypeName, - = VarStoreId - = ), LineNum); = =20 + = StoreName, + = &Guid, + = &gCVfrVarDataTypeDB, + = TypeName, + = VarStoreId, + = IsBitVarStore + = ), LineNum); _PCATCH(gCVfrData= Storage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN); _PCATCH(gCVfrVarD= ataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum); } else { - _PCATCH(gCVfrDataS= torage.DeclareBufferVarStore ( + _PCATCH(gCVfrDataSt= orage.DeclareBufferVarStore ( = TN->getText(), = &Guid, = &gCVfrVarDataTypeDB, = TypeName, - = VarStoreId - = ), LineNum); =20 + = VarStoreId, + = FALSE + = ), LineNum); _PCATCH(gCVfrData= Storage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN); _PCATCH(gCVfrVarD= ataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine()); } - VSEObj.SetGuid (&Gu= id); =20 + VSEObj.SetGuid (&Gu= id); VSEObj.SetVarStoreI= d (VarStoreId); =20 VSEObj.SetSize ((UI= NT16) Size); VSEObj.SetName (Sto= reName); if (IsUEFI23EfiVars= tore =3D=3D FALSE && StoreName !=3D NULL) { @@ -1139,71 +1276,79 @@ vfrStatementSuppressIfFormSet : vfrStatementHeader[CIfrStatementHeader *SHObj] : Prompt "=3D" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt= (_STOSID(S1->getText(), S1->getLine())); >> Help "=3D" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (= _STOSID(S2->getText(), S2->getLine())); >> ; =20 +vfrQuestionBaseInfo[EFI_VARSTORE_INFO & Info, EFI_QUESTION_ID & QId, EFI_Q= UESION_TYPE QType =3D QUESTION_NORMAL]: + << + CHAR8 *QName =3D NULL; + CHAR8 *VarIdStr =3D NULL; + mUsedDefaultCount =3D 0; + >> + { + Name "=3D" QN:StringIdentifier "," << + QName =3D QN->getTex= t(); + _PCATCH(mCVfrQuestio= nDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used = please used anther name"); + >> + } + { V:VarId "=3D" vfrStorageVarId[Info, VarIdStr] "," } + { + QuestionId "=3D" ID:Number "," << + QId =3D _STOQID(ID->= getText(), ID->getLine()); + _PCATCH(mCVfrQuestio= nDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used pl= ease assign another number"); + >> + } + << + switch (QType) { + case QUESTION_NORMAL= : + mCVfrQuestionDB.Re= gisterQuestion (QName, VarIdStr, QId); + break; + case QUESTION_DATE: + mCVfrQuestionDB.Re= gisterNewDateQuestion (QName, VarIdStr, QId); + break; + case QUESTION_TIME: + mCVfrQuestionDB.Re= gisterNewTimeQuestion (QName, VarIdStr, QId); + break; + case QUESTION_REF: + // + // VarIdStr !=3D N= ULL stand for question with storagae. + // + if (VarIdStr !=3D = NULL) { + mCVfrQuestionDB.= RegisterRefQuestion (QName, VarIdStr, QId); + } else { + mCVfrQuestionDB.= RegisterQuestion (QName, NULL, QId); + } + break; + default: + _PCATCH(VFR_RETURN_F= ATAL_ERROR); + } + >> + << + if (VarIdStr !=3D NU= LL) { + delete VarIdStr; + } + _SAVE_CURRQEST_VARIN= FO (Info); + >> + ; + vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType =3D Q= UESTION_NORMAL]: << EFI_VARSTORE_INFO Info; Info.mVarType =3D EFI_IFR_TYPE_OTHER; Info.mVarTotalSize =3D 0; Info.mInfo.mVarOffset =3D EFI_VAROFFSET_INVALID; Info.mVarStoreId =3D EFI_VARSTORE_ID_INVALID; + Info.mIsBitVar =3D FALSE; EFI_QUESTION_ID QId =3D EFI_QUESTION_ID_INVALID; - CHAR8 *QName =3D NULL; - CHAR8 *VarIdStr =3D NULL; - mUsedDefaultCount =3D 0; >> - { - Name "=3D" QN:StringIdentifier "," << - QName =3D QN->getTe= xt(); - _PCATCH(mCVfrQuesti= onDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used= please used anther name"); - >> - } - { V:VarId "=3D" vfrStorageVarId[Info, VarIdStr] "," } - { - QuestionId "=3D" ID:Number "," << - QId =3D _STOQID(ID-= >getText(), ID->getLine()); - _PCATCH(mCVfrQuesti= onDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used p= lease assign another number"); - >> - } - << - switch (QType) { - case QUESTION_NORMA= L: - mCVfrQuestionDB.R= egisterQuestion (QName, VarIdStr, QId); - break; - case QUESTION_DATE: - mCVfrQuestionDB.R= egisterNewDateQuestion (QName, VarIdStr, QId); - break; - case QUESTION_TIME: - mCVfrQuestionDB.R= egisterNewTimeQuestion (QName, VarIdStr, QId); - break; - case QUESTION_REF: - // - // VarIdStr !=3D = NULL stand for question with storagae. - // - if (VarIdStr !=3D= NULL) { - mCVfrQuestionDB= .RegisterRefQuestion (QName, VarIdStr, QId); - } else { - mCVfrQuestionDB= .RegisterQuestion (QName, NULL, QId); - } - break; - default: - _PCATCH(VFR_RETURN_= FATAL_ERROR); - } - $QHObj.SetQuestionI= d (QId); - if (VarIdStr !=3D N= ULL) { - $QHObj.SetVarStore= Info (&Info); - } + vfrQuestionBaseInfo[Info, QId, QType] + << $QHObj.SetQuestionI= d (QId); + if (Info.mVarStore= Id !=3D EFI_VARSTORE_ID_INVALID) { + $QHObj.SetVarSto= reInfo (&Info); + } >> vfrStatementHeader[&$QHObj] - <<=20 - if (VarIdStr !=3D N= ULL) { - delete VarIdStr;= =20 - } - _SAVE_CURRQEST_VARI= NFO (Info); - >> ; =20 questionheaderFlagsField[UINT8 & Flags] : ReadOnlyFlag << $Flags |=3D 0x01; >= > | InteractiveFlag << $Flags |=3D 0x04; >= > @@ -1268,10 +1413,11 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&Q= uestVarIdStr, BOOLEAN CheckFl = SName, = &mFormsetGuid, = &gCVfrVarDataTypeDB, = SName, = EFI_VARSTORE_ID_INVALID, + = FALSE, = FALSE = ); VfrReturnCode = =3D gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid= ); } if (CheckFlag || Vf= rReturnCode =3D=3D VFR_RETURN_SUCCESS) { @@ -1299,21 +1445,21 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&Q= uestVarIdStr, BOOLEAN CheckFl VfrReturnCode = =3D gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid= ); } if (CheckFlag || Vf= rReturnCode =3D=3D VFR_RETURN_SUCCESS) { _PCATCH(VfrReturn= Code, SN2); VarStoreType =3D = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId); - if (VarStoreType = =3D=3D EFI_VFR_VARSTORE_BUFFER) { + if (VarStoreType = =3D=3D EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_BUFF= ER_BITS) { _PCATCH(gCVfrDa= taStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2); _STRCAT(&VarStr= , TName); } } >> =20 ( "." << if (CheckFlag || Vf= rReturnCode =3D=3D VFR_RETURN_SUCCESS) { - _PCATCH(((VarStor= eType !=3D EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VF= R_RETURN_SUCCESS), SN2); + _PCATCH((((VarSto= reType !=3D EFI_VFR_VARSTORE_BUFFER) && (VarStoreType !=3D EFI_VFR_VARSTORE= _BUFFER_BITS))? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2= ); } _STRCAT(&VarIdStr, = "."); _STRCAT(&VarStr, "."); >> SF:StringIdentifier << _STRCAT(&VarIdStr, = SF->getText()); _STRCAT(&VarStr, SF->getText()); >> { @@ -1338,11 +1484,12 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&Q= uestVarIdStr, BOOLEAN CheckFl switch (VarStoreTyp= e) { case EFI_VFR_VARSTO= RE_EFI: _PCATCH(gCVfrData= Storage.GetEfiVarStoreInfo (&$Info), SN2); break; case EFI_VFR_VARSTO= RE_BUFFER: - _PCATCH(gCVfrVarD= ataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType,= $Info.mVarTotalSize), SN2->getLine(), VarStr); + case EFI_VFR_VARSTO= RE_BUFFER_BITS: + _PCATCH(gCVfrVarD= ataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType,= $Info.mVarTotalSize, $Info.mIsBitVar), SN2->getLine(), VarStr); VarGuid =3D gCVfr= DataStorage.GetVarStoreGuid($Info.mVarStoreId); _PCATCH((EFI_VFR_= RETURN_CODE)gCVfrBufferConfig.Register ( SName, VarGui= d, NULL), @@ -1436,90 +1583,97 @@ vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALU= E &Value, BOOLEAN &ListType] >> { "\-" << Negative =3D TRUE; = >> } N1:Number << - switch ($Type) { - case EFI_IFR_TYPE_N= UM_SIZE_8 : - $Value.u8 =3D _ST= OU8(N1->getText(), N1->getLine()); - if (IntDecStyle) = { - if (Negative) { - if ($Value.u8= > 0x80) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, = small than -0x80"); - } - } else { - if ($Value.u8= > 0x7F) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, = small than -0x80"); + // + // The value stored= in bit fields is always set to UINT32 type. + // + if (_GET_CURRQEST_V= ARTINFO().mIsBitVar) { + $Value.u32 =3D _S= TOU32(N1->getText(), N1->getLine()); + } else { + switch ($Type) { + case EFI_IFR_TYPE= _NUM_SIZE_8 : + $Value.u8 =3D _= STOU8(N1->getText(), N1->getLine()); + if (IntDecStyle= ) { + if (Negative)= { + if ($Value.= u8 > 0x80) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F= , small than -0x80"); + } + } else { + if ($Value.= u8 > 0x7F) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F= , small than -0x80"); + } } } - } - if (Negative) { - $Value.u8 =3D ~= $Value.u8 + 1; - } - break; - case EFI_IFR_TYPE_N= UM_SIZE_16 : - $Value.u16 =3D _S= TOU16(N1->getText(), N1->getLine()); - if (IntDecStyle) = { if (Negative) { - if ($Value.u1= 6 > 0x8000) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FF= F, small than -0x8000"); - } - } else { - if ($Value.u1= 6 > 0x7FFF) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FF= F, small than -0x8000"); + $Value.u8 =3D= ~$Value.u8 + 1; + } + break; + case EFI_IFR_TYPE= _NUM_SIZE_16 : + $Value.u16 =3D = _STOU16(N1->getText(), N1->getLine()); + if (IntDecStyle= ) { + if (Negative)= { + if ($Value.= u16 > 0x8000) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7= FFF, small than -0x8000"); + } + } else { + if ($Value.= u16 > 0x7FFF) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7= FFF, small than -0x8000"); + } } } - } - if (Negative) { - $Value.u16 =3D = ~$Value.u16 + 1; - } - break; - case EFI_IFR_TYPE_N= UM_SIZE_32 : - $Value.u32 =3D= _STOU32(N1->getText(), N1->getLine()); - if (IntDecStyle) = { if (Negative) { - if ($Value.u3= 2 > 0x80000000) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FF= FFFFF, small than -0x80000000"); - } - } else { - if ($Value.u3= 2 > 0X7FFFFFFF) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FF= FFFFF, small than -0x80000000"); + $Value.u16 = =3D ~$Value.u16 + 1; + } + break; + case EFI_IFR_TYPE= _NUM_SIZE_32 : + $Value.u32 = =3D _STOU32(N1->getText(), N1->getLine()); + if (IntDecStyle= ) { + if (Negative)= { + if ($Value.= u32 > 0x80000000) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7= FFFFFFF, small than -0x80000000"); + } + } else { + if ($Value.= u32 > 0X7FFFFFFF) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7= FFFFFFF, small than -0x80000000"); + } } } - } - if (Negative) { - $Value.u32 =3D = ~$Value.u32 + 1; - } - break; - case EFI_IFR_TYPE_N= UM_SIZE_64 : - $Value.u64 =3D= _STOU64(N1->getText(), N1->getLine()); - if (IntDecStyle) = { if (Negative) { - if ($Value.u6= 4 > 0x8000000000000000) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FF= FFFFFFFFFFFFF, small than -0x8000000000000000"); - } - } else { - if ($Value.u6= 4 > 0x7FFFFFFFFFFFFFFF) { - _PCATCH (VF= R_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FF= FFFFFFFFFFFFF, small than -0x8000000000000000"); + $Value.u32 = =3D ~$Value.u32 + 1; + } + break; + case EFI_IFR_TYPE= _NUM_SIZE_64 : + $Value.u64 = =3D _STOU64(N1->getText(), N1->getLine()); + if (IntDecStyle= ) { + if (Negative)= { + if ($Value.= u64 > 0x8000000000000000) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7= FFFFFFFFFFFFFFF, small than -0x8000000000000000"); + } + } else { + if ($Value.= u64 > 0x7FFFFFFFFFFFFFFF) { + _PCATCH (= VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7= FFFFFFFFFFFFFFF, small than -0x8000000000000000"); + } } } + if (Negative) { + $Value.u64 = =3D ~$Value.u64 + 1; + } + break; + case EFI_IFR_TYPE= _BOOLEAN : + $Value.b = =3D _STOU8(N1->getText(), N1->getLine()); + break; + case EFI_IFR_TYPE= _STRING : + $Value.string = =3D _STOU16(N1->getText(), N1->getLine()); + break; + case EFI_IFR_TYPE= _TIME : + case EFI_IFR_TYPE= _DATE : + case EFI_IFR_TYPE= _REF : + default : + break; } - if (Negative) { - $Value.u64 =3D = ~$Value.u64 + 1; - } - break; - case EFI_IFR_TYPE_B= OOLEAN : - $Value.b =3D= _STOU8(N1->getText(), N1->getLine()); - break; - case EFI_IFR_TYPE_S= TRING : - $Value.string =3D= _STOU16(N1->getText(), N1->getLine()); - break; - case EFI_IFR_TYPE_T= IME : - case EFI_IFR_TYPE_D= ATE : - case EFI_IFR_TYPE_R= EF : - default : - break; } >> | B1:True << $Value.b =3D T= RUE; >> | B2:False << $Value.b =3D F= ALSE; >> | O1:One << $Value.u8 =3D _= STOU8(O1->getText(), O1->getLine()); >> @@ -1689,42 +1843,51 @@ vfrStatementDefault : "=3D" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayTyp= e] "," =20 <<=20 if (gCurrentMinMax= Data !=3D NULL && gCurrentMinMaxData->IsNumericOpcode()) { //check default = value is valid for Numeric Opcode NumericQst =3D (= CIfrNumeric *) gCurrentQuestion; - if ((NumericQst-= >GetNumericFlags() & EFI_IFR_DISPLAY) =3D=3D 0) { + if ((NumericQst-= >GetNumericFlags() & EFI_IFR_DISPLAY) =3D=3D 0 && !(_GET_CURRQEST_VARTINFO(= ).mIsBitVar)) { switch (_GET_C= URRQEST_DATATYPE()) { case EFI_IFR_T= YPE_NUM_SIZE_8: - if (((INT8) = Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) = ||=20 - ((INT8) = Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())))= { + if (((INT8) = Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), F= ALSE)) || + ((INT8) = Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), F= ALSE))) { _PCATCH (V= FR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be b= etween MinValue and MaxValue."); } break; case EFI_IFR_T= YPE_NUM_SIZE_16: - if (((INT16)= Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()= )) ||=20 - ((INT16)= Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()= ))) { + if (((INT16)= Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()= , FALSE)) || + ((INT16)= Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()= , FALSE))) { _PCATCH (V= FR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be b= etween MinValue and MaxValue."); } break; case EFI_IFR_T= YPE_NUM_SIZE_32: - if (((INT32)= Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()= )) ||=20 - ((INT32)= Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()= ))) { + if (((INT32)= Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()= , FALSE)) || + ((INT32)= Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()= , FALSE))) { _PCATCH (V= FR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be b= etween MinValue and MaxValue."); } break; case EFI_IFR_T= YPE_NUM_SIZE_64: - if (((INT64)= Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()= )) ||=20 - ((INT64)= Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()= ))) { + if (((INT64)= Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()= , FALSE)) || + ((INT64)= Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()= , FALSE))) { _PCATCH (V= FR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be b= etween MinValue and MaxValue."); } break; default: break; } } else { - if (Val->u64 <= gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCu= rrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) { + // + // Value for q= uestion stored in bit fields is always set to UINT32 type. + // + if (_GET_CURRQ= EST_VARTINFO().mIsBitVar) { + if (Val->u32= < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), TRUE) || Val->u= 32 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), TRUE)) { _PCATCH (VFR= _RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be bet= ween MinValue and MaxValue."); + } + } else { + if (Val->u64= < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE) || Val->= u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE)) { + _PCATCH (V= FR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be b= etween MinValue and MaxValue."); + } } } } if (_GET_CURRQEST_= DATATYPE() =3D=3D EFI_IFR_TYPE_OTHER) { _PCATCH (VFR_RET= URN_FATAL_ERROR, D->getLine(), "Default data type error."); @@ -1759,21 +1922,29 @@ vfrStatementDefault : =20 default: break; } } else { - _PCATCH (gCVfrVa= rDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine()= ); + if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { + Size =3D sizeo= f (UINT32); + } else { + _PCATCH (gCVfr= VarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine= ()); + } } Size +=3D OFFSET_O= F (EFI_IFR_DEFAULT, Value); DObj =3D new CIfrD= efault ((UINT8)Size); DObj->SetLineNo(D-= >getLine()); if (ArrayType) { DObj->SetType (E= FI_IFR_TYPE_BUFFER); } else if (gIsStri= ngOp) { DObj->SetType (E= FI_IFR_TYPE_STRING); } else { - DObj->SetType (_= GET_CURRQEST_DATATYPE()); + if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { + DObj->SetType = (EFI_IFR_TYPE_NUM_SIZE_32); + } else { + DObj->SetType = (_GET_CURRQEST_DATATYPE()); + } } DObj->SetValue(*Va= l); >> | << IsExp =3D TRUE; DOb= j2 =3D new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1= ); >> vfrStatementValue "," << CIfrEnd EndObj1; En= dObj1.SetLineNo(D->getLine()); >> @@ -2176,39 +2347,72 @@ vfrStatementBooleanType : // default value =3D TRUE, defaultstore =3D MyDefaultStore, // endcheckbox; // vfrStatementCheckBox : << - CIfrCheckBox CBObj; + CIfrCheckBox *CBObj =3D NULL; EFI_IFR_TYPE_VALUE Val =3D gZeroEfiIfrTypeValue; CHAR8 *VarStoreName =3D NULL; UINT32 DataTypeSize; EFI_GUID *VarStoreGuid =3D NULL; + CIfrGuid *GuidObj =3D NULL; + EFI_QUESTION_ID QId =3D EFI_QUESTION_ID_INVALID;; + EFI_VARSTORE_INFO Info; + Info.mVarType =3D EFI_IFR_TYPE_OTHER; + Info.mVarTotalSize =3D 0; + Info.mInfo.mVarOffset =3D EFI_VAROFFSET_INVALID; + Info.mVarStoreId =3D EFI_VARSTORE_ID_INVALID; + Info.mIsBitVar =3D FALSE; >> - L:CheckBox << CBObj.SetLineNo(= L->getLine()); >> - vfrQuestionHeader[CBObj] "," << //check data typ= e + L:CheckBox + vfrQuestionBaseInfo[Info, QId] << + // + // Create a GUID = opcode to wrap the checkbox opcode, if it refer to bit varstore. + // + if (_GET_CURRQEST= _VARTINFO().mIsBitVar) { + GuidObj =3D new= CIfrGuid(0); + GuidObj->SetGui= d (&gEfiIfrBitvarstoreGuid); + GuidObj->SetLin= eNo(L->getLine()); + } + CBObj =3D new CIf= rCheckBox; + CBObj->SetLineNo(= L->getLine()); + CBObj->SetQuestio= nId (QId); + CBObj->SetVarStor= eInfo (&Info); + >> + vfrStatementHeader[CBObj]"," << //check data t= ype if (_GET_CURRQES= T_DATATYPE() =3D=3D EFI_IFR_TYPE_OTHER) { _GET_CURRQEST_= VARTINFO().mVarType =3D EFI_IFR_TYPE_BOOLEAN; } if (_GET_CURRQES= T_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { - _PCATCH (gCVfr= VarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L-= >getLine(), "CheckBox varid is not the valid data type"); - if (DataTypeSi= ze !=3D 0 && DataTypeSize !=3D _GET_CURRQEST_VARSIZE()) { - _PCATCH (VFR= _RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support ar= ray"); - } else if ((gC= VfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) =3D= =3D EFI_VFR_VARSTORE_BUFFER) && - (_GE= T_CURRQEST_VARSIZE() !=3D sizeof (BOOLEAN))) { - _PCATCH (VFR= _RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLE= AN data type"); + // + // Check wheth= er the question refers to a bit field, if yes. create a Guid to indicate th= e question refers to a bit field. + // + if (_GET_CURRQ= EST_VARTINFO ().mIsBitVar) { + _PCATCH (gCV= frVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), = L->getLine(), "CheckBox varid is not the valid data type"); + if ((gCVfrDa= taStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) =3D=3D EFI= _VFR_VARSTORE_BUFFER_BITS) && + (_GET_CU= RRQEST_VARSIZE() !=3D 1)) { + _PCATCH (V= FR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only occupy 1 bi= t in Bit Varstore"); + } + } else { + _PCATCH (gCV= frVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), = L->getLine(), "CheckBox varid is not the valid data type"); + if (DataType= Size !=3D 0 && DataTypeSize !=3D _GET_CURRQEST_VARSIZE()) { + _PCATCH (V= FR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support = array"); + } else if ((= gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) =3D= =3D EFI_VFR_VARSTORE_BUFFER) && + (_= GET_CURRQEST_VARSIZE() !=3D sizeof (BOOLEAN))) { + _PCATCH (V= FR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOO= LEAN data type"); + } } } >> { - F:FLAGS "=3D" vfrCheckBoxFlags[CBObj, F->getLine()] "," + F:FLAGS "=3D" vfrCheckBoxFlags[*CBObj, F->getLine()] "," << if (_GET_CURRQEST= _VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { _PCATCH(gCVfrD= ataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStore= Name), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name"); VarStoreGuid = =3D gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId); Val.b =3D TRUE= ; - if (CBObj.GetF= lags () & 0x01) { + if (CBObj->Get= Flags () & 0x01) { CheckDuplica= teDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F); _PCATCH( gCVfrDefau= ltStore.BufferVarStoreAltConfigAdd ( = EFI_HII_DEFAULT_CLASS_STANDARD, = _GET_CURRQEST_VARTINFO(), @@ -2220,11 +2424,11 @@ vfrStatementCheckBox : VFR_RETURN= _SUCCESS, L, "No standa= rd default storage found" ); } - if (CBObj.GetF= lags () & 0x02) { + if (CBObj->Get= Flags () & 0x02) { CheckDuplica= teDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F); _PCATCH( gCVfrDefau= ltStore.BufferVarStoreAltConfigAdd ( = EFI_HII_DEFAULT_CLASS_MANUFACTURING, = _GET_CURRQEST_VARTINFO(), @@ -2240,14 +2444,21 @@ vfrStatementCheckBox : } } >> } { - Key "=3D" KN:Number "," << AssignQuestion= Key (CBObj, KN); >> + Key "=3D" KN:Number "," << AssignQuestion= Key (*CBObj, KN); >> } vfrStatementQuestionOptionList - E:EndCheckBox << CRT_END_OP (E); = >> + E:EndCheckBox << CRT_END_OP (E); + if (GuidObj !=3D= NULL) { + GuidObj->SetSc= ope(1); + CRT_END_OP (E)= ; + delete GuidObj= ; + } + if (CBObj !=3D N= ULL) delete CBObj; + >> ";" ; =20 vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] : << @@ -2439,11 +2650,12 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] : UINT32 MaxU4 =3D 0, MinU4 =3D 0, StepU4 =3D 0; UINT16 MaxU2 =3D 0, MinU2 =3D 0, StepU2 =3D 0; UINT8 MaxU1 =3D 0, MinU1 =3D 0, StepU1 =3D 0; BOOLEAN IntDecStyle =3D FALSE; CIfrNumeric *NObj =3D (CIfrNumeric *) (&MMSDObj); - if ((NObj->GetOpCode() =3D=3D EFI_IFR_NUMERIC_OP) && ((NObj->GetNumer= icFlags() & EFI_IFR_DISPLAY) =3D=3D 0)) { + if (((_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() =3D= =3D EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY_BIT)= =3D=3D 0)) || + (!(_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() =3D=3D E= FI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) =3D=3D 0= ))) { IntDecStyle =3D TRUE; } BOOLEAN MinNegative =3D FALSE; BOOLEAN MaxNegative =3D FALSE; >> @@ -2453,383 +2665,539 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] : } I:Number "," << if (!IntDecStyle= && MinNegative) { _PCATCH (VFR_R= ETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int= decimal type. "); } - switch (_GET_CUR= RQEST_DATATYPE()) { - case EFI_IFR_TYP= E_NUM_SIZE_64 : - MinU8 =3D _STO= U64(I->getText(), I->getLine()); - if (IntDecStyl= e) { - if (MinNegat= ive) {=20 - if (MinU8 = > 0x8000000000000000) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't smal= l than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); - } - } else { - if (MinU8 = > 0x7FFFFFFFFFFFFFFF) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't smal= l than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); - } - } - } - if (MinNegativ= e) { - MinU8 =3D ~M= inU8 + 1; - } - break; - case EFI_IFR_TYP= E_NUM_SIZE_32 : + // + // Value for que= stion stored in bit fields is always set to UINT32 type. + // + if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { MinU4 =3D _STO= U32(I->getText(), I->getLine()); - if (IntDecStyl= e) { - if (MinNegat= ive) {=20 - if (MinU4 = > 0x80000000) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't smal= l than -0x80000000, big than 0x7FFFFFFF"); - } - } else { - if (MinU4 = > 0x7FFFFFFF) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't smal= l than -0x80000000, big than 0x7FFFFFFF"); - } - } - } - if (MinNegativ= e) { - MinU4 =3D ~M= inU4 + 1; + if (!IntDecSty= le && MinU4 > (1<< _GET_CURRQEST_VARTINFO().mVarTotalSize) -1) { + _PCATCH (VFR= _RETURN_INVALID_PARAMETER, I->getLine(), "BIT type minimum can't small than= 0, bigger than 2^BitWidth -1"); } - break; - case EFI_IFR_TYP= E_NUM_SIZE_16 : - MinU2 =3D _STO= U16(I->getText(), I->getLine()); - if (IntDecStyl= e) { - if (MinNegat= ive) {=20 - if (MinU2 = > 0x8000) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't smal= l than -0x8000, big than 0x7FFF"); + } else { + switch (_GET_C= URRQEST_DATATYPE()) { + case EFI_IFR_T= YPE_NUM_SIZE_64 : + MinU8 =3D _S= TOU64(I->getText(), I->getLine()); + if (IntDecSt= yle) { + if (MinNeg= ative) { + if (MinU= 8 > 0x8000000000000000) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't sm= all than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); + } + } else { + if (MinU= 8 > 0x7FFFFFFFFFFFFFFF) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't sm= all than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); + } } - } else { - if (MinU2 = > 0x7FFF) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't smal= l than -0x8000, big than 0x7FFF"); + } + if (MinNegat= ive) { + MinU8 =3D = ~MinU8 + 1; + } + break; + case EFI_IFR_T= YPE_NUM_SIZE_32 : + MinU4 =3D _S= TOU32(I->getText(), I->getLine()); + if (IntDecSt= yle) { + if (MinNeg= ative) { + if (MinU= 4 > 0x80000000) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't sm= all than -0x80000000, big than 0x7FFFFFFF"); + } + } else { + if (MinU= 4 > 0x7FFFFFFF) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't sm= all than -0x80000000, big than 0x7FFFFFFF"); + } } } - } - if (MinNegativ= e) { - MinU2 =3D ~M= inU2 + 1; - } - break; - case EFI_IFR_TYP= E_NUM_SIZE_8 : - MinU1 =3D _STO= U8(I->getText(), I->getLine()); - if (IntDecStyl= e) { - if (MinNegat= ive) {=20 - if (MinU1 = > 0x80) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small= than -0x80, big than 0x7F"); + if (MinNegat= ive) { + MinU4 =3D = ~MinU4 + 1; + } + break; + case EFI_IFR_T= YPE_NUM_SIZE_16 : + MinU2 =3D _S= TOU16(I->getText(), I->getLine()); + if (IntDecSt= yle) { + if (MinNeg= ative) { + if (MinU= 2 > 0x8000) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't sm= all than -0x8000, big than 0x7FFF"); + } + } else { + if (MinU= 2 > 0x7FFF) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't sm= all than -0x8000, big than 0x7FFF"); + } } - } else { - if (MinU1 = > 0x7F) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small= than -0x80, big than 0x7F"); + } + if (MinNegat= ive) { + MinU2 =3D = ~MinU2 + 1; + } + break; + case EFI_IFR_T= YPE_NUM_SIZE_8 : + MinU1 =3D _S= TOU8(I->getText(), I->getLine()); + if (IntDecSt= yle) { + if (MinNeg= ative) { + if (MinU= 1 > 0x80) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't sma= ll than -0x80, big than 0x7F"); + } + } else { + if (MinU= 1 > 0x7F) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't sma= ll than -0x80, big than 0x7F"); + } } } + if (MinNegat= ive) { + MinU1 =3D = ~MinU1 + 1; + } + break; } - if (MinNegativ= e) { - MinU1 =3D ~M= inU1 + 1; - } - break; } >> Maximum "=3D"=20 {=20 "\-" << MaxNegative =3D = TRUE; >> } A:Number "," << if (!IntDecStyle= && MaxNegative) { _PCATCH (VFR_R= ETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int= decimal type. "); } - - switch (_GET_CUR= RQEST_DATATYPE()) { - case EFI_IFR_TYP= E_NUM_SIZE_64 :=20 - MaxU8 =3D _STO= U64(A->getText(), A->getLine());=20 - if (IntDecStyl= e) { + if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { + MaxU4 =3D _STO= U32(A->getText(), A->getLine()); + if (!IntDecSty= le && MaxU4 > (1<< _GET_CURRQEST_VARTINFO().mVarTotalSize) -1) { + _PCATCH (VFR= _RETURN_INVALID_PARAMETER, A->getLine(), "BIT type maximum can't bigger tha= n 2^BitWidth -1"); + } + } else { + switch (_GET_C= URRQEST_DATATYPE()) { + case EFI_IFR_T= YPE_NUM_SIZE_64 : + MaxU8 =3D _S= TOU64(A->getText(), A->getLine()); + if (IntDecSt= yle) { + if (MaxNeg= ative) { + if (MaxU= 8 > 0x8000000000000000) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't sm= all than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); + } + } else { + if (MaxU= 8 > 0x7FFFFFFFFFFFFFFF) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't sm= all than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); + } + } + } if (MaxNegat= ive) { - if (MaxU8 = > 0x8000000000000000) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't smal= l than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); + MaxU8 =3D = ~MaxU8 + 1; + } + if (IntDecSt= yle) { + if ((INT64= ) MaxU8 < (INT64) MinU8) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } else { - if (MaxU8 = > 0x7FFFFFFFFFFFFFFF) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't smal= l than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); + if (MaxU8 = < MinU8) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } - } - if (MaxNegativ= e) { - MaxU8 =3D ~M= axU8 + 1; - } - if (IntDecStyl= e) { - if ((INT64) = MaxU8 < (INT64) MinU8) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); - } - } else { - if (MaxU8 < = MinU8) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); + break; + case EFI_IFR_T= YPE_NUM_SIZE_32 : + MaxU4 =3D _S= TOU32(A->getText(), A->getLine()); + if (IntDecSt= yle) { + if (MaxNeg= ative) { + if (MaxU= 4 > 0x80000000) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't sm= all than -0x80000000, big than 0x7FFFFFFF"); + } + } else { + if (MaxU= 4 > 0x7FFFFFFF) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't sm= all than -0x80000000, big than 0x7FFFFFFF"); + } + } } - } - break; - case EFI_IFR_TYP= E_NUM_SIZE_32 :=20 - MaxU4 =3D _STO= U32(A->getText(), A->getLine()); - if (IntDecStyl= e) { if (MaxNegat= ive) { - if (MaxU4 = > 0x80000000) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't smal= l than -0x80000000, big than 0x7FFFFFFF"); + MaxU4 =3D = ~MaxU4 + 1; + } + if (IntDecSt= yle) { + if ((INT32= ) MaxU4 < (INT32) MinU4) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } else { - if (MaxU4 = > 0x7FFFFFFF) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't smal= l than -0x80000000, big than 0x7FFFFFFF"); + if (MaxU4 = < MinU4) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } - } - if (MaxNegativ= e) { - MaxU4 =3D ~M= axU4 + 1; - } - if (IntDecStyl= e) { - if ((INT32) = MaxU4 < (INT32) MinU4) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); - } - } else { - if (MaxU4 < = MinU4) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); + break; + case EFI_IFR_T= YPE_NUM_SIZE_16 : + MaxU2 =3D _S= TOU16(A->getText(), A->getLine()); + if (IntDecSt= yle) { + if (MaxNeg= ative) { + if (MaxU= 2 > 0x8000) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't sm= all than -0x8000, big than 0x7FFF"); + } + } else { + if (MaxU= 2 > 0x7FFF) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't sm= all than -0x8000, big than 0x7FFF"); + } + } } - } - break; - case EFI_IFR_TYP= E_NUM_SIZE_16 :=20 - MaxU2 =3D _STO= U16(A->getText(), A->getLine());=20 - if (IntDecStyl= e) { if (MaxNegat= ive) { - if (MaxU2 = > 0x8000) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't smal= l than -0x8000, big than 0x7FFF"); + MaxU2 =3D = ~MaxU2 + 1; + } + if (IntDecSt= yle) { + if ((INT16= ) MaxU2 < (INT16) MinU2) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } else { - if (MaxU2 = > 0x7FFF) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't smal= l than -0x8000, big than 0x7FFF"); + if (MaxU2 = < MinU2) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } - } - if (MaxNegativ= e) { - MaxU2 =3D ~M= axU2 + 1; - } - if (IntDecStyl= e) { - if ((INT16) = MaxU2 < (INT16) MinU2) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); - } - } else { - if (MaxU2 < = MinU2) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); + break; + case EFI_IFR_T= YPE_NUM_SIZE_8 : + MaxU1 =3D _S= TOU8(A->getText(), A->getLine()); + if (IntDecSt= yle) { + if (MaxNeg= ative) { + if (MaxU= 1 > 0x80) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't sma= ll than -0x80, big than 0x7F"); + } + } else { + if (MaxU= 1 > 0x7F) { + _PCATC= H (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't sma= ll than -0x80, big than 0x7F"); + } + } } - } - break; - case EFI_IFR_TYP= E_NUM_SIZE_8 : =20 - MaxU1 =3D _STO= U8(A->getText(), A->getLine()); - if (IntDecStyl= e) { if (MaxNegat= ive) { - if (MaxU1 = > 0x80) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small= than -0x80, big than 0x7F"); + MaxU1 =3D = ~MaxU1 + 1; + } + if (IntDecSt= yle) { + if ((INT8)= MaxU1 < (INT8) MinU1) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } else { - if (MaxU1 = > 0x7F) { - _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small= than -0x80, big than 0x7F"); + if (MaxU1 = < MinU1) { + _PCATCH = (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mi= nimum"); } } + break; } - if (MaxNegativ= e) { - MaxU1 =3D ~M= axU1 + 1; - } - if (IntDecStyl= e) { - if ((INT8) M= axU1 < (INT8) MinU1) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); - } - } else { - if (MaxU1 < = MinU1) { - _PCATCH (V= FR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Mini= mum"); - } - } - break; } >> { STEP "=3D" S:Number "," << - switch (_GET_CUR= RQEST_DATATYPE()) { - case EFI_IFR_TYP= E_NUM_SIZE_64 : StepU8 =3D _STOU64(S->getText(), S->getLine()); break; - case EFI_IFR_TYP= E_NUM_SIZE_32 : StepU4 =3D _STOU32(S->getText(), S->getLine()); break; - case EFI_IFR_TYP= E_NUM_SIZE_16 : StepU2 =3D _STOU16(S->getText(), S->getLine()); break; - case EFI_IFR_TYP= E_NUM_SIZE_8 : StepU1 =3D _STOU8(S->getText(), S->getLine()); break; + if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { + StepU4 =3D _ST= OU32(S->getText(), S->getLine()); + } else { + switch (_GET_C= URRQEST_DATATYPE()) { + case EFI_IFR_T= YPE_NUM_SIZE_64 : StepU8 =3D _STOU64(S->getText(), S->getLine()); break; + case EFI_IFR_T= YPE_NUM_SIZE_32 : StepU4 =3D _STOU32(S->getText(), S->getLine()); break; + case EFI_IFR_T= YPE_NUM_SIZE_16 : StepU2 =3D _STOU16(S->getText(), S->getLine()); break; + case EFI_IFR_T= YPE_NUM_SIZE_8 : StepU1 =3D _STOU8(S->getText(), S->getLine()); break; + } } >> } << - switch (_GET_CUR= RQEST_DATATYPE()) { - case EFI_IFR_TYP= E_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break; - case EFI_IFR_TYP= E_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break; - case EFI_IFR_TYP= E_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break; - case EFI_IFR_TYP= E_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break; + if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { + $MMSDObj.SetMi= nMaxStepData (MinU4, MaxU4, StepU4); + } else { + switch (_GET_C= URRQEST_DATATYPE()) { + case EFI_IFR_T= YPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break; + case EFI_IFR_T= YPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break; + case EFI_IFR_T= YPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break; + case EFI_IFR_T= YPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break= ; + } } >> ; =20 vfrStatementNumeric : << - CIfrNumeric NObj; + CIfrNumeric *NObj =3D NULL; UINT32 DataTypeSize; BOOLEAN IsSupported =3D TRUE; UINT8 ShrinkSize =3D 0; + CIfrGuid *GuidObj =3D NULL; + UINT8 LFlags =3D _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZ= E; + EFI_QUESTION_ID QId =3D EFI_QUESTION_ID_INVALID; + EFI_VARSTORE_INFO Info; + Info.mVarType =3D EFI_IFR_TYPE_OTHER; + Info.mVarTotalSize =3D 0; + Info.mInfo.mVarOffset =3D EFI_VAROFFSET_INVALID; + Info.mVarStoreId =3D EFI_VARSTORE_ID_INVALID; + Info.mIsBitVar =3D FALSE; >> - L:Numeric << NObj.SetLineNo(L= ->getLine()); >> - vfrQuestionHeader[NObj] "," << // check data ty= pe + L:Numeric + vfrQuestionBaseInfo[Info, QId] << + // + // Create a GUID = opcode to wrap the numeric opcode, if it refer to bit varstore. + // + if (_GET_CURRQEST= _VARTINFO().mIsBitVar) { + GuidObj =3D new= CIfrGuid(0); + GuidObj->SetGui= d (&gEfiIfrBitvarstoreGuid); + GuidObj->SetLin= eNo(L->getLine()); + } + NObj =3D new CIfr= Numeric; + NObj->SetLineNo(L= ->getLine()); + NObj->SetQuestion= Id (QId); + NObj->SetVarStore= Info (&Info); + >> + vfrStatementHeader[NObj]"," + << + // check data ty= pe if (_GET_CURRQES= T_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { - _PCATCH (gCVfr= VarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L-= >getLine(), "Numeric varid is not the valid data type"); - if (DataTypeSi= ze !=3D 0 && DataTypeSize !=3D _GET_CURRQEST_VARSIZE()) { - _PCATCH (VFR= _RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support arr= ay"); + if (_GET_CURRQ= EST_VARTINFO().mIsBitVar) { + LFlags =3D = (EFI_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE())); + _PCATCH(NObj= ->SetFlagsForBitField (NObj->FLAGS(), LFlags), L->getLine()); + } else { + _PCATCH (gCV= frVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), = L->getLine(), "Numeric varid is not the valid data type"); + if (DataType= Size !=3D 0 && DataTypeSize !=3D _GET_CURRQEST_VARSIZE()) { + _PCATCH (V= FR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support a= rray"); + } + _PCATCH(NObj= ->SetFlags (NObj->FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); } - _PCATCH(NObj.S= etFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); } >> - { F:FLAGS "=3D" vfrNumericFlags[NObj, F->getLine()] "," } + { F:FLAGS "=3D" vfrNumericFlags[*NObj, F->getLine()] "," } { - Key "=3D" KN:Number "," << AssignQuestion= Key (NObj, KN); >> + Key "=3D" KN:Number "," << AssignQuestion= Key (*NObj, KN); >> } - vfrSetMinMaxStep[NObj] << - switch (_GET_CUR= RQEST_DATATYPE()) { + vfrSetMinMaxStep[*NObj] << + if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + switch (_GET_C= URRQEST_DATATYPE()) { + // + // Base on t= he type to know the actual used size,shrink the buffer + // size allo= cate before. + // + case EFI_IFR= _TYPE_NUM_SIZE_8: ShrinkSize =3D 21;break; + case EFI_IFR= _TYPE_NUM_SIZE_16:ShrinkSize =3D 18;break; + case EFI_IFR= _TYPE_NUM_SIZE_32:ShrinkSize =3D 12;break; + case EFI_IFR= _TYPE_NUM_SIZE_64:break; + default: + IsSupporte= d =3D FALSE; + break; + } + } else { // - // Base on the= type to know the actual used size,shrink the buffer=20 - // size alloca= te before. + // Question st= ored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_= TYPE_NUM_SIZE_32. // - case EFI_IFR_T= YPE_NUM_SIZE_8: ShrinkSize =3D 21;break; - case EFI_IFR_T= YPE_NUM_SIZE_16:ShrinkSize =3D 18;break; - case EFI_IFR_T= YPE_NUM_SIZE_32:ShrinkSize =3D 12;break; - case EFI_IFR_T= YPE_NUM_SIZE_64:break; - default:=20 - IsSupported = =3D FALSE; - break; + ShrinkSize =3D= 12; } - NObj.ShrinkBinSi= ze (ShrinkSize); + NObj->ShrinkBinS= ize (ShrinkSize); + if (!IsSupported= ) { _PCATCH (VFR_R= ETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8= , UINT16, UINT32 and UINT64 data type."); } >> vfrStatementQuestionOptionList E:EndNumeric <<=20 - CRT_END_OP (E);= =20 + CRT_END_OP (E); + if (GuidObj !=3D= NULL) { + GuidObj->SetSc= ope(1); + CRT_END_OP (E)= ; + delete GuidObj= ; + } + if (NObj !=3D NU= LL) delete NObj; >> ";" ; =20 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] : << UINT8 LFlags =3D _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE; UINT8 HFlags =3D 0; - EFI_VFR_VARSTORE_TYPE VarStoreType =3D EFI_VFR_VARSTORE_INVALID; BOOLEAN IsSetType =3D FALSE; BOOLEAN IsDisplaySpecified =3D FALSE; + EFI_VFR_VARSTORE_TYPE VarStoreType =3D gCVfrDataStorage.GetVarStoreTy= pe (_GET_CURRQEST_VARTINFO().mVarStoreId); >> - numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" = numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )* + numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum= ] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, L= ineNum] )* << //check data typ= e flag - if (_GET_CURRQES= T_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { - VarStoreType = =3D gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId)= ; - if (VarStoreTy= pe =3D=3D EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_E= FI) { - if (_GET_CUR= RQEST_DATATYPE() !=3D (LFlags & EFI_IFR_NUMERIC_SIZE)) { - _PCATCH(VF= R_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric V= arData type"); + if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + if (_GET_CURRQ= EST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { + if (VarStore= Type =3D=3D EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE= _EFI) { + if (_GET_C= URRQEST_DATATYPE() !=3D (LFlags & EFI_IFR_NUMERIC_SIZE)) { + _PCATCH(= VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric= VarData type"); + } + } else { + // update = data type for name/value store + UINT32 Dat= aTypeSize; + _GET_CURRQ= EST_VARTINFO().mVarType =3D LFlags & EFI_IFR_NUMERIC_SIZE; + gCVfrVarDa= taTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize); + _GET_CURRQ= EST_VARTINFO().mVarTotalSize =3D DataTypeSize; } - } else { - // update da= ta type for name/value store - UINT32 DataT= ypeSize; + } else if (IsS= etType){ _GET_CURRQES= T_VARTINFO().mVarType =3D LFlags & EFI_IFR_NUMERIC_SIZE; - gCVfrVarData= TypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize); - _GET_CURRQES= T_VARTINFO().mVarTotalSize =3D DataTypeSize; } - } else if (IsSet= Type){ - _GET_CURRQEST_= VARTINFO().mVarType =3D LFlags & EFI_IFR_NUMERIC_SIZE; + _PCATCH(NObj.S= etFlags (HFlags, LFlags, IsDisplaySpecified), LineNum); + } else if ((_GET= _CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) && (_GET_CUR= RQEST_VARTINFO().mIsBitVar)) { + LFlags |=3D (E= FI_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE())); + _PCATCH(NObj.S= etFlagsForBitField (HFlags, LFlags, IsDisplaySpecified), LineNum); } - _PCATCH(NObj.Set= Flags (HFlags, LFlags, IsDisplaySpecified), LineNum); >> ; =20 -numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BO= OLEAN & IsDisplaySpecified] : +numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BO= OLEAN & IsDisplaySpecified, UINT32 LineNum] : N:Number << _PCATCH(_STOU8(N= ->getText(), N->getLine()) =3D=3D 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUP= PORTED, N->getLine()); >> - | "NUMERIC_SIZE_1" << $LFlags =3D ($LF= lags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType =3D TRUE;= >> - | "NUMERIC_SIZE_2" << $LFlags =3D ($LF= lags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType =3D TRUE;= >> - | "NUMERIC_SIZE_4" << $LFlags =3D ($LF= lags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType =3D TRUE;= >> - | "NUMERIC_SIZE_8" << $LFlags =3D ($LF= lags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType =3D TRUE;= >> - | "DISPLAY_INT_DEC" << $LFlags =3D ($LF= lags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified =3D = TRUE;>> - | "DISPLAY_UINT_DEC" << $LFlags =3D ($LF= lags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified =3D= TRUE;>> - | "DISPLAY_UINT_HEX" << $LFlags =3D ($LF= lags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified =3D= TRUE;>> + | "NUMERIC_SIZE_1" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1;IsSetType =3D TRUE= ; + } else { + _PCATCH(VFR_RE= TURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric v= alue for BIT field"); + } + >> + | "NUMERIC_SIZE_2" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2;IsSetType =3D TRUE= ; + } else { + _PCATCH(VFR_RE= TURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric v= alue for BIT field"); + } + >> + | "NUMERIC_SIZE_4" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType =3D TRU= E; + } else { + _PCATCH(VFR_RE= TURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric v= alue for BIT field"); + } + >> + | "NUMERIC_SIZE_8" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType =3D TRU= E; + } else { + _PCATCH(VFR_RE= TURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric v= alue for BIT field"); + } + >> + | "DISPLAY_INT_DEC" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; + } else { + $LFlags =3D ($= LFlags & ~EFI_IFR_DISPLAY_BIT) | EFI_IFR_DISPLAY_INT_DEC_BIT; + } + IsDisplaySpecifi= ed =3D TRUE; + >> + | "DISPLAY_UINT_DEC" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; + } else { + $LFlags =3D ($= LFlags & ~EFI_IFR_DISPLAY_BIT) | EFI_IFR_DISPLAY_UINT_DEC_BIT; + } + IsDisplaySpecifi= ed =3D TRUE; + >> + | "DISPLAY_UINT_HEX" << if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + $LFlags =3D ($= LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; + } else { + $LFlags =3D ($= LFlags & ~EFI_IFR_DISPLAY_BIT) | EFI_IFR_DISPLAY_UINT_HEX_BIT; + } + IsDisplaySpecifi= ed =3D TRUE; + >> | questionheaderFlagsField[HFlags] ; =20 vfrStatementOneOf : << - CIfrOneOf OObj; + CIfrOneOf *OObj =3D NULL; UINT32 DataTypeSize; BOOLEAN IsSupported =3D TRUE; UINT8 ShrinkSize =3D 0; + CIfrGuid *GuidObj =3D NULL; + UINT8 LFlags =3D _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE; + EFI_QUESTION_ID QId =3D EFI_QUESTION_ID_INVALID;; + EFI_VARSTORE_INFO Info; + Info.mVarType =3D EFI_IFR_TYPE_OTHER; + Info.mVarTotalSize =3D 0; + Info.mInfo.mVarOffset =3D EFI_VAROFFSET_INVALID; + Info.mVarStoreId =3D EFI_VARSTORE_ID_INVALID; + Info.mIsBitVar =3D FALSE; >> - L:OneOf << OObj.SetLineNo(L= ->getLine()); >> - vfrQuestionHeader[OObj] "," << //check data typ= e + L:OneOf + vfrQuestionBaseInfo[Info, QId] << + // + // Create a GUID = opcode to wrap the oneof opcode, if it refer to bit varstore. + // + if (_GET_CURRQEST= _VARTINFO().mIsBitVar) { + GuidObj =3D new= CIfrGuid(0); + GuidObj->SetGui= d (&gEfiIfrBitvarstoreGuid); + GuidObj->SetLin= eNo(L->getLine()); + } + OObj =3D new CIfr= OneOf; + OObj->SetLineNo(L= ->getLine()); + OObj->SetQuestion= Id (QId); + OObj->SetVarStore= Info (&Info); + >> + vfrStatementHeader[OObj]"," + << //check data ty= pe if (_GET_CURRQES= T_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { - _PCATCH (gCVfr= VarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L-= >getLine(), "OneOf varid is not the valid data type"); - if (DataTypeSi= ze !=3D 0 && DataTypeSize !=3D _GET_CURRQEST_VARSIZE()) { - _PCATCH (VFR= _RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array= "); + if (_GET_CURRQ= EST_VARTINFO().mIsBitVar) { + LFlags =3D = (EFI_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE())); + _PCATCH(OObj= ->SetFlagsForBitField (OObj->FLAGS(), LFlags), L->getLine()); + } else { + _PCATCH (gCV= frVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), = L->getLine(), "OneOf varid is not the valid data type"); + if (DataType= Size !=3D 0 && DataTypeSize !=3D _GET_CURRQEST_VARSIZE()) { + _PCATCH (V= FR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support arr= ay"); + } + _PCATCH(OObj= ->SetFlags (OObj->FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); } - _PCATCH(OObj.S= etFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); } >> - { F:FLAGS "=3D" vfrOneofFlagsField[OObj, F->getLine()] "," } + { F:FLAGS "=3D" vfrOneofFlagsField[*OObj, F->getLine()] "," } { - vfrSetMinMaxStep[OObj] + vfrSetMinMaxStep[*OObj] } << - switch (_GET_CUR= RQEST_DATATYPE()) { + if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + switch (_GET_C= URRQEST_DATATYPE()) { + // + // Base on t= he type to know the actual used size,shrink the buffer + // size allo= cate before. + // + case EFI_IFR= _TYPE_NUM_SIZE_8: ShrinkSize =3D 21;break; + case EFI_IFR= _TYPE_NUM_SIZE_16:ShrinkSize =3D 18;break; + case EFI_IFR= _TYPE_NUM_SIZE_32:ShrinkSize =3D 12;break; + case EFI_IFR= _TYPE_NUM_SIZE_64:break; + default: + IsSupporte= d =3D FALSE; + break; + } + } else { // - // Base on the= type to know the actual used size,shrink the buffer=20 - // size alloca= te before. + // Question st= ored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_= TYPE_NUM_SIZE_32. // - case EFI_IFR_T= YPE_NUM_SIZE_8: ShrinkSize =3D 21;break; - case EFI_IFR_T= YPE_NUM_SIZE_16:ShrinkSize =3D 18;break; - case EFI_IFR_T= YPE_NUM_SIZE_32:ShrinkSize =3D 12;break; - case EFI_IFR_T= YPE_NUM_SIZE_64:break; - default: - IsSupported = =3D FALSE; - break; + ShrinkSize =3D= 12; } - OObj.ShrinkBinSi= ze (ShrinkSize); + OObj->ShrinkBinS= ize (ShrinkSize); + if (!IsSupported= ) { _PCATCH (VFR_R= ETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, = UINT16, UINT32 and UINT64 data type."); } >> vfrStatementQuestionOptionList E:EndOneOf << - CRT_END_OP (E);= =20 + CRT_END_OP (E); + if (GuidObj !=3D= NULL) { + GuidObj->SetSc= ope(1); + CRT_END_OP (E)= ; + delete GuidObj= ; + } + if (OObj !=3D NU= LL) delete OObj; >> ";" ; =20 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] : << UINT8 LFlags =3D _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE; UINT8 HFlags =3D 0; - EFI_VFR_VARSTORE_TYPE VarStoreType =3D EFI_VFR_VARSTORE_INVALID; BOOLEAN IsSetType =3D FALSE; BOOLEAN IsDisplaySpecified =3D FALSE; + EFI_VFR_VARSTORE_TYPE VarStoreType =3D gCVfrDataStorage.GetVarStoreTy= pe (_GET_CURRQEST_VARTINFO().mVarStoreId); >> - numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" = numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )* + numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum= ] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, L= ineNum] )* << //check data typ= e flag - if (_GET_CURRQES= T_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { - VarStoreType = =3D gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId)= ; - if (VarStoreTy= pe =3D=3D EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_E= FI) { - if (_GET_CUR= RQEST_DATATYPE() !=3D (LFlags & EFI_IFR_NUMERIC_SIZE)) { - _PCATCH(VF= R_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric V= arData type"); + if (!_GET_CURRQE= ST_VARTINFO().mIsBitVar) { + if (_GET_CURRQ= EST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { + if (VarStore= Type =3D=3D EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE= _EFI) { + if (_GET_C= URRQEST_DATATYPE() !=3D (LFlags & EFI_IFR_NUMERIC_SIZE)) { + _PCATCH(V= FR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric = VarData type"); + } + } else { + // update = data type for Name/Value store + UINT32 Dat= aTypeSize; + _GET_CURRQ= EST_VARTINFO().mVarType =3D LFlags & EFI_IFR_NUMERIC_SIZE; + gCVfrVarDa= taTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize); + _GET_CURRQ= EST_VARTINFO().mVarTotalSize =3D DataTypeSize; } - } else { - // update da= ta type for Name/Value store - UINT32 DataT= ypeSize; + } else if (IsS= etType){ _GET_CURRQES= T_VARTINFO().mVarType =3D LFlags & EFI_IFR_NUMERIC_SIZE; - gCVfrVarData= TypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize); - _GET_CURRQES= T_VARTINFO().mVarTotalSize =3D DataTypeSize; } - } else if (IsSet= Type){ - _GET_CURRQEST_= VARTINFO().mVarType =3D LFlags & EFI_IFR_NUMERIC_SIZE; + _PCATCH(OObj.S= etFlags (HFlags, LFlags), LineNum); + } else if (_GET_= CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) { + _PCATCH(OObj.S= etFlagsForBitField (HFlags, LFlags), LineNum); } - _PCATCH(OObj.Set= Flags (HFlags, LFlags), LineNum); >> ; =20 vfrStatementStringType : vfrStatementString | @@ -3379,26 +3747,30 @@ vfrStatementOneOfOption : Text "=3D" "STRING_TOKEN" "\(" S:Number "\)" "," =20 Value "=3D" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayT= ype] "," <<=20 if (gCurrentMinM= axData !=3D NULL) { //set min/max = value for oneof opcode - UINT64 Step = =3D gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE()); - switch (_GET_C= URRQEST_DATATYPE()) { - case EFI_IFR_T= YPE_NUM_SIZE_64: - gCurrentMinM= axData->SetMinMaxStepData(Val->u64, Val->u64, Step); - break; - case EFI_IFR_T= YPE_NUM_SIZE_32: + UINT64 Step = =3D gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE(), _GET_CURRQEST= _VARTINFO().mIsBitVar); + if (_GET_CURRQ= EST_VARTINFO().mIsBitVar) { gCurrentMinM= axData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step); - break; - case EFI_IFR_T= YPE_NUM_SIZE_16: - gCurrentMinM= axData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step); - break; - case EFI_IFR_T= YPE_NUM_SIZE_8: - gCurrentMinM= axData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step); - break; - default: - break; + } else { + switch (_GET= _CURRQEST_DATATYPE()) { + case EFI_IFR= _TYPE_NUM_SIZE_64: + gCurrentMi= nMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step); + break; + case EFI_IFR= _TYPE_NUM_SIZE_32: + gCurrentMi= nMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step); + break; + case EFI_IFR= _TYPE_NUM_SIZE_16: + gCurrentMi= nMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step); + break; + case EFI_IFR= _TYPE_NUM_SIZE_8: + gCurrentMi= nMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step); + break; + default: + break; + } } } if (_GET_CURRQES= T_DATATYPE() =3D=3D EFI_IFR_TYPE_OTHER) { Size =3D sizeo= f (EFI_IFR_TYPE_VALUE); } else if (Array= Type) { @@ -3428,24 +3800,35 @@ vfrStatementOneOfOption : break; default: break; } } else { - ReturnCode =3D= gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size); + // + // For the one= of stored in bit fields, set the option type as UINT32. + // + if (_GET_CURRQ= EST_VARTINFO().mIsBitVar) { + Size =3D siz= eof (UINT32); + } else { + ReturnCode = =3D gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size); + } } if (ReturnCode != =3D VFR_RETURN_SUCCESS) { _PCATCH (Retur= nCode, L->getLine()); } =20 Size +=3D OFFSET= _OF (EFI_IFR_ONE_OF_OPTION, Value); OOOObj =3D new C= IfrOneOfOption((UINT8)Size); OOOObj->SetLineN= o(L->getLine()); OOOObj->SetOptio= n (_STOSID(S->getText(), S->getLine()));=20 if (ArrayType) { - OOOObj->SetTyp= e (EFI_IFR_TYPE_BUFFER);=20 + OOOObj->SetTyp= e (EFI_IFR_TYPE_BUFFER); } else { - OOOObj->SetTyp= e (_GET_CURRQEST_DATATYPE());=20 + if (_GET_CURRQ= EST_VARTINFO().mIsBitVar) { + OOOObj->SetT= ype ( EFI_IFR_TYPE_NUM_SIZE_32); + } else { + OOOObj->SetT= ype (_GET_CURRQEST_DATATYPE()); + } } OOOObj->SetValue= (*Val);=20 >> F:FLAGS "=3D" vfrOneOfOptionFlags[*OOOObj, F->getLine()] << @@ -5220,11 +5603,12 @@ EfiVfrParser::_DeclareDefaultLinearVarStore ( gCVfrDataStorage.DeclareBufferVarStore ( TypeNameList[Index], &mFormsetGuid, &gCVfrVarDataTypeDB, TypeNameList[Index], - EFI_VARSTORE_ID_INVALID + EFI_VARSTORE_ID_INVALID, + FALSE ); gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFor= msetGuid); VSObj.SetVarStoreId (VarStoreId); gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size); VSObj.SetSize ((UINT16) Size); @@ -5245,11 +5629,12 @@ EfiVfrParser::_DeclareDefaultLinearVarStore ( gCVfrDataStorage.DeclareBufferVarStore ( (CHAR8 *) DateName, &mFormsetGuid, &gCVfrVarDataTypeDB, (CHAR8 *) DateType, - EFI_VARSTORE_ID_INVALID + EFI_VARSTORE_ID_INVALID, + FALSE ); gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mForm= setGuid); VSObj.SetVarStoreId (VarStoreId); gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size); VSObj.SetSize ((UINT16) Size); @@ -5266,11 +5651,12 @@ EfiVfrParser::_DeclareDefaultLinearVarStore ( gCVfrDataStorage.DeclareBufferVarStore ( (CHAR8 *) TimeName, &mFormsetGuid, &gCVfrVarDataTypeDB, (CHAR8 *) TimeType, - EFI_VARSTORE_ID_INVALID + EFI_VARSTORE_ID_INVALID, + FALSE ); gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mForm= setGuid); VSObj.SetVarStoreId (VarStoreId); gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size); VSObj.SetSize ((UINT16) Size); diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp b/BaseTools/So= urce/C/VfrCompile/VfrUtilityLib.cpp index 37b58e2..23fffa1 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp @@ -598,10 +598,65 @@ CVfrVarDataTypeDB::ExtractStructTypeName ( } =20 return VFR_RETURN_SUCCESS; } =20 +/** + Check whether the DataType contain bit field. + + @param TypeName The name of the type. + +**/ +BOOLEAN +CVfrVarDataTypeDB::DataTypeHasBitField ( + IN CHAR8 *TypeName + ) +{ + SVfrDataType *pType =3D NULL; + SVfrDataField *pTmp; + + GetDataType (TypeName, &pType); + for (pTmp =3D pType->mMembers; pTmp!=3D NULL; pTmp =3D pTmp->mNext) { + if (pTmp->mIsBitField) { + return TRUE; + } + } + return FALSE; +} + +/** + Check whether the field is bit field or not. + + @param VarStr Point to the field name which may contain the structu= re name. + +**/ +BOOLEAN +CVfrVarDataTypeDB::IsThisBitField ( + IN CHAR8 *VarStr + ) +{ + CHAR8 FName[MAX_NAME_LEN]; + CHAR8 TName[MAX_NAME_LEN]; + UINT32 ArrayIdx; + SVfrDataType *pType =3D NULL; + SVfrDataField *pField =3D NULL; + + CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SU= CCESS); + CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS); + + while (*VarStr !=3D '\0') { + CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx),= VFR_RETURN_SUCCESS); + CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUC= CESS); + pType =3D pField->mFieldType; + } + if (pField->mIsBitField) { + return TRUE; + } else { + return FALSE; + } +} + EFI_VFR_RETURN_CODE CVfrVarDataTypeDB::ExtractFieldNameAndArrary ( IN CHAR8 *&VarStr, IN CHAR8 *FName, OUT UINT32 &ArrayIdx @@ -695,11 +750,12 @@ CVfrVarDataTypeDB::GetTypeField ( =20 EFI_VFR_RETURN_CODE CVfrVarDataTypeDB::GetFieldOffset ( IN SVfrDataField *Field, IN UINT32 ArrayIdx, - OUT UINT32 &Offset + OUT UINT32 &Offset, + IN BOOLEAN IsBitField ) { if (Field =3D=3D NULL) { return VFR_RETURN_FATAL_ERROR; } @@ -727,12 +783,15 @@ CVfrVarDataTypeDB::GetFieldOffset ( // // if ((ArrayIdx =3D=3D INVALID_ARRAY_INDEX) && (Field->mArrayNum > 0)) = { // return VFR_RETURN_ERROR_ARRARY_NUM; // } // - - Offset =3D Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx = =3D=3D INVALID_ARRAY_INDEX) ? 0 : ArrayIdx); + if (IsBitField) { + Offset =3D Field->mBitOffset + Field->mFieldType->mTotalSize * ((Array= Idx =3D=3D INVALID_ARRAY_INDEX) ? 0 : ArrayIdx) * 8; + } else { + Offset =3D Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx= =3D=3D INVALID_ARRAY_INDEX) ? 0 : ArrayIdx); + } return VFR_RETURN_SUCCESS; } =20 UINT8 CVfrVarDataTypeDB::GetFieldWidth ( @@ -747,21 +806,26 @@ CVfrVarDataTypeDB::GetFieldWidth ( } =20 UINT32 CVfrVarDataTypeDB::GetFieldSize ( IN SVfrDataField *Field, - IN UINT32 ArrayIdx + IN UINT32 ArrayIdx, + IN BOOLEAN BitField ) { if (Field =3D=3D NULL) { return VFR_RETURN_FATAL_ERROR; } =20 if ((ArrayIdx =3D=3D INVALID_ARRAY_INDEX) && (Field->mArrayNum !=3D 0)) = { - return Field->mFieldType->mTotalSize * Field->mArrayNum; + return Field->mFieldType->mTotalSize * Field->mArrayNum; } else { - return Field->mFieldType->mTotalSize; + if (BitField) { + return Field->mBitWidth; + } else { + return Field->mFieldType->mTotalSize; + } } } =20 VOID CVfrVarDataTypeDB::InternalTypesListInit ( @@ -786,22 +850,25 @@ CVfrVarDataTypeDB::InternalTypesListInit ( strcpy (pYearField->mFieldName, "Year"); GetDataType ((CHAR8 *)"UINT16", &pYearField->mFieldType); pYearField->mOffset =3D 0; pYearField->mNext =3D pMonthField; pYearField->mArrayNum =3D 0; + pYearField->mIsBitField =3D FALSE; =20 strcpy (pMonthField->mFieldName, "Month"); GetDataType ((CHAR8 *)"UINT8", &pMonthField->mFieldType); pMonthField->mOffset =3D 2; pMonthField->mNext =3D pDayField; pMonthField->mArrayNum =3D 0; + pMonthField->mIsBitField =3D FALSE; =20 strcpy (pDayField->mFieldName, "Day"); GetDataType ((CHAR8 *)"UINT8", &pDayField->mFieldType); pDayField->mOffset =3D 3; pDayField->mNext =3D NULL; pDayField->mArrayNum =3D 0; + pDayField->mIsBitField =3D FALSE; =20 New->mMembers =3D pYearField; } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TI= ME") =3D=3D 0) { SVfrDataField *pHoursField =3D new SVfrDataField; SVfrDataField *pMinutesField =3D new SVfrDataField; @@ -810,22 +877,25 @@ CVfrVarDataTypeDB::InternalTypesListInit ( strcpy (pHoursField->mFieldName, "Hours"); GetDataType ((CHAR8 *)"UINT8", &pHoursField->mFieldType); pHoursField->mOffset =3D 0; pHoursField->mNext =3D pMinutesField; pHoursField->mArrayNum =3D 0; + pHoursField->mIsBitField =3D FALSE; =20 strcpy (pMinutesField->mFieldName, "Minutes"); GetDataType ((CHAR8 *)"UINT8", &pMinutesField->mFieldType); pMinutesField->mOffset =3D 1; pMinutesField->mNext =3D pSecondsField; pMinutesField->mArrayNum =3D 0; + pMinutesField->mIsBitField =3D FALSE; =20 strcpy (pSecondsField->mFieldName, "Seconds"); GetDataType ((CHAR8 *)"UINT8", &pSecondsField->mFieldType); pSecondsField->mOffset =3D 2; pSecondsField->mNext =3D NULL; pSecondsField->mArrayNum =3D 0; + pSecondsField->mIsBitField =3D FALSE; =20 New->mMembers =3D pHoursField; } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_RE= F") =3D=3D 0) { SVfrDataField *pQuestionIdField =3D new SVfrDataField; SVfrDataField *pFormIdField =3D new SVfrDataField; @@ -835,28 +905,32 @@ CVfrVarDataTypeDB::InternalTypesListInit ( strcpy (pQuestionIdField->mFieldName, "QuestionId"); GetDataType ((CHAR8 *)"UINT16", &pQuestionIdField->mFieldType); pQuestionIdField->mOffset =3D 0; pQuestionIdField->mNext =3D pFormIdField; pQuestionIdField->mArrayNum =3D 0; + pQuestionIdField->mIsBitField =3D FALSE; =20 strcpy (pFormIdField->mFieldName, "FormId"); GetDataType ((CHAR8 *)"UINT16", &pFormIdField->mFieldType); pFormIdField->mOffset =3D 2; pFormIdField->mNext =3D pFormSetGuidField; pFormIdField->mArrayNum =3D 0; + pFormIdField->mIsBitField =3D FALSE; =20 strcpy (pFormSetGuidField->mFieldName, "FormSetGuid"); GetDataType ((CHAR8 *)"EFI_GUID", &pFormSetGuidField->mFieldType); pFormSetGuidField->mOffset =3D 4; pFormSetGuidField->mNext =3D pDevicePathField; pFormSetGuidField->mArrayNum =3D 0; + pFormSetGuidField->mIsBitField =3D FALSE; =20 strcpy (pDevicePathField->mFieldName, "DevicePath"); GetDataType ((CHAR8 *)"EFI_STRING_ID", &pDevicePathField->mFieldTy= pe); pDevicePathField->mOffset =3D 20; pDevicePathField->mNext =3D NULL; pDevicePathField->mArrayNum =3D 0; + pDevicePathField->mIsBitField =3D FALSE; =20 New->mMembers =3D pQuestionIdField; } else { New->mMembers =3D NULL; } @@ -976,10 +1050,11 @@ CVfrVarDataTypeDB::DeclareDataTypeBegin ( pNewType->mType =3D EFI_IFR_TYPE_OTHER; pNewType->mAlign =3D DEFAULT_ALIGN; pNewType->mTotalSize =3D 0; pNewType->mMembers =3D NULL; pNewType->mNext =3D NULL; + pNewType->mHasBitField =3D FALSE; =20 mNewDataType =3D pNewType; } =20 EFI_VFR_RETURN_CODE @@ -1007,10 +1082,127 @@ CVfrVarDataTypeDB::SetNewTypeName ( =20 strcpy(mNewDataType->mTypeName, TypeName); return VFR_RETURN_SUCCESS; } =20 +/** + Record the bit field info in the data type. + + @param FieldName Point to the field name. + @param TypeName Point to the type name. + @param Width The bit widthS. + @param FieldInUnion The filed is in Union type or Structure type. + +**/ +EFI_VFR_RETURN_CODE +CVfrVarDataTypeDB::DataTypeAddBitField ( + IN CHAR8 *FieldName, + IN CHAR8 *TypeName, + IN UINT32 Width, + IN BOOLEAN FieldInUnion + ) +{ + SVfrDataField *pNewField =3D NULL; + SVfrDataType *pFieldType =3D NULL; + SVfrDataField *pTmp; + UINT32 Align; + UINT32 MaxDataTypeSize; + BOOLEAN UpdateTotalSize; + + CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCC= ESS); + + if (Width > MAX_BIT_WIDTH) { + return VFR_RETURN_BIT_WIDTH_ERROR; + } + + if (Width > pFieldType->mTotalSize * 8) { + return VFR_RETURN_BIT_WIDTH_ERROR; + } + + if (strlen (FieldName) >=3D MAX_NAME_LEN) { + return VFR_RETURN_INVALID_PARAMETER; + } + + if (Width =3D=3D 0 && strcmp (" ", FieldName) !=3D 0) { + return VFR_RETURN_INVALID_PARAMETER; + } + + for (pTmp =3D mNewDataType->mMembers; pTmp !=3D NULL; pTmp =3D pTmp->mNe= xt) { + if (strcmp (pTmp->mFieldName, FieldName) =3D=3D 0 && strcmp (" ", Fiel= dName) !=3D 0) { + return VFR_RETURN_REDEFINED; + } + } + + Align =3D MIN (mPackAlign, pFieldType->mAlign); + UpdateTotalSize =3D FALSE; + + if ((pNewField =3D new SVfrDataField) =3D=3D NULL) { + return VFR_RETURN_OUT_FOR_RESOURCES; + } + + MaxDataTypeSize =3D mNewDataType->mTotalSize; + strcpy (pNewField->mFieldName, FieldName); + pNewField->mFieldType =3D pFieldType; + pNewField->mIsBitField =3D TRUE; + pNewField->mBitWidth =3D Width; + pNewField->mArrayNum =3D 0; + pNewField->mBitOffset =3D 0; + pNewField->mOffset =3D 0; + + if (mNewDataType->mMembers =3D=3D NULL) { + mNewDataType->mMembers =3D pNewField; + pNewField->mNext =3D NULL; + } else { + for (pTmp =3D mNewDataType->mMembers; pTmp->mNext !=3D NULL; pTmp =3D = pTmp->mNext) + ; + pTmp->mNext =3D pNewField; + pNewField->mNext =3D NULL; + } + + if (FieldInUnion) { + pNewField->mOffset =3D 0; + if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) { + mNewDataType->mTotalSize =3D pNewField->mFieldType->mTotalSize; + } + } else { + // + // Check whether the bit fileds can be contained within one FieldType. + // + if (pTmp !=3D NULL && pTmp->mIsBitField && strcmp (pTmp->mFieldType->m= TypeName, pNewField->mFieldType->mTypeName) =3D=3D 0 && + (pTmp->mBitOffset - pTmp->mOffset * 8) + pTmp->mBitWidth + pNewFiel= d->mBitWidth <=3D pNewField->mFieldType->mTotalSize * 8) { + pNewField->mBitOffset =3D pTmp->mBitOffset + pTmp->mBitWidth; + pNewField->mOffset =3D pTmp->mOffset; + // + // If BitWidth=3D0,used to force alignment at the next word boundary= . + // So make this bit field occupy the remaing bit width of current fi= eld type. + // + if (pNewField->mBitWidth =3D=3D 0) { + pNewField->mBitWidth =3D pNewField->mFieldType->mTotalSize * 8 - (= pNewField->mBitOffset - pTmp->mOffset * 8); + } + } else { + // + // The bit filed start a new memory + // + pNewField->mBitOffset =3D mNewDataType->mTotalSize * 8; + UpdateTotalSize =3D TRUE; + } + } + + if (UpdateTotalSize){ + if ((mNewDataType->mTotalSize % Align) =3D=3D 0) { + pNewField->mOffset =3D mNewDataType->mTotalSize; + } else { + pNewField->mOffset =3D mNewDataType->mTotalSize + ALIGN_STUFF(mN= ewDataType->mTotalSize, Align); + } + mNewDataType->mTotalSize =3D pNewField->mOffset + (pNewField->mFieldTy= pe->mTotalSize); + } + + mNewDataType->mAlign =3D MIN (mPackAlign, MAX (pFieldType->mAlign, m= NewDataType->mAlign)); + mNewDataType->mHasBitField =3D TRUE; + return VFR_RETURN_SUCCESS; +} + EFI_VFR_RETURN_CODE CVfrVarDataTypeDB::DataTypeAddField ( IN CHAR8 *FieldName, IN CHAR8 *TypeName, IN UINT32 ArrayNum, @@ -1042,10 +1234,11 @@ CVfrVarDataTypeDB::DataTypeAddField ( return VFR_RETURN_OUT_FOR_RESOURCES; } strcpy (pNewField->mFieldName, FieldName); pNewField->mFieldType =3D pFieldType; pNewField->mArrayNum =3D ArrayNum; + pNewField->mIsBitField =3D FALSE; if ((mNewDataType->mTotalSize % Align) =3D=3D 0) { pNewField->mOffset =3D mNewDataType->mTotalSize; } else { pNewField->mOffset =3D mNewDataType->mTotalSize + ALIGN_STUFF(mNew= DataType->mTotalSize, Align); } @@ -1181,39 +1374,48 @@ CVfrVarDataTypeDB::GetDataTypeSize ( EFI_VFR_RETURN_CODE CVfrVarDataTypeDB::GetDataFieldInfo ( IN CHAR8 *VarStr, OUT UINT16 &Offset, OUT UINT8 &Type, - OUT UINT32 &Size + OUT UINT32 &Size, + OUT BOOLEAN &BitField ) { CHAR8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN]; UINT32 ArrayIdx, Tmp; SVfrDataType *pType =3D NULL; SVfrDataField *pField =3D NULL; + CHAR8 *VarStrName; =20 Offset =3D 0; Type =3D EFI_IFR_TYPE_OTHER; Size =3D 0; + VarStrName =3D VarStr; =20 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SU= CCESS); CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS); =20 + BitField =3D IsThisBitField (VarStrName); + // // if it is not struct data type // Type =3D pType->mType; Size =3D pType->mTotalSize; =20 while (*VarStr !=3D '\0') { - CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), = VFR_RETURN_SUCCESS); + CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx),= VFR_RETURN_SUCCESS); CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUC= CESS); pType =3D pField->mFieldType; - CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_= SUCCESS); - Offset =3D (UINT16) (Offset + Tmp); + CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsB= itField), VFR_RETURN_SUCCESS); + if (BitField && !pField->mIsBitField) { + Offset =3D (UINT16) (Offset + Tmp * 8); + } else { + Offset =3D (UINT16) (Offset + Tmp); + } Type =3D GetFieldWidth (pField); - Size =3D GetFieldSize (pField, ArrayIdx); + Size =3D GetFieldSize (pField, ArrayIdx, BitField); } return VFR_RETURN_SUCCESS; } =20 EFI_VFR_RETURN_CODE @@ -1358,10 +1560,11 @@ SVfrVarStorageNode::SVfrVarStorageNode ( SVfrVarStorageNode::SVfrVarStorageNode ( IN EFI_GUID *Guid, IN CHAR8 *StoreName, IN EFI_VARSTORE_ID VarStoreId, IN SVfrDataType *DataType, + IN BOOLEAN BitsVarstore, IN BOOLEAN Flag ) { if (Guid !=3D NULL) { mGuid =3D *Guid; @@ -1374,11 +1577,15 @@ SVfrVarStorageNode::SVfrVarStorageNode ( } else { mVarStoreName =3D NULL; } mNext =3D NULL; mVarStoreId =3D VarStoreId; - mVarStoreType =3D EFI_VFR_VARSTORE_BUFFER; + if (BitsVarstore) { + mVarStoreType =3D EFI_VFR_VARSTORE_BUFFER_BITS; + } else { + mVarStoreType =3D EFI_VFR_VARSTORE_BUFFER; + } mStorageInfo.mDataType =3D DataType; mAssignedFlag =3D Flag; } =20 SVfrVarStorageNode::SVfrVarStorageNode ( @@ -1646,10 +1853,11 @@ CVfrDataStorage::DeclareBufferVarStore ( IN CHAR8 *StoreName,=20 IN EFI_GUID *Guid,=20 IN CVfrVarDataTypeDB *DataTypeDB, IN CHAR8 *TypeName, IN EFI_VARSTORE_ID VarStoreId, + IN BOOLEAN IsBitVarStore, IN BOOLEAN Flag ) { SVfrVarStorageNode *pNew =3D NULL; SVfrDataType *pDataType =3D NULL; @@ -1672,11 +1880,11 @@ CVfrDataStorage::DeclareBufferVarStore ( return VFR_RETURN_VARSTOREID_REDEFINED; } MarkVarStoreIdUsed (VarStoreId); } =20 - if ((pNew =3D new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pData= Type, Flag)) =3D=3D NULL) { + if ((pNew =3D new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pData= Type, IsBitVarStore, Flag)) =3D=3D NULL) { return VFR_RETURN_OUT_FOR_RESOURCES; } =20 pNew->mNext =3D mBufferVarStoreList; mBufferVarStoreList =3D pNew; @@ -2386,10 +2594,11 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO ( mVarStoreId =3D EFI_VARSTORE_ID_INVALID; mInfo.mVarName =3D EFI_STRING_ID_INVALID; mInfo.mVarOffset =3D EFI_VAROFFSET_INVALID; mVarType =3D EFI_IFR_TYPE_OTHER; mVarTotalSize =3D 0; + mIsBitVar =3D FALSE; } =20 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO ( IN EFI_VARSTORE_INFO &Info ) @@ -2397,10 +2606,11 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO ( mVarStoreId =3D Info.mVarStoreId; mInfo.mVarName =3D Info.mInfo.mVarName; mInfo.mVarOffset =3D Info.mInfo.mVarOffset; mVarType =3D Info.mVarType; mVarTotalSize =3D Info.mVarTotalSize; + mIsBitVar =3D Info.mIsBitVar; } =20 EFI_VARSTORE_INFO& EFI_VARSTORE_INFO::operator=3D ( IN CONST EFI_VARSTORE_INFO &Info @@ -2410,10 +2620,11 @@ EFI_VARSTORE_INFO::operator=3D ( mVarStoreId =3D Info.mVarStoreId; mInfo.mVarName =3D Info.mInfo.mVarName; mInfo.mVarOffset =3D Info.mInfo.mVarOffset; mVarType =3D Info.mVarType; mVarTotalSize =3D Info.mVarTotalSize; + mIsBitVar =3D Info.mIsBitVar; } =20 return *this; } =20 @@ -2424,11 +2635,12 @@ EFI_VARSTORE_INFO::operator =3D=3D ( { if ((mVarStoreId =3D=3D Info->mVarStoreId) && (mInfo.mVarName =3D=3D Info->mInfo.mVarName) && (mInfo.mVarOffset =3D=3D Info->mInfo.mVarOffset) && (mVarType =3D=3D Info->mVarType) && - (mVarTotalSize =3D=3D Info->mVarTotalSize)) { + (mVarTotalSize =3D=3D Info->mVarTotalSize) && + (mIsBitVar =3D=3D Info->mIsBitVar)) { return TRUE; } =20 return FALSE; } @@ -3727,10 +3939,11 @@ CVfrStringDB::GetUnicodeStringTextSize ( =20 return StringSize; } =20 BOOLEAN VfrCompatibleMode =3D FALSE; +EFI_GUID gEfiIfrBitvarstoreGuid =3D {0x82DDD68B, 0x9163, 0x4187, {0x9B, 0x= 27, 0x20, 0xA8, 0xFD, 0x60 ,0xA7 , 0x1D}}; =20 CVfrVarDataTypeDB gCVfrVarDataTypeDB; CVfrDefaultStore gCVfrDefaultStore; CVfrDataStorage gCVfrDataStorage; =20 diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h b/BaseTools/Sour= ce/C/VfrCompile/VfrUtilityLib.h index 0c67d73..c1d124f 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h @@ -20,11 +20,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. #include "Common/UefiBaseTypes.h" #include "EfiVfr.h" #include "VfrError.h" =20 extern BOOLEAN VfrCompatibleMode; +extern EFI_GUID gEfiIfrBitvarstoreGuid; =20 +#define MAX_BIT_WIDTH 32 #define MAX_NAME_LEN 64 #define MAX_STRING_LEN 0x100 #define DEFAULT_ALIGN 1 #define DEFAULT_PACK_ALIGN 0x8 #define DEFAULT_NAME_TABLE_ITEMS 1024 @@ -114,18 +116,22 @@ struct SVfrDataType; struct SVfrDataField { CHAR8 mFieldName[MAX_NAME_LEN]; SVfrDataType *mFieldType; UINT32 mOffset; UINT32 mArrayNum; + BOOLEAN mIsBitField; + UINT8 mBitWidth; + UINT32 mBitOffset; SVfrDataField *mNext; }; =20 struct SVfrDataType { CHAR8 mTypeName[MAX_NAME_LEN]; UINT8 mType; UINT32 mAlign; UINT32 mTotalSize; + BOOLEAN mHasBitField; SVfrDataField *mMembers; SVfrDataType *mNext; }; =20 #define VFR_PACK_ASSIGN 0x01 @@ -193,30 +199,33 @@ private: VOID InternalTypesListInit (VOID); VOID RegisterNewType (IN SVfrDataType *); =20 EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *); EFI_VFR_RETURN_CODE GetTypeField (IN CONST CHAR8 *, IN SVfrDataType *, I= N SVfrDataField *&); - EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT U= INT32 &); + EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT U= INT32 &, IN BOOLEAN); UINT8 GetFieldWidth (IN SVfrDataField *); - UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32); + UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32, IN BOOL= EAN); =20 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,= IN BOOLEAN); + EFI_VFR_RETURN_CODE DataTypeAddBitField (IN CHAR8 *, IN CHAR8 *, IN UINT= 32, 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 *); - EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT= 8 &, OUT UINT32 &); + EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT= 8 &, OUT UINT32 &, OUT BOOLEAN &); =20 EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT3= 2 *); EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *,= OUT UINT32 &); + BOOLEAN DataTypeHasBitField (IN CHAR8 *); + BOOLEAN IsThisBitField (IN CHAR8 *); =20 BOOLEAN IsTypeNameDefined (IN CHAR8 *); =20 VOID Dump(IN FILE *); // @@ -236,11 +245,12 @@ extern CVfrVarDataTypeDB gCVfrVarDataTypeDB; =20 typedef enum { EFI_VFR_VARSTORE_INVALID, EFI_VFR_VARSTORE_BUFFER, EFI_VFR_VARSTORE_EFI, - EFI_VFR_VARSTORE_NAME + EFI_VFR_VARSTORE_NAME, + EFI_VFR_VARSTORE_BUFFER_BITS } EFI_VFR_VARSTORE_TYPE; =20 struct SVfrVarStorageNode { EFI_GUID mGuid; CHAR8 *mVarStoreName; @@ -266,11 +276,11 @@ struct SVfrVarStorageNode { } mNameSpace; } mStorageInfo; =20 public: SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EF= I_STRING_ID, IN UINT32, IN BOOLEAN Flag =3D TRUE); - SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SV= frDataType *, IN BOOLEAN Flag =3D TRUE); + SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SV= frDataType *,IN BOOLEAN, IN BOOLEAN Flag =3D TRUE); SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID); ~SVfrVarStorageNode (VOID); =20 private: SVfrVarStorageNode (IN CONST SVfrVarStorageNode&); // Preven= t copy-construction @@ -283,10 +293,11 @@ struct EFI_VARSTORE_INFO { EFI_STRING_ID mVarName; UINT16 mVarOffset; } mInfo; UINT8 mVarType; UINT32 mVarTotalSize; + BOOLEAN mIsBitVar; =20 EFI_VARSTORE_INFO (VOID); EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &); EFI_VARSTORE_INFO& operator=3D(IN CONST EFI_VARSTORE_INFO &); BOOLEAN operator =3D=3D (IN EFI_VARSTORE_INFO *); @@ -341,11 +352,11 @@ public: EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID); EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *); =20 EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EF= I_STRING_ID, IN UINT32, IN BOOLEAN Flag =3D TRUE); =20 - EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN= CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag =3D T= RUE); + EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN= CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN, IN BOOLEA= N Flag =3D TRUE); =20 EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *, IN= EFI_GUID *VarGuid =3D NULL); EFI_VFR_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID); EFI_GUID * GetVarStoreGuid (IN EFI_VARSTORE_ID); EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **); --=20 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel