BaseTool/VfrCompiler: Support Bit fields in EFI/Buffer VarStore
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=545 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 <eric.dong@intel.com> Cc: Liming Gao <liming.gao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
EDK II specific HII relative definition.
|
EDK II specific HII relative definition.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
This program and the accompanying materials are licensed and made available
|
This program and the accompanying materials are licensed and made available
|
||||||
under the terms and conditions of the BSD License which accompanies this
|
under the terms and conditions of the BSD License which accompanies this
|
||||||
@@ -212,10 +212,28 @@ typedef struct _EFI_IFR_GUID_VAREQNAME {
|
|||||||
UINT16 NameId;
|
UINT16 NameId;
|
||||||
} EFI_IFR_GUID_VAREQNAME;
|
} 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 style 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()
|
#pragma pack()
|
||||||
|
|
||||||
extern EFI_GUID gEfiIfrTianoGuid;
|
extern EFI_GUID gEfiIfrTianoGuid;
|
||||||
extern EFI_GUID gEfiIfrFrameworkGuid;
|
extern EFI_GUID gEfiIfrFrameworkGuid;
|
||||||
|
extern EFI_GUID gEdkiiIfrBitVarStoreGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
VfrCompiler error handler.
|
VfrCompiler error handler.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -46,6 +46,7 @@ static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {
|
|||||||
{ VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},
|
{ 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_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_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 <= sizeof (type) * 8 and the max width can not > 32" },
|
||||||
{ VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }
|
{ VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
VfrCompiler Error definition
|
VfrCompiler Error definition
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -44,6 +44,7 @@ typedef enum {
|
|||||||
VFR_RETURN_DEFAULT_VALUE_REDEFINED,
|
VFR_RETURN_DEFAULT_VALUE_REDEFINED,
|
||||||
VFR_RETURN_CONSTANT_ONLY,
|
VFR_RETURN_CONSTANT_ONLY,
|
||||||
VFR_RETURN_VARSTORE_NAME_REDEFINED_ERROR,
|
VFR_RETURN_VARSTORE_NAME_REDEFINED_ERROR,
|
||||||
|
VFR_RETURN_BIT_WIDTH_ERROR,
|
||||||
VFR_RETURN_CODEUNDEFINED
|
VFR_RETURN_CODEUNDEFINED
|
||||||
} EFI_VFR_RETURN_CODE;
|
} EFI_VFR_RETURN_CODE;
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
The definition of CFormPkg's member function
|
The definition of CFormPkg's member function
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -829,6 +829,9 @@ CFormPkg::DeclarePendingQuestion (
|
|||||||
UINT32 ShrinkSize = 0;
|
UINT32 ShrinkSize = 0;
|
||||||
EFI_VFR_RETURN_CODE ReturnCode;
|
EFI_VFR_RETURN_CODE ReturnCode;
|
||||||
EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
|
EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
|
||||||
|
UINT8 LFlags;
|
||||||
|
UINT32 MaxValue;
|
||||||
|
CIfrGuid *GuidObj = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Declare all questions as Numeric in DisableIf True
|
// Declare all questions as Numeric in DisableIf True
|
||||||
@@ -844,14 +847,8 @@ CFormPkg::DeclarePendingQuestion (
|
|||||||
// Declare Numeric qeustion for each undefined question.
|
// Declare Numeric qeustion for each undefined question.
|
||||||
for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {
|
for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {
|
||||||
if (pNode->mFlag == PENDING) {
|
if (pNode->mFlag == PENDING) {
|
||||||
CIfrNumeric CNObj;
|
|
||||||
EFI_VARSTORE_INFO Info;
|
EFI_VARSTORE_INFO Info;
|
||||||
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
|
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
|
||||||
|
|
||||||
CNObj.SetLineNo (LineNo);
|
|
||||||
CNObj.SetPrompt (0x0);
|
|
||||||
CNObj.SetHelp (0x0);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register this question, assume it is normal question, not date or time question
|
// Register this question, assume it is normal question, not date or time question
|
||||||
//
|
//
|
||||||
@@ -888,7 +885,7 @@ CFormPkg::DeclarePendingQuestion (
|
|||||||
} else {
|
} else {
|
||||||
if (VarStoreType == EFI_VFR_VARSTORE_EFI) {
|
if (VarStoreType == EFI_VFR_VARSTORE_EFI) {
|
||||||
ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info);
|
ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info);
|
||||||
} else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {
|
} else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_BUFFER_BITS) {
|
||||||
VarStr = pNode->mKey;
|
VarStr = pNode->mKey;
|
||||||
//convert VarStr with store name to VarStr with structure name
|
//convert VarStr with store name to VarStr with structure name
|
||||||
ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (Info.mVarStoreId, &SName);
|
ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (Info.mVarStoreId, &SName);
|
||||||
@@ -897,7 +894,7 @@ CFormPkg::DeclarePendingQuestion (
|
|||||||
NewStr[0] = '\0';
|
NewStr[0] = '\0';
|
||||||
strcpy (NewStr, SName);
|
strcpy (NewStr, SName);
|
||||||
strcat (NewStr, VarStr + strlen (FName));
|
strcat (NewStr, VarStr + strlen (FName));
|
||||||
ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);
|
ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize, Info.mIsBitVar);
|
||||||
delete[] NewStr;
|
delete[] NewStr;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -908,39 +905,63 @@ CFormPkg::DeclarePendingQuestion (
|
|||||||
gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey);
|
gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey);
|
||||||
return ReturnCode;
|
return ReturnCode;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
// If the storage is bit fields, create Guid opcode to wrap the numeric opcode.
|
||||||
|
//
|
||||||
|
if (Info.mIsBitVar) {
|
||||||
|
GuidObj = new CIfrGuid(0);
|
||||||
|
GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);
|
||||||
|
GuidObj->SetLineNo(LineNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
CIfrNumeric CNObj;
|
||||||
|
CNObj.SetLineNo (LineNo);
|
||||||
|
CNObj.SetPrompt (0x0);
|
||||||
|
CNObj.SetHelp (0x0);
|
||||||
CNObj.SetQuestionId (QId);
|
CNObj.SetQuestionId (QId);
|
||||||
CNObj.SetVarStoreInfo (&Info);
|
CNObj.SetVarStoreInfo (&Info);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Numeric doesn't support BOOLEAN data type.
|
// 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.
|
||||||
// BOOLEAN type has the same data size to UINT8.
|
|
||||||
//
|
//
|
||||||
if (Info.mVarType == EFI_IFR_TYPE_BOOLEAN) {
|
if (Info.mIsBitVar) {
|
||||||
Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8;
|
MaxValue = (1 << Info.mVarTotalSize) -1;
|
||||||
}
|
CNObj.SetMinMaxStepData ((UINT32) 0, MaxValue, (UINT32) 0);
|
||||||
CNObj.SetFlags (0, Info.mVarType);
|
|
||||||
//
|
|
||||||
// Use maximum value not to limit the vaild value for the undefined question.
|
|
||||||
//
|
|
||||||
switch (Info.mVarType) {
|
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_64:
|
|
||||||
CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0);
|
|
||||||
ShrinkSize = 0;
|
|
||||||
break;
|
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_32:
|
|
||||||
CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);
|
|
||||||
ShrinkSize = 12;
|
ShrinkSize = 12;
|
||||||
break;
|
LFlags = (EDKII_IFR_NUMERIC_SIZE_BIT & Info.mVarTotalSize);
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_16:
|
CNObj.SetFlagsForBitField (0, LFlags);
|
||||||
CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);
|
} else {
|
||||||
ShrinkSize = 18;
|
//
|
||||||
break;
|
// Numeric doesn't support BOOLEAN data type.
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_8:
|
// BOOLEAN type has the same data size to UINT8.
|
||||||
CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);
|
//
|
||||||
ShrinkSize = 21;
|
if (Info.mVarType == EFI_IFR_TYPE_BOOLEAN) {
|
||||||
break;
|
Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8;
|
||||||
default:
|
}
|
||||||
break;
|
CNObj.SetFlags (0, Info.mVarType);
|
||||||
|
//
|
||||||
|
// Use maximum value not to limit the vaild value for the undefined question.
|
||||||
|
//
|
||||||
|
switch (Info.mVarType) {
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||||
|
CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0);
|
||||||
|
ShrinkSize = 0;
|
||||||
|
break;
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_32:
|
||||||
|
CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);
|
||||||
|
ShrinkSize = 12;
|
||||||
|
break;
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_16:
|
||||||
|
CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);
|
||||||
|
ShrinkSize = 18;
|
||||||
|
break;
|
||||||
|
case EFI_IFR_TYPE_NUM_SIZE_8:
|
||||||
|
CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);
|
||||||
|
ShrinkSize = 21;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CNObj.ShrinkBinSize (ShrinkSize);
|
CNObj.ShrinkBinSize (ShrinkSize);
|
||||||
|
|
||||||
@@ -956,8 +977,18 @@ CFormPkg::DeclarePendingQuestion (
|
|||||||
//
|
//
|
||||||
// End for Numeric
|
// End for Numeric
|
||||||
//
|
//
|
||||||
CIfrEnd CEObj;
|
CIfrEnd CEObj;
|
||||||
CEObj.SetLineNo (LineNo);
|
CEObj.SetLineNo (LineNo);
|
||||||
|
//
|
||||||
|
// End for Guided opcode
|
||||||
|
//
|
||||||
|
if (GuidObj != NULL) {
|
||||||
|
CIfrEnd CEObjGuid;
|
||||||
|
CEObjGuid.SetLineNo (LineNo);
|
||||||
|
GuidObj->SetScope(1);
|
||||||
|
delete GuidObj;
|
||||||
|
GuidObj = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
The definition of CFormPkg's member function
|
The definition of CFormPkg's member function
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -567,8 +567,12 @@ public:
|
|||||||
mMinMaxStepData->u8.Step = Step;
|
mMinMaxStepData->u8.Step = Step;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT64 GetMinData (UINT8 VarType) {
|
UINT64 GetMinData (UINT8 VarType, BOOLEAN IsBitVar) {
|
||||||
UINT64 MinValue = 0;
|
UINT64 MinValue = 0;
|
||||||
|
if (IsBitVar) {
|
||||||
|
MinValue = mMinMaxStepData->u32.MinValue;
|
||||||
|
return MinValue;
|
||||||
|
}
|
||||||
switch (VarType) {
|
switch (VarType) {
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_64:
|
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||||
MinValue = mMinMaxStepData->u64.MinValue;
|
MinValue = mMinMaxStepData->u64.MinValue;
|
||||||
@@ -588,8 +592,12 @@ public:
|
|||||||
return MinValue;
|
return MinValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT64 GetMaxData (UINT8 VarType) {
|
UINT64 GetMaxData (UINT8 VarType, BOOLEAN IsBitVar) {
|
||||||
UINT64 MaxValue = 0;
|
UINT64 MaxValue = 0;
|
||||||
|
if (IsBitVar) {
|
||||||
|
MaxValue = mMinMaxStepData->u32.MaxValue;
|
||||||
|
return MaxValue;
|
||||||
|
}
|
||||||
switch (VarType) {
|
switch (VarType) {
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_64:
|
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||||
MaxValue = mMinMaxStepData->u64.MaxValue;
|
MaxValue = mMinMaxStepData->u64.MaxValue;
|
||||||
@@ -609,8 +617,12 @@ public:
|
|||||||
return MaxValue;
|
return MaxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT64 GetStepData (UINT8 VarType) {
|
UINT64 GetStepData (UINT8 VarType, BOOLEAN IsBitVar) {
|
||||||
UINT64 MaxValue = 0;
|
UINT64 MaxValue = 0;
|
||||||
|
if (IsBitVar) {
|
||||||
|
MaxValue = mMinMaxStepData->u32.Step;
|
||||||
|
return MaxValue;
|
||||||
|
}
|
||||||
switch (VarType) {
|
switch (VarType) {
|
||||||
case EFI_IFR_TYPE_NUM_SIZE_64:
|
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||||
MaxValue = mMinMaxStepData->u64.Step;
|
MaxValue = mMinMaxStepData->u64.Step;
|
||||||
@@ -1407,6 +1419,22 @@ public:
|
|||||||
return VFR_RETURN_SUCCESS;
|
return VFR_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 LFlags, BOOLEAN DisplaySettingsSpecified = FALSE) {
|
||||||
|
EFI_VFR_RETURN_CODE Ret;
|
||||||
|
|
||||||
|
Ret = CIfrQuestionHeader::SetFlags (HFlags);
|
||||||
|
if (Ret != VFR_RETURN_SUCCESS) {
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DisplaySettingsSpecified == FALSE) {
|
||||||
|
mNumeric->Flags = LFlags | EDKII_IFR_DISPLAY_UINT_DEC_BIT;
|
||||||
|
} else {
|
||||||
|
mNumeric->Flags = LFlags;
|
||||||
|
}
|
||||||
|
return VFR_RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
UINT8 GetNumericFlags () {
|
UINT8 GetNumericFlags () {
|
||||||
return mNumeric->Flags;
|
return mNumeric->Flags;
|
||||||
}
|
}
|
||||||
@@ -1447,6 +1475,22 @@ public:
|
|||||||
return VFR_RETURN_SUCCESS;
|
return VFR_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 LFlags) {
|
||||||
|
EFI_VFR_RETURN_CODE Ret;
|
||||||
|
|
||||||
|
Ret = CIfrQuestionHeader::SetFlags (HFlags);
|
||||||
|
if (Ret != VFR_RETURN_SUCCESS) {
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LFlags & EFI_IFR_DISPLAY) {
|
||||||
|
mOneOf->Flags = LFlags;
|
||||||
|
} else {
|
||||||
|
mOneOf->Flags = LFlags | EDKII_IFR_DISPLAY_UINT_DEC_BIT;
|
||||||
|
}
|
||||||
|
return VFR_RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
VOID ShrinkBinSize (IN UINT16 Size) {
|
VOID ShrinkBinSize (IN UINT16 Size) {
|
||||||
//
|
//
|
||||||
// Update the buffer size which is truly be used later.
|
// Update the buffer size which is truly be used later.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -600,6 +600,61 @@ CVfrVarDataTypeDB::ExtractStructTypeName (
|
|||||||
return VFR_RETURN_SUCCESS;
|
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 = NULL;
|
||||||
|
SVfrDataField *pTmp;
|
||||||
|
|
||||||
|
GetDataType (TypeName, &pType);
|
||||||
|
for (pTmp = pType->mMembers; pTmp!= NULL; pTmp = 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 structure name.
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
CVfrVarDataTypeDB::IsThisBitField (
|
||||||
|
IN CHAR8 *VarStr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CHAR8 FName[MAX_NAME_LEN];
|
||||||
|
CHAR8 TName[MAX_NAME_LEN];
|
||||||
|
UINT32 ArrayIdx;
|
||||||
|
SVfrDataType *pType = NULL;
|
||||||
|
SVfrDataField *pField = NULL;
|
||||||
|
|
||||||
|
CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);
|
||||||
|
CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);
|
||||||
|
|
||||||
|
while (*VarStr != '\0') {
|
||||||
|
CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);
|
||||||
|
CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);
|
||||||
|
pType = pField->mFieldType;
|
||||||
|
}
|
||||||
|
if (pField->mIsBitField) {
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EFI_VFR_RETURN_CODE
|
EFI_VFR_RETURN_CODE
|
||||||
CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
|
CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
|
||||||
IN CHAR8 *&VarStr,
|
IN CHAR8 *&VarStr,
|
||||||
@@ -697,7 +752,8 @@ EFI_VFR_RETURN_CODE
|
|||||||
CVfrVarDataTypeDB::GetFieldOffset (
|
CVfrVarDataTypeDB::GetFieldOffset (
|
||||||
IN SVfrDataField *Field,
|
IN SVfrDataField *Field,
|
||||||
IN UINT32 ArrayIdx,
|
IN UINT32 ArrayIdx,
|
||||||
OUT UINT32 &Offset
|
OUT UINT32 &Offset,
|
||||||
|
IN BOOLEAN IsBitField
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Field == NULL) {
|
if (Field == NULL) {
|
||||||
@@ -729,8 +785,11 @@ CVfrVarDataTypeDB::GetFieldOffset (
|
|||||||
// return VFR_RETURN_ERROR_ARRARY_NUM;
|
// return VFR_RETURN_ERROR_ARRARY_NUM;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
if (IsBitField) {
|
||||||
Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);
|
Offset = Field->mBitOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx) * 8;
|
||||||
|
} else {
|
||||||
|
Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);
|
||||||
|
}
|
||||||
return VFR_RETURN_SUCCESS;
|
return VFR_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -749,7 +808,8 @@ CVfrVarDataTypeDB::GetFieldWidth (
|
|||||||
UINT32
|
UINT32
|
||||||
CVfrVarDataTypeDB::GetFieldSize (
|
CVfrVarDataTypeDB::GetFieldSize (
|
||||||
IN SVfrDataField *Field,
|
IN SVfrDataField *Field,
|
||||||
IN UINT32 ArrayIdx
|
IN UINT32 ArrayIdx,
|
||||||
|
IN BOOLEAN BitField
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Field == NULL) {
|
if (Field == NULL) {
|
||||||
@@ -757,9 +817,13 @@ CVfrVarDataTypeDB::GetFieldSize (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {
|
if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {
|
||||||
return Field->mFieldType->mTotalSize * Field->mArrayNum;
|
return Field->mFieldType->mTotalSize * Field->mArrayNum;
|
||||||
} else {
|
} else {
|
||||||
return Field->mFieldType->mTotalSize;
|
if (BitField) {
|
||||||
|
return Field->mBitWidth;
|
||||||
|
} else {
|
||||||
|
return Field->mFieldType->mTotalSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -788,18 +852,21 @@ CVfrVarDataTypeDB::InternalTypesListInit (
|
|||||||
pYearField->mOffset = 0;
|
pYearField->mOffset = 0;
|
||||||
pYearField->mNext = pMonthField;
|
pYearField->mNext = pMonthField;
|
||||||
pYearField->mArrayNum = 0;
|
pYearField->mArrayNum = 0;
|
||||||
|
pYearField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pMonthField->mFieldName, "Month");
|
strcpy (pMonthField->mFieldName, "Month");
|
||||||
GetDataType ((CHAR8 *)"UINT8", &pMonthField->mFieldType);
|
GetDataType ((CHAR8 *)"UINT8", &pMonthField->mFieldType);
|
||||||
pMonthField->mOffset = 2;
|
pMonthField->mOffset = 2;
|
||||||
pMonthField->mNext = pDayField;
|
pMonthField->mNext = pDayField;
|
||||||
pMonthField->mArrayNum = 0;
|
pMonthField->mArrayNum = 0;
|
||||||
|
pMonthField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pDayField->mFieldName, "Day");
|
strcpy (pDayField->mFieldName, "Day");
|
||||||
GetDataType ((CHAR8 *)"UINT8", &pDayField->mFieldType);
|
GetDataType ((CHAR8 *)"UINT8", &pDayField->mFieldType);
|
||||||
pDayField->mOffset = 3;
|
pDayField->mOffset = 3;
|
||||||
pDayField->mNext = NULL;
|
pDayField->mNext = NULL;
|
||||||
pDayField->mArrayNum = 0;
|
pDayField->mArrayNum = 0;
|
||||||
|
pDayField->mIsBitField = FALSE;
|
||||||
|
|
||||||
New->mMembers = pYearField;
|
New->mMembers = pYearField;
|
||||||
} else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {
|
} else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {
|
||||||
@@ -812,18 +879,21 @@ CVfrVarDataTypeDB::InternalTypesListInit (
|
|||||||
pHoursField->mOffset = 0;
|
pHoursField->mOffset = 0;
|
||||||
pHoursField->mNext = pMinutesField;
|
pHoursField->mNext = pMinutesField;
|
||||||
pHoursField->mArrayNum = 0;
|
pHoursField->mArrayNum = 0;
|
||||||
|
pHoursField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pMinutesField->mFieldName, "Minutes");
|
strcpy (pMinutesField->mFieldName, "Minutes");
|
||||||
GetDataType ((CHAR8 *)"UINT8", &pMinutesField->mFieldType);
|
GetDataType ((CHAR8 *)"UINT8", &pMinutesField->mFieldType);
|
||||||
pMinutesField->mOffset = 1;
|
pMinutesField->mOffset = 1;
|
||||||
pMinutesField->mNext = pSecondsField;
|
pMinutesField->mNext = pSecondsField;
|
||||||
pMinutesField->mArrayNum = 0;
|
pMinutesField->mArrayNum = 0;
|
||||||
|
pMinutesField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pSecondsField->mFieldName, "Seconds");
|
strcpy (pSecondsField->mFieldName, "Seconds");
|
||||||
GetDataType ((CHAR8 *)"UINT8", &pSecondsField->mFieldType);
|
GetDataType ((CHAR8 *)"UINT8", &pSecondsField->mFieldType);
|
||||||
pSecondsField->mOffset = 2;
|
pSecondsField->mOffset = 2;
|
||||||
pSecondsField->mNext = NULL;
|
pSecondsField->mNext = NULL;
|
||||||
pSecondsField->mArrayNum = 0;
|
pSecondsField->mArrayNum = 0;
|
||||||
|
pSecondsField->mIsBitField = FALSE;
|
||||||
|
|
||||||
New->mMembers = pHoursField;
|
New->mMembers = pHoursField;
|
||||||
} else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_REF") == 0) {
|
} else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_REF") == 0) {
|
||||||
@@ -837,24 +907,28 @@ CVfrVarDataTypeDB::InternalTypesListInit (
|
|||||||
pQuestionIdField->mOffset = 0;
|
pQuestionIdField->mOffset = 0;
|
||||||
pQuestionIdField->mNext = pFormIdField;
|
pQuestionIdField->mNext = pFormIdField;
|
||||||
pQuestionIdField->mArrayNum = 0;
|
pQuestionIdField->mArrayNum = 0;
|
||||||
|
pQuestionIdField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pFormIdField->mFieldName, "FormId");
|
strcpy (pFormIdField->mFieldName, "FormId");
|
||||||
GetDataType ((CHAR8 *)"UINT16", &pFormIdField->mFieldType);
|
GetDataType ((CHAR8 *)"UINT16", &pFormIdField->mFieldType);
|
||||||
pFormIdField->mOffset = 2;
|
pFormIdField->mOffset = 2;
|
||||||
pFormIdField->mNext = pFormSetGuidField;
|
pFormIdField->mNext = pFormSetGuidField;
|
||||||
pFormIdField->mArrayNum = 0;
|
pFormIdField->mArrayNum = 0;
|
||||||
|
pFormIdField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pFormSetGuidField->mFieldName, "FormSetGuid");
|
strcpy (pFormSetGuidField->mFieldName, "FormSetGuid");
|
||||||
GetDataType ((CHAR8 *)"EFI_GUID", &pFormSetGuidField->mFieldType);
|
GetDataType ((CHAR8 *)"EFI_GUID", &pFormSetGuidField->mFieldType);
|
||||||
pFormSetGuidField->mOffset = 4;
|
pFormSetGuidField->mOffset = 4;
|
||||||
pFormSetGuidField->mNext = pDevicePathField;
|
pFormSetGuidField->mNext = pDevicePathField;
|
||||||
pFormSetGuidField->mArrayNum = 0;
|
pFormSetGuidField->mArrayNum = 0;
|
||||||
|
pFormSetGuidField->mIsBitField = FALSE;
|
||||||
|
|
||||||
strcpy (pDevicePathField->mFieldName, "DevicePath");
|
strcpy (pDevicePathField->mFieldName, "DevicePath");
|
||||||
GetDataType ((CHAR8 *)"EFI_STRING_ID", &pDevicePathField->mFieldType);
|
GetDataType ((CHAR8 *)"EFI_STRING_ID", &pDevicePathField->mFieldType);
|
||||||
pDevicePathField->mOffset = 20;
|
pDevicePathField->mOffset = 20;
|
||||||
pDevicePathField->mNext = NULL;
|
pDevicePathField->mNext = NULL;
|
||||||
pDevicePathField->mArrayNum = 0;
|
pDevicePathField->mArrayNum = 0;
|
||||||
|
pDevicePathField->mIsBitField = FALSE;
|
||||||
|
|
||||||
New->mMembers = pQuestionIdField;
|
New->mMembers = pQuestionIdField;
|
||||||
} else {
|
} else {
|
||||||
@@ -978,6 +1052,7 @@ CVfrVarDataTypeDB::DeclareDataTypeBegin (
|
|||||||
pNewType->mTotalSize = 0;
|
pNewType->mTotalSize = 0;
|
||||||
pNewType->mMembers = NULL;
|
pNewType->mMembers = NULL;
|
||||||
pNewType->mNext = NULL;
|
pNewType->mNext = NULL;
|
||||||
|
pNewType->mHasBitField = FALSE;
|
||||||
|
|
||||||
mNewDataType = pNewType;
|
mNewDataType = pNewType;
|
||||||
}
|
}
|
||||||
@@ -1009,6 +1084,125 @@ CVfrVarDataTypeDB::SetNewTypeName (
|
|||||||
return VFR_RETURN_SUCCESS;
|
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 = NULL;
|
||||||
|
SVfrDataType *pFieldType = 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 != NULL && strlen (FieldName) >= MAX_NAME_LEN) {
|
||||||
|
return VFR_RETURN_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Width == 0 && FieldName != NULL) {
|
||||||
|
return VFR_RETURN_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {
|
||||||
|
if (FieldName != NULL && strcmp (pTmp->mFieldName, FieldName) == 0) {
|
||||||
|
return VFR_RETURN_REDEFINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Align = MIN (mPackAlign, pFieldType->mAlign);
|
||||||
|
UpdateTotalSize = FALSE;
|
||||||
|
|
||||||
|
if ((pNewField = new SVfrDataField) == NULL) {
|
||||||
|
return VFR_RETURN_OUT_FOR_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
MaxDataTypeSize = mNewDataType->mTotalSize;
|
||||||
|
if (FieldName != NULL) {
|
||||||
|
strcpy (pNewField->mFieldName, FieldName);
|
||||||
|
}
|
||||||
|
pNewField->mFieldType = pFieldType;
|
||||||
|
pNewField->mIsBitField = TRUE;
|
||||||
|
pNewField->mBitWidth = Width;
|
||||||
|
pNewField->mArrayNum = 0;
|
||||||
|
pNewField->mBitOffset = 0;
|
||||||
|
pNewField->mOffset = 0;
|
||||||
|
|
||||||
|
if (mNewDataType->mMembers == NULL) {
|
||||||
|
mNewDataType->mMembers = pNewField;
|
||||||
|
pNewField->mNext = NULL;
|
||||||
|
} else {
|
||||||
|
for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext)
|
||||||
|
;
|
||||||
|
pTmp->mNext = pNewField;
|
||||||
|
pNewField->mNext = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FieldInUnion) {
|
||||||
|
pNewField->mOffset = 0;
|
||||||
|
if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {
|
||||||
|
mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Check whether the bit fileds can be contained within one FieldType.
|
||||||
|
//
|
||||||
|
if (pTmp != NULL && pTmp->mIsBitField && strcmp (pTmp->mFieldType->mTypeName, pNewField->mFieldType->mTypeName) == 0 &&
|
||||||
|
(pTmp->mBitOffset - pTmp->mOffset * 8) + pTmp->mBitWidth + pNewField->mBitWidth <= pNewField->mFieldType->mTotalSize * 8) {
|
||||||
|
pNewField->mBitOffset = pTmp->mBitOffset + pTmp->mBitWidth;
|
||||||
|
pNewField->mOffset = pTmp->mOffset;
|
||||||
|
//
|
||||||
|
// If BitWidth=0,used to force alignment at the next word boundary.
|
||||||
|
// So make this bit field occupy the remaing bit width of current field type.
|
||||||
|
//
|
||||||
|
if (pNewField->mBitWidth == 0) {
|
||||||
|
pNewField->mBitWidth = pNewField->mFieldType->mTotalSize * 8 - (pNewField->mBitOffset - pTmp->mOffset * 8);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// The bit filed start a new memory
|
||||||
|
//
|
||||||
|
pNewField->mBitOffset = mNewDataType->mTotalSize * 8;
|
||||||
|
UpdateTotalSize = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpdateTotalSize){
|
||||||
|
if ((mNewDataType->mTotalSize % Align) == 0) {
|
||||||
|
pNewField->mOffset = mNewDataType->mTotalSize;
|
||||||
|
} else {
|
||||||
|
pNewField->mOffset = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);
|
||||||
|
}
|
||||||
|
mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));
|
||||||
|
mNewDataType->mHasBitField = TRUE;
|
||||||
|
return VFR_RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
EFI_VFR_RETURN_CODE
|
EFI_VFR_RETURN_CODE
|
||||||
CVfrVarDataTypeDB::DataTypeAddField (
|
CVfrVarDataTypeDB::DataTypeAddField (
|
||||||
IN CHAR8 *FieldName,
|
IN CHAR8 *FieldName,
|
||||||
@@ -1044,6 +1238,7 @@ CVfrVarDataTypeDB::DataTypeAddField (
|
|||||||
strcpy (pNewField->mFieldName, FieldName);
|
strcpy (pNewField->mFieldName, FieldName);
|
||||||
pNewField->mFieldType = pFieldType;
|
pNewField->mFieldType = pFieldType;
|
||||||
pNewField->mArrayNum = ArrayNum;
|
pNewField->mArrayNum = ArrayNum;
|
||||||
|
pNewField->mIsBitField = FALSE;
|
||||||
if ((mNewDataType->mTotalSize % Align) == 0) {
|
if ((mNewDataType->mTotalSize % Align) == 0) {
|
||||||
pNewField->mOffset = mNewDataType->mTotalSize;
|
pNewField->mOffset = mNewDataType->mTotalSize;
|
||||||
} else {
|
} else {
|
||||||
@@ -1183,21 +1378,26 @@ CVfrVarDataTypeDB::GetDataFieldInfo (
|
|||||||
IN CHAR8 *VarStr,
|
IN CHAR8 *VarStr,
|
||||||
OUT UINT16 &Offset,
|
OUT UINT16 &Offset,
|
||||||
OUT UINT8 &Type,
|
OUT UINT8 &Type,
|
||||||
OUT UINT32 &Size
|
OUT UINT32 &Size,
|
||||||
|
OUT BOOLEAN &BitField
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];
|
CHAR8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];
|
||||||
UINT32 ArrayIdx, Tmp;
|
UINT32 ArrayIdx, Tmp;
|
||||||
SVfrDataType *pType = NULL;
|
SVfrDataType *pType = NULL;
|
||||||
SVfrDataField *pField = NULL;
|
SVfrDataField *pField = NULL;
|
||||||
|
CHAR8 *VarStrName;
|
||||||
|
|
||||||
Offset = 0;
|
Offset = 0;
|
||||||
Type = EFI_IFR_TYPE_OTHER;
|
Type = EFI_IFR_TYPE_OTHER;
|
||||||
Size = 0;
|
Size = 0;
|
||||||
|
VarStrName = VarStr;
|
||||||
|
|
||||||
CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);
|
CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);
|
||||||
CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);
|
CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);
|
||||||
|
|
||||||
|
BitField = IsThisBitField (VarStrName);
|
||||||
|
|
||||||
//
|
//
|
||||||
// if it is not struct data type
|
// if it is not struct data type
|
||||||
//
|
//
|
||||||
@@ -1205,13 +1405,17 @@ CVfrVarDataTypeDB::GetDataFieldInfo (
|
|||||||
Size = pType->mTotalSize;
|
Size = pType->mTotalSize;
|
||||||
|
|
||||||
while (*VarStr != '\0') {
|
while (*VarStr != '\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);
|
CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);
|
||||||
pType = pField->mFieldType;
|
pType = pField->mFieldType;
|
||||||
CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);
|
CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsBitField), VFR_RETURN_SUCCESS);
|
||||||
Offset = (UINT16) (Offset + Tmp);
|
if (BitField && !pField->mIsBitField) {
|
||||||
|
Offset = (UINT16) (Offset + Tmp * 8);
|
||||||
|
} else {
|
||||||
|
Offset = (UINT16) (Offset + Tmp);
|
||||||
|
}
|
||||||
Type = GetFieldWidth (pField);
|
Type = GetFieldWidth (pField);
|
||||||
Size = GetFieldSize (pField, ArrayIdx);
|
Size = GetFieldSize (pField, ArrayIdx, BitField);
|
||||||
}
|
}
|
||||||
return VFR_RETURN_SUCCESS;
|
return VFR_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -1360,6 +1564,7 @@ SVfrVarStorageNode::SVfrVarStorageNode (
|
|||||||
IN CHAR8 *StoreName,
|
IN CHAR8 *StoreName,
|
||||||
IN EFI_VARSTORE_ID VarStoreId,
|
IN EFI_VARSTORE_ID VarStoreId,
|
||||||
IN SVfrDataType *DataType,
|
IN SVfrDataType *DataType,
|
||||||
|
IN BOOLEAN BitsVarstore,
|
||||||
IN BOOLEAN Flag
|
IN BOOLEAN Flag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -1376,7 +1581,11 @@ SVfrVarStorageNode::SVfrVarStorageNode (
|
|||||||
}
|
}
|
||||||
mNext = NULL;
|
mNext = NULL;
|
||||||
mVarStoreId = VarStoreId;
|
mVarStoreId = VarStoreId;
|
||||||
mVarStoreType = EFI_VFR_VARSTORE_BUFFER;
|
if (BitsVarstore) {
|
||||||
|
mVarStoreType = EFI_VFR_VARSTORE_BUFFER_BITS;
|
||||||
|
} else {
|
||||||
|
mVarStoreType = EFI_VFR_VARSTORE_BUFFER;
|
||||||
|
}
|
||||||
mStorageInfo.mDataType = DataType;
|
mStorageInfo.mDataType = DataType;
|
||||||
mAssignedFlag = Flag;
|
mAssignedFlag = Flag;
|
||||||
}
|
}
|
||||||
@@ -1648,6 +1857,7 @@ CVfrDataStorage::DeclareBufferVarStore (
|
|||||||
IN CVfrVarDataTypeDB *DataTypeDB,
|
IN CVfrVarDataTypeDB *DataTypeDB,
|
||||||
IN CHAR8 *TypeName,
|
IN CHAR8 *TypeName,
|
||||||
IN EFI_VARSTORE_ID VarStoreId,
|
IN EFI_VARSTORE_ID VarStoreId,
|
||||||
|
IN BOOLEAN IsBitVarStore,
|
||||||
IN BOOLEAN Flag
|
IN BOOLEAN Flag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -1674,7 +1884,7 @@ CVfrDataStorage::DeclareBufferVarStore (
|
|||||||
MarkVarStoreIdUsed (VarStoreId);
|
MarkVarStoreIdUsed (VarStoreId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType, Flag)) == NULL) {
|
if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType, IsBitVarStore, Flag)) == NULL) {
|
||||||
return VFR_RETURN_OUT_FOR_RESOURCES;
|
return VFR_RETURN_OUT_FOR_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2388,6 +2598,7 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
|
|||||||
mInfo.mVarOffset = EFI_VAROFFSET_INVALID;
|
mInfo.mVarOffset = EFI_VAROFFSET_INVALID;
|
||||||
mVarType = EFI_IFR_TYPE_OTHER;
|
mVarType = EFI_IFR_TYPE_OTHER;
|
||||||
mVarTotalSize = 0;
|
mVarTotalSize = 0;
|
||||||
|
mIsBitVar = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
|
EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
|
||||||
@@ -2399,6 +2610,7 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
|
|||||||
mInfo.mVarOffset = Info.mInfo.mVarOffset;
|
mInfo.mVarOffset = Info.mInfo.mVarOffset;
|
||||||
mVarType = Info.mVarType;
|
mVarType = Info.mVarType;
|
||||||
mVarTotalSize = Info.mVarTotalSize;
|
mVarTotalSize = Info.mVarTotalSize;
|
||||||
|
mIsBitVar = Info.mIsBitVar;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_VARSTORE_INFO&
|
EFI_VARSTORE_INFO&
|
||||||
@@ -2412,6 +2624,7 @@ EFI_VARSTORE_INFO::operator= (
|
|||||||
mInfo.mVarOffset = Info.mInfo.mVarOffset;
|
mInfo.mVarOffset = Info.mInfo.mVarOffset;
|
||||||
mVarType = Info.mVarType;
|
mVarType = Info.mVarType;
|
||||||
mVarTotalSize = Info.mVarTotalSize;
|
mVarTotalSize = Info.mVarTotalSize;
|
||||||
|
mIsBitVar = Info.mIsBitVar;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -2426,7 +2639,8 @@ EFI_VARSTORE_INFO::operator == (
|
|||||||
(mInfo.mVarName == Info->mInfo.mVarName) &&
|
(mInfo.mVarName == Info->mInfo.mVarName) &&
|
||||||
(mInfo.mVarOffset == Info->mInfo.mVarOffset) &&
|
(mInfo.mVarOffset == Info->mInfo.mVarOffset) &&
|
||||||
(mVarType == Info->mVarType) &&
|
(mVarType == Info->mVarType) &&
|
||||||
(mVarTotalSize == Info->mVarTotalSize)) {
|
(mVarTotalSize == Info->mVarTotalSize) &&
|
||||||
|
(mIsBitVar == Info->mIsBitVar)) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,7 +22,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
#include "VfrError.h"
|
#include "VfrError.h"
|
||||||
|
|
||||||
extern BOOLEAN VfrCompatibleMode;
|
extern BOOLEAN VfrCompatibleMode;
|
||||||
|
static EFI_GUID gEdkiiIfrBitVarGuid = EDKII_IFR_BIT_VARSTORE_GUID;
|
||||||
|
|
||||||
|
#define MAX_BIT_WIDTH 32
|
||||||
#define MAX_NAME_LEN 64
|
#define MAX_NAME_LEN 64
|
||||||
#define MAX_STRING_LEN 0x100
|
#define MAX_STRING_LEN 0x100
|
||||||
#define DEFAULT_ALIGN 1
|
#define DEFAULT_ALIGN 1
|
||||||
@@ -116,6 +118,9 @@ struct SVfrDataField {
|
|||||||
SVfrDataType *mFieldType;
|
SVfrDataType *mFieldType;
|
||||||
UINT32 mOffset;
|
UINT32 mOffset;
|
||||||
UINT32 mArrayNum;
|
UINT32 mArrayNum;
|
||||||
|
BOOLEAN mIsBitField;
|
||||||
|
UINT8 mBitWidth;
|
||||||
|
UINT32 mBitOffset;
|
||||||
SVfrDataField *mNext;
|
SVfrDataField *mNext;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -124,6 +129,7 @@ struct SVfrDataType {
|
|||||||
UINT8 mType;
|
UINT8 mType;
|
||||||
UINT32 mAlign;
|
UINT32 mAlign;
|
||||||
UINT32 mTotalSize;
|
UINT32 mTotalSize;
|
||||||
|
BOOLEAN mHasBitField;
|
||||||
SVfrDataField *mMembers;
|
SVfrDataField *mMembers;
|
||||||
SVfrDataType *mNext;
|
SVfrDataType *mNext;
|
||||||
};
|
};
|
||||||
@@ -195,9 +201,9 @@ private:
|
|||||||
|
|
||||||
EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *);
|
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 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 *);
|
UINT8 GetFieldWidth (IN SVfrDataField *);
|
||||||
UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);
|
UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32, IN BOOLEAN);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CVfrVarDataTypeDB (VOID);
|
CVfrVarDataTypeDB (VOID);
|
||||||
@@ -206,15 +212,18 @@ public:
|
|||||||
VOID DeclareDataTypeBegin (VOID);
|
VOID DeclareDataTypeBegin (VOID);
|
||||||
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
|
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
|
||||||
EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32, IN BOOLEAN);
|
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);
|
VOID DeclareDataTypeEnd (VOID);
|
||||||
|
|
||||||
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
|
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
|
||||||
EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);
|
EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);
|
||||||
EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, 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 GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);
|
||||||
EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, 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 *);
|
BOOLEAN IsTypeNameDefined (IN CHAR8 *);
|
||||||
|
|
||||||
@@ -238,7 +247,8 @@ typedef enum {
|
|||||||
EFI_VFR_VARSTORE_INVALID,
|
EFI_VFR_VARSTORE_INVALID,
|
||||||
EFI_VFR_VARSTORE_BUFFER,
|
EFI_VFR_VARSTORE_BUFFER,
|
||||||
EFI_VFR_VARSTORE_EFI,
|
EFI_VFR_VARSTORE_EFI,
|
||||||
EFI_VFR_VARSTORE_NAME
|
EFI_VFR_VARSTORE_NAME,
|
||||||
|
EFI_VFR_VARSTORE_BUFFER_BITS
|
||||||
} EFI_VFR_VARSTORE_TYPE;
|
} EFI_VFR_VARSTORE_TYPE;
|
||||||
|
|
||||||
struct SVfrVarStorageNode {
|
struct SVfrVarStorageNode {
|
||||||
@@ -268,7 +278,7 @@ struct SVfrVarStorageNode {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
|
SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
|
||||||
SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *, IN BOOLEAN Flag = TRUE);
|
SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *,IN BOOLEAN, IN BOOLEAN Flag = TRUE);
|
||||||
SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);
|
SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);
|
||||||
~SVfrVarStorageNode (VOID);
|
~SVfrVarStorageNode (VOID);
|
||||||
|
|
||||||
@@ -285,6 +295,7 @@ struct EFI_VARSTORE_INFO {
|
|||||||
} mInfo;
|
} mInfo;
|
||||||
UINT8 mVarType;
|
UINT8 mVarType;
|
||||||
UINT32 mVarTotalSize;
|
UINT32 mVarTotalSize;
|
||||||
|
BOOLEAN mIsBitVar;
|
||||||
|
|
||||||
EFI_VARSTORE_INFO (VOID);
|
EFI_VARSTORE_INFO (VOID);
|
||||||
EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
|
EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
|
||||||
@@ -343,7 +354,7 @@ public:
|
|||||||
|
|
||||||
EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
|
EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
|
||||||
|
|
||||||
EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);
|
EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN, IN BOOLEAN Flag = TRUE);
|
||||||
|
|
||||||
EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *, IN EFI_GUID *VarGuid = NULL);
|
EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *, IN EFI_GUID *VarGuid = NULL);
|
||||||
EFI_VFR_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID);
|
EFI_VFR_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID);
|
||||||
|
Reference in New Issue
Block a user