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