dataStructFieldDate [FieldInUnion] |\r
dataStructFieldTime [FieldInUnion] |\r
dataStructFieldRef [FieldInUnion] |\r
- dataStructFieldUser [FieldInUnion]\r
+ dataStructFieldUser [FieldInUnion] |\r
+ dataStructBitField64 [FieldInUnion] |\r
+ dataStructBitField32 [FieldInUnion] |\r
+ dataStructBitField16 [FieldInUnion] |\r
+ dataStructBitField8 [FieldInUnion]\r
)*\r
;\r
\r
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>\r
;\r
\r
+dataStructBitField64[BOOLEAN FieldInUnion]:\r
+ <<\r
+ UINT32 Width = 0;\r
+ BOOLEAN HasBitFieldName = FALSE;\r
+ >>\r
+ D:"UINT64"\r
+ {\r
+ N:StringIdentifier << HasBitFieldName = TRUE;>>\r
+ }\r
+ ":" I:Number << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+ ";" << if (HasBitFieldName) {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+ } else {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+ }\r
+ >>\r
+ ;\r
+\r
+dataStructBitField32[BOOLEAN FieldInUnion]:\r
+ <<\r
+ UINT32 Width = 0;\r
+ BOOLEAN HasBitFieldName = FALSE;\r
+ >>\r
+ D:"UINT32"\r
+ {\r
+ N:StringIdentifier << HasBitFieldName = TRUE;>>\r
+ }\r
+\r
+ ":" I:Number << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+ ";" << if (HasBitFieldName) {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+ } else {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+ }\r
+ >>\r
+ ;\r
+\r
+dataStructBitField16[BOOLEAN FieldInUnion]:\r
+ <<\r
+ UINT32 Width = 0;\r
+ BOOLEAN HasBitFieldName = FALSE;\r
+ >>\r
+ D:"UINT16"\r
+ {\r
+ N:StringIdentifier << HasBitFieldName = TRUE;>>\r
+ }\r
+ ":" I:Number << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+ ";" << if (HasBitFieldName) {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+ } else {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+ }\r
+ >>\r
+ ;\r
+\r
+dataStructBitField8[BOOLEAN FieldInUnion]:\r
+ <<\r
+ UINT32 Width = 0;\r
+ BOOLEAN HasBitFieldName = FALSE;\r
+ >>\r
+ D:"UINT8"\r
+ {\r
+ N:StringIdentifier << HasBitFieldName = TRUE;>>\r
+ }\r
+ ":" I:Number << Width = _STOU32(I->getText(), I->getLine());>>\r
+\r
+ ";" << if (HasBitFieldName) {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (N->getText(), D->getText(), Width, FieldInUnion), N);\r
+ } else {\r
+ _PCATCH(gCVfrVarDataTypeDB.DataTypeAddBitField (NULL, D->getText(), Width, FieldInUnion), D);\r
+ }\r
+ >>\r
+ ;\r
+\r
//*****************************************************************************\r
//\r
// the syntax of GUID definition\r
EFI_STRING_ID Data_SID = 0;\r
BOOLEAN IsArray = FALSE;\r
UINT8 *ByteOffset = NULL;\r
+ BOOLEAN BitField = FALSE;\r
+ UINT64 Value;\r
+ UINT64 Mask;\r
+ UINT16 Offset;\r
+ UINT8 PreBits;\r
>>\r
(\r
("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
memcpy (ByteOffset, &Data_SID, TypeSize); \r
}\r
} else {\r
- gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
+ gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize, BitField);\r
+ if (BitField) {\r
+ Mask = (1 << FieldSize) - 1;\r
+ Offset = FieldOffset / 8;\r
+ PreBits = FieldOffset % 8;\r
+ Mask <<= PreBits;\r
+ }\r
switch (FieldType) {\r
case EFI_IFR_TYPE_NUM_SIZE_8:\r
Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
- memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT8*) (ByteOffset + Offset);\r
+ Data_U8 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U8;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT8));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+ }\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_16:\r
Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
- memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT16*) (ByteOffset + Offset);\r
+ Data_U16 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U16;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT16));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+ }\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_32:\r
Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
- memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT32*) (ByteOffset + Offset);\r
+ Data_U32 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U32;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT32));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+ }\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_64:\r
Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
- memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+ if (BitField) {\r
+ //\r
+ // Set the value to the bit fileds.\r
+ //\r
+ Value = *(UINT64*) (ByteOffset + Offset);\r
+ Data_U64 <<= PreBits;\r
+ Value = (Value & (~Mask)) | Data_U64;\r
+ memcpy (ByteOffset + Offset, &Value, sizeof (UINT64));\r
+ } else {\r
+ memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+ }\r
break;\r
case EFI_IFR_TYPE_BOOLEAN:\r
Data_BL = _STOU8(RD->getText(), RD->getLine());\r
UINT32 LineNum;\r
EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
UINT32 Size;\r
+ BOOLEAN IsBitVarStore = FALSE;\r
>>\r
V:Varstore << VSObj.SetLineNo(V->getLine()); >>\r
(\r
- TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
+ TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); IsBitVarStore = gCVfrVarDataTypeDB.DataTypeHasBitField (TN->getText());>>\r
| U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
| U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
| C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
StoreName = SN->getText();\r
}\r
_PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
- StoreName,\r
- &Guid,\r
- &gCVfrVarDataTypeDB,\r
- TypeName,\r
- VarStoreId\r
- ), LineNum);\r
+ StoreName,\r
+ &Guid,\r
+ &gCVfrVarDataTypeDB,\r
+ TypeName,\r
+ VarStoreId,\r
+ IsBitVarStore\r
+ ), LineNum);\r
VSObj.SetGuid (&Guid);\r
_PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
VSObj.SetVarStoreId (VarStoreId);\r
UINT32 LineNum;\r
CHAR8 *StoreName = NULL;\r
BOOLEAN CustomizedName = FALSE;\r
+ BOOLEAN IsBitVarStore = FALSE;\r
>>\r
E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>\r
(\r
- TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >>\r
+ TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; IsBitVarStore = gCVfrVarDataTypeDB.DataTypeHasBitField (TN->getText());>>\r
| U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
| U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
| C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
Uuid "=" guidDefinition[Guid] << \r
if (IsUEFI23EfiVarstore) {\r
_PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
- StoreName,\r
- &Guid,\r
- &gCVfrVarDataTypeDB,\r
- TypeName,\r
- VarStoreId\r
- ), LineNum); \r
+ StoreName,\r
+ &Guid,\r
+ &gCVfrVarDataTypeDB,\r
+ TypeName,\r
+ VarStoreId,\r
+ IsBitVarStore\r
+ ), LineNum);\r
_PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
} else {\r
- _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
+ _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
TN->getText(),\r
&Guid,\r
&gCVfrVarDataTypeDB,\r
TypeName,\r
- VarStoreId\r
- ), LineNum); \r
+ VarStoreId,\r
+ FALSE\r
+ ), LineNum);\r
_PCATCH(gCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
}\r
- VSEObj.SetGuid (&Guid); \r
+ VSEObj.SetGuid (&Guid);\r
VSEObj.SetVarStoreId (VarStoreId);\r
\r
VSEObj.SetSize ((UINT16) Size);\r
Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); >>\r
;\r
\r
+vfrQuestionBaseInfo[EFI_VARSTORE_INFO & Info, EFI_QUESTION_ID & QId, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
+ <<\r
+ CHAR8 *QName = NULL;\r
+ CHAR8 *VarIdStr = NULL;\r
+ mUsedDefaultCount = 0;\r
+ >>\r
+ {\r
+ Name "=" QN:StringIdentifier "," <<\r
+ QName = QN->getText();\r
+ _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
+ >>\r
+ }\r
+ { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
+ {\r
+ QuestionId "=" ID:Number "," <<\r
+ QId = _STOQID(ID->getText(), ID->getLine());\r
+ _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r
+ >>\r
+ }\r
+ <<\r
+ switch (QType) {\r
+ case QUESTION_NORMAL:\r
+ mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
+ break;\r
+ case QUESTION_DATE:\r
+ mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
+ break;\r
+ case QUESTION_TIME:\r
+ mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
+ break;\r
+ case QUESTION_REF:\r
+ //\r
+ // VarIdStr != NULL stand for question with storagae.\r
+ //\r
+ if (VarIdStr != NULL) {\r
+ mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);\r
+ } else {\r
+ mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
+ }\r
+ break;\r
+ default:\r
+ _PCATCH(VFR_RETURN_FATAL_ERROR);\r
+ }\r
+ >>\r
+ <<\r
+ if (VarIdStr != NULL) {\r
+ delete VarIdStr;\r
+ }\r
+ _SAVE_CURRQEST_VARINFO (Info);\r
+ >>\r
+ ;\r
+\r
vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
<<\r
EFI_VARSTORE_INFO Info;\r
Info.mVarTotalSize = 0;\r
Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
+ Info.mIsBitVar = FALSE;\r
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
- CHAR8 *QName = NULL;\r
- CHAR8 *VarIdStr = NULL;\r
- mUsedDefaultCount = 0;\r
>>\r
- {\r
- Name "=" QN:StringIdentifier "," <<\r
- QName = QN->getText();\r
- _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
- >>\r
- }\r
- { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
- {\r
- QuestionId "=" ID:Number "," <<\r
- QId = _STOQID(ID->getText(), ID->getLine());\r
- _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r
- >>\r
- }\r
- <<\r
- switch (QType) {\r
- case QUESTION_NORMAL:\r
- mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
- break;\r
- case QUESTION_DATE:\r
- mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
- break;\r
- case QUESTION_TIME:\r
- mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
- break;\r
- case QUESTION_REF:\r
- //\r
- // VarIdStr != NULL stand for question with storagae.\r
- //\r
- if (VarIdStr != NULL) {\r
- mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);\r
- } else {\r
- mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
- }\r
- break;\r
- default:\r
- _PCATCH(VFR_RETURN_FATAL_ERROR);\r
- }\r
- $QHObj.SetQuestionId (QId);\r
- if (VarIdStr != NULL) {\r
- $QHObj.SetVarStoreInfo (&Info);\r
- }\r
+ vfrQuestionBaseInfo[Info, QId, QType]\r
+ << $QHObj.SetQuestionId (QId);\r
+ if (Info.mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+ $QHObj.SetVarStoreInfo (&Info);\r
+ }\r
>>\r
vfrStatementHeader[&$QHObj]\r
- << \r
- if (VarIdStr != NULL) {\r
- delete VarIdStr; \r
- }\r
- _SAVE_CURRQEST_VARINFO (Info);\r
- >>\r
;\r
\r
questionheaderFlagsField[UINT8 & Flags] :\r
&gCVfrVarDataTypeDB,\r
SName,\r
EFI_VARSTORE_ID_INVALID,\r
+ FALSE,\r
FALSE\r
);\r
VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
_PCATCH(VfrReturnCode, SN2);\r
VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
- if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_BUFFER_BITS) {\r
_PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
_STRCAT(&VarStr, TName);\r
}\r
(\r
"." <<\r
if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
- _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+ _PCATCH((((VarStoreType != EFI_VFR_VARSTORE_BUFFER) && (VarStoreType != EFI_VFR_VARSTORE_BUFFER_BITS))? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
}\r
_STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
>>\r
_PCATCH(gCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
break;\r
case EFI_VFR_VARSTORE_BUFFER:\r
- _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
+ case EFI_VFR_VARSTORE_BUFFER_BITS:\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize, $Info.mIsBitVar), SN2->getLine(), VarStr);\r
VarGuid = gCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
_PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
SName,\r
"\-" << Negative = TRUE; >>\r
}\r
N1:Number <<\r
- switch ($Type) {\r
- case EFI_IFR_TYPE_NUM_SIZE_8 :\r
- $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
- if (IntDecStyle) {\r
- if (Negative) {\r
- if ($Value.u8 > 0x80) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
- }\r
- } else {\r
- if ($Value.u8 > 0x7F) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+ //\r
+ // The value stored in bit fields is always set to UINT32 type.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
+ } else {\r
+ switch ($Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u8 > 0x80) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+ }\r
+ } else {\r
+ if ($Value.u8 > 0x7F) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+ }\r
}\r
}\r
- }\r
- if (Negative) {\r
- $Value.u8 = ~$Value.u8 + 1;\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 :\r
- $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
- if (IntDecStyle) {\r
if (Negative) {\r
- if ($Value.u16 > 0x8000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
- }\r
- } else {\r
- if ($Value.u16 > 0x7FFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+ $Value.u8 = ~$Value.u8 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u16 > 0x8000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+ }\r
+ } else {\r
+ if ($Value.u16 > 0x7FFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+ }\r
}\r
}\r
- }\r
- if (Negative) {\r
- $Value.u16 = ~$Value.u16 + 1;\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 :\r
- $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
- if (IntDecStyle) {\r
if (Negative) {\r
- if ($Value.u32 > 0x80000000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
- }\r
- } else {\r
- if ($Value.u32 > 0X7FFFFFFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+ $Value.u16 = ~$Value.u16 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u32 > 0x80000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+ }\r
+ } else {\r
+ if ($Value.u32 > 0X7FFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+ }\r
}\r
}\r
- }\r
- if (Negative) {\r
- $Value.u32 = ~$Value.u32 + 1;\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_64 :\r
- $Value.u64 = _STOU64(N1->getText(), N1->getLine());\r
- if (IntDecStyle) {\r
if (Negative) {\r
- if ($Value.u64 > 0x8000000000000000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
- }\r
- } else {\r
- if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+ $Value.u32 = ~$Value.u32 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ $Value.u64 = _STOU64(N1->getText(), N1->getLine());\r
+ if (IntDecStyle) {\r
+ if (Negative) {\r
+ if ($Value.u64 > 0x8000000000000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+ }\r
+ } else {\r
+ if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+ }\r
}\r
}\r
+ if (Negative) {\r
+ $Value.u64 = ~$Value.u64 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_BOOLEAN :\r
+ $Value.b = _STOU8(N1->getText(), N1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_STRING :\r
+ $Value.string = _STOU16(N1->getText(), N1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_TIME :\r
+ case EFI_IFR_TYPE_DATE :\r
+ case EFI_IFR_TYPE_REF :\r
+ default :\r
+ break;\r
}\r
- if (Negative) {\r
- $Value.u64 = ~$Value.u64 + 1;\r
- }\r
- break;\r
- case EFI_IFR_TYPE_BOOLEAN :\r
- $Value.b = _STOU8(N1->getText(), N1->getLine());\r
- break;\r
- case EFI_IFR_TYPE_STRING :\r
- $Value.string = _STOU16(N1->getText(), N1->getLine());\r
- break;\r
- case EFI_IFR_TYPE_TIME :\r
- case EFI_IFR_TYPE_DATE :\r
- case EFI_IFR_TYPE_REF :\r
- default :\r
- break;\r
}\r
>>\r
| B1:True << $Value.b = TRUE; >>\r
if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
//check default value is valid for Numeric Opcode\r
NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
- if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) {\r
+ if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 && !(_GET_CURRQEST_VARTINFO().mIsBitVar)) {\r
switch (_GET_CURRQEST_DATATYPE()) {\r
case EFI_IFR_TYPE_NUM_SIZE_8:\r
- if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
- ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+ ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
}\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_16:\r
- if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
- ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+ ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
}\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_32:\r
- if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
- ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+ ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
}\r
break;\r
case EFI_IFR_TYPE_NUM_SIZE_64:\r
- if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
- ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+ if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE)) ||\r
+ ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE))) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
}\r
break;\r
break;\r
}\r
} else {\r
- if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+ //\r
+ // Value for question stored in bit fields is always set to UINT32 type.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ if (Val->u32 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), TRUE) || Val->u32 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), TRUE)) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
+ } else {\r
+ if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE(), FALSE) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE(), FALSE)) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
}\r
}\r
}\r
break;\r
}\r
} else {\r
- _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ Size = sizeof (UINT32);\r
+ } else {\r
+ _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
+ }\r
}\r
Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
DObj = new CIfrDefault ((UINT8)Size);\r
} else if (gIsStringOp) {\r
DObj->SetType (EFI_IFR_TYPE_STRING);\r
} else {\r
- DObj->SetType (_GET_CURRQEST_DATATYPE());\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ DObj->SetType (EFI_IFR_TYPE_NUM_SIZE_32);\r
+ } else {\r
+ DObj->SetType (_GET_CURRQEST_DATATYPE());\r
+ }\r
}\r
DObj->SetValue(*Val);\r
>>\r
//\r
vfrStatementCheckBox :\r
<<\r
- CIfrCheckBox CBObj;\r
+ CIfrCheckBox *CBObj = NULL;\r
EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
CHAR8 *VarStoreName = NULL;\r
UINT32 DataTypeSize;\r
EFI_GUID *VarStoreGuid = NULL;\r
+ CIfrGuid *GuidObj = NULL;\r
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;;\r
+ EFI_VARSTORE_INFO Info;\r
+ Info.mVarType = EFI_IFR_TYPE_OTHER;\r
+ Info.mVarTotalSize = 0;\r
+ Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
+ Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
+ Info.mIsBitVar = FALSE;\r
>>\r
- L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r
- vfrQuestionHeader[CBObj] "," << //check data type\r
+ L:CheckBox\r
+ vfrQuestionBaseInfo[Info, QId] <<\r
+ //\r
+ // Create a GUID opcode to wrap the checkbox opcode, if it refer to bit varstore.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ GuidObj = new CIfrGuid(0);\r
+ GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+ GuidObj->SetLineNo(L->getLine());\r
+ }\r
+ CBObj = new CIfrCheckBox;\r
+ CBObj->SetLineNo(L->getLine());\r
+ CBObj->SetQuestionId (QId);\r
+ CBObj->SetVarStoreInfo (&Info);\r
+ >>\r
+ vfrStatementHeader[CBObj]"," << //check data type\r
if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
_GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
}\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
- if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
- } else if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
- (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+ //\r
+ // Check whether the question refers to a bit field, if yes. create a Guid to indicate the question refers to a bit field.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO ().mIsBitVar) {\r
+ _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
+ if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER_BITS) &&\r
+ (_GET_CURRQEST_VARSIZE() != 1)) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only occupy 1 bit in Bit Varstore");\r
+ }\r
+ } else {\r
+ _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
+ if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
+ } else if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
+ (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+ }\r
}\r
}\r
>>\r
{\r
- F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
+ F:FLAGS "=" vfrCheckBoxFlags[*CBObj, F->getLine()] ","\r
<<\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
_PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
Val.b = TRUE;\r
- if (CBObj.GetFlags () & 0x01) {\r
+ if (CBObj->GetFlags () & 0x01) {\r
CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
_PCATCH(\r
gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
"No standard default storage found"\r
);\r
}\r
- if (CBObj.GetFlags () & 0x02) {\r
+ if (CBObj->GetFlags () & 0x02) {\r
CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
_PCATCH(\r
gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
>>\r
}\r
{\r
- Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r
+ Key "=" KN:Number "," << AssignQuestionKey (*CBObj, KN); >>\r
}\r
vfrStatementQuestionOptionList\r
- E:EndCheckBox << CRT_END_OP (E); >>\r
+ E:EndCheckBox << CRT_END_OP (E);\r
+ if (GuidObj != NULL) {\r
+ GuidObj->SetScope(1);\r
+ CRT_END_OP (E);\r
+ delete GuidObj;\r
+ }\r
+ if (CBObj != NULL) delete CBObj;\r
+ >>\r
";"\r
;\r
\r
UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
BOOLEAN IntDecStyle = FALSE;\r
CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\r
- if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) {\r
+ if (((_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EDKII_IFR_DISPLAY_BIT) == 0)) ||\r
+ (!(_GET_CURRQEST_VARTINFO().mIsBitVar) && (NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0))) {\r
IntDecStyle = TRUE;\r
}\r
BOOLEAN MinNegative = FALSE;\r
if (!IntDecStyle && MinNegative) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
}\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 :\r
- MinU8 = _STOU64(I->getText(), I->getLine());\r
- if (IntDecStyle) {\r
- if (MinNegative) { \r
- if (MinU8 > 0x8000000000000000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
- }\r
- } else {\r
- if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
- }\r
- }\r
- }\r
- if (MinNegative) {\r
- MinU8 = ~MinU8 + 1;\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ //\r
+ // Value for question stored in bit fields is always set to UINT32 type.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
MinU4 = _STOU32(I->getText(), I->getLine());\r
- if (IntDecStyle) {\r
- if (MinNegative) { \r
- if (MinU4 > 0x80000000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
- }\r
- } else {\r
- if (MinU4 > 0x7FFFFFFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
- }\r
- }\r
- }\r
- if (MinNegative) {\r
- MinU4 = ~MinU4 + 1;\r
+ if (!IntDecStyle && MinU4 > (1<< _GET_CURRQEST_VARTINFO().mVarTotalSize) -1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "BIT type minimum can't small than 0, bigger than 2^BitWidth -1");\r
}\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 :\r
- MinU2 = _STOU16(I->getText(), I->getLine());\r
- if (IntDecStyle) {\r
- if (MinNegative) { \r
- if (MinU2 > 0x8000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+ } else {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ MinU8 = _STOU64(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) {\r
+ if (MinU8 > 0x8000000000000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ } else {\r
+ if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
}\r
- } else {\r
- if (MinU2 > 0x7FFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ if (MinNegative) {\r
+ MinU8 = ~MinU8 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ MinU4 = _STOU32(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) {\r
+ if (MinU4 > 0x80000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ } else {\r
+ if (MinU4 > 0x7FFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
}\r
}\r
- }\r
- if (MinNegative) {\r
- MinU2 = ~MinU2 + 1;\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 :\r
- MinU1 = _STOU8(I->getText(), I->getLine());\r
- if (IntDecStyle) {\r
- if (MinNegative) { \r
- if (MinU1 > 0x80) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+ if (MinNegative) {\r
+ MinU4 = ~MinU4 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ MinU2 = _STOU16(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) {\r
+ if (MinU2 > 0x8000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ } else {\r
+ if (MinU2 > 0x7FFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
}\r
- } else {\r
- if (MinU1 > 0x7F) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+ }\r
+ if (MinNegative) {\r
+ MinU2 = ~MinU2 + 1;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ MinU1 = _STOU8(I->getText(), I->getLine());\r
+ if (IntDecStyle) {\r
+ if (MinNegative) {\r
+ if (MinU1 > 0x80) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+ }\r
+ } else {\r
+ if (MinU1 > 0x7F) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+ }\r
}\r
}\r
+ if (MinNegative) {\r
+ MinU1 = ~MinU1 + 1;\r
+ }\r
+ break;\r
}\r
- if (MinNegative) {\r
- MinU1 = ~MinU1 + 1;\r
- }\r
- break;\r
}\r
>>\r
Maximum "=" \r
if (!IntDecStyle && MaxNegative) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
}\r
-\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : \r
- MaxU8 = _STOU64(A->getText(), A->getLine()); \r
- if (IntDecStyle) {\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ MaxU4 = _STOU32(A->getText(), A->getLine());\r
+ if (!IntDecStyle && MaxU4 > (1<< _GET_CURRQEST_VARTINFO().mVarTotalSize) -1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "BIT type maximum can't bigger than 2^BitWidth -1");\r
+ }\r
+ } else {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ MaxU8 = _STOU64(A->getText(), A->getLine());\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU8 > 0x8000000000000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ } else {\r
+ if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ }\r
+ }\r
+ }\r
if (MaxNegative) {\r
- if (MaxU8 > 0x8000000000000000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ MaxU8 = ~MaxU8 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT64) MaxU8 < (INT64) MinU8) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
} else {\r
- if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+ if (MaxU8 < MinU8) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
}\r
- }\r
- if (MaxNegative) {\r
- MaxU8 = ~MaxU8 + 1;\r
- }\r
- if (IntDecStyle) {\r
- if ((INT64) MaxU8 < (INT64) MinU8) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
- }\r
- } else {\r
- if (MaxU8 < MinU8) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ MaxU4 = _STOU32(A->getText(), A->getLine());\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU4 > 0x80000000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ } else {\r
+ if (MaxU4 > 0x7FFFFFFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ }\r
+ }\r
}\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 : \r
- MaxU4 = _STOU32(A->getText(), A->getLine());\r
- if (IntDecStyle) {\r
if (MaxNegative) {\r
- if (MaxU4 > 0x80000000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ MaxU4 = ~MaxU4 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT32) MaxU4 < (INT32) MinU4) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
} else {\r
- if (MaxU4 > 0x7FFFFFFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+ if (MaxU4 < MinU4) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
}\r
- }\r
- if (MaxNegative) {\r
- MaxU4 = ~MaxU4 + 1;\r
- }\r
- if (IntDecStyle) {\r
- if ((INT32) MaxU4 < (INT32) MinU4) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
- }\r
- } else {\r
- if (MaxU4 < MinU4) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ MaxU2 = _STOU16(A->getText(), A->getLine());\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU2 > 0x8000) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ } else {\r
+ if (MaxU2 > 0x7FFF) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+ }\r
+ }\r
}\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : \r
- MaxU2 = _STOU16(A->getText(), A->getLine()); \r
- if (IntDecStyle) {\r
if (MaxNegative) {\r
- if (MaxU2 > 0x8000) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+ MaxU2 = ~MaxU2 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT16) MaxU2 < (INT16) MinU2) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
} else {\r
- if (MaxU2 > 0x7FFF) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+ if (MaxU2 < MinU2) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
}\r
- }\r
- if (MaxNegative) {\r
- MaxU2 = ~MaxU2 + 1;\r
- }\r
- if (IntDecStyle) {\r
- if ((INT16) MaxU2 < (INT16) MinU2) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
- }\r
- } else {\r
- if (MaxU2 < MinU2) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ MaxU1 = _STOU8(A->getText(), A->getLine());\r
+ if (IntDecStyle) {\r
+ if (MaxNegative) {\r
+ if (MaxU1 > 0x80) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+ }\r
+ } else {\r
+ if (MaxU1 > 0x7F) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+ }\r
+ }\r
}\r
- }\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : \r
- MaxU1 = _STOU8(A->getText(), A->getLine());\r
- if (IntDecStyle) {\r
if (MaxNegative) {\r
- if (MaxU1 > 0x80) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+ MaxU1 = ~MaxU1 + 1;\r
+ }\r
+ if (IntDecStyle) {\r
+ if ((INT8) MaxU1 < (INT8) MinU1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
} else {\r
- if (MaxU1 > 0x7F) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+ if (MaxU1 < MinU1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
}\r
}\r
+ break;\r
}\r
- if (MaxNegative) {\r
- MaxU1 = ~MaxU1 + 1;\r
- }\r
- if (IntDecStyle) {\r
- if ((INT8) MaxU1 < (INT8) MinU1) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
- }\r
- } else {\r
- if (MaxU1 < MinU1) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
- }\r
- }\r
- break;\r
}\r
>>\r
{\r
STEP "=" S:Number ","\r
<<\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ StepU4 = _STOU32(S->getText(), S->getLine());\r
+ } else {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
+ }\r
}\r
>>\r
}\r
<<\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4);\r
+ } else {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
+ }\r
}\r
>>\r
;\r
\r
vfrStatementNumeric :\r
<<\r
- CIfrNumeric NObj;\r
+ CIfrNumeric *NObj = NULL;\r
UINT32 DataTypeSize;\r
BOOLEAN IsSupported = TRUE;\r
UINT8 ShrinkSize = 0;\r
+ CIfrGuid *GuidObj = NULL;\r
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
+ EFI_VARSTORE_INFO Info;\r
+ Info.mVarType = EFI_IFR_TYPE_OTHER;\r
+ Info.mVarTotalSize = 0;\r
+ Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
+ Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
+ Info.mIsBitVar = FALSE;\r
>>\r
- L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
- vfrQuestionHeader[NObj] "," << // check data type\r
+ L:Numeric\r
+ vfrQuestionBaseInfo[Info, QId] <<\r
+ //\r
+ // Create a GUID opcode to wrap the numeric opcode, if it refer to bit varstore.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ GuidObj = new CIfrGuid(0);\r
+ GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+ GuidObj->SetLineNo(L->getLine());\r
+ }\r
+ NObj = new CIfrNumeric;\r
+ NObj->SetLineNo(L->getLine());\r
+ NObj->SetQuestionId (QId);\r
+ NObj->SetVarStoreInfo (&Info);\r
+ >>\r
+ vfrStatementHeader[NObj]","\r
+ <<\r
+ // check data type\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
- if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ LFlags = (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+ _PCATCH(NObj->SetFlagsForBitField (NObj->FLAGS(), LFlags), L->getLine());\r
+ } else {\r
+ _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
+ if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+ }\r
+ _PCATCH(NObj->SetFlags (NObj->FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
}\r
- _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
}\r
>>\r
- { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
+ { F:FLAGS "=" vfrNumericFlags[*NObj, F->getLine()] "," }\r
{\r
- Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r
+ Key "=" KN:Number "," << AssignQuestionKey (*NObj, KN); >>\r
}\r
- vfrSetMinMaxStep[NObj] <<\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
+ vfrSetMinMaxStep[*NObj] <<\r
+ if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ //\r
+ // Base on the type to know the actual used size,shrink the buffer\r
+ // size allocate before.\r
+ //\r
+ case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
+ default:\r
+ IsSupported = FALSE;\r
+ break;\r
+ }\r
+ } else {\r
//\r
- // Base on the type to know the actual used size,shrink the buffer \r
- // size allocate before.\r
+ // Question stored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32.\r
//\r
- case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
- case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
- default: \r
- IsSupported = FALSE;\r
- break;\r
+ ShrinkSize = 12;\r
}\r
- NObj.ShrinkBinSize (ShrinkSize);\r
+ NObj->ShrinkBinSize (ShrinkSize);\r
+\r
if (!IsSupported) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
}\r
>>\r
vfrStatementQuestionOptionList\r
E:EndNumeric << \r
- CRT_END_OP (E); \r
+ CRT_END_OP (E);\r
+ if (GuidObj != NULL) {\r
+ GuidObj->SetScope(1);\r
+ CRT_END_OP (E);\r
+ delete GuidObj;\r
+ }\r
+ if (NObj != NULL) delete NObj;\r
>>\r
";"\r
;\r
<<\r
UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
UINT8 HFlags = 0;\r
- EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
BOOLEAN IsSetType = FALSE;\r
BOOLEAN IsDisplaySpecified = FALSE;\r
+ EFI_VFR_VARSTORE_TYPE VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
>>\r
- numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
+ numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] )*\r
<<\r
//check data type flag\r
- if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
- if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
- if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
- _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+ if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+ if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+ }\r
+ } else {\r
+ // update data type for name/value store\r
+ UINT32 DataTypeSize;\r
+ _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+ gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+ _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
}\r
- } else {\r
- // update data type for name/value store\r
- UINT32 DataTypeSize;\r
+ } else if (IsSetType){\r
_GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
- gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
- _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
}\r
- } else if (IsSetType){\r
- _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+ _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
+ } else if ((_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) && (_GET_CURRQEST_VARTINFO().mIsBitVar)) {\r
+ LFlags |= (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+ _PCATCH(NObj.SetFlagsForBitField (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
}\r
- _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
>>\r
;\r
\r
-numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\r
+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified, UINT32 LineNum] :\r
N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
- | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
- | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
- | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
- | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
- | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
- | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
- | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\r
+ | "NUMERIC_SIZE_1" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1;IsSetType = TRUE;\r
+ } else {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+ }\r
+ >>\r
+ | "NUMERIC_SIZE_2" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2;IsSetType = TRUE;\r
+ } else {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+ }\r
+ >>\r
+ | "NUMERIC_SIZE_4" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;\r
+ } else {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+ }\r
+ >>\r
+ | "NUMERIC_SIZE_8" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;\r
+ } else {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Can not specify the size of the numeric value for BIT field");\r
+ }\r
+ >>\r
+ | "DISPLAY_INT_DEC" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC;\r
+ } else {\r
+ $LFlags = ($LFlags & ~EDKII_IFR_DISPLAY_BIT) | EDKII_IFR_DISPLAY_INT_DEC_BIT;\r
+ }\r
+ IsDisplaySpecified = TRUE;\r
+ >>\r
+ | "DISPLAY_UINT_DEC" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC;\r
+ } else {\r
+ $LFlags = ($LFlags & ~EDKII_IFR_DISPLAY_BIT) | EDKII_IFR_DISPLAY_UINT_DEC_BIT;\r
+ }\r
+ IsDisplaySpecified = TRUE;\r
+ >>\r
+ | "DISPLAY_UINT_HEX" << if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX;\r
+ } else {\r
+ $LFlags = ($LFlags & ~EDKII_IFR_DISPLAY_BIT) | EDKII_IFR_DISPLAY_UINT_HEX_BIT;\r
+ }\r
+ IsDisplaySpecified = TRUE;\r
+ >>\r
| questionheaderFlagsField[HFlags]\r
;\r
\r
vfrStatementOneOf :\r
<<\r
- CIfrOneOf OObj;\r
+ CIfrOneOf *OObj = NULL;\r
UINT32 DataTypeSize;\r
BOOLEAN IsSupported = TRUE;\r
UINT8 ShrinkSize = 0;\r
+ CIfrGuid *GuidObj = NULL;\r
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;;\r
+ EFI_VARSTORE_INFO Info;\r
+ Info.mVarType = EFI_IFR_TYPE_OTHER;\r
+ Info.mVarTotalSize = 0;\r
+ Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
+ Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
+ Info.mIsBitVar = FALSE;\r
>>\r
- L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
- vfrQuestionHeader[OObj] "," << //check data type\r
+ L:OneOf\r
+ vfrQuestionBaseInfo[Info, QId] <<\r
+ //\r
+ // Create a GUID opcode to wrap the oneof opcode, if it refer to bit varstore.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ GuidObj = new CIfrGuid(0);\r
+ GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+ GuidObj->SetLineNo(L->getLine());\r
+ }\r
+ OObj = new CIfrOneOf;\r
+ OObj->SetLineNo(L->getLine());\r
+ OObj->SetQuestionId (QId);\r
+ OObj->SetVarStoreInfo (&Info);\r
+ >>\r
+ vfrStatementHeader[OObj]","\r
+ << //check data type\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
- if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ LFlags = (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+ _PCATCH(OObj->SetFlagsForBitField (OObj->FLAGS(), LFlags), L->getLine());\r
+ } else {\r
+ _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
+ if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+ }\r
+ _PCATCH(OObj->SetFlags (OObj->FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
}\r
- _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
}\r
>>\r
- { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
+ { F:FLAGS "=" vfrOneofFlagsField[*OObj, F->getLine()] "," }\r
{\r
- vfrSetMinMaxStep[OObj]\r
+ vfrSetMinMaxStep[*OObj]\r
}\r
<<\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
+ if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ //\r
+ // Base on the type to know the actual used size,shrink the buffer\r
+ // size allocate before.\r
+ //\r
+ case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
+ default:\r
+ IsSupported = FALSE;\r
+ break;\r
+ }\r
+ } else {\r
//\r
- // Base on the type to know the actual used size,shrink the buffer \r
- // size allocate before.\r
+ // Question stored in bit fields saved as UINT32 type, so the ShrinkSize same as EFI_IFR_TYPE_NUM_SIZE_32.\r
//\r
- case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
- case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
- default:\r
- IsSupported = FALSE;\r
- break;\r
+ ShrinkSize = 12;\r
}\r
- OObj.ShrinkBinSize (ShrinkSize);\r
+ OObj->ShrinkBinSize (ShrinkSize);\r
+\r
if (!IsSupported) {\r
_PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
}\r
>>\r
vfrStatementQuestionOptionList\r
E:EndOneOf <<\r
- CRT_END_OP (E); \r
+ CRT_END_OP (E);\r
+ if (GuidObj != NULL) {\r
+ GuidObj->SetScope(1);\r
+ CRT_END_OP (E);\r
+ delete GuidObj;\r
+ }\r
+ if (OObj != NULL) delete OObj;\r
>>\r
";"\r
;\r
<<\r
UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
UINT8 HFlags = 0;\r
- EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
BOOLEAN IsSetType = FALSE;\r
BOOLEAN IsDisplaySpecified = FALSE;\r
+ EFI_VFR_VARSTORE_TYPE VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
>>\r
- numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
+ numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified, LineNum] )*\r
<<\r
//check data type flag\r
- if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
- if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
- if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
- _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+ if (!_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+ if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+ }\r
+ } else {\r
+ // update data type for Name/Value store\r
+ UINT32 DataTypeSize;\r
+ _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+ gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+ _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
}\r
- } else {\r
- // update data type for Name/Value store\r
- UINT32 DataTypeSize;\r
+ } else if (IsSetType){\r
_GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
- gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
- _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
}\r
- } else if (IsSetType){\r
- _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+ _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
+ } else if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
+ _PCATCH(OObj.SetFlagsForBitField (HFlags, LFlags), LineNum);\r
}\r
- _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
>>\r
;\r
\r
<< \r
if (gCurrentMinMaxData != NULL) {\r
//set min/max value for oneof opcode\r
- UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE(), _GET_CURRQEST_VARTINFO().mIsBitVar);\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8:\r
- gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
- break;\r
- default:\r
- break;\r
+ } else {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
break;\r
}\r
} else {\r
- ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+ //\r
+ // For the oneof stored in bit fields, set the option type as UINT32.\r
+ //\r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ Size = sizeof (UINT32);\r
+ } else {\r
+ ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+ }\r
}\r
if (ReturnCode != VFR_RETURN_SUCCESS) {\r
_PCATCH (ReturnCode, L->getLine());\r
OOOObj->SetLineNo(L->getLine());\r
OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
if (ArrayType) {\r
- OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
+ OOOObj->SetType (EFI_IFR_TYPE_BUFFER);\r
} else {\r
- OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+ if (_GET_CURRQEST_VARTINFO().mIsBitVar) {\r
+ OOOObj->SetType ( EFI_IFR_TYPE_NUM_SIZE_32);\r
+ } else {\r
+ OOOObj->SetType (_GET_CURRQEST_DATATYPE());\r
+ }\r
}\r
OOOObj->SetValue (*Val); \r
>>\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
TypeNameList[Index],\r
- EFI_VARSTORE_ID_INVALID\r
+ EFI_VARSTORE_ID_INVALID,\r
+ FALSE\r
);\r
gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
VSObj.SetVarStoreId (VarStoreId);\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
(CHAR8 *) DateType,\r
- EFI_VARSTORE_ID_INVALID\r
+ EFI_VARSTORE_ID_INVALID,\r
+ FALSE\r
);\r
gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
VSObj.SetVarStoreId (VarStoreId);\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
(CHAR8 *) TimeType,\r
- EFI_VARSTORE_ID_INVALID\r
+ EFI_VARSTORE_ID_INVALID,\r
+ FALSE\r
);\r
gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
VSObj.SetVarStoreId (VarStoreId);\r
return VFR_RETURN_SUCCESS;\r
}\r
\r
+/**\r
+ Check whether the DataType contain bit field.\r
+\r
+ @param TypeName The name of the type.\r
+\r
+**/\r
+BOOLEAN\r
+CVfrVarDataTypeDB::DataTypeHasBitField (\r
+ IN CHAR8 *TypeName\r
+ )\r
+{\r
+ SVfrDataType *pType = NULL;\r
+ SVfrDataField *pTmp;\r
+\r
+ GetDataType (TypeName, &pType);\r
+ for (pTmp = pType->mMembers; pTmp!= NULL; pTmp = pTmp->mNext) {\r
+ if (pTmp->mIsBitField) {\r
+ return TRUE;\r
+ }\r
+ }\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Check whether the field is bit field or not.\r
+\r
+ @param VarStr Point to the field name which may contain the structure name.\r
+\r
+**/\r
+BOOLEAN\r
+CVfrVarDataTypeDB::IsThisBitField (\r
+ IN CHAR8 *VarStr\r
+ )\r
+{\r
+ CHAR8 FName[MAX_NAME_LEN];\r
+ CHAR8 TName[MAX_NAME_LEN];\r
+ UINT32 ArrayIdx;\r
+ SVfrDataType *pType = NULL;\r
+ SVfrDataField *pField = NULL;\r
+\r
+ CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
+ CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
+\r
+ while (*VarStr != '\0') {\r
+ CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
+ CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
+ pType = pField->mFieldType;\r
+ }\r
+ if (pField->mIsBitField) {\r
+ return TRUE;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+}\r
+\r
EFI_VFR_RETURN_CODE\r
CVfrVarDataTypeDB::ExtractFieldNameAndArrary (\r
IN CHAR8 *&VarStr,\r
CVfrVarDataTypeDB::GetFieldOffset (\r
IN SVfrDataField *Field,\r
IN UINT32 ArrayIdx,\r
- OUT UINT32 &Offset\r
+ OUT UINT32 &Offset,\r
+ IN BOOLEAN IsBitField\r
)\r
{\r
if (Field == NULL) {\r
// return VFR_RETURN_ERROR_ARRARY_NUM;\r
// }\r
//\r
-\r
- Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
+ if (IsBitField) {\r
+ Offset = Field->mBitOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx) * 8;\r
+ } else {\r
+ Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
+ }\r
return VFR_RETURN_SUCCESS;\r
}\r
\r
UINT32\r
CVfrVarDataTypeDB::GetFieldSize (\r
IN SVfrDataField *Field,\r
- IN UINT32 ArrayIdx\r
+ IN UINT32 ArrayIdx,\r
+ IN BOOLEAN BitField\r
)\r
{\r
if (Field == NULL) {\r
}\r
\r
if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {\r
- return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
+ return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
} else {\r
- return Field->mFieldType->mTotalSize;\r
+ if (BitField) {\r
+ return Field->mBitWidth;\r
+ } else {\r
+ return Field->mFieldType->mTotalSize;\r
+ }\r
}\r
}\r
\r
pYearField->mOffset = 0;\r
pYearField->mNext = pMonthField;\r
pYearField->mArrayNum = 0;\r
+ pYearField->mIsBitField = FALSE;\r
\r
strcpy (pMonthField->mFieldName, "Month");\r
GetDataType ((CHAR8 *)"UINT8", &pMonthField->mFieldType);\r
pMonthField->mOffset = 2;\r
pMonthField->mNext = pDayField;\r
pMonthField->mArrayNum = 0;\r
+ pMonthField->mIsBitField = FALSE;\r
\r
strcpy (pDayField->mFieldName, "Day");\r
GetDataType ((CHAR8 *)"UINT8", &pDayField->mFieldType);\r
pDayField->mOffset = 3;\r
pDayField->mNext = NULL;\r
pDayField->mArrayNum = 0;\r
+ pDayField->mIsBitField = FALSE;\r
\r
New->mMembers = pYearField;\r
} else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {\r
pHoursField->mOffset = 0;\r
pHoursField->mNext = pMinutesField;\r
pHoursField->mArrayNum = 0;\r
+ pHoursField->mIsBitField = FALSE;\r
\r
strcpy (pMinutesField->mFieldName, "Minutes");\r
GetDataType ((CHAR8 *)"UINT8", &pMinutesField->mFieldType);\r
pMinutesField->mOffset = 1;\r
pMinutesField->mNext = pSecondsField;\r
pMinutesField->mArrayNum = 0;\r
+ pMinutesField->mIsBitField = FALSE;\r
\r
strcpy (pSecondsField->mFieldName, "Seconds");\r
GetDataType ((CHAR8 *)"UINT8", &pSecondsField->mFieldType);\r
pSecondsField->mOffset = 2;\r
pSecondsField->mNext = NULL;\r
pSecondsField->mArrayNum = 0;\r
+ pSecondsField->mIsBitField = FALSE;\r
\r
New->mMembers = pHoursField;\r
} else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_REF") == 0) {\r
pQuestionIdField->mOffset = 0;\r
pQuestionIdField->mNext = pFormIdField;\r
pQuestionIdField->mArrayNum = 0;\r
+ pQuestionIdField->mIsBitField = FALSE;\r
\r
strcpy (pFormIdField->mFieldName, "FormId");\r
GetDataType ((CHAR8 *)"UINT16", &pFormIdField->mFieldType);\r
pFormIdField->mOffset = 2;\r
pFormIdField->mNext = pFormSetGuidField;\r
pFormIdField->mArrayNum = 0;\r
+ pFormIdField->mIsBitField = FALSE;\r
\r
strcpy (pFormSetGuidField->mFieldName, "FormSetGuid");\r
GetDataType ((CHAR8 *)"EFI_GUID", &pFormSetGuidField->mFieldType);\r
pFormSetGuidField->mOffset = 4;\r
pFormSetGuidField->mNext = pDevicePathField;\r
pFormSetGuidField->mArrayNum = 0;\r
+ pFormSetGuidField->mIsBitField = FALSE;\r
\r
strcpy (pDevicePathField->mFieldName, "DevicePath");\r
GetDataType ((CHAR8 *)"EFI_STRING_ID", &pDevicePathField->mFieldType);\r
pDevicePathField->mOffset = 20;\r
pDevicePathField->mNext = NULL;\r
pDevicePathField->mArrayNum = 0;\r
+ pDevicePathField->mIsBitField = FALSE;\r
\r
New->mMembers = pQuestionIdField;\r
} else {\r
pNewType->mTotalSize = 0;\r
pNewType->mMembers = NULL;\r
pNewType->mNext = NULL;\r
+ pNewType->mHasBitField = FALSE;\r
\r
mNewDataType = pNewType;\r
}\r
return VFR_RETURN_SUCCESS;\r
}\r
\r
+/**\r
+ Record the bit field info in the data type.\r
+\r
+ @param FieldName Point to the field name.\r
+ @param TypeName Point to the type name.\r
+ @param Width The bit width.\r
+ @param FieldInUnion The filed is in Union type or Structure type.\r
+\r
+**/\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::DataTypeAddBitField (\r
+ IN CHAR8 *FieldName,\r
+ IN CHAR8 *TypeName,\r
+ IN UINT32 Width,\r
+ IN BOOLEAN FieldInUnion\r
+ )\r
+{\r
+ SVfrDataField *pNewField = NULL;\r
+ SVfrDataType *pFieldType = NULL;\r
+ SVfrDataField *pTmp;\r
+ UINT32 Align;\r
+ UINT32 MaxDataTypeSize;\r
+ BOOLEAN UpdateTotalSize;\r
+\r
+ CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
+\r
+ if (Width > MAX_BIT_WIDTH) {\r
+ return VFR_RETURN_BIT_WIDTH_ERROR;\r
+ }\r
+\r
+ if (Width > pFieldType->mTotalSize * 8) {\r
+ return VFR_RETURN_BIT_WIDTH_ERROR;\r
+ }\r
+\r
+ if (FieldName != NULL && strlen (FieldName) >= MAX_NAME_LEN) {\r
+ return VFR_RETURN_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (Width == 0 && FieldName != NULL) {\r
+ return VFR_RETURN_INVALID_PARAMETER;\r
+ }\r
+\r
+ for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {\r
+ if (FieldName != NULL && strcmp (pTmp->mFieldName, FieldName) == 0) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+ }\r
+\r
+ Align = MIN (mPackAlign, pFieldType->mAlign);\r
+ UpdateTotalSize = FALSE;\r
+\r
+ if ((pNewField = new SVfrDataField) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+\r
+ MaxDataTypeSize = mNewDataType->mTotalSize;\r
+ if (FieldName != NULL) {\r
+ strcpy (pNewField->mFieldName, FieldName);\r
+ }\r
+ pNewField->mFieldType = pFieldType;\r
+ pNewField->mIsBitField = TRUE;\r
+ pNewField->mBitWidth = Width;\r
+ pNewField->mArrayNum = 0;\r
+ pNewField->mBitOffset = 0;\r
+ pNewField->mOffset = 0;\r
+\r
+ if (mNewDataType->mMembers == NULL) {\r
+ mNewDataType->mMembers = pNewField;\r
+ pNewField->mNext = NULL;\r
+ } else {\r
+ for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext)\r
+ ;\r
+ pTmp->mNext = pNewField;\r
+ pNewField->mNext = NULL;\r
+ }\r
+\r
+ if (FieldInUnion) {\r
+ pNewField->mOffset = 0;\r
+ if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {\r
+ mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;\r
+ }\r
+ } else {\r
+ //\r
+ // Check whether the bit fileds can be contained within one FieldType.\r
+ //\r
+ if (pTmp != NULL && pTmp->mIsBitField && strcmp (pTmp->mFieldType->mTypeName, pNewField->mFieldType->mTypeName) == 0 &&\r
+ (pTmp->mBitOffset - pTmp->mOffset * 8) + pTmp->mBitWidth + pNewField->mBitWidth <= pNewField->mFieldType->mTotalSize * 8) {\r
+ pNewField->mBitOffset = pTmp->mBitOffset + pTmp->mBitWidth;\r
+ pNewField->mOffset = pTmp->mOffset;\r
+ //\r
+ // If BitWidth=0,used to force alignment at the next word boundary.\r
+ // So make this bit field occupy the remaing bit width of current field type.\r
+ //\r
+ if (pNewField->mBitWidth == 0) {\r
+ pNewField->mBitWidth = pNewField->mFieldType->mTotalSize * 8 - (pNewField->mBitOffset - pTmp->mOffset * 8);\r
+ }\r
+ } else {\r
+ //\r
+ // The bit filed start a new memory\r
+ //\r
+ pNewField->mBitOffset = mNewDataType->mTotalSize * 8;\r
+ UpdateTotalSize = TRUE;\r
+ }\r
+ }\r
+\r
+ if (UpdateTotalSize){\r
+ if ((mNewDataType->mTotalSize % Align) == 0) {\r
+ pNewField->mOffset = mNewDataType->mTotalSize;\r
+ } else {\r
+ pNewField->mOffset = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);\r
+ }\r
+ mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize);\r
+ }\r
+\r
+ mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
+ mNewDataType->mHasBitField = TRUE;\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
EFI_VFR_RETURN_CODE\r
CVfrVarDataTypeDB::DataTypeAddField (\r
IN CHAR8 *FieldName,\r
strcpy (pNewField->mFieldName, FieldName);\r
pNewField->mFieldType = pFieldType;\r
pNewField->mArrayNum = ArrayNum;\r
+ pNewField->mIsBitField = FALSE;\r
if ((mNewDataType->mTotalSize % Align) == 0) {\r
pNewField->mOffset = mNewDataType->mTotalSize;\r
} else {\r
IN CHAR8 *VarStr,\r
OUT UINT16 &Offset,\r
OUT UINT8 &Type,\r
- OUT UINT32 &Size\r
+ OUT UINT32 &Size,\r
+ OUT BOOLEAN &BitField\r
)\r
{\r
CHAR8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];\r
UINT32 ArrayIdx, Tmp;\r
SVfrDataType *pType = NULL;\r
SVfrDataField *pField = NULL;\r
+ CHAR8 *VarStrName;\r
\r
Offset = 0;\r
Type = EFI_IFR_TYPE_OTHER;\r
Size = 0;\r
+ VarStrName = VarStr;\r
\r
CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
\r
+ BitField = IsThisBitField (VarStrName);\r
+\r
//\r
// if it is not struct data type\r
//\r
Size = pType->mTotalSize;\r
\r
while (*VarStr != '\0') {\r
- CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
+ CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
pType = pField->mFieldType;\r
- CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);\r
- Offset = (UINT16) (Offset + Tmp);\r
+ CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsBitField), VFR_RETURN_SUCCESS);\r
+ if (BitField && !pField->mIsBitField) {\r
+ Offset = (UINT16) (Offset + Tmp * 8);\r
+ } else {\r
+ Offset = (UINT16) (Offset + Tmp);\r
+ }\r
Type = GetFieldWidth (pField);\r
- Size = GetFieldSize (pField, ArrayIdx);\r
+ Size = GetFieldSize (pField, ArrayIdx, BitField);\r
}\r
return VFR_RETURN_SUCCESS;\r
}\r
IN CHAR8 *StoreName,\r
IN EFI_VARSTORE_ID VarStoreId,\r
IN SVfrDataType *DataType,\r
+ IN BOOLEAN BitsVarstore,\r
IN BOOLEAN Flag\r
)\r
{\r
}\r
mNext = NULL;\r
mVarStoreId = VarStoreId;\r
- mVarStoreType = EFI_VFR_VARSTORE_BUFFER;\r
+ if (BitsVarstore) {\r
+ mVarStoreType = EFI_VFR_VARSTORE_BUFFER_BITS;\r
+ } else {\r
+ mVarStoreType = EFI_VFR_VARSTORE_BUFFER;\r
+ }\r
mStorageInfo.mDataType = DataType;\r
mAssignedFlag = Flag;\r
}\r
IN CVfrVarDataTypeDB *DataTypeDB,\r
IN CHAR8 *TypeName,\r
IN EFI_VARSTORE_ID VarStoreId,\r
+ IN BOOLEAN IsBitVarStore,\r
IN BOOLEAN Flag\r
)\r
{\r
MarkVarStoreIdUsed (VarStoreId);\r
}\r
\r
- if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType, Flag)) == NULL) {\r
+ if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType, IsBitVarStore, Flag)) == NULL) {\r
return VFR_RETURN_OUT_FOR_RESOURCES;\r
}\r
\r
mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
mVarType = EFI_IFR_TYPE_OTHER;\r
mVarTotalSize = 0;\r
+ mIsBitVar = FALSE;\r
}\r
\r
EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
mVarType = Info.mVarType;\r
mVarTotalSize = Info.mVarTotalSize;\r
+ mIsBitVar = Info.mIsBitVar;\r
}\r
\r
EFI_VARSTORE_INFO&\r
mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
mVarType = Info.mVarType;\r
mVarTotalSize = Info.mVarTotalSize;\r
+ mIsBitVar = Info.mIsBitVar;\r
}\r
\r
return *this;\r
(mInfo.mVarName == Info->mInfo.mVarName) &&\r
(mInfo.mVarOffset == Info->mInfo.mVarOffset) &&\r
(mVarType == Info->mVarType) &&\r
- (mVarTotalSize == Info->mVarTotalSize)) {\r
+ (mVarTotalSize == Info->mVarTotalSize) &&\r
+ (mIsBitVar == Info->mIsBitVar)) {\r
return TRUE;\r
}\r
\r