From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 3E37621E1B760 for ; Thu, 21 Sep 2017 00:33:02 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Sep 2017 00:36:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.42,424,1500966000"; d="scan'208";a="137810038" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga002.jf.intel.com with ESMTP; 21 Sep 2017 00:36:04 -0700 Received: from fmsmsx117.amr.corp.intel.com (10.18.116.17) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 21 Sep 2017 00:35:37 -0700 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by fmsmsx117.amr.corp.intel.com (10.18.116.17) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 21 Sep 2017 00:31:13 -0700 Received: from shsmsx152.ccr.corp.intel.com ([169.254.6.93]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.159]) with mapi id 14.03.0319.002; Thu, 21 Sep 2017 15:29:57 +0800 From: "Gao, Liming" To: "Bi, Dandan" , "edk2-devel@lists.01.org" CC: "Dong, Eric" Thread-Topic: [PATCH V7 1/6] BaseTool/VfrCompiler: Support Bit fields in EFI/Buffer VarStore Thread-Index: AQHTMqpXBwHluficsEmXwa6t6/D0gKK+8YEA Date: Thu, 21 Sep 2017 07:29:56 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E15BA3B@SHSMSX152.ccr.corp.intel.com> References: <1505978459-434440-1-git-send-email-dandan.bi@intel.com> In-Reply-To: <1505978459-434440-1-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 V7 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: Thu, 21 Sep 2017 07:33:02 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Liming Gao >-----Original Message----- >From: Bi, Dandan >Sent: Thursday, September 21, 2017 3:21 PM >To: edk2-devel@lists.01.org >Cc: Dong, Eric ; Gao, Liming >Subject: [PATCH V7 1/6] BaseTool/VfrCompiler: Support Bit fields in EFI/Bu= ffer >VarStore > >V7: Fix GCC warning and error in VfrCompiler. >V6: Update EDKII extenstion MACRO name with EDKII prefix >which are missing in V5. > >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 | 20 +- > 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 | 242 ++++- > BaseTools/Source/C/VfrCompile/VfrUtilityLib.h | 23 +- > 8 files changed, 1196 insertions(+), 490 deletions(-) > >diff --git a/BaseTools/Source/C/Include/Common/MdeModuleHii.h >b/BaseTools/Source/C/Include/Common/MdeModuleHii.h >index 21c8387..e6538e2 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. > >- Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
>+ Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
> > This program and the accompanying materials are licensed and made >available > under the terms and conditions of the BSD License which accompanies thi= s > distribution. The full text of the license may be found at > http://opensource.org/licenses/bsd-license.php >@@ -210,12 +210,30 @@ typedef struct _EFI_IFR_GUID_VAREQNAME { > /// The the Unicode String will be used as a EFI Variable Name. > /// > UINT16 NameId; > } EFI_IFR_GUID_VAREQNAME; > >+/// >+/// EDKII implementation extension GUID, used to indaicate there are bit >fields in the varstore. >+/// >+#define EDKII_IFR_BIT_VARSTORE_GUID \ >+ { 0x82DDD68B, 0x9163, 0x4187, {0x9B, 0x27, 0x20, 0xA8, 0xFD, 0x60 ,0xA7= , >0x1D}} >+ >+/// >+/// EDKII implementation extension flags, used to indaicate the disply st= yle >and bit width for bit filed storage. >+/// Two high bits for display style and the low six bits for bit width. >+/// >+#define EDKII_IFR_DISPLAY_BIT 0xC0 >+#define EDKII_IFR_DISPLAY_INT_DEC_BIT 0x00 >+#define EDKII_IFR_DISPLAY_UINT_DEC_BIT 0x40 >+#define EDKII_IFR_DISPLAY_UINT_HEX_BIT 0x80 >+ >+#define EDKII_IFR_NUMERIC_SIZE_BIT 0x3F >+ > #pragma pack() > > extern EFI_GUID gEfiIfrTianoGuid; > extern EFI_GUID gEfiIfrFrameworkGuid; >+extern EFI_GUID gEdkiiIfrBitVarStoreGuid; > > #endif > >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 > > VfrCompiler error handler. > >-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
>+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD >License > which accompanies this distribution. The full text of the license may be= found >at > http://opensource.org/licenses/bsd-license.php > >@@ -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 >support"}, > { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined >with different value"}, > { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the >expression"}, > { 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" } > }; > > 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 > > VfrCompiler Error definition > >-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
>+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD >License > which accompanies this distribution. The full text of the license may be= found >at > http://opensource.org/licenses/bsd-license.php > >@@ -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; > > typedef enum { > VFR_WARNING_DEFAULT_VALUE_REDEFINED =3D 0, >diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp >b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp >index 2be0c38..b835062 100644 >--- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp >+++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp >@@ -1,10 +1,10 @@ > /** @file > > The definition of CFormPkg's member function > >-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
>+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD >License > which accompanies this distribution. The full text of the license may be= found >at > http://opensource.org/licenses/bsd-license.php > >@@ -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; > > // > // Declare all questions as Numeric in DisableIf True > // > // DisableIf >@@ -842,18 +845,12 @@ CFormPkg::DeclarePendingQuestion ( > CIfrTrue TObj (LineNo); > > // Declare Numeric qeustion for each undefined question. > for (pNode =3D PendingAssignList; pNode !=3D NULL; pNode =3D pNode->mNe= xt) { > if (pNode->mFlag =3D=3D PENDING) { >- CIfrNumeric CNObj; > EFI_VARSTORE_INFO Info; > 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 o= r 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, Array= Idx); > } 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 || VarStor= eType >=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 >(Info.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, >Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize); >+ ReturnCode =3D lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, >Info.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- >>mKey); > return ReturnCode; > } >- >- CNObj.SetQuestionId (QId); >- CNObj.SetVarStoreInfo (&Info); > // >- // Numeric doesn't support BOOLEAN data type. >- // BOOLEAN type has the same data size to UINT8. >+ // If the storage is bit fields, create Guid opcode to wrap the num= eric >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 (&gEdkiiIfrBitVarGuid); >+ 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 (EDKII_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 undefin= ed >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); > > // > // For undefined Efi VarStore type question >@@ -954,12 +975,22 @@ CFormPkg::DeclarePendingQuestion ( > } > > // > // End for Numeric > // >- CIfrEnd CEObj; >+ CIfrEnd CEObj; > CEObj.SetLineNo (LineNo); >+ // >+ // End for Guided opcode >+ // >+ if (GuidObj !=3D NULL) { >+ CIfrEnd CEObjGuid; >+ CEObjGuid.SetLineNo (LineNo); >+ GuidObj->SetScope(1); >+ delete GuidObj; >+ GuidObj =3D NULL; >+ } > } > } > > // > // End for DisableIf >diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h >b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h >index 17ab14c..8a22cb2 100644 >--- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h >+++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h >@@ -1,10 +1,10 @@ > /** @file > > The definition of CFormPkg's member function > >-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
>+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD >License > which accompanies this distribution. The full text of the license may be= found >at > http://opensource.org/licenses/bsd-license.php > >@@ -565,12 +565,16 @@ public: > } > } > mMinMaxStepData->u8.Step =3D Step; > } > >- 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; > } > >- 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; > } > >- 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; > } > >+ EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 >LFlags, 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 | EDKII_IFR_DISPLAY_UINT_DEC_BIT; >+ } else { >+ mNumeric->Flags =3D LFlags; >+ } >+ return VFR_RETURN_SUCCESS; >+ } >+ > UINT8 GetNumericFlags () { > return mNumeric->Flags; > } > }; > >@@ -1445,10 +1473,26 @@ public: > mOneOf->Flags =3D LFlags | EFI_IFR_DISPLAY_UINT_DEC; > } > return VFR_RETURN_SUCCESS; > } > >+ EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 >LFlags) { >+ 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 | EDKII_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..fbd5abf 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] > )* > ; > > dataStructField64 [BOOLEAN FieldInUnion]: > << UINT32 ArrayNum =3D 0; >> >@@ -467,10 +471,87 @@ dataStructFieldUser [BOOLEAN FieldInUnion]: > OpenBracket I:Number CloseBracket << ArrayNum =3D _STOU= 32(I- >>getText(), I->getLine()); >> > } > ";" << >_PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T- >>getText(), ArrayNum, FieldInUnion), T); >> > ; > >+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.DataTypeAddBi= tField (N- >>getText(), D->getText(), Width, FieldInUnion), N); >+ } else { >+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBi= tField (NULL, >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.DataTypeAddBi= tField (N- >>getText(), D->getText(), Width, FieldInUnion), N); >+ } else { >+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBi= tField (NULL, >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.DataTypeAddBi= tField (N- >>getText(), D->getText(), Width, FieldInUnion), N); >+ } else { >+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBi= tField (NULL, >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.DataTypeAddBi= tField (N- >>getText(), D->getText(), Width, FieldInUnion), N); >+ } else { >+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBi= tField (NULL, >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); > } > } else { >- gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, >FieldType, FieldSize); >+ gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, >FieldType, 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->g= etText(); LineNum >=3D TN->getLine(); >> >+ TN:StringIdentifier "," << TypeName =3D TN->g= etText(); LineNum >=3D TN->getLine(); IsBitVarStore =3D gCVfrVarDataTypeDB.DataTypeHasBitFiel= d >(TN->getText());>> > | U8:"UINT8" "," << TypeName =3D U8->g= etText(); LineNum =3D >U8->getLine(); >> > | U16:"UINT16" "," << TypeName =3D U16->= getText(); LineNum >=3D U16->getLine(); >> > | C16:"CHAR16" "," << TypeName =3D (CHAR= 8 *) "UINT16"; >LineNum =3D C16->getLine(); >> > | U32:"UINT32" "," << TypeName =3D U32->= getText(); LineNum >=3D U32->getLine(); >> > | U64:"UINT64" "," << TypeName =3D U64->= getText(); LineNum >=3D U64->getLine(); >> >@@ -910,16 +1043,17 @@ vfrStatementVarStoreLinear : > StoreName =3D Ty= peName; > } else { > StoreName =3D SN= ->getText(); > } > >_PCATCH(gCVfrDataStorage.DeclareBufferVarStore ( >- = StoreName, >- = &Guid, >- = &gCVfrVarDataTypeDB, >- = TypeName, >- = VarStoreId >- = ), LineNum); >+ = StoreName, >+ = &Guid, >+ = &gCVfrVarDataTypeDB, >+ = TypeName, >+ = VarStoreId, >+ = IsBitVarStore >+ = ), LineNum); > VSObj.SetGuid (&Gu= id); > >_PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), >SN); > VSObj.SetVarStoreI= d (VarStoreId); > >_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), >LineNum); > VSObj.SetSize ((UI= NT16) 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->g= etText(); LineNum >=3D TN->getLine(); CustomizedName =3D TRUE; >> >+ TN:StringIdentifier "," << TypeName =3D TN->g= etText(); LineNum >=3D TN->getLine(); CustomizedName =3D TRUE; IsBitVarStore =3D >gCVfrVarDataTypeDB.DataTypeHasBitField (TN->getText());>> > | U8:"UINT8" "," << TypeName =3D U8->g= etText(); LineNum =3D >U8->getLine(); >> > | U16:"UINT16" "," << TypeName =3D U16->= getText(); LineNum >=3D U16->getLine(); >> > | C16:"CHAR16" "," << TypeName =3D (CHAR= 8 *) "UINT16"; >LineNum =3D C16->getLine(); >> > | U32:"UINT32" "," << TypeName =3D U32->= getText(); LineNum >=3D U32->getLine(); >> > | U64:"UINT64" "," << TypeName =3D U64->= getText(); LineNum >=3D U64->getLine(); >> >@@ -1002,30 +1137,32 @@ vfrStatementVarStoreEfi : > ) > > Uuid "=3D" guidDefinition[Guid] << > if (IsUEFI23EfiVar= store) { > >_PCATCH(gCVfrDataStorage.DeclareBufferVarStore ( >- = StoreName, >- = &Guid, >- = &gCVfrVarDataTypeDB, >- = TypeName, >- = VarStoreId >- = ), LineNum); >+ = StoreName, >+ = &Guid, >+ = &gCVfrVarDataTypeDB, >+ = TypeName, >+ = VarStoreId, >+ = IsBitVarStore >+ = ), LineNum); > >_PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), >SN); > >_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), >LineNum); > } else { >- >_PCATCH(gCVfrDataStorage.DeclareBufferVarStore ( >+ >_PCATCH(gCVfrDataStorage.DeclareBufferVarStore ( > = TN->getText(), > = &Guid, > = &gCVfrVarDataTypeDB, > = TypeName, >- = VarStoreId >- = ), LineNum); >+ = VarStoreId, >+ = FALSE >+ = ), LineNum); > _PCATCH(gCVfrDat= aStorage.GetVarStoreId(TN- >>getText(), &VarStoreId, &Guid), VN); > >_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N- >>getLine()); > } >- VSEObj.SetGuid (&G= uid); >+ VSEObj.SetGuid (&G= uid); > VSEObj.SetVarStore= Id (VarStoreId); > > VSEObj.SetSize ((U= INT16) Size); > VSEObj.SetName (St= oreName); > if (IsUEFI23EfiVar= store =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())); >> > ; > >+vfrQuestionBaseInfo[EFI_VARSTORE_INFO & Info, EFI_QUESTION_ID & QId, >EFI_QUESION_TYPE QType =3D QUESTION_NORMAL]: >+ << >+ 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 please 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); >+ } >+ >> >+ << >+ if (VarIdStr !=3D N= ULL) { >+ delete VarIdStr; >+ } >+ _SAVE_CURRQEST_VARI= NFO (Info); >+ >> >+ ; >+ > vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE >QType =3D QUESTION_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->getT= ext(); >- _PCATCH(mCVfrQuest= ionDB.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(mCVfrQuest= ionDB.FindQuestion (QId), >VFR_RETURN_UNDEFINED, ID, "has already been used please assign another >number"); >- >> >- } >- << >- switch (QType) { >- case QUESTION_NORM= AL: >- mCVfrQuestionDB.= RegisterQuestion (QName, >VarIdStr, QId); >- break; >- case QUESTION_DATE= : >- mCVfrQuestionDB.= RegisterNewDateQuestion >(QName, VarIdStr, QId); >- break; >- case QUESTION_TIME= : >- mCVfrQuestionDB.= RegisterNewTimeQuestion >(QName, VarIdStr, QId); >- break; >- case QUESTION_REF: >- // >- // VarIdStr !=3D= NULL stand for question with >storagae. >- // >- if (VarIdStr != =3D NULL) { >- mCVfrQuestionD= B.RegisterRefQuestion >(QName, VarIdStr, QId); >- } else { >- mCVfrQuestionD= B.RegisterQuestion (QName, >NULL, QId); >- } >- break; >- default: >- _PCATCH(VFR_RETURN= _FATAL_ERROR); >- } >- $QHObj.SetQuestion= Id (QId); >- if (VarIdStr !=3D = NULL) { >- $QHObj.SetVarStor= eInfo (&Info); >- } >+ vfrQuestionBaseInfo[Info, QId, QType] >+ << $QHObj.SetQuestion= Id (QId); >+ if (Info.mVarStor= eId !=3D >EFI_VARSTORE_ID_INVALID) { >+ $QHObj.SetVarSt= oreInfo (&Info); >+ } > >> > vfrStatementHeader[&$QHObj] >- << >- if (VarIdStr !=3D = NULL) { >- delete VarIdStr; >- } >- _SAVE_CURRQEST_VAR= INFO (Info); >- >> > ; > > questionheaderFlagsField[UINT8 & Flags] : > ReadOnlyFlag << $Flags |=3D 0x01; = >> > | InteractiveFlag << $Flags |=3D 0x04; = >> >@@ -1268,10 +1413,11 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, >CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl > = SName, > = &mFormsetGuid, > = &gCVfrVarDataTypeDB, > = SName, > = EFI_VARSTORE_ID_INVALID, >+ = FALSE, > = FALSE > = ); > VfrReturnCode = =3D >gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, >&mFormsetGuid); > } > if (CheckFlag || V= frReturnCode =3D=3D >VFR_RETURN_SUCCESS) { >@@ -1299,21 +1445,21 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, >CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl > VfrReturnCode = =3D >gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, >&mFormsetGuid); > } > if (CheckFlag || V= frReturnCode =3D=3D >VFR_RETURN_SUCCESS) { > _PCATCH(VfrRetur= nCode, 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_BUFFER_BITS) { > >_PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarSto >reId, &TName), SN2); > _STRCAT(&VarSt= r, TName); > } > } > >> > > ( > "." << > if (CheckFlag || V= frReturnCode =3D=3D >VFR_RETURN_SUCCESS) { >- _PCATCH(((VarSto= reType !=3D >EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : >VFR_RETURN_SUCCESS), SN2); >+ _PCATCH((((VarSt= oreType !=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 *&QuestVarIdStr, BOOLEAN CheckFl > switch (VarStoreTy= pe) { > case EFI_VFR_VARST= ORE_EFI: > _PCATCH(gCVfrDat= aStorage.GetEfiVarStoreInfo >(&$Info), SN2); > break; > case EFI_VFR_VARST= ORE_BUFFER: >- >_PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, >$Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2- >>getLine(), VarStr); >+ case EFI_VFR_VARST= ORE_BUFFER_BITS: >+ >_PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, >$Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize, >$Info.mIsBitVar), SN2->getLine(), VarStr); > VarGuid =3D >gCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId); > >_PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register ( > SName= , > VarGu= id, > NULL)= , >@@ -1436,90 +1583,97 @@ vfrConstantValueField[UINT8 Type, >EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] > >> > { > "\-" << Negative =3D TRUE;= >> > } > N1:Number << >- switch ($Type) { >- case EFI_IFR_TYPE_= NUM_SIZE_8 : >- $Value.u8 =3D _S= TOU8(N1->getText(), N1- >>getLine()); >- if (IntDecStyle)= { >- if (Negative) = { >- if ($Value.u= 8 > 0x80) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big >than 0x7F, small than -0x80"); >- } >- } else { >- if ($Value.u= 8 > 0x7F) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big >than 0x7F, small than -0x80"); >+ // >+ // The value store= d in bit fields is always set to >UINT32 type. >+ // >+ if (_GET_CURRQEST_= VARTINFO().mIsBitVar) { >+ $Value.u32 =3D _= STOU32(N1->getText(), N1- >>getLine()); >+ } else { >+ switch ($Type) { >+ case EFI_IFR_TYP= E_NUM_SIZE_8 : >+ $Value.u8 =3D = _STOU8(N1->getText(), N1- >>getLine()); >+ if (IntDecStyl= e) { >+ 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_= NUM_SIZE_16 : >- $Value.u16 =3D _= STOU16(N1->getText(), N1- >>getLine()); >- if (IntDecStyle)= { > if (Negative) = { >- if ($Value.u= 16 > 0x8000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big >than 0x7FFF, small than -0x8000"); >- } >- } else { >- if ($Value.u= 16 > 0x7FFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big >than 0x7FFF, small than -0x8000"); >+ $Value.u8 = =3D ~$Value.u8 + 1; >+ } >+ break; >+ case EFI_IFR_TYP= E_NUM_SIZE_16 : >+ $Value.u16 =3D= _STOU16(N1->getText(), N1- >>getLine()); >+ if (IntDecStyl= e) { >+ if (Negative= ) { >+ if ($Value= .u16 > 0x8000) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big >than 0x7FFF, small than -0x8000"); >+ } >+ } else { >+ if ($Value= .u16 > 0x7FFF) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big >than 0x7FFF, small than -0x8000"); >+ } > } > } >- } >- if (Negative) { >- $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.u= 32 > 0x80000000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big >than 0x7FFFFFFF, small than -0x80000000"); >- } >- } else { >- if ($Value.u= 32 > 0X7FFFFFFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big >than 0x7FFFFFFF, small than -0x80000000"); >+ $Value.u16 = =3D ~$Value.u16 + 1; >+ } >+ break; >+ case EFI_IFR_TYP= E_NUM_SIZE_32 : >+ $Value.u32 = =3D _STOU32(N1->getText(), N1- >>getLine()); >+ if (IntDecStyl= e) { >+ if (Negative= ) { >+ if ($Value= .u32 > 0x80000000) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big >than 0x7FFFFFFF, small than -0x80000000"); >+ } >+ } else { >+ if ($Value= .u32 > 0X7FFFFFFF) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big >than 0x7FFFFFFF, small than -0x80000000"); >+ } > } > } >- } >- if (Negative) { >- $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.u= 64 > 0x8000000000000000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big >than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000"); >- } >- } else { >- if ($Value.u= 64 > 0x7FFFFFFFFFFFFFFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big >than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000"); >+ $Value.u32 = =3D ~$Value.u32 + 1; >+ } >+ break; >+ case EFI_IFR_TYP= E_NUM_SIZE_64 : >+ $Value.u64 = =3D _STOU64(N1->getText(), N1- >>getLine()); >+ if (IntDecStyl= e) { >+ if (Negative= ) { >+ if ($Value= .u64 > 0x8000000000000000) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big >than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000"); >+ } >+ } else { >+ if ($Value= .u64 > 0x7FFFFFFFFFFFFFFF) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big >than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000"); >+ } > } > } >+ if (Negative) = { >+ $Value.u64 = =3D ~$Value.u64 + 1; >+ } >+ break; >+ case EFI_IFR_TYP= E_BOOLEAN : >+ $Value.b = =3D _STOU8(N1->getText(), N1- >>getLine()); >+ break; >+ case EFI_IFR_TYP= E_STRING : >+ $Value.string = =3D _STOU16(N1->getText(), N1- >>getLine()); >+ break; >+ case EFI_IFR_TYP= E_TIME : >+ case EFI_IFR_TYP= E_DATE : >+ case EFI_IFR_TYP= E_REF : >+ default : >+ break; > } >- 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; > } > >> > | B1:True << $Value.b =3D = TRUE; >> > | B2:False << $Value.b =3D = FALSE; >> > | O1:One << $Value.u8 =3D = _STOU8(O1->getText(), O1- >>getLine()); >> >@@ -1689,42 +1843,51 @@ vfrStatementDefault : > "=3D" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayTy= pe] >"," > << > if (gCurrentMinMa= xData !=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_= CURRQEST_DATATYPE()) { > case EFI_IFR_= TYPE_NUM_SIZE_8: >- if (((INT8)= Val->u8 < (INT8) >gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || >- ((INT8)= Val->u8 > (INT8) >gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) { >+ if (((INT8)= Val->u8 < (INT8) >gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) >|| >+ ((INT8)= Val->u8 > (INT8) >gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) >{ > _PCATCH >(VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value >must be between MinValue and MaxValue."); > } > break; > case EFI_IFR_= TYPE_NUM_SIZE_16: >- if (((INT16= ) Val->u16 < (INT16) >gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || >- ((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 >(VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value >must be between MinValue and MaxValue."); > } > break; > case EFI_IFR_= TYPE_NUM_SIZE_32: >- if (((INT32= ) Val->u32 < (INT32) >gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || >- ((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 >(VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value >must be between MinValue and MaxValue."); > } > break; > case EFI_IFR_= TYPE_NUM_SIZE_64: >- if (((INT64= ) Val->u64 < (INT64) >gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || >- ((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 >(VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value >must be between MinValue and MaxValue."); > } > break; > default: > break; > } > } else { >- if (Val->u64 = < gCurrentMinMaxData- >>GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > >gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) { >+ // >+ // Value for = question stored in bit fields is >always set to UINT32 type. >+ // >+ if (_GET_CURR= QEST_VARTINFO().mIsBitVar) { >+ if (Val->u3= 2 < gCurrentMinMaxData- >>GetMinData(_GET_CURRQEST_DATATYPE(), TRUE) || Val->u32 > >gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), TRUE)) { > _PCATCH >(VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value >must be between MinValue and MaxValue."); >+ } >+ } else { >+ if (Val->u6= 4 < gCurrentMinMaxData- >>GetMinData(_GET_CURRQEST_DATATYPE(), FALSE) || Val->u64 > >gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE)) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value >must be between MinValue and MaxValue."); >+ } > } > } > } > if (_GET_CURRQEST= _DATATYPE() =3D=3D >EFI_IFR_TYPE_OTHER) { > _PCATCH (VFR_RE= TURN_FATAL_ERROR, D- >>getLine(), "Default data type error."); >@@ -1759,21 +1922,29 @@ vfrStatementDefault : > > default: > break; > } > } else { >- _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&Size), D->getLine()); >+ if (_GET_CURRQE= ST_VARTINFO().mIsBitVar) { >+ Size =3D size= of (UINT32); >+ } else { >+ _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&Size), D->getLine()); >+ } > } > Size +=3D OFFSET_= OF (EFI_IFR_DEFAULT, Value); > DObj =3D new CIfr= Default ((UINT8)Size); > DObj->SetLineNo(D= ->getLine()); > if (ArrayType) { > DObj->SetType (= EFI_IFR_TYPE_BUFFER); > } else if (gIsStr= ingOp) { > DObj->SetType (= EFI_IFR_TYPE_STRING); > } else { >- DObj->SetType (= _GET_CURRQEST_DATATYPE()); >+ if (_GET_CURRQE= ST_VARTINFO().mIsBitVar) { >+ DObj->SetType= (EFI_IFR_TYPE_NUM_SIZE_32); >+ } else { >+ DObj->SetType >(_GET_CURRQEST_DATATYPE()); >+ } > } > DObj->SetValue(*V= al); > >> > | << IsExp =3D TRUE; DO= bj2 =3D new CIfrDefault2; DObj2- >>SetLineNo(D->getLine()); DObj2->SetScope (1); >> > vfrStatementValue "," << CIfrEnd EndObj1; >EndObj1.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 ty= pe >+ L:CheckBox >+ vfrQuestionBaseInfo[Info, QId] << >+ // >+ // Create a GUID= opcode to wrap the checkbox >opcode, if it refer to bit varstore. >+ // >+ if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { >+ GuidObj =3D ne= w CIfrGuid(0); >+ GuidObj->SetGu= id (&gEdkiiIfrBitVarGuid); >+ GuidObj->SetLi= neNo(L->getLine()); >+ } >+ CBObj =3D new CI= frCheckBox; >+ CBObj->SetLineNo= (L->getLine()); >+ CBObj->SetQuesti= onId (QId); >+ CBObj->SetVarSto= reInfo (&Info); >+ >> >+ vfrStatementHeader[CBObj]"," << //check data = type > if (_GET_CURRQE= ST_DATATYPE() =3D=3D >EFI_IFR_TYPE_OTHER) { > _GET_CURRQEST= _VARTINFO().mVarType =3D >EFI_IFR_TYPE_BOOLEAN; > } > if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >- _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type")= ; >- if (DataTypeS= ize !=3D 0 && DataTypeSize !=3D >_GET_CURRQEST_VARSIZE()) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't >support array"); >- } else if ((g= CVfrDataStorage.GetVarStoreType >(_GET_CURRQEST_VARTINFO().mVarStoreId) =3D=3D >EFI_VFR_VARSTORE_BUFFER) && >- (_G= ET_CURRQEST_VARSIZE() !=3D sizeof >(BOOLEAN))) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only >support BOOLEAN data type"); >+ // >+ // Check whet= her the question refers to a bit >field, if yes. create a Guid to indicate the question refers to a bit fiel= d. >+ // >+ if (_GET_CURR= QEST_VARTINFO ().mIsBitVar) { >+ _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type")= ; >+ if ((gCVfrD= ataStorage.GetVarStoreType >(_GET_CURRQEST_VARTINFO().mVarStoreId) =3D=3D >EFI_VFR_VARSTORE_BUFFER_BITS) && >+ (_GET_C= URRQEST_VARSIZE() !=3D 1)) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only >occupy 1 bit in Bit Varstore"); >+ } >+ } else { >+ _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type")= ; >+ if (DataTyp= eSize !=3D 0 && DataTypeSize !=3D >_GET_CURRQEST_VARSIZE()) { >+ _PCATCH >(VFR_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 >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only >support BOOLEAN data type"); >+ } > } > } > >> > { >- F:FLAGS "=3D" vfrCheckBoxFlags[CBObj, F->getLine()] "," >+ F:FLAGS "=3D" vfrCheckBoxFlags[*CBObj, F->getLine()] "," > << > if (_GET_CURRQES= T_VARTINFO().mVarStoreId !=3D >EFI_VARSTORE_ID_INVALID) { > _PCATCH(gCVfr= DataStorage.GetVarStoreName >(_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), >VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name"); > VarStoreGuid = =3D >gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStor >eId); > Val.b =3D TRU= E; >- if (CBObj.Get= Flags () & 0x01) { >+ if (CBObj->Ge= tFlags () & 0x01) { > CheckDuplic= ateDefaultValue >(EFI_HII_DEFAULT_CLASS_STANDARD, F); > _PCATCH( > >gCVfrDefaultStore.BufferVarStoreAltConfigAdd ( > >EFI_HII_DEFAULT_CLASS_STANDARD, > = _GET_CURRQEST_VARTINFO(), >@@ -2220,11 +2424,11 @@ vfrStatementCheckBox : > VFR_RETUR= N_SUCCESS, > L, > "No stand= ard default storage found" > ); > } >- if (CBObj.Get= Flags () & 0x02) { >+ if (CBObj->Ge= tFlags () & 0x02) { > CheckDuplic= ateDefaultValue >(EFI_HII_DEFAULT_CLASS_MANUFACTURING, F); > _PCATCH( > >gCVfrDefaultStore.BufferVarStoreAltConfigAdd ( > >EFI_HII_DEFAULT_CLASS_MANUFACTURING, > = _GET_CURRQEST_VARTINFO(), >@@ -2240,14 +2444,21 @@ vfrStatementCheckBox : > } > } > >> > } > { >- Key "=3D" KN:Number "," << AssignQuestio= nKey (CBObj, KN); >> >+ Key "=3D" KN:Number "," << AssignQuestio= nKey (*CBObj, >KN); >> > } > vfrStatementQuestionOptionList >- E:EndCheckBox << CRT_END_OP (E);= >> >+ E:EndCheckBox << CRT_END_OP (E); >+ if (GuidObj != =3D NULL) { >+ GuidObj->SetS= cope(1); >+ CRT_END_OP (E= ); >+ delete GuidOb= j; >+ } >+ if (CBObj !=3D = NULL) delete CBObj; >+ >> > ";" > ; > > 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- >>GetNumericFlags() & EFI_IFR_DISPLAY) =3D=3D 0)) { >+ if (((_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() >=3D=3D EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & >EDKII_IFR_DISPLAY_BIT) =3D=3D 0)) || >+ (!(_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() =3D=3D >EFI_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 (!IntDecStyl= e && MinNegative) { > _PCATCH (VFR_= RETURN_INVALID_PARAMETER, >I->getLine(), "\"-\" can't be used when not in int decimal type. "); > } >- switch (_GET_CU= RRQEST_DATATYPE()) { >- case EFI_IFR_TY= PE_NUM_SIZE_64 : >- MinU8 =3D _ST= OU64(I->getText(), I->getLine()); >- if (IntDecSty= le) { >- if (MinNega= tive) { >- if (MinU8= > 0x8000000000000000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >- } >- } else { >- if (MinU8= > 0x7FFFFFFFFFFFFFFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >- } >- } >- } >- if (MinNegati= ve) { >- MinU8 =3D ~= MinU8 + 1; >- } >- break; >- case EFI_IFR_TY= PE_NUM_SIZE_32 : >+ // >+ // Value for qu= estion stored in bit fields is >always set to UINT32 type. >+ // >+ if (_GET_CURRQE= ST_VARTINFO().mIsBitVar) { > MinU4 =3D _ST= OU32(I->getText(), I->getLine()); >- if (IntDecSty= le) { >- if (MinNega= tive) { >- if (MinU4= > 0x80000000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum >can't small than -0x80000000, big than 0x7FFFFFFF"); >- } >- } else { >- if (MinU4= > 0x7FFFFFFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum >can't small than -0x80000000, big than 0x7FFFFFFF"); >- } >- } >- } >- if (MinNegati= ve) { >- MinU4 =3D ~= MinU4 + 1; >+ if (!IntDecSt= yle && 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_TY= PE_NUM_SIZE_16 : >- MinU2 =3D _ST= OU16(I->getText(), I->getLine()); >- if (IntDecSty= le) { >- if (MinNega= tive) { >- if (MinU2= > 0x8000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum >can't small than -0x8000, big than 0x7FFF"); >+ } else { >+ switch (_GET_= CURRQEST_DATATYPE()) { >+ case EFI_IFR_= TYPE_NUM_SIZE_64 : >+ MinU8 =3D _= STOU64(I->getText(), I->getLine()); >+ if (IntDecS= tyle) { >+ if (MinNe= gative) { >+ if (Min= U8 > 0x8000000000000000) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >+ } >+ } else { >+ if (Min= U8 > 0x7FFFFFFFFFFFFFFF) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >+ } > } >- } else { >- if (MinU2= > 0x7FFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum >can't small than -0x8000, big than 0x7FFF"); >+ } >+ if (MinNega= tive) { >+ MinU8 =3D= ~MinU8 + 1; >+ } >+ break; >+ case EFI_IFR_= TYPE_NUM_SIZE_32 : >+ MinU4 =3D _= STOU32(I->getText(), I->getLine()); >+ if (IntDecS= tyle) { >+ if (MinNe= gative) { >+ if (Min= U4 > 0x80000000) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum >can't small than -0x80000000, big than 0x7FFFFFFF"); >+ } >+ } else { >+ if (Min= U4 > 0x7FFFFFFF) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum >can't small than -0x80000000, big than 0x7FFFFFFF"); >+ } > } > } >- } >- if (MinNegati= ve) { >- MinU2 =3D ~= MinU2 + 1; >- } >- break; >- case EFI_IFR_TY= PE_NUM_SIZE_8 : >- MinU1 =3D _ST= OU8(I->getText(), I->getLine()); >- if (IntDecSty= le) { >- if (MinNega= tive) { >- if (MinU1= > 0x80) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't >small than -0x80, big than 0x7F"); >+ if (MinNega= tive) { >+ MinU4 =3D= ~MinU4 + 1; >+ } >+ break; >+ case EFI_IFR_= TYPE_NUM_SIZE_16 : >+ MinU2 =3D _= STOU16(I->getText(), I->getLine()); >+ if (IntDecS= tyle) { >+ if (MinNe= gative) { >+ if (Min= U2 > 0x8000) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum >can't small than -0x8000, big than 0x7FFF"); >+ } >+ } else { >+ if (Min= U2 > 0x7FFF) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum >can't small 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 (MinNega= tive) { >+ MinU2 =3D= ~MinU2 + 1; >+ } >+ break; >+ case EFI_IFR_= TYPE_NUM_SIZE_8 : >+ MinU1 =3D _= STOU8(I->getText(), I->getLine()); >+ if (IntDecS= tyle) { >+ if (MinNe= gative) { >+ if (Min= U1 > 0x80) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't >small than -0x80, big than 0x7F"); >+ } >+ } else { >+ if (Min= U1 > 0x7F) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't >small than -0x80, big than 0x7F"); >+ } > } > } >+ if (MinNega= tive) { >+ MinU1 =3D= ~MinU1 + 1; >+ } >+ break; > } >- if (MinNegati= ve) { >- MinU1 =3D ~= MinU1 + 1; >- } >- break; > } > >> > Maximum "=3D" > { > "\-" << MaxNegative =3D= TRUE; >> > } > A:Number "," << > if (!IntDecStyl= e && MaxNegative) { > _PCATCH (VFR_= RETURN_INVALID_PARAMETER, >A->getLine(), "\"-\" can't be used when not in int decimal type. "); > } >- >- switch (_GET_CU= RRQEST_DATATYPE()) { >- case EFI_IFR_TY= PE_NUM_SIZE_64 : >- MaxU8 =3D _ST= OU64(A->getText(), A->getLine()); >- if (IntDecSty= le) { >+ if (_GET_CURRQE= ST_VARTINFO().mIsBitVar) { >+ MaxU4 =3D _ST= OU32(A->getText(), A->getLine()); >+ if (!IntDecSt= yle && MaxU4 > (1<< >_GET_CURRQEST_VARTINFO().mVarTotalSize) -1) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "BIT type maximum can't >bigger than 2^BitWidth -1"); >+ } >+ } else { >+ switch (_GET_= CURRQEST_DATATYPE()) { >+ case EFI_IFR_= TYPE_NUM_SIZE_64 : >+ MaxU8 =3D _= STOU64(A->getText(), A- >>getLine()); >+ if (IntDecS= tyle) { >+ if (MaxNe= gative) { >+ if (Max= U8 > 0x8000000000000000) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >+ } >+ } else { >+ if (Max= U8 > 0x7FFFFFFFFFFFFFFF) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >+ } >+ } >+ } > if (MaxNega= tive) { >- if (MaxU8= > 0x8000000000000000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >+ MaxU8 =3D= ~MaxU8 + 1; >+ } >+ if (IntDecS= tyle) { >+ if ((INT6= 4) MaxU8 < (INT64) MinU8) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } else { >- if (MaxU8= > 0x7FFFFFFFFFFFFFFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum >can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); >+ if (MaxU8= < MinU8) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } >- } >- if (MaxNegati= ve) { >- MaxU8 =3D ~= MaxU8 + 1; >- } >- if (IntDecSty= le) { >- if ((INT64)= MaxU8 < (INT64) MinU8) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >- } >- } else { >- if (MaxU8 <= MinU8) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >+ break; >+ case EFI_IFR_= TYPE_NUM_SIZE_32 : >+ MaxU4 =3D _= STOU32(A->getText(), A- >>getLine()); >+ if (IntDecS= tyle) { >+ if (MaxNe= gative) { >+ if (Max= U4 > 0x80000000) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum >can't small than -0x80000000, big than 0x7FFFFFFF"); >+ } >+ } else { >+ if (Max= U4 > 0x7FFFFFFF) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum >can't small than -0x80000000, big than 0x7FFFFFFF"); >+ } >+ } > } >- } >- break; >- case EFI_IFR_TY= PE_NUM_SIZE_32 : >- MaxU4 =3D _ST= OU32(A->getText(), A->getLine()); >- if (IntDecSty= le) { > if (MaxNega= tive) { >- if (MaxU4= > 0x80000000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum >can't small than -0x80000000, big than 0x7FFFFFFF"); >+ MaxU4 =3D= ~MaxU4 + 1; >+ } >+ if (IntDecS= tyle) { >+ if ((INT3= 2) MaxU4 < (INT32) MinU4) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } else { >- if (MaxU4= > 0x7FFFFFFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum >can't small than -0x80000000, big than 0x7FFFFFFF"); >+ if (MaxU4= < MinU4) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } >- } >- if (MaxNegati= ve) { >- MaxU4 =3D ~= MaxU4 + 1; >- } >- if (IntDecSty= le) { >- if ((INT32)= MaxU4 < (INT32) MinU4) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >- } >- } else { >- if (MaxU4 <= MinU4) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >+ break; >+ case EFI_IFR_= TYPE_NUM_SIZE_16 : >+ MaxU2 =3D _= STOU16(A->getText(), A- >>getLine()); >+ if (IntDecS= tyle) { >+ if (MaxNe= gative) { >+ if (Max= U2 > 0x8000) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum >can't small than -0x8000, big than 0x7FFF"); >+ } >+ } else { >+ if (Max= U2 > 0x7FFF) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum >can't small than -0x8000, big than 0x7FFF"); >+ } >+ } > } >- } >- break; >- case EFI_IFR_TY= PE_NUM_SIZE_16 : >- MaxU2 =3D _ST= OU16(A->getText(), A->getLine()); >- if (IntDecSty= le) { > if (MaxNega= tive) { >- if (MaxU2= > 0x8000) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum >can't small than -0x8000, big than 0x7FFF"); >+ MaxU2 =3D= ~MaxU2 + 1; >+ } >+ if (IntDecS= tyle) { >+ if ((INT1= 6) MaxU2 < (INT16) MinU2) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } else { >- if (MaxU2= > 0x7FFF) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum >can't small than -0x8000, big than 0x7FFF"); >+ if (MaxU2= < MinU2) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } >- } >- if (MaxNegati= ve) { >- MaxU2 =3D ~= MaxU2 + 1; >- } >- if (IntDecSty= le) { >- if ((INT16)= MaxU2 < (INT16) MinU2) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >- } >- } else { >- if (MaxU2 <= MinU2) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >+ break; >+ case EFI_IFR_= TYPE_NUM_SIZE_8 : >+ MaxU1 =3D _= STOU8(A->getText(), A->getLine()); >+ if (IntDecS= tyle) { >+ if (MaxNe= gative) { >+ if (Max= U1 > 0x80) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum >can't small than -0x80, big than 0x7F"); >+ } >+ } else { >+ if (Max= U1 > 0x7F) { >+ _PCAT= CH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum >can't small than -0x80, big than 0x7F"); >+ } >+ } > } >- } >- break; >- case EFI_IFR_TY= PE_NUM_SIZE_8 : >- MaxU1 =3D _ST= OU8(A->getText(), A->getLine()); >- if (IntDecSty= le) { > if (MaxNega= tive) { >- 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 (IntDecS= tyle) { >+ if ((INT8= ) MaxU1 < (INT8) MinU1) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); > } > } 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 Minimum"); > } > } >+ break; > } >- if (MaxNegati= ve) { >- MaxU1 =3D ~= MaxU1 + 1; >- } >- if (IntDecSty= le) { >- if ((INT8) = MaxU1 < (INT8) MinU1) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >- } >- } else { >- if (MaxU1 <= MinU1) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less >than Minimum"); >- } >- } >- break; > } > >> > { > STEP "=3D" S:Number "," > << >- switch (_GET_CU= RRQEST_DATATYPE()) { >- case EFI_IFR_TY= PE_NUM_SIZE_64 : StepU8 =3D >_STOU64(S->getText(), S->getLine()); break; >- case EFI_IFR_TY= PE_NUM_SIZE_32 : StepU4 =3D >_STOU32(S->getText(), S->getLine()); break; >- case EFI_IFR_TY= PE_NUM_SIZE_16 : StepU2 =3D >_STOU16(S->getText(), S->getLine()); break; >- case EFI_IFR_TY= PE_NUM_SIZE_8 : StepU1 =3D >_STOU8(S->getText(), S->getLine()); break; >+ if (_GET_CURRQE= ST_VARTINFO().mIsBitVar) { >+ StepU4 =3D _S= TOU32(S->getText(), S->getLine()); >+ } else { >+ switch (_GET_= CURRQEST_DATATYPE()) { >+ case EFI_IFR_= TYPE_NUM_SIZE_64 : StepU8 =3D >_STOU64(S->getText(), S->getLine()); break; >+ case EFI_IFR_= TYPE_NUM_SIZE_32 : StepU4 =3D >_STOU32(S->getText(), S->getLine()); break; >+ case EFI_IFR_= TYPE_NUM_SIZE_16 : StepU2 =3D >_STOU16(S->getText(), S->getLine()); break; >+ case EFI_IFR_= TYPE_NUM_SIZE_8 : StepU1 =3D >_STOU8(S->getText(), S->getLine()); break; >+ } > } > >> > } > << >- switch (_GET_CU= RRQEST_DATATYPE()) { >- case EFI_IFR_TY= PE_NUM_SIZE_64 : >$MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break; >- case EFI_IFR_TY= PE_NUM_SIZE_32 : >$MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break; >- case EFI_IFR_TY= PE_NUM_SIZE_16 : >$MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break; >- case EFI_IFR_TY= PE_NUM_SIZE_8 : >$MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break; >+ if (_GET_CURRQE= ST_VARTINFO().mIsBitVar) { >+ $MMSDObj.SetM= inMaxStepData (MinU4, >MaxU4, StepU4); >+ } else { >+ switch (_GET_= CURRQEST_DATATYPE()) { >+ case EFI_IFR_= TYPE_NUM_SIZE_64 : >$MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break; >+ case EFI_IFR_= TYPE_NUM_SIZE_32 : >$MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break; >+ case EFI_IFR_= TYPE_NUM_SIZE_16 : >$MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break; >+ case EFI_IFR_= TYPE_NUM_SIZE_8 : >$MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break; >+ } > } > >> > ; > > 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_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:Numeric << NObj.SetLineNo(= L->getLine()); >> >- vfrQuestionHeader[NObj] "," << // check data t= ype >+ L:Numeric >+ vfrQuestionBaseInfo[Info, QId] << >+ // >+ // Create a GUID= opcode to wrap the numeric >opcode, if it refer to bit varstore. >+ // >+ if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { >+ GuidObj =3D ne= w CIfrGuid(0); >+ GuidObj->SetGu= id (&gEdkiiIfrBitVarGuid); >+ GuidObj->SetLi= neNo(L->getLine()); >+ } >+ NObj =3D new CIf= rNumeric; >+ NObj->SetLineNo(= L->getLine()); >+ NObj->SetQuestio= nId (QId); >+ NObj->SetVarStor= eInfo (&Info); >+ >> >+ vfrStatementHeader[NObj]"," >+ << >+ // check data t= ype > if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >- _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "Numeric varid is not the valid data type"); >- if (DataTypeS= ize !=3D 0 && DataTypeSize !=3D >_GET_CURRQEST_VARSIZE()) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't >support array"); >+ if (_GET_CURR= QEST_VARTINFO().mIsBitVar) { >+ LFlags =3D= (EDKII_IFR_NUMERIC_SIZE_BIT & >(_GET_CURRQEST_VARSIZE())); >+ _PCATCH(NOb= j->SetFlagsForBitField (NObj- >>FLAGS(), LFlags), L->getLine()); >+ } else { >+ _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "Numeric varid is not the valid data type"); >+ if (DataTyp= eSize !=3D 0 && DataTypeSize !=3D >_GET_CURRQEST_VARSIZE()) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't >support array"); >+ } >+ _PCATCH(NOb= j->SetFlags (NObj->FLAGS(), >_GET_CURRQEST_DATATYPE()), L->getLine()); > } >- _PCATCH(NObj.= SetFlags (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 "," << AssignQuestio= nKey (NObj, KN); >> >+ Key "=3D" KN:Number "," << AssignQuestio= nKey (*NObj, >KN); >> > } >- vfrSetMinMaxStep[NObj] << >- switch (_GET_CU= RRQEST_DATATYPE()) { >+ vfrSetMinMaxStep[*NObj] << >+ if (!_GET_CURRQ= EST_VARTINFO().mIsBitVar) { >+ switch (_GET_= CURRQEST_DATATYPE()) { >+ // >+ // Base on = the type to know the actual used >size,shrink the buffer >+ // size all= ocate before. >+ // >+ case EFI_IF= R_TYPE_NUM_SIZE_8: ShrinkSize =3D >21;break; >+ case EFI_IF= R_TYPE_NUM_SIZE_16:ShrinkSize >=3D 18;break; >+ case EFI_IF= R_TYPE_NUM_SIZE_32:ShrinkSize >=3D 12;break; >+ case EFI_IF= R_TYPE_NUM_SIZE_64:break; >+ default: >+ IsSupport= ed =3D FALSE; >+ break; >+ } >+ } else { > // >- // Base on th= e type to know the actual used >size,shrink the buffer >- // size alloc= ate before. >+ // Question s= tored in bit fields saved as UINT32 >type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32. > // >- 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: >- IsSupported= =3D FALSE; >- break; >+ ShrinkSize = =3D 12; > } >- NObj.ShrinkBinS= ize (ShrinkSize); >+ NObj->ShrinkBin= Size (ShrinkSize); >+ > if (!IsSupporte= d) { > _PCATCH (VFR_= RETURN_INVALID_PARAMETER, >L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and >UINT64 data type."); > } > >> > vfrStatementQuestionOptionList > E:EndNumeric << >- CRT_END_OP (E); >+ CRT_END_OP (E); >+ if (GuidObj != =3D NULL) { >+ GuidObj->SetS= cope(1); >+ CRT_END_OP (E= ); >+ delete GuidOb= j; >+ } >+ if (NObj !=3D N= ULL) delete NObj; > >> > ";" > ; > > 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.GetVarStoreType >(_GET_CURRQEST_VARTINFO().mVarStoreId); > >> >- numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" >numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )* >+ numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNu= m] >( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, >LineNum] )* > << > //check data ty= pe flag >- if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >- VarStoreType = =3D >gCVfrDataStorage.GetVarStoreType >(_GET_CURRQEST_VARTINFO().mVarStoreId); >- if (VarStoreT= ype =3D=3D >EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_EFI) { >- if (_GET_CU= RRQEST_DATATYPE() !=3D (LFlags & >EFI_IFR_NUMERIC_SIZE)) { >- >_PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is >not same to Numeric VarData type"); >+ if (!_GET_CURRQ= EST_VARTINFO().mIsBitVar) { >+ if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >+ if (VarStor= eType =3D=3D >EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_EFI) { >+ if (_GET_= CURRQEST_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 Da= taTypeSize; >+ _GET_CURR= QEST_VARTINFO().mVarType =3D >LFlags & EFI_IFR_NUMERIC_SIZE; >+ gCVfrVarD= ataTypeDB.GetDataTypeSize >(_GET_CURRQEST_DATATYPE(), &DataTypeSize); >+ >_GET_CURRQEST_VARTINFO().mVarTotalSize =3D DataTypeSize; > } >- } else { >- // update d= ata type for name/value store >- UINT32 Data= TypeSize; >+ } else if (Is= SetType){ > _GET_CURRQE= ST_VARTINFO().mVarType =3D >LFlags & EFI_IFR_NUMERIC_SIZE; >- gCVfrVarDat= aTypeDB.GetDataTypeSize >(_GET_CURRQEST_DATATYPE(), &DataTypeSize); >- _GET_CURRQE= ST_VARTINFO().mVarTotalSize >=3D DataTypeSize; > } >- } else if (IsSe= tType){ >- _GET_CURRQEST= _VARTINFO().mVarType =3D >LFlags & EFI_IFR_NUMERIC_SIZE; >+ _PCATCH(NObj.= SetFlags (HFlags, LFlags, >IsDisplaySpecified), LineNum); >+ } else if >((_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >&& (_GET_CURRQEST_VARTINFO().mIsBitVar)) { >+ LFlags |=3D (= EDKII_IFR_NUMERIC_SIZE_BIT & >(_GET_CURRQEST_VARSIZE())); >+ _PCATCH(NObj.= SetFlagsForBitField (HFlags, >LFlags, IsDisplaySpecified), LineNum); > } >- _PCATCH(NObj.Se= tFlags (HFlags, LFlags, >IsDisplaySpecified), LineNum); > >> > ; > >-numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, >BOOLEAN & IsDisplaySpecified] : >+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, >BOOLEAN & IsDisplaySpecified, UINT32 LineNum] : > N:Number << _PCATCH(_STOU8(= N->getText(), N- >>getLine()) =3D=3D 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N- >>getLine()); >> >- | "NUMERIC_SIZE_1" << $LFlags =3D ($L= Flags & >~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType =3D TRUE;>> >- | "NUMERIC_SIZE_2" << $LFlags =3D ($L= Flags & >~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType =3D TRUE;>> >- | "NUMERIC_SIZE_4" << $LFlags =3D ($L= Flags & >~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType =3D TRUE;>> >- | "NUMERIC_SIZE_8" << $LFlags =3D ($L= Flags & >~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType =3D TRUE;>> >- | "DISPLAY_INT_DEC" << $LFlags =3D ($L= Flags & >~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified =3D TRUE;>= > >- | "DISPLAY_UINT_DEC" << $LFlags =3D ($L= Flags & >~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified =3D >TRUE;>> >- | "DISPLAY_UINT_HEX" << $LFlags =3D ($L= Flags & >~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified =3D >TRUE;>> >+ | "NUMERIC_SIZE_1" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_NUMERIC_SIZE) >| EFI_IFR_NUMERIC_SIZE_1;IsSetType =3D TRUE; >+ } else { >+ _PCATCH(VFR_R= ETURN_INVALID_PARAMETER, >LineNum, "Can not specify the size of the numeric value for BIT field"); >+ } >+ >> >+ | "NUMERIC_SIZE_2" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_NUMERIC_SIZE) >| EFI_IFR_NUMERIC_SIZE_2;IsSetType =3D TRUE; >+ } else { >+ _PCATCH(VFR_R= ETURN_INVALID_PARAMETER, >LineNum, "Can not specify the size of the numeric value for BIT field"); >+ } >+ >> >+ | "NUMERIC_SIZE_4" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_NUMERIC_SIZE) >| EFI_IFR_NUMERIC_SIZE_4; IsSetType =3D TRUE; >+ } else { >+ _PCATCH(VFR_R= ETURN_INVALID_PARAMETER, >LineNum, "Can not specify the size of the numeric value for BIT field"); >+ } >+ >> >+ | "NUMERIC_SIZE_8" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_NUMERIC_SIZE) >| EFI_IFR_NUMERIC_SIZE_8; IsSetType =3D TRUE; >+ } else { >+ _PCATCH(VFR_R= ETURN_INVALID_PARAMETER, >LineNum, "Can not specify the size of the numeric value for BIT field"); >+ } >+ >> >+ | "DISPLAY_INT_DEC" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_DISPLAY) | >EFI_IFR_DISPLAY_INT_DEC; >+ } else { >+ $LFlags =3D (= $LFlags & ~EDKII_IFR_DISPLAY_BIT) | >EDKII_IFR_DISPLAY_INT_DEC_BIT; >+ } >+ IsDisplaySpecif= ied =3D TRUE; >+ >> >+ | "DISPLAY_UINT_DEC" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_DISPLAY) | >EFI_IFR_DISPLAY_UINT_DEC; >+ } else { >+ $LFlags =3D (= $LFlags & ~EDKII_IFR_DISPLAY_BIT) | >EDKII_IFR_DISPLAY_UINT_DEC_BIT; >+ } >+ IsDisplaySpecif= ied =3D TRUE; >+ >> >+ | "DISPLAY_UINT_HEX" << if >(!_GET_CURRQEST_VARTINFO().mIsBitVar) { >+ $LFlags =3D (= $LFlags & ~EFI_IFR_DISPLAY) | >EFI_IFR_DISPLAY_UINT_HEX; >+ } else { >+ $LFlags =3D (= $LFlags & ~EDKII_IFR_DISPLAY_BIT) | >EDKII_IFR_DISPLAY_UINT_HEX_BIT; >+ } >+ IsDisplaySpecif= ied =3D TRUE; >+ >> > | questionheaderFlagsField[HFlags] > ; > > 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 ty= pe >+ L:OneOf >+ vfrQuestionBaseInfo[Info, QId] << >+ // >+ // Create a GUID= opcode to wrap the oneof >opcode, if it refer to bit varstore. >+ // >+ if (_GET_CURRQES= T_VARTINFO().mIsBitVar) { >+ GuidObj =3D ne= w CIfrGuid(0); >+ GuidObj->SetGu= id (&gEdkiiIfrBitVarGuid); >+ GuidObj->SetLi= neNo(L->getLine()); >+ } >+ OObj =3D new CIf= rOneOf; >+ OObj->SetLineNo(= L->getLine()); >+ OObj->SetQuestio= nId (QId); >+ OObj->SetVarStor= eInfo (&Info); >+ >> >+ vfrStatementHeader[OObj]"," >+ << //check data t= ype > if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >- _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "OneOf varid is not the valid data type"); >- if (DataTypeS= ize !=3D 0 && DataTypeSize !=3D >_GET_CURRQEST_VARSIZE()) { >- _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't >support array"); >+ if (_GET_CURR= QEST_VARTINFO().mIsBitVar) { >+ LFlags =3D= (EDKII_IFR_NUMERIC_SIZE_BIT & >(_GET_CURRQEST_VARSIZE())); >+ _PCATCH(OOb= j->SetFlagsForBitField (OObj- >>FLAGS(), LFlags), L->getLine()); >+ } else { >+ _PCATCH >(gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&DataTypeSize), L->getLine(), "OneOf varid is not the valid data type"); >+ if (DataTyp= eSize !=3D 0 && DataTypeSize !=3D >_GET_CURRQEST_VARSIZE()) { >+ _PCATCH >(VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't >support array"); >+ } >+ _PCATCH(OOb= j->SetFlags (OObj->FLAGS(), >_GET_CURRQEST_DATATYPE()), L->getLine()); > } >- _PCATCH(OObj.= SetFlags (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_CU= RRQEST_DATATYPE()) { >+ if (!_GET_CURRQ= EST_VARTINFO().mIsBitVar) { >+ switch (_GET_= CURRQEST_DATATYPE()) { >+ // >+ // Base on = the type to know the actual used >size,shrink the buffer >+ // size all= ocate before. >+ // >+ case EFI_IF= R_TYPE_NUM_SIZE_8: ShrinkSize =3D >21;break; >+ case EFI_IF= R_TYPE_NUM_SIZE_16:ShrinkSize >=3D 18;break; >+ case EFI_IF= R_TYPE_NUM_SIZE_32:ShrinkSize >=3D 12;break; >+ case EFI_IF= R_TYPE_NUM_SIZE_64:break; >+ default: >+ IsSupport= ed =3D FALSE; >+ break; >+ } >+ } else { > // >- // Base on th= e type to know the actual used >size,shrink the buffer >- // size alloc= ate before. >+ // Question s= tored in bit fields saved as UINT32 >type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32. > // >- 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: >- IsSupported= =3D FALSE; >- break; >+ ShrinkSize = =3D 12; > } >- OObj.ShrinkBinS= ize (ShrinkSize); >+ OObj->ShrinkBin= Size (ShrinkSize); >+ > if (!IsSupporte= d) { > _PCATCH (VFR_= RETURN_INVALID_PARAMETER, >L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and >UINT64 data type."); > } > >> > vfrStatementQuestionOptionList > E:EndOneOf << >- CRT_END_OP (E); >+ CRT_END_OP (E); >+ if (GuidObj != =3D NULL) { >+ GuidObj->SetS= cope(1); >+ CRT_END_OP (E= ); >+ delete GuidOb= j; >+ } >+ if (OObj !=3D N= ULL) delete OObj; > >> > ";" > ; > > 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.GetVarStoreType >(_GET_CURRQEST_VARTINFO().mVarStoreId); > >> >- numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" >numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )* >+ numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNu= m] >( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, >LineNum] )* > << > //check data ty= pe flag >- if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >- VarStoreType = =3D >gCVfrDataStorage.GetVarStoreType >(_GET_CURRQEST_VARTINFO().mVarStoreId); >- if (VarStoreT= ype =3D=3D >EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_EFI) { >- if (_GET_CU= RRQEST_DATATYPE() !=3D (LFlags & >EFI_IFR_NUMERIC_SIZE)) { >- >_PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is >not same to Numeric VarData type"); >+ if (!_GET_CURRQ= EST_VARTINFO().mIsBitVar) { >+ if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >+ if (VarStor= eType =3D=3D >EFI_VFR_VARSTORE_BUFFER || VarStoreType =3D=3D EFI_VFR_VARSTORE_EFI) { >+ if (_GET_= CURRQEST_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 Da= taTypeSize; >+ _GET_CURR= QEST_VARTINFO().mVarType =3D >LFlags & EFI_IFR_NUMERIC_SIZE; >+ gCVfrVarD= ataTypeDB.GetDataTypeSize >(_GET_CURRQEST_DATATYPE(), &DataTypeSize); >+ >_GET_CURRQEST_VARTINFO().mVarTotalSize =3D DataTypeSize; > } >- } else { >- // update d= ata type for Name/Value store >- UINT32 Data= TypeSize; >+ } else if (Is= SetType){ > _GET_CURRQE= ST_VARTINFO().mVarType =3D >LFlags & EFI_IFR_NUMERIC_SIZE; >- gCVfrVarDat= aTypeDB.GetDataTypeSize >(_GET_CURRQEST_DATATYPE(), &DataTypeSize); >- _GET_CURRQE= ST_VARTINFO().mVarTotalSize >=3D DataTypeSize; > } >- } else if (IsSe= tType){ >- _GET_CURRQEST= _VARTINFO().mVarType =3D >LFlags & EFI_IFR_NUMERIC_SIZE; >+ _PCATCH(OObj.= SetFlags (HFlags, LFlags), >LineNum); >+ } else if >(_GET_CURRQEST_VARTINFO().mVarStoreId !=3D EFI_VARSTORE_ID_INVALID) >{ >+ _PCATCH(OObj.= SetFlagsForBitField (HFlags, >LFlags), LineNum); > } >- _PCATCH(OObj.Se= tFlags (HFlags, LFlags), >LineNum); > >> > ; > > vfrStatementStringType : > vfrStatementString | >@@ -3379,26 +3747,30 @@ vfrStatementOneOfOption : > Text "=3D" "STRING_TOKEN" "\(" S:Number "\)" "," > Value "=3D" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, >ArrayType] "," > << > if (gCurrentMin= MaxData !=3D NULL) { > //set min/max= value for oneof opcode >- UINT64 Step = =3D gCurrentMinMaxData- >>GetStepData(_GET_CURRQEST_DATATYPE()); >- switch (_GET_= CURRQEST_DATATYPE()) { >- case EFI_IFR_= TYPE_NUM_SIZE_64: >- gCurrentMin= MaxData- >>SetMinMaxStepData(Val->u64, Val->u64, Step); >- break; >- case EFI_IFR_= TYPE_NUM_SIZE_32: >+ UINT64 Step = =3D gCurrentMinMaxData- >>GetStepData(_GET_CURRQEST_DATATYPE(), >_GET_CURRQEST_VARTINFO().mIsBitVar); >+ if (_GET_CURR= QEST_VARTINFO().mIsBitVar) { > gCurrentMin= MaxData- >>SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step); >- break; >- case EFI_IFR_= TYPE_NUM_SIZE_16: >- gCurrentMin= MaxData- >>SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step); >- break; >- case EFI_IFR_= TYPE_NUM_SIZE_8: >- gCurrentMin= MaxData- >>SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step); >- break; >- default: >- break; >+ } else { >+ switch (_GE= T_CURRQEST_DATATYPE()) { >+ case EFI_IF= R_TYPE_NUM_SIZE_64: >+ gCurrentM= inMaxData- >>SetMinMaxStepData(Val->u64, Val->u64, Step); >+ break; >+ case EFI_IF= R_TYPE_NUM_SIZE_32: >+ gCurrentM= inMaxData- >>SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step); >+ break; >+ case EFI_IF= R_TYPE_NUM_SIZE_16: >+ gCurrentM= inMaxData- >>SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step); >+ break; >+ case EFI_IF= R_TYPE_NUM_SIZE_8: >+ gCurrentM= inMaxData- >>SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step); >+ break; >+ default: >+ break; >+ } > } > } > if (_GET_CURRQE= ST_DATATYPE() =3D=3D >EFI_IFR_TYPE_OTHER) { > Size =3D size= of (EFI_IFR_TYPE_VALUE); > } else if (Arra= yType) { >@@ -3428,24 +3800,35 @@ vfrStatementOneOfOption : > break; > default: > break; > } > } else { >- ReturnCode = =3D >gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&Size); >+ // >+ // For the on= eof stored in bit fields, set the >option type as UINT32. >+ // >+ if (_GET_CURR= QEST_VARTINFO().mIsBitVar) { >+ Size =3D si= zeof (UINT32); >+ } else { >+ ReturnCode = =3D >gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), >&Size); >+ } > } > if (ReturnCode = !=3D VFR_RETURN_SUCCESS) { > _PCATCH (Retu= rnCode, L->getLine()); > } > > Size +=3D OFFSE= T_OF (EFI_IFR_ONE_OF_OPTION, >Value); > OOOObj =3D new = CIfrOneOfOption((UINT8)Size); > OOOObj->SetLine= No(L->getLine()); > OOOObj->SetOpti= on (_STOSID(S->getText(), S- >>getLine())); > if (ArrayType) = { >- OOOObj->SetTy= pe (EFI_IFR_TYPE_BUFFER); >+ OOOObj->SetTy= pe (EFI_IFR_TYPE_BUFFER); > } else { >- OOOObj->SetTy= pe >(_GET_CURRQEST_DATATYPE()); >+ if (_GET_CURR= QEST_VARTINFO().mIsBitVar) { >+ OOOObj->Set= Type >( EFI_IFR_TYPE_NUM_SIZE_32); >+ } else { >+ OOOObj->Set= Type >(_GET_CURRQEST_DATATYPE()); >+ } > } > OOOObj->SetValu= e (*Val); > >> > 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, >&mFormsetGuid); > 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, >&mFormsetGuid); > 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, >&mFormsetGuid); > VSObj.SetVarStoreId (VarStoreId); > gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size); > VSObj.SetSize ((UINT16) Size); >diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp >b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp >index 37b58e2..b00a926 100644 >--- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp >+++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp >@@ -598,10 +598,65 @@ CVfrVarDataTypeDB::ExtractStructTypeName ( > } > > return VFR_RETURN_SUCCESS; > } > >+/** >+ 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 struct= ure >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_SUCCESS); >+ 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_SUCCESS); >+ 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 ( > > 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 * ((Arra= yIdx >=3D=3D INVALID_ARRAY_INDEX) ? 0 : ArrayIdx) * 8; >+ } else { >+ Offset =3D Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayId= x =3D=3D >INVALID_ARRAY_INDEX) ? 0 : ArrayIdx); >+ } > return VFR_RETURN_SUCCESS; > } > > UINT8 > CVfrVarDataTypeDB::GetFieldWidth ( >@@ -747,21 +806,26 @@ CVfrVarDataTypeDB::GetFieldWidth ( > } > > 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; > } > > 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; >+ } > } > } > > 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; > > 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; > > 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; > > New->mMembers =3D pYearField; > } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_T= IME") >=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; > > 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; > > 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; > > New->mMembers =3D pHoursField; > } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_R= EF") >=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; > > 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; > > 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; > > strcpy (pDevicePathField->mFieldName, "DevicePath"); > GetDataType ((CHAR8 *)"EFI_STRING_ID", &pDevicePathField- >>mFieldType); > pDevicePathField->mOffset =3D 20; > pDevicePathField->mNext =3D NULL; > pDevicePathField->mArrayNum =3D 0; >+ pDevicePathField->mIsBitField =3D FALSE; > > 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; > > mNewDataType =3D pNewType; > } > > EFI_VFR_RETURN_CODE >@@ -1007,10 +1082,129 @@ CVfrVarDataTypeDB::SetNewTypeName ( > > strcpy(mNewDataType->mTypeName, TypeName); > return VFR_RETURN_SUCCESS; > } > >+/** >+ 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 width. >+ @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_SUCCESS); >+ >+ if (Width > MAX_BIT_WIDTH) { >+ return VFR_RETURN_BIT_WIDTH_ERROR; >+ } >+ >+ if (Width > pFieldType->mTotalSize * 8) { >+ return VFR_RETURN_BIT_WIDTH_ERROR; >+ } >+ >+ if (FieldName !=3D NULL && strlen (FieldName) >=3D MAX_NAME_LEN) { >+ return VFR_RETURN_INVALID_PARAMETER; >+ } >+ >+ if (Width =3D=3D 0 && FieldName !=3D NULL) { >+ return VFR_RETURN_INVALID_PARAMETER; >+ } >+ >+ for (pTmp =3D mNewDataType->mMembers; pTmp !=3D NULL; pTmp =3D pTmp- >>mNext) { >+ if (FieldName !=3D NULL && strcmp (pTmp->mFieldName, FieldName) =3D= =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; >+ if (FieldName !=3D NULL) { >+ 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- >>mTypeName, pNewField->mFieldType->mTypeName) =3D=3D 0 && >+ (pTmp->mBitOffset - pTmp->mOffset * 8) + pTmp->mBitWidth + >pNewField->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 boundar= y. >+ // So make this bit field occupy the remaing bit width of current f= ield 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(mNewDataType->mTotalSize, Align); >+ } >+ mNewDataType->mTotalSize =3D pNewField->mOffset + (pNewField- >>mFieldType->mTotalSize); >+ } >+ >+ mNewDataType->mAlign =3D MIN (mPackAlign, MAX (pFieldType->mAlign, >mNewDataType->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 +1236,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(mNewDataType->mTotalSize, Align); > } >@@ -1181,39 +1376,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; > > Offset =3D 0; > Type =3D EFI_IFR_TYPE_OTHER; > Size =3D 0; >+ VarStrName =3D VarStr; > > CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), >VFR_RETURN_SUCCESS); > CHECK_ERROR_RETURN (GetDataType (TName, &pType), >VFR_RETURN_SUCCESS); > >+ BitField =3D IsThisBitField (VarStrName); >+ > // > // if it is not struct data type > // > Type =3D pType->mType; > Size =3D pType->mTotalSize; > > 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_SUCCESS); > 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- >>mIsBitField), 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; > } > > EFI_VFR_RETURN_CODE >@@ -1358,10 +1562,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 +1579,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; > } > > SVfrVarStorageNode::SVfrVarStorageNode ( >@@ -1646,10 +1855,11 @@ CVfrDataStorage::DeclareBufferVarStore ( > IN CHAR8 *StoreName, > IN EFI_GUID *Guid, > 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 +1882,11 @@ CVfrDataStorage::DeclareBufferVarStore ( > return VFR_RETURN_VARSTOREID_REDEFINED; > } > MarkVarStoreIdUsed (VarStoreId); > } > >- if ((pNew =3D new SVfrVarStorageNode (Guid, StoreName, VarStoreId, >pDataType, Flag)) =3D=3D NULL) { >+ if ((pNew =3D new SVfrVarStorageNode (Guid, StoreName, VarStoreId, >pDataType, IsBitVarStore, Flag)) =3D=3D NULL) { > return VFR_RETURN_OUT_FOR_RESOURCES; > } > > pNew->mNext =3D mBufferVarStoreList; > mBufferVarStoreList =3D pNew; >@@ -2386,10 +2596,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; > } > > EFI_VARSTORE_INFO::EFI_VARSTORE_INFO ( > IN EFI_VARSTORE_INFO &Info > ) >@@ -2397,10 +2608,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; > } > > EFI_VARSTORE_INFO& > EFI_VARSTORE_INFO::operator=3D ( > IN CONST EFI_VARSTORE_INFO &Info >@@ -2410,10 +2622,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; > } > > return *this; > } > >@@ -2424,11 +2637,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; > } > > return FALSE; > } >diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h >b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h >index 0c67d73..70af911 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, EITHER EXPRESS OR IMPLIED. > #include "Common/UefiBaseTypes.h" > #include "EfiVfr.h" > #include "VfrError.h" > > extern BOOLEAN VfrCompatibleMode; >+static EFI_GUID gEdkiiIfrBitVarGuid =3D EDKII_IFR_BIT_VARSTORE_GUID; > >+#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; > }; > > struct SVfrDataType { > CHAR8 mTypeName[MAX_NAME_LEN]; > UINT8 mType; > UINT32 mAlign; > UINT32 mTotalSize; >+ BOOLEAN mHasBitField; > SVfrDataField *mMembers; > SVfrDataType *mNext; > }; > > #define VFR_PACK_ASSIGN 0x01 >@@ -193,30 +199,33 @@ private: > VOID InternalTypesListInit (VOID); > VOID RegisterNewType (IN SVfrDataType *); > > EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 >*); > EFI_VFR_RETURN_CODE GetTypeField (IN CONST CHAR8 *, IN SVfrDataType >*, IN SVfrDataField *&); >- EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, >OUT UINT32 &); >+ EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, >OUT UINT32 &, IN BOOLEAN); > UINT8 GetFieldWidth (IN SVfrDataField *); >- UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32); >+ UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32, IN BOO= LEAN); > > public: > CVfrVarDataTypeDB (VOID); > ~CVfrVarDataTypeDB (VOID); > > VOID DeclareDataTypeBegin (VOID); > EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *); > EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN >UINT32, IN BOOLEAN); >+ EFI_VFR_RETURN_CODE DataTypeAddBitField (IN CHAR8 *, IN CHAR8 *, IN >UINT32, IN BOOLEAN); > VOID DeclareDataTypeEnd (VOID); > > EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **); > EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *); > EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *); >- EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT >UINT8 &, OUT UINT32 &); >+ EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, >OUT UINT8 &, OUT UINT32 &, OUT BOOLEAN &); > > EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, >OUT UINT32 *); > EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT >CHAR8 *, OUT UINT32 &); >+ BOOLEAN DataTypeHasBitField (IN CHAR8 *); >+ BOOLEAN IsThisBitField (IN CHAR8 *); > > BOOLEAN IsTypeNameDefined (IN CHAR8 *); > > VOID Dump(IN FILE *); > // >@@ -236,11 +245,12 @@ extern CVfrVarDataTypeDB gCVfrVarDataTypeDB; > > 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; > > struct SVfrVarStorageNode { > EFI_GUID mGuid; > CHAR8 *mVarStoreName; >@@ -266,11 +276,11 @@ struct SVfrVarStorageNode { > } mNameSpace; > } mStorageInfo; > > public: > SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN >EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag =3D TRUE); >- SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN >SVfrDataType *, IN BOOLEAN Flag =3D TRUE); >+ SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN >SVfrDataType *,IN BOOLEAN, IN BOOLEAN Flag =3D TRUE); > SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID); > ~SVfrVarStorageNode (VOID); > > private: > SVfrVarStorageNode (IN CONST SVfrVarStorageNode&); // Preve= nt >copy-construction >@@ -283,10 +293,11 @@ struct EFI_VARSTORE_INFO { > EFI_STRING_ID mVarName; > UINT16 mVarOffset; > } mInfo; > UINT8 mVarType; > UINT32 mVarTotalSize; >+ BOOLEAN mIsBitVar; > > 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 *); > > EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN >EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag =3D TRUE); > >- EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, >IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag >=3D TRUE); >+ EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID >*, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN, >IN BOOLEAN Flag =3D TRUE); > > 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 **); >-- >1.9.5.msysgit.1