/*++ @file\r
Vfr Syntax\r
\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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
--*/\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
)\r
{\r
ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);\r
- VfrParser.parser()->SetCompatibleMode (InputInfo->CompatibleMode);\r
VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid);\r
return VfrParser.parser()->vfrProgram();\r
}\r
//\r
// Define a lexical class for parsing quoted strings. Basically\r
// starts with a double quote, and ends with a double quote that\r
-// is not preceeded with a backslash.\r
+// is not preceded with a backslash.\r
//\r
#lexclass QUOTED_STRING\r
#token TheString "~[\"]*\"" << mode (START); >>\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 LateCheckFlag("LATE_CHECK") "LATE_CHECK"\r
#token ReadOnlyFlag("READ_ONLY") "READ_ONLY"\r
#token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"\r
+#token RestStyleFlag("REST_STYLE") "REST_STYLE"\r
#token Class("class") "class"\r
#token Subclass("subclass") "subclass"\r
#token ClassGuid("classguid") "classguid"\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
<<\r
EFI_GUID Guid;\r
EFI_GUID DefaultClassGuid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID;\r
- EFI_GUID ClassGuid1, ClassGuid2, ClassGuid3;\r
+ EFI_GUID ClassGuid1, ClassGuid2, ClassGuid3, ClassGuid4;\r
UINT8 ClassGuidNum = 0;\r
CIfrFormSet *FSObj = NULL;\r
UINT16 C, SC;\r
"\|" guidDefinition[ClassGuid2] << ++ClassGuidNum; >>\r
{\r
"\|" guidDefinition[ClassGuid3] << ++ClassGuidNum; >>\r
+ {\r
+ "\|" guidDefinition[ClassGuid4] << ++ClassGuidNum; >>\r
+ }\r
}\r
}\r
","\r
}\r
<<\r
- if (mOverrideClassGuid != NULL && ClassGuidNum >= 3) {\r
- _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 3 class guids, can't add extra class guid!");\r
+ if (mOverrideClassGuid != NULL && ClassGuidNum >= 4) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 4 class guids, can't add extra class guid!");\r
}\r
switch (ClassGuidNum) {\r
case 0:\r
}\r
break;\r
case 3:\r
+ if (mOverrideClassGuid != NULL) {\r
+ ClassGuidNum ++;\r
+ }\r
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
+ FSObj->SetClassGuid(&ClassGuid1);\r
+ FSObj->SetClassGuid(&ClassGuid2);\r
+ FSObj->SetClassGuid(&ClassGuid3);\r
+ if (mOverrideClassGuid != NULL) {\r
+ FSObj->SetClassGuid(mOverrideClassGuid);\r
+ }\r
+ break;\r
+ case 4:\r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
FSObj->SetClassGuid(&ClassGuid2);\r
FSObj->SetClassGuid(&ClassGuid3);\r
+ FSObj->SetClassGuid(&ClassGuid4);\r
break;\r
default:\r
break;\r
\r
SET_LINE_INFO (*FSObj, L);\r
FSObj->SetGuid (&Guid);\r
- //\r
- // for framework vfr to store formset guid used by varstore and efivarstore\r
- //\r
- if (mCompatibleMode) {\r
- memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID));\r
- }\r
FSObj->SetFormSetTitle (_STOSID(S1->getText(), S1->getLine()));\r
FSObj->SetHelp (_STOSID(S2->getText(), S2->getLine()));\r
>>\r
>>\r
vfrFormSetList\r
E:EndFormSet <<\r
- if (mCompatibleMode) {\r
- //\r
- // declare all undefined varstore and efivarstore\r
- //\r
- _DeclareDefaultFrameworkVarStore (GET_LINENO(E));\r
- }\r
- \r
//\r
// Declare undefined Question so that they can be used in expression.\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
<<\r
if (gCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
CIfrDefaultStore DSObj;\r
- _PCATCH(gCVfrDefaultStore.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
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
| T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
| R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >>\r
)\r
- { Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
- if (mCompatibleMode) {\r
- VarStoreId = _STOU16(FID->getText(), FID->getLine());\r
- }\r
- >>\r
- }\r
{\r
VarId "=" ID:Number "," <<\r
_PCATCH(\r
Name "=" SN:StringIdentifier ","\r
Uuid "=" guidDefinition[Guid]\r
<<\r
- if (mCompatibleMode) {\r
- StoreName = TypeName;\r
- } else {\r
- StoreName = SN->getText();\r
- }\r
+\r
+ StoreName = SN->getText();\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
VSEObj.SetName (StoreName);\r
if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {\r
- delete StoreName; \r
+ delete[] StoreName;\r
}\r
>>\r
";"\r
;\r
\r
//\r
-// keep classDeinition and validClassNames for compatibility but not generate\r
+// keep classDefinition and validClassNames for compatibility but not generate\r
// any IFR object\r
//\r
classDefinition[UINT16 & Class] :\r
vfrStatementSuppressIfFormSet :\r
<< CIfrSuppressIf SIObj;>>\r
L:SuppressIf <<\r
- if (mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
- }\r
SIObj.SetLineNo(L->getLine()); \r
>>\r
{ FLAGS "=" flagsField ( "\|" flagsField )* "," }\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
+ | RestStyleFlag << $Flags |= 0x20; >>\r
| ReconnectRequiredFlag << $Flags |= 0x40; >>\r
- | O:OptionOnlyFlag << \r
- if (mCompatibleMode) {\r
- $Flags |= 0x80;\r
- } else {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- O->getLine(),\r
- O->getText()\r
- );\r
- }\r
+ | O:OptionOnlyFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ O->getLine(),\r
+ O->getText()\r
+ );\r
>>\r
- | N:NVAccessFlag << \r
- if (!mCompatibleMode) {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- N->getLine(),\r
- N->getText()\r
- );\r
- }\r
+ | N:NVAccessFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ N->getLine(),\r
+ N->getText()\r
+ );\r
>>\r
- | L:LateCheckFlag << \r
- if (!mCompatibleMode) {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- L->getLine(),\r
- L->getText()\r
- );\r
- }\r
+ | L:LateCheckFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ L->getLine(),\r
+ L->getText()\r
+ );\r
>>\r
;\r
\r
>>\r
<<\r
VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
- if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
- gCVfrDataStorage.DeclareBufferVarStore (\r
- SName,\r
- &mFormsetGuid,\r
- &gCVfrVarDataTypeDB,\r
- SName,\r
- EFI_VARSTORE_ID_INVALID,\r
- FALSE\r
- );\r
- VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
- }\r
if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
_PCATCH(VfrReturnCode, SN1);\r
_PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
<<\r
VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
- if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
- gCVfrDataStorage.DeclareBufferVarStore (\r
- SName,\r
- &mFormsetGuid,\r
- &gCVfrVarDataTypeDB,\r
- SName,\r
- EFI_VARSTORE_ID_INVALID,\r
- FALSE\r
- );\r
- VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
- }\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
{\r
OpenBracket I2:Number CloseBracket <<\r
Idx = _STOU32(I2->getText(), I2->getLine());\r
- if (mCompatibleMode) Idx --;\r
if (Idx > 0) {\r
//\r
// Idx == 0, [0] can be ignored.\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
}\r
\r
QuestVarIdStr = VarIdStr;\r
- if (VarStr != NULL) {delete VarStr;}\r
+ if (VarStr != NULL) {delete[] VarStr;}\r
>>\r
)\r
;\r
{\r
OpenBracket I2:Number CloseBracket <<\r
Idx = _STOU32(I2->getText(), I2->getLine());\r
- if (mCompatibleMode) Idx --;\r
if (Idx > 0) {\r
//\r
// Idx == 0, [0] can be ignored.\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
vfrStatementRefreshEvent ";"\r
)*\r
E:EndForm <<\r
- if (mCompatibleMode) {\r
- //\r
- // Add Label for Framework Vfr\r
- //\r
- CIfrLabel LObj1;\r
- LObj1.SetLineNo(E->getLine());\r
- LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
- CIfrLabel LObj2;\r
- LObj2.SetLineNo(E->getLine());\r
- LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0\r
- CIfrLabel LObj3;\r
- LObj3.SetLineNo(E->getLine());\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
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
\r
vfrStatementSuppressIfStat :\r
- <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r
- | vfrStatementSuppressIfStatNew\r
+ vfrStatementSuppressIfStatNew\r
;\r
\r
vfrStatementGrayOutIfStat :\r
- <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r
- | vfrStatementGrayOutIfStatNew\r
+ vfrStatementGrayOutIfStatNew\r
;\r
\r
vfrStatementInvalid :\r
| DefaultFlag \r
| ResetRequiredFlag \r
| ReconnectRequiredFlag\r
- | N:NVAccessFlag << \r
- if (!mCompatibleMode) {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- N->getLine(),\r
- N->getText()\r
- );\r
- }\r
+ | N:NVAccessFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ N->getLine(),\r
+ N->getText()\r
+ );\r
>>\r
- | L:LateCheckFlag << \r
- if (!mCompatibleMode) {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- L->getLine(),\r
- L->getText()\r
- );\r
- }\r
+ | L:LateCheckFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ L->getLine(),\r
+ L->getText()\r
+ );\r
>> \r
;\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
\r
checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
N:Number <<\r
- if (mCompatibleMode) {\r
- //\r
- // set question flag\r
- //\r
- $LFlags |= _STOU8(N->getText(), N->getLine());\r
- } else {\r
- _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
- }\r
+ _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
>>\r
| D:"DEFAULT" <<\r
- if (mCompatibleMode) {\r
- //\r
- // set question Default flag\r
- //\r
- $LFlags |= 0x01;\r
- } else {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
>>\r
| M:"MANUFACTURING" <<\r
- if (mCompatibleMode) {\r
- //\r
- // set question MFG flag\r
- //\r
- $LFlags |= 0x02;\r
- } else {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
>>\r
| "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r
| "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\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
+ 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
- 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
+ } 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_DISPLAY_BIT;\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
+ LFlags &= EDKII_IFR_DISPLAY_BIT;\r
+ LFlags |= (EDKII_IFR_NUMERIC_SIZE_BIT & (_GET_CURRQEST_VARSIZE()));\r
+ _PCATCH(OObj.SetFlagsForBitField (HFlags, LFlags), LineNum);\r
}\r
- _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
>>\r
;\r
\r
vfrStatementInconsistentIfStat :\r
<< CIfrInconsistentIf IIObj; >>\r
L:InconsistentIf <<\r
- if (!mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
IIObj.SetLineNo(L->getLine());\r
>>\r
Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
E: EndIf ";" << CRT_END_OP (E); >>\r
;\r
\r
-vfrStatementSuppressIfStatOld :\r
- <<\r
- CIfrSuppressIf SIObj;\r
- BOOLEAN GrayOutExist = FALSE;\r
- >>\r
- L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
- { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
- vfrStatementExpression[0]\r
- ";"\r
- {\r
- vfrStatementsuppressIfGrayOutIf\r
- << GrayOutExist = TRUE; >>\r
- }\r
- ( vfrStatementStatListOld )*\r
- E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
- ;\r
-\r
-vfrStatementGrayOutIfStatOld :\r
- <<\r
- CIfrGrayOutIf GOIObj;\r
- BOOLEAN SuppressExist = FALSE;\r
- >>\r
- L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
- { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
- vfrStatementExpression[0]\r
- ";"\r
- {\r
- vfrStatementgrayoutIfSuppressIf\r
- << SuppressExist = TRUE; >>\r
- }\r
- ( vfrStatementStatListOld )*\r
- E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
- ;\r
-\r
vfrImageTag :\r
<< CIfrImage IObj; >>\r
L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\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
>>\r
{\r
"," Key "=" KN:Number <<\r
- if (!mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
//\r
// Guid Option Key\r
//\r
| "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
| InteractiveFlag << $HFlags |= 0x04; >>\r
| ResetRequiredFlag << $HFlags |= 0x10; >>\r
+ | RestStyleFlag << $HFlags |= 0x20; >>\r
| ReconnectRequiredFlag << $HFlags |= 0x40; >>\r
| ManufacturingFlag << $LFlags |= 0x20; >>\r
| DefaultFlag << $LFlags |= 0x10; >>\r
- | A:NVAccessFlag << \r
- if (mCompatibleMode) {\r
- $HFlags |= 0x08;\r
- } else {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- A->getLine(),\r
- A->getText()\r
- );\r
- }\r
+ | A:NVAccessFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ A->getLine(),\r
+ A->getText()\r
+ );\r
>>\r
- | L:LateCheckFlag << \r
- if (mCompatibleMode) {\r
- $HFlags |= 0x20;\r
- } else {\r
- gCVfrErrorHandle.HandleWarning (\r
- VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
- L->getLine(),\r
- L->getText()\r
- );\r
- }\r
+ | L:LateCheckFlag <<\r
+ gCVfrErrorHandle.HandleWarning (\r
+ VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
+ L->getLine(),\r
+ L->getText()\r
+ );\r
>>\r
;\r
\r
vfrStatementLabel :\r
L:Label\r
N:Number <<\r
- if (mCompatibleMode) {\r
- //\r
- // Add end Label for Framework Vfr\r
- //\r
- CIfrLabel LObj1;\r
- LObj1.SetLineNo(L->getLine());\r
- LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
- }\r
-\r
{\r
CIfrLabel LObj2;\r
LObj2.SetLineNo(L->getLine());\r
//\r
vfrStatementInvalidHidden :\r
L:Hidden <<\r
- if (!mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
>>\r
Value "=" Number ","\r
Key "=" Number ";"\r
\r
vfrStatementInvalidInventory :\r
L:Inventory <<\r
- if (!mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
>>\r
Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
vfrStatementInvalidSaveRestoreDefaults :\r
(\r
L:Save <<\r
- if (!mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
>>\r
|\r
K:Restore <<\r
- if (!mCompatibleMode) {\r
- _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
- }\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
>>\r
)\r
Defaults ","\r
// Root expression extension function called by other function.\r
//\r
vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
- << if ($RootLevel == 0) {mCIfrOpHdrIndex ++; if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!"); _CLEAR_SAVED_OPHDR ();} >>\r
+ <<\r
+ if ($RootLevel == 0) {\r
+ mCIfrOpHdrIndex ++;\r
+ if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!");\r
+ }\r
+ _INIT_OPHDR_COND ();\r
+ }\r
+ >>\r
andTerm[$RootLevel, $ExpOpCount]\r
(\r
L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
}\r
\r
if ($RootLevel == 0) {\r
+ _CLEAR_SAVED_OPHDR ();\r
mCIfrOpHdrIndex --;\r
}\r
>>\r
\r
//\r
// Add new sub function for the sub expression extension to remember the ExpOpCount\r
-// This funciton is only called by sub expression.\r
+// This function is only called by sub expression.\r
//\r
vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
andTerm[$RootLevel, $ExpOpCount]\r
EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
>>\r
L:VarEqVal <<\r
- if (!mCompatibleMode) {\r
_PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
- }\r
>>\r
VK:Var\r
OpenParen\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
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
}\r
CIfrSet TSObj(L->getLine()); \r
TSObj.SetVarInfo (&Info); \r
- delete VarIdStr; \r
+ delete[] VarIdStr;\r
$ExpOpCount++;\r
}\r
>>\r
UINT8 mCIfrOpHdrIndex;\r
VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
VOID _CLEAR_SAVED_OPHDR (VOID);\r
+ VOID _INIT_OPHDR_COND (VOID);\r
BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
\r
\r
UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
UINT16 mUsedDefaultCount;\r
\r
-//\r
-// For framework vfr compatibility\r
-//\r
- BOOLEAN mCompatibleMode;\r
EFI_GUID mFormsetGuid;\r
\r
VOID _CRT_OP (IN BOOLEAN);\r
\r
VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
VOID _DeclareStandardDefaultStorage (IN UINT32);\r
- VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r
\r
VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
\r
VOID IdEqIdDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_COMPARE_TYPE);\r
VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
VOID SetOverrideClassGuid (IN EFI_GUID *);\r
-//\r
-// For framework vfr compatibility\r
-//\r
- VOID SetCompatibleMode (IN BOOLEAN);\r
>>\r
}\r
\r
}\r
\r
VOID\r
-EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
+EfiVfrParser::_INIT_OPHDR_COND (\r
VOID\r
)\r
{\r
mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
}\r
\r
+VOID\r
+EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
+ VOID\r
+ )\r
+{\r
+ if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+ delete mCIfrOpHdr[mCIfrOpHdrIndex];\r
+ mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
+ }\r
+}\r
+\r
BOOLEAN\r
EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
VOID\r
}\r
if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
- gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
}\r
}\r
\r
}\r
if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
- gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
}\r
}\r
\r
}\r
if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
- gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
}\r
}\r
\r
}\r
if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
- gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (VFR_RETURN_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
}\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
return Ref;\r
}\r
\r
-//\r
-// framework vfr to default declare varstore for each structure\r
-//\r
-VOID\r
-EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
- IN UINT32 LineNo\r
- )\r
-{\r
- SVfrVarStorageNode *pNode;\r
- UINT32 TypeSize;\r
- BOOLEAN FirstNode;\r
- CONST CHAR8 VarName[] = "Setup";\r
-\r
- FirstNode = TRUE;\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
- // its name should be "Setup"\r
- //\r
- gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
- CIfrVarStore VSObj;\r
- VSObj.SetLineNo (LineNo);\r
- VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
- VSObj.SetSize ((UINT16) TypeSize);\r
- //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
- VSObj.SetName ((CHAR8 *) VarName);\r
- VSObj.SetGuid (&mFormsetGuid);\r
-#ifdef VFREXP_DEBUG\r
- printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
-#endif\r
- } else {\r
- for (; pNode != NULL; pNode = pNode->mNext) {\r
- //\r
- // create the default varstore opcode for not declared varstore\r
- // the first varstore name should be "Setup"\r
- //\r
- if (!pNode->mAssignedFlag) {\r
- CIfrVarStore VSObj;\r
- VSObj.SetLineNo (LineNo);\r
- VSObj.SetVarStoreId (pNode->mVarStoreId);\r
- VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
- if (FirstNode) {\r
- VSObj.SetName ((CHAR8 *) VarName);\r
- FirstNode = FALSE;\r
- } else {\r
- VSObj.SetName (pNode->mVarStoreName);\r
- }\r
- VSObj.SetGuid (&pNode->mGuid);\r
-#ifdef VFREXP_DEBUG\r
- printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
-#endif\r
- }\r
- }\r
- }\r
-\r
- pNode = gCVfrDataStorage.GetEfiVarStoreList();\r
- for (; pNode != NULL; pNode = pNode->mNext) {\r
- //\r
- // create the default efi varstore opcode for not exist varstore\r
- //\r
- if (!pNode->mAssignedFlag) {\r
- CIfrVarStoreEfi VSEObj;\r
- VSEObj.SetLineNo (LineNo);\r
- VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
- VSEObj.SetGuid (&pNode->mGuid);\r
- VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
- // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
- // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
- VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
-#ifdef VFREXP_DEBUG\r
- printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
-#endif\r
- }\r
- }\r
-\r
-}\r
-\r
VOID\r
EfiVfrParser::_DeclareDefaultLinearVarStore (\r
IN UINT32 LineNo\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
//\r
CIfrDefaultStore DSObj;\r
\r
- gCVfrDefaultStore.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
- gCVfrDefaultStore.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
mOverrideClassGuid = OverrideClassGuid;\r
}\r
\r
-//\r
-// For framework vfr compatibility\r
-//\r
-VOID\r
-EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
-{\r
- mCompatibleMode = Mode;\r
- mCVfrQuestionDB.SetCompatibleMode (Mode);\r
-}\r
-\r
VOID\r
EfiVfrParser::CheckDuplicateDefaultValue (\r
IN EFI_DEFAULT_ID DefaultId,\r