/*++ @file\r
Vfr Syntax\r
\r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
>>\r
\r
<<\r
+#ifdef UINT8_MAX\r
+#undef UINT8_MAX\r
+#endif\r
#include "stdio.h"\r
#include "PBlackBox.h"\r
#include "DLexerBase.h"\r
#include "AToken.h"\r
\r
#define GET_LINENO(Obj) ((Obj)->getLine())\r
-#define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0)\r
-#define CRT_END_OP(Obj) {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)\r
+#define SET_LINE_INFO(Obj, L) do {(Obj).SetLineNo((L)->getLine());} while (0)\r
+#define CRT_END_OP(Obj) do {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)\r
\r
typedef ANTLRCommonToken ANTLRToken;\r
\r
{\r
public:\r
CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};\r
- INT32 errstd (char *Text)\r
+ void errstd (const char *Text)\r
{\r
printf ("unrecognized input '%s'\n", Text);\r
}\r
#token Inventory("inventory") "inventory"\r
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"\r
#token Struct("struct") "struct"\r
+#token Union("union") "union"\r
#token Boolean("BOOLEAN") "BOOLEAN"\r
#token Uint64("UINT64") "UINT64"\r
#token Uint32("UINT32") "UINT32"\r
#token InteractiveFlag("INTERACTIVE") "INTERACTIVE"\r
#token NVAccessFlag("NV_ACCESS") "NV_ACCESS"\r
#token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"\r
+#token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED"\r
#token LateCheckFlag("LATE_CHECK") "LATE_CHECK"\r
#token ReadOnlyFlag("READ_ONLY") "READ_ONLY"\r
#token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"\r
(\r
vfrPragmaPackDefinition\r
| vfrDataStructDefinition\r
+ | vfrDataUnionDefinition\r
)*\r
vfrFormSetDefinition\r
<< $Return = mParserStatus; >>\r
"\)"\r
;\r
\r
+ vfrDataUnionDefinition :\r
+ { TypeDef } Union << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
+ { NonNvDataMap }\r
+ {\r
+ N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
+ }\r
+ OpenBrace\r
+ vfrDataStructFields[TRUE]\r
+ CloseBrace\r
+ {\r
+ N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
+ }\r
+ ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>\r
+ ;\r
+\r
vfrDataStructDefinition :\r
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
{ NonNvDataMap }\r
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
}\r
OpenBrace\r
- vfrDataStructFields\r
+ vfrDataStructFields[FALSE]\r
CloseBrace\r
{\r
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r
;\r
\r
-vfrDataStructFields :\r
+vfrDataStructFields [BOOLEAN FieldInUnion]:\r
(\r
- dataStructField64 |\r
- dataStructField32 |\r
- dataStructField16 |\r
- dataStructField8 |\r
- dataStructFieldBool |\r
- dataStructFieldString |\r
- dataStructFieldDate |\r
- dataStructFieldTime |\r
- dataStructFieldRef |\r
- dataStructFieldUser\r
+ dataStructField64 [FieldInUnion] |\r
+ dataStructField32 [FieldInUnion] |\r
+ dataStructField16 [FieldInUnion] |\r
+ dataStructField8 [FieldInUnion] |\r
+ dataStructFieldBool [FieldInUnion] |\r
+ dataStructFieldString [FieldInUnion]|\r
+ dataStructFieldDate [FieldInUnion] |\r
+ dataStructFieldTime [FieldInUnion] |\r
+ dataStructFieldRef [FieldInUnion] |\r
+ dataStructFieldUser [FieldInUnion] |\r
+ dataStructBitField64 [FieldInUnion] |\r
+ dataStructBitField32 [FieldInUnion] |\r
+ dataStructBitField16 [FieldInUnion] |\r
+ dataStructBitField8 [FieldInUnion]\r
)*\r
;\r
\r
-dataStructField64 :\r
+dataStructField64 [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"UINT64"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructField32 :\r
+dataStructField32 [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"UINT32"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructField16 :\r
+dataStructField16 [BOOLEAN FieldInUnion]:\r
<< \r
UINT32 ArrayNum = 0; \r
>>\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructField8 :\r
+dataStructField8 [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"UINT8"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldBool :\r
+dataStructFieldBool [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"BOOLEAN"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldString :\r
+dataStructFieldString [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_STRING_ID"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldDate :\r
+dataStructFieldDate [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_HII_DATE"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldTime :\r
+dataStructFieldTime [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_HII_TIME"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldRef :\r
+dataStructFieldRef [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
D:"EFI_HII_REF"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
;\r
\r
-dataStructFieldUser :\r
+dataStructFieldUser [BOOLEAN FieldInUnion]:\r
<< UINT32 ArrayNum = 0; >>\r
T:StringIdentifier\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\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
if (gCFormPkg.HavePendingUnassigned()) {\r
mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
gCVfrVarDataTypeDB,\r
- mCVfrDataStorage,\r
+ gCVfrDataStorage,\r
mCVfrQuestionDB,\r
&mFormsetGuid,\r
E->getLine(),\r
if (gNeedAdjustOpcode) {\r
gCFormPkg.AdjustDynamicInsertOpcode (\r
mLastFormEndAddr,\r
- InsertOpcodeAddr\r
+ InsertOpcodeAddr,\r
+ FALSE\r
);\r
}\r
\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
break;\r
}\r
}\r
- if (TFName != NULL) { delete TFName; TFName = NULL; }\r
+ if (TFName != NULL) { delete[] TFName; TFName = NULL; }\r
>>\r
)*\r
)\r
"," Attribute "=" A:Number << DefaultId = _STOU16(A->getText(), A->getLine()); >>\r
}\r
<<\r
- if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
+ if (gCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
CIfrDefaultStore DSObj;\r
- _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
+ _PCATCH(gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr<CHAR8>(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
DSObj.SetLineNo(D->getLine());\r
DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine()));\r
DSObj.SetDefaultId (DefaultId);\r
} else {\r
- _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
+ _PCATCH(gCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
}\r
>>\r
";"\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
} else {\r
StoreName = SN->getText();\r
}\r
- _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
- StoreName,\r
- &Guid,\r
- &gCVfrVarDataTypeDB,\r
- TypeName,\r
- VarStoreId\r
- ), LineNum);\r
+ _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
+ StoreName,\r
+ &Guid,\r
+ &gCVfrVarDataTypeDB,\r
+ TypeName,\r
+ VarStoreId,\r
+ IsBitVarStore\r
+ ), LineNum);\r
VSObj.SetGuid (&Guid);\r
- _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
+ _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
VSObj.SetVarStoreId (VarStoreId);\r
_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
VSObj.SetSize ((UINT16) Size);\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
\r
Uuid "=" guidDefinition[Guid] << \r
if (IsUEFI23EfiVarstore) {\r
- _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
- StoreName,\r
- &Guid,\r
- &gCVfrVarDataTypeDB,\r
- TypeName,\r
- VarStoreId\r
- ), LineNum); \r
- _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
+ _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\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(mCVfrDataStorage.DeclareBufferVarStore (\r
+ _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
TN->getText(),\r
&Guid,\r
&gCVfrVarDataTypeDB,\r
TypeName,\r
- VarStoreId\r
- ), LineNum); \r
- _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\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
VSEObj.SetName (StoreName);\r
if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {\r
- delete StoreName; \r
+ delete[] StoreName;\r
}\r
>>\r
";"\r
(\r
Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << \r
if (!Created) {\r
- _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
+ _PCATCH(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
Created = TRUE;\r
}\r
- _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN); \r
+ _PCATCH(gCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN);\r
>>\r
)+\r
- Uuid "=" guidDefinition[Guid] << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
+ Uuid "=" guidDefinition[Guid] << _PCATCH(gCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
<<\r
VSNVObj.SetGuid (&Guid);\r
- _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
+ _PCATCH(gCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
VSNVObj.SetVarStoreId (VarStoreId);\r
>>\r
";"\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
ReadOnlyFlag << $Flags |= 0x01; >>\r
| InteractiveFlag << $Flags |= 0x04; >>\r
| ResetRequiredFlag << $Flags |= 0x10; >>\r
+ | ReconnectRequiredFlag << $Flags |= 0x40; >>\r
| O:OptionOnlyFlag << \r
if (mCompatibleMode) {\r
$Flags |= 0x80;\r
_STRCAT(&VarIdStr, "]");\r
>>\r
<<\r
- VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
+ VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
- mCVfrDataStorage.DeclareBufferVarStore (\r
+ gCVfrDataStorage.DeclareBufferVarStore (\r
SName,\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
SName,\r
EFI_VARSTORE_ID_INVALID,\r
+ FALSE,\r
FALSE\r
);\r
- VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+ VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
}\r
if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
_PCATCH(VfrReturnCode, SN1);\r
- _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+ _PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
}\r
\r
QuestVarIdStr = VarIdStr;\r
(\r
SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
<<\r
- VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
+ VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
- mCVfrDataStorage.DeclareBufferVarStore (\r
+ gCVfrDataStorage.DeclareBufferVarStore (\r
SName,\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
EFI_VARSTORE_ID_INVALID,\r
FALSE\r
);\r
- VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+ VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
}\r
if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
_PCATCH(VfrReturnCode, SN2);\r
- VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
- if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
- _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
+ VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\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
"." <<\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
)* <<\r
switch (VarStoreType) {\r
case EFI_VFR_VARSTORE_EFI:\r
- _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\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
- VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\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
VarGuid,\r
$Info.mVarTotalSize,\r
Dummy),\r
SN2->getLine());\r
+ _PCATCH(gCVfrDataStorage.AddBufferVarStoreFieldInfo(&$Info ),SN2->getLine());\r
break;\r
case EFI_VFR_VARSTORE_NAME:\r
default: break;\r
}\r
\r
QuestVarIdStr = VarIdStr;\r
- if (VarStr != NULL) {delete VarStr;}\r
+ if (VarStr != NULL) {delete[] VarStr;}\r
>>\r
)\r
;\r
)\r
;\r
\r
-vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
- <<\r
- EFI_GUID Guid;\r
+vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
+ << \r
+ EFI_GUID Guid;\r
+ BOOLEAN Negative = FALSE;\r
+ BOOLEAN IntDecStyle = FALSE;\r
+ CIfrNumeric *NumericQst = NULL;\r
+ if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+ NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+ IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;\r
+ }\r
+ UINT8 *Type8 = (UINT8 *) &Value;\r
+ UINT16 *Type16 = (UINT16 *) &Value;\r
+ UINT32 *Type32 = (UINT32 *) &Value;\r
+ UINT64 *Type64 = (UINT64 *) &Value;\r
+ UINT16 Index = 0;\r
+ ListType = FALSE;\r
>>\r
+ {\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
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 :\r
- $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 :\r
- $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_64 :\r
- $Value.u64 = _STOU64(N1->getText(), N1->getLine());\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
+ // 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
+ 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
+ }\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
+ }\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
+ }\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
}\r
>>\r
| B1:True << $Value.b = TRUE; >>\r
| QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
<< $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
| "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
+ | "\{" << ListType = TRUE; >>\r
+ L1:Number << \r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ Type8[Index] = _STOU8(L1->getText(), L1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ Index++;\r
+ >>\r
+ (\r
+ "," \r
+ L2:Number << \r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ Type8[Index] = _STOU8(L2->getText(), L2->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ Index++;\r
+ >>\r
+ )*\r
+ "\}" \r
;\r
\r
//*****************************************************************************\r
LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
}\r
\r
- {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
+ {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr<CHAR8>(); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
>>\r
";"\r
;\r
vfrStatementDefault :\r
<<\r
BOOLEAN IsExp = FALSE;\r
- EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+ UINT64 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+ EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
CIfrDefault *DObj = NULL;\r
CIfrDefault2 *DObj2 = NULL;\r
EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
UINT32 Size = 0;\r
EFI_GUID *VarGuid = NULL;\r
+ BOOLEAN ArrayType = FALSE;\r
+ UINT8 *Type8 = (UINT8 *) ValueList;\r
+ UINT16 *Type16 = (UINT16 *) ValueList;\r
+ UINT32 *Type32 = (UINT32 *) ValueList;\r
+ UINT64 *Type64 = (UINT64 *) ValueList;\r
+ CIfrNumeric *NumericQst = NULL;\r
+\r
>>\r
D:Default \r
(\r
(\r
- "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] "," \r
+ "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," \r
<< \r
if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
//check default value is valid for Numeric Opcode\r
- if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ NumericQst = (CIfrNumeric *) gCurrentQuestion;\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(), 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(), 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(), 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(), 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
+ default:\r
+ break;\r
+ }\r
+ } else {\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
if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
_PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+ } else if (ArrayType) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ while (Type8[Size] != 0) {\r
+ Size++;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ while (Type16[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT16);\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ while (Type32[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT32);\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ while (Type64[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT64);\r
+ break;\r
+\r
+ default:\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
DObj->SetLineNo(D->getLine());\r
- DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
- DObj->SetValue(Val);\r
+ if (ArrayType) {\r
+ DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+ } else if (gIsStringOp) {\r
+ DObj->SetType (EFI_IFR_TYPE_STRING);\r
+ } else {\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
| << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
)\r
{\r
DefaultStore "=" SN:StringIdentifier "," << \r
- _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
+ _PCATCH(gCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN);\r
if (DObj != NULL) {\r
DObj->SetDefaultId (DefaultId); \r
} \r
<<\r
CheckDuplicateDefaultValue (DefaultId, D);\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
- VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
- VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+ _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
+ VarGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+ VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
- _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+ _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
DefaultId,\r
_GET_CURRQEST_VARTINFO(),\r
VarStoreName,\r
VarGuid,\r
_GET_CURRQEST_DATATYPE (),\r
- Val),\r
- D->getLine()\r
- );\r
+ *Val),\r
+ D->getLine()\r
+ );\r
}\r
}\r
if (DObj != NULL) {delete DObj;} \r
| ManufacturingFlag \r
| DefaultFlag \r
| ResetRequiredFlag \r
+ | ReconnectRequiredFlag\r
| N:NVAccessFlag << \r
if (!mCompatibleMode) {\r
gCVfrErrorHandle.HandleWarning (\r
L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r
DefaultStore\r
"=" N:StringIdentifier "," <<\r
- _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
+ _PCATCH(gCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
RBObj.SetDefaultId (DefaultId);\r
>>\r
vfrStatementHeader[&RBObj] ","\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 ((mCVfrDataStorage.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(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
- VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\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
- mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+ gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
EFI_HII_DEFAULT_CLASS_STANDARD,\r
_GET_CURRQEST_VARTINFO(),\r
VarStoreName,\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
- mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+ gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
_GET_CURRQEST_VARTINFO(),\r
VarStoreName,\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
UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
+ BOOLEAN IntDecStyle = FALSE;\r
+ CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\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
+ BOOLEAN MaxNegative = FALSE;\r
>>\r
- Minimum "=" I:Number ","\r
- <<\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText(), I->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText(), I->getLine()); break;\r
+ Minimum "=" \r
+ {\r
+ "\-" << MinNegative = TRUE; >>\r
+ }\r
+ I:Number "," <<\r
+ if (!IntDecStyle && MinNegative) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
}\r
- >>\r
- Maximum "=" A:Number ","\r
- <<\r
- switch (_GET_CURRQEST_DATATYPE()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : \r
- MaxU8 = _STOU64(A->getText(), A->getLine()); \r
- if (MaxU8 < MinU8) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\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 && 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_32 : \r
- MaxU4 = _STOU32(A->getText(), A->getLine()); \r
- if (MaxU4 < MinU4) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\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
+ }\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
+ 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
+ }\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
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : \r
- MaxU2 = _STOU16(A->getText(), A->getLine()); \r
- if (MaxU2 < MinU2) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ >>\r
+ Maximum "=" \r
+ { \r
+ "\-" << MaxNegative = TRUE; >>\r
+ }\r
+ A:Number "," <<\r
+ if (!IntDecStyle && MaxNegative) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
+ }\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
- break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : \r
- MaxU1 = _STOU8(A->getText(), A->getLine()); \r
- if (MaxU1 < MinU1) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\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
+ 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
+ }\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
+ }\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
+ 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
+ }\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
+ }\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
+ 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
+ }\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
+ }\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
+ 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
- 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 = mCVfrDataStorage.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 = mCVfrDataStorage.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
UINT8 StringMinSize;\r
UINT8 StringMaxSize;\r
>>\r
- L:String << SObj.SetLineNo(L->getLine()); >>\r
+ L:String << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>>\r
vfrQuestionHeader[SObj] ","\r
{ F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
{\r
SObj.SetMaxSize (StringMaxSize);\r
>>\r
vfrStatementQuestionOptionList\r
- E:EndString << CRT_END_OP (E); >>\r
+ E:EndString << CRT_END_OP (E); gIsStringOp = FALSE;>>\r
";"\r
;\r
\r
CIfrOrderedList OLObj;\r
UINT32 VarArraySize;\r
>>\r
- L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r
+ L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
vfrQuestionHeader[OLObj] ","\r
<< \r
VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
}\r
{ F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
vfrStatementQuestionOptionList\r
- E:EndList << CRT_END_OP (E); >>\r
+ E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
";"\r
;\r
\r
Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
{ FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
vfrStatementExpression[0]\r
- E:EndIf << CRT_END_OP (E); >>\r
+ E:EndIf {";"} << CRT_END_OP (E); >>\r
;\r
\r
vfrStatementNoSubmitIf :\r
Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
{ FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
vfrStatementExpression[0]\r
- E:EndIf << CRT_END_OP (E); >>\r
+ E:EndIf {";"} << CRT_END_OP (E); >>\r
;\r
\r
vfrStatementWarningIf :\r
Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>\r
{Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
vfrStatementExpression[0]\r
- E:EndIf << CRT_END_OP (E); >>\r
+ E:EndIf {";"} << CRT_END_OP (E); >>\r
;\r
\r
vfrStatementDisableIfQuest :\r
L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
vfrStatementExpression[0] ";"\r
vfrStatementQuestionOptionList\r
- E:EndIf << CRT_END_OP (E); >>\r
+ E:EndIf {";"} << CRT_END_OP (E); >>\r
;\r
\r
vfrStatementRefresh :\r
{ FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
vfrStatementExpression[0] ";"\r
vfrStatementQuestionOptionList\r
- E:EndIf << CRT_END_OP (E); >>\r
+ E:EndIf {";"} << CRT_END_OP (E); >>\r
;\r
\r
vfrStatementGrayOutIfQuest :\r
{ FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
vfrStatementExpression[0] ";"\r
vfrStatementQuestionOptionList\r
- E:EndIf << CRT_END_OP (E); >>\r
+ E:EndIf {";"} << CRT_END_OP (E); >>\r
;\r
\r
vfrStatementOptions :\r
\r
vfrStatementOneOfOption :\r
<<\r
- EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+ UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+ EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
CHAR8 *VarStoreName = NULL;\r
UINT32 Size = 0;\r
BOOLEAN TypeError = FALSE;\r
EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
EFI_GUID *VarStoreGuid = NULL;\r
- \r
- if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
- TypeError = TRUE;\r
- Size = sizeof (EFI_IFR_TYPE_VALUE);\r
- } else {\r
- ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
- }\r
-\r
- Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
- CIfrOneOfOption OOOObj ((UINT8)Size);\r
+ BOOLEAN ArrayType = FALSE;\r
+ CIfrOneOfOption *OOOObj;\r
+ UINT8 *Type8 = (UINT8 *) ValueList;\r
+ UINT16 *Type16 = (UINT16 *) ValueList;\r
+ UINT32 *Type32 = (UINT32 *) ValueList;\r
+ UINT64 *Type64 = (UINT64 *) ValueList;\r
>>\r
L:Option << \r
- OOOObj.SetLineNo(L->getLine());\r
- if (TypeError) {\r
+ if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
_PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
}\r
- if (ReturnCode != VFR_RETURN_SUCCESS) {\r
- _PCATCH (ReturnCode, L->getLine());\r
- }\r
+\r
>>\r
- Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
- Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," \r
+ Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," \r
+ Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
<< \r
if (gCurrentMinMaxData != NULL) {\r
//set min/max value for oneof opcode\r
- UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\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
+ } 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
+ Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+ } else if (ArrayType) {\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
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ while (Type8[Size] != 0) {\r
+ Size++;\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ while (Type16[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT16);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ while (Type32[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT32);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ while (Type64[Size] != 0) {\r
+ Size++;\r
+ }\r
+ Size *= sizeof (UINT64);\r
+ break;\r
+ default:\r
+ break;\r
}\r
+ } else {\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
}\r
- OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
- OOOObj.SetValue (Val); \r
+\r
+ Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+ OOOObj = new CIfrOneOfOption((UINT8)Size);\r
+ OOOObj->SetLineNo(L->getLine());\r
+ OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
+ if (ArrayType) {\r
+ OOOObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+ } else {\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
- F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+ F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
<<\r
+ //\r
+ // Array type only for default type OneOfOption.\r
+ //\r
+ if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
+ _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
+ }\r
+\r
+ //\r
+ // Clear the default flag if the option not use array value but has default flag.\r
+ //\r
+ if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
+ OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
+ }\r
+\r
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
- _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
- VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
- if (OOOObj.GetFlags () & 0x10) {\r
+ _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
+ VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+ if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
- _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+ _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
EFI_HII_DEFAULT_CLASS_STANDARD,\r
_GET_CURRQEST_VARTINFO(),\r
VarStoreName,\r
VarStoreGuid,\r
_GET_CURRQEST_DATATYPE (),\r
- Val\r
+ *Val\r
), L->getLine());\r
}\r
- if (OOOObj.GetFlags () & 0x20) {\r
+ if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
- _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+ _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
_GET_CURRQEST_VARTINFO(),\r
VarStoreName,\r
VarStoreGuid,\r
_GET_CURRQEST_DATATYPE (),\r
- Val\r
+ *Val\r
), L->getLine());\r
}\r
}\r
//\r
CIfrOptionKey IfrOptionKey (\r
gCurrentQuestion->QUESTION_ID(),\r
- Val,\r
+ *Val,\r
_STOQID(KN->getText(), KN->getLine())\r
);\r
SET_LINE_INFO (IfrOptionKey, KN);\r
>>\r
}\r
(\r
- T:"," vfrImageTag << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
+ T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
)*\r
- ";"\r
+ ";" << if (OOOObj != NULL) {delete OOOObj;} >>\r
;\r
\r
vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
| "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
| InteractiveFlag << $HFlags |= 0x04; >>\r
| ResetRequiredFlag << $HFlags |= 0x10; >>\r
+ | ReconnectRequiredFlag << $HFlags |= 0x40; >>\r
| ManufacturingFlag << $LFlags |= 0x20; >>\r
| DefaultFlag << $LFlags |= 0x10; >>\r
| A:NVAccessFlag << \r
#token ToUpper("toupper") "toupper"\r
#token ToLower("tolower") "tolower"\r
#token Match("match") "match"\r
+#token Match2("match2") "match2"\r
#token Catenate("catenate") "catenate"\r
#token QuestionRefVal("questionrefval") "questionrefval"\r
#token StringRefVal("stringrefval") "stringrefval"\r
}\r
\r
if ($RootLevel == 0) {\r
+ _CLEAR_SAVED_OPHDR ();\r
mCIfrOpHdrIndex --;\r
}\r
>>\r
atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
| vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
+ | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
| vfrExpressionParen[$RootLevel, $ExpOpCount]\r
| vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
| vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
"\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
;\r
\r
+vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+ <<\r
+ EFI_GUID Guid;\r
+ >>\r
+ L:Match2\r
+ "\("\r
+ vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+ ","\r
+ vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+ ","\r
+ guidDefinition[Guid]\r
+ "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
+ ;\r
+\r
vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
"\("\r
vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
OpenParen\r
VN:Number <<\r
VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
- VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
+ VfrReturnCode = gCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
- _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
+ _PCATCH (gCVfrDataStorage.DeclareEfiVarStore (\r
VarIdStr,\r
&mFormsetGuid,\r
_STOSID(VN->getText(), VN->getLine()),\r
<< IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
)\r
)\r
+ <<\r
+ if (VarIdStr != NULL) {\r
+ delete[] VarIdStr;\r
+ VarIdStr = NULL;\r
+ }\r
+ >>\r
;\r
\r
ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
<< IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
)\r
)\r
+ <<\r
+ if (VarIdStr != NULL) {\r
+ delete[] VarIdStr;\r
+ VarIdStr = NULL;\r
+ }\r
+ >>\r
;\r
\r
ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
<< IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
)\r
)\r
+ <<\r
+ if (VarIdStr[0] != NULL) {\r
+ delete[] VarIdStr[0];\r
+ VarIdStr[0] = NULL;\r
+ }\r
+ if (VarIdStr[1] != NULL) {\r
+ delete[] VarIdStr[1];\r
+ VarIdStr[1] = NULL;\r
+ }\r
+ >>\r
;\r
\r
ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
}\r
$ExpOpCount++;\r
}\r
+ if (VarIdStr != NULL) {\r
+ delete[] VarIdStr;\r
+ VarIdStr = NULL;\r
+ }\r
>>\r
;\r
\r
break;\r
}\r
} else {\r
- if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+ if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
_PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
}\r
if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
CIfrGet GObj(L->getLine()); \r
_SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
GObj.SetVarInfo (&Info); \r
- delete VarIdStr; \r
+ delete[] VarIdStr;\r
$ExpOpCount++;\r
}\r
>>\r
break;\r
}\r
} else {\r
- if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+ if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
_PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
}\r
if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
}\r
CIfrSet TSObj(L->getLine()); \r
TSObj.SetVarInfo (&Info); \r
- delete VarIdStr; \r
+ delete[] VarIdStr;\r
$ExpOpCount++;\r
}\r
>>\r
UINT8 mParserStatus;\r
BOOLEAN mConstantOnlyInExpression;\r
\r
- CVfrDefaultStore mCVfrDefaultStore;\r
- CVfrDataStorage mCVfrDataStorage;\r
CVfrQuestionDB mCVfrQuestionDB;\r
CVfrRulesDB mCVfrRulesDB;\r
\r
VOID\r
)\r
{\r
- mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
+ if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+ delete mCIfrOpHdr[mCIfrOpHdrIndex];\r
+ mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
+ }\r
mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
}\r
\r
NewStr[0] = '\0';\r
if (*Dest != NULL) {\r
strcpy (NewStr, *Dest);\r
- delete *Dest;\r
+ delete[] *Dest;\r
}\r
strcat (NewStr, Src);\r
\r
CONST CHAR8 VarName[] = "Setup";\r
\r
FirstNode = TRUE;\r
- pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
+ pNode = gCVfrDataStorage.GetBufferVarStoreList();\r
if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
//\r
// Create the default Buffer Var Store when no VarStore is defined.\r
}\r
}\r
\r
- pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
+ pNode = gCVfrDataStorage.GetEfiVarStoreList();\r
for (; pNode != NULL; pNode = pNode->mNext) {\r
//\r
// create the default efi varstore opcode for not exist varstore\r
CIfrVarStore VSObj;\r
\r
VSObj.SetLineNo (LineNo);\r
- mCVfrDataStorage.DeclareBufferVarStore (\r
+ gCVfrDataStorage.DeclareBufferVarStore (\r
TypeNameList[Index],\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
TypeNameList[Index],\r
- EFI_VARSTORE_ID_INVALID\r
+ EFI_VARSTORE_ID_INVALID,\r
+ FALSE\r
);\r
- mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
+ gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
VSObj.SetVarStoreId (VarStoreId);\r
gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
VSObj.SetSize ((UINT16) Size);\r
CIfrVarStore VSObj;\r
\r
VSObj.SetLineNo (LineNo);\r
- mCVfrDataStorage.DeclareBufferVarStore (\r
+ gCVfrDataStorage.DeclareBufferVarStore (\r
(CHAR8 *) DateName,\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
(CHAR8 *) DateType,\r
- EFI_VARSTORE_ID_INVALID\r
+ EFI_VARSTORE_ID_INVALID,\r
+ FALSE\r
);\r
- mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
+ gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
VSObj.SetVarStoreId (VarStoreId);\r
gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
VSObj.SetSize ((UINT16) Size);\r
CIfrVarStore VSObj;\r
\r
VSObj.SetLineNo (LineNo);\r
- mCVfrDataStorage.DeclareBufferVarStore (\r
+ gCVfrDataStorage.DeclareBufferVarStore (\r
(CHAR8 *) TimeName,\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
(CHAR8 *) TimeType,\r
- EFI_VARSTORE_ID_INVALID\r
+ EFI_VARSTORE_ID_INVALID,\r
+ FALSE\r
);\r
- mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
+ gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
VSObj.SetVarStoreId (VarStoreId);\r
gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
VSObj.SetSize ((UINT16) Size);\r
//\r
CIfrDefaultStore DSObj;\r
\r
- mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+ gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr<CHAR8>(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
DSObj.SetLineNo (LineNo);\r
DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
//\r
CIfrDefaultStore DSObjMF;\r
\r
- mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
+ gCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr<CHAR8>(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
DSObjMF.SetLineNo (LineNo);\r
DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r