}\r
};\r
\r
-static CIfrQuestionHeader *gCurrentQuestion = NULL;\r
-static CIfrObj *gCurrentIfrOpcode = NULL;\r
-\r
/*\r
* The definition of CIfrMinMaxStepData\r
*/\r
class CIfrMinMaxStepData {\r
private:\r
MINMAXSTEP_DATA *mMinMaxStepData;\r
+ BOOLEAN ValueIsSet;\r
+ BOOLEAN IsNumeric;\r
\r
public:\r
- CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr) : mMinMaxStepData (DataAddr) {\r
+ CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr, BOOLEAN NumericOpcode=FALSE) : mMinMaxStepData (DataAddr) {\r
mMinMaxStepData->u64.MinValue = 0;\r
mMinMaxStepData->u64.MaxValue = 0;\r
mMinMaxStepData->u64.Step = 0;\r
+ ValueIsSet = FALSE;\r
+ IsNumeric = NumericOpcode;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT64 MinValue, IN UINT64 MaxValue, IN UINT64 Step) {\r
- mMinMaxStepData->u64.MinValue = MinValue;\r
- mMinMaxStepData->u64.MaxValue = MaxValue;\r
- mMinMaxStepData->u64.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u64.MinValue = MinValue;\r
+ mMinMaxStepData->u64.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u64.MinValue) {\r
+ mMinMaxStepData->u64.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u64.MaxValue) {\r
+ mMinMaxStepData->u64.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u64.Step = Step;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT32 MinValue, IN UINT32 MaxValue, IN UINT32 Step) {\r
- mMinMaxStepData->u32.MinValue = MinValue;\r
- mMinMaxStepData->u32.MaxValue = MaxValue;\r
- mMinMaxStepData->u32.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u32.MinValue = MinValue;\r
+ mMinMaxStepData->u32.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u32.MinValue) {\r
+ mMinMaxStepData->u32.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u32.MaxValue) {\r
+ mMinMaxStepData->u32.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u32.Step = Step;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT16 MinValue, IN UINT16 MaxValue, IN UINT16 Step) {\r
- mMinMaxStepData->u16.MinValue = MinValue;\r
- mMinMaxStepData->u16.MaxValue = MaxValue;\r
- mMinMaxStepData->u16.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u16.MinValue = MinValue;\r
+ mMinMaxStepData->u16.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u16.MinValue) {\r
+ mMinMaxStepData->u16.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u16.MaxValue) {\r
+ mMinMaxStepData->u16.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u16.Step = Step;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT8 MinValue, IN UINT8 MaxValue, IN UINT8 Step) {\r
- mMinMaxStepData->u8.MinValue = MinValue;\r
- mMinMaxStepData->u8.MaxValue = MaxValue;\r
- mMinMaxStepData->u8.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u8.MinValue = MinValue;\r
+ mMinMaxStepData->u8.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u8.MinValue) {\r
+ mMinMaxStepData->u8.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u8.MaxValue) {\r
+ mMinMaxStepData->u8.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u8.Step = Step;\r
+ }\r
+\r
+ UINT64 GetMinData (UINT8 VarType) {\r
+ UINT64 MinValue = 0;\r
+ switch (VarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ MinValue = mMinMaxStepData->u64.MinValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ MinValue = (UINT64) mMinMaxStepData->u32.MinValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ MinValue = (UINT64) mMinMaxStepData->u16.MinValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ MinValue = (UINT64) mMinMaxStepData->u8.MinValue;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return MinValue;\r
+ }\r
+\r
+ UINT64 GetMaxData (UINT8 VarType) {\r
+ UINT64 MaxValue = 0;\r
+ switch (VarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ MaxValue = mMinMaxStepData->u64.MaxValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ MaxValue = (UINT64) mMinMaxStepData->u32.MaxValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ MaxValue = (UINT64) mMinMaxStepData->u16.MaxValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ MaxValue = (UINT64) mMinMaxStepData->u8.MaxValue;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return MaxValue;\r
+ }\r
+\r
+ UINT64 GetStepData (UINT8 VarType) {\r
+ UINT64 MaxValue = 0;\r
+ switch (VarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ MaxValue = mMinMaxStepData->u64.Step;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ MaxValue = (UINT64) mMinMaxStepData->u32.Step;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ MaxValue = (UINT64) mMinMaxStepData->u16.Step;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ MaxValue = (UINT64) mMinMaxStepData->u8.Step;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return MaxValue;\r
}\r
\r
+ BOOLEAN IsNumericOpcode () {\r
+ return IsNumeric;\r
+ }\r
};\r
\r
+static CIfrQuestionHeader *gCurrentQuestion = NULL;\r
+static CIfrMinMaxStepData *gCurrentMinMaxData = NULL;\r
+\r
/*\r
* The definition of all of the UEFI IFR Objects\r
*/\r
CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)&mNumeric),\r
CIfrOpHeader (EFI_IFR_NUMERIC_OP, &mNumeric->Header),\r
CIfrQuestionHeader (&mNumeric->Question),\r
- CIfrMinMaxStepData (&mNumeric->data) {\r
+ CIfrMinMaxStepData (&mNumeric->data, TRUE) {\r
mNumeric->Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC;\r
- gCurrentQuestion = this;\r
- gCurrentIfrOpcode = this;\r
+ gCurrentQuestion = this;\r
+ gCurrentMinMaxData = this;\r
}\r
\r
~CIfrNumeric () {\r
- gCurrentQuestion = NULL;\r
- gCurrentIfrOpcode = NULL;\r
+ gCurrentQuestion = NULL;\r
+ gCurrentMinMaxData = NULL;\r
}\r
\r
EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
CIfrQuestionHeader (&mOneOf->Question),\r
CIfrMinMaxStepData (&mOneOf->data) {\r
mOneOf->Flags = 0;\r
- gCurrentQuestion = this;\r
- gCurrentIfrOpcode = this;\r
+ gCurrentQuestion = this;\r
+ gCurrentMinMaxData = this;\r
}\r
\r
~CIfrOneOf () {\r
- gCurrentQuestion = NULL;\r
- gCurrentIfrOpcode = NULL;\r
+ gCurrentQuestion = NULL;\r
+ gCurrentMinMaxData = NULL;\r
}\r
\r
EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
}\r
};\r
\r
+class CIfrSecurity : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+ EFI_IFR_SECURITY *mSecurity;\r
+\r
+public:\r
+ CIfrSecurity (\r
+ IN UINT32 LineNo\r
+ ) : CIfrObj (EFI_IFR_SECURITY_OP, (CHAR8 **)&mSecurity),\r
+ CIfrOpHeader (EFI_IFR_SECURITY_OP, &mSecurity->Header) {\r
+ SetLineNo (LineNo);\r
+ memset (&mSecurity->Permissions, 0, sizeof (EFI_GUID));\r
+ }\r
+\r
+ VOID SetPermissions (IN EFI_GUID *Permissions) {\r
+ memcpy (&mSecurity->Permissions, Permissions, sizeof (EFI_GUID));\r
+ }\r
+};\r
+\r
class CIfrUint8 : public CIfrObj, public CIfrOpHeader {\r
private:\r
EFI_IFR_UINT8 *mUint8;\r