--- /dev/null
+#ifndef _VFRUTILITYLIB_H_\r
+#define _VFRUTILITYLIB_H_\r
+\r
+#include "Tiano.h"\r
+#include "string.h"\r
+#include "EfiTypes.h"\r
+#include "EfiVfr.h"\r
+#include "VfrError.h"\r
+\r
+#define MAX_NAME_LEN 64\r
+#define DEFAULT_ALIGN 1\r
+#define DEFAULT_PACK_ALIGN 0xFFFFFFFF\r
+#define DEFAULT_NAME_TABLE_ITEMS 1024\r
+\r
+#define EFI_BITS_SHIFT_PER_UINT32 0x5\r
+#define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)\r
+\r
+#define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);\r
+\r
+class CVfrBinaryOutput {\r
+public:\r
+ virtual VOID WriteLine (IN FILE *, IN UINT32, IN INT8 *, IN INT8 *, IN UINT32);\r
+ virtual VOID WriteEnd (IN FILE *, IN UINT32, IN INT8 *, IN INT8 *, IN UINT32);\r
+};\r
+\r
+UINT32\r
+_STR2U32 (\r
+ IN INT8 *Str\r
+ );\r
+\r
+struct SConfigInfo {\r
+ UINT16 mOffset;\r
+ UINT16 mWidth;\r
+ UINT8 *mValue;\r
+ SConfigInfo *mNext;\r
+\r
+ SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);\r
+ ~SConfigInfo (VOID);\r
+};\r
+\r
+struct SConfigItem {\r
+ INT8 *mId;\r
+ INT8 *mInfo;\r
+ SConfigInfo *mInfoStrList;\r
+ SConfigItem *mNext;\r
+\r
+public:\r
+ SConfigItem (IN INT8 *, IN INT8 *);\r
+ SConfigItem (IN INT8 *, IN INT8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);\r
+ virtual ~SConfigItem ();\r
+};\r
+\r
+class CVfrBufferConfig {\r
+private:\r
+ SConfigItem *mItemListHead;\r
+ SConfigItem *mItemListTail;\r
+ SConfigItem *mItemListPos;\r
+\r
+public:\r
+ CVfrBufferConfig (VOID);\r
+ virtual ~CVfrBufferConfig (VOID);\r
+\r
+ virtual UINT8 Register (IN INT8 *, IN INT8 *Info = NULL);\r
+ virtual VOID Open (VOID);\r
+ virtual BOOLEAN Eof(VOID);\r
+ virtual UINT8 Select (IN INT8 *, IN INT8 *Info = NULL);\r
+ virtual UINT8 Write (IN CONST CHAR8, IN INT8 *, IN INT8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);\r
+#if 0\r
+ virtual UINT8 Read (OUT INT8 **, OUT INT8 **, OUT INT8 **, OUT INT8 **, OUT INT8 **);\r
+#endif\r
+ virtual VOID Close (VOID);\r
+ virtual VOID OutputCFile (IN FILE *, IN INT8 *);\r
+};\r
+\r
+extern CVfrBufferConfig gCVfrBufferConfig;\r
+\r
+#define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))\r
+#define INVALID_ARRAY_INDEX 0xFFFFFFFF\r
+\r
+struct SVfrDataType;\r
+\r
+struct SVfrDataField {\r
+ INT8 mFieldName[MAX_NAME_LEN];\r
+ SVfrDataType *mFieldType;\r
+ UINT32 mOffset;\r
+ UINT32 mArrayNum;\r
+ SVfrDataField *mNext;\r
+};\r
+\r
+struct SVfrDataType {\r
+ INT8 mTypeName[MAX_NAME_LEN];\r
+ UINT8 mType;\r
+ UINT32 mAlign;\r
+ UINT32 mTotalSize;\r
+ SVfrDataField *mMembers;\r
+ SVfrDataType *mNext;\r
+};\r
+\r
+class CVfrVarDataTypeDB {\r
+private:\r
+ SVfrDataType *mDataTypeList;\r
+ UINT32 mPackAlign;\r
+\r
+ SVfrDataType *mNewDataType;\r
+ SVfrDataType *mCurrDataType;\r
+ SVfrDataField *mCurrDataField;\r
+\r
+ VOID InternalTypesListInit (VOID);\r
+ VOID RegisterNewType (IN SVfrDataType *);\r
+\r
+ EFI_VFR_RETURN_CODE ExtractStructTypeName (IN INT8 *&, OUT INT8 *);\r
+ EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN INT8 *&, OUT INT8 *, OUT UINT32 &);\r
+ EFI_VFR_RETURN_CODE GetTypeField (IN INT8 *, IN SVfrDataType *, IN SVfrDataField *&);\r
+ EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);\r
+ UINT8 GetFieldWidth (IN SVfrDataField *);\r
+ UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);\r
+\r
+public:\r
+ CVfrVarDataTypeDB (VOID);\r
+ ~CVfrVarDataTypeDB (VOID);\r
+\r
+ EFI_VFR_RETURN_CODE Pack (IN UINT32);\r
+ VOID UnPack (VOID);\r
+\r
+ VOID DeclareDataTypeBegin (VOID);\r
+ EFI_VFR_RETURN_CODE SetNewTypeName (IN INT8 *);\r
+ EFI_VFR_RETURN_CODE DataTypeAddField (IN INT8 *, IN INT8 *, IN UINT32);\r
+ VOID DeclareDataTypeEnd (VOID);\r
+\r
+ EFI_VFR_RETURN_CODE GetDataType (IN INT8 *, OUT SVfrDataType **);\r
+ EFI_VFR_RETURN_CODE GetDataTypeSize (IN INT8 *, OUT UINT32 *);\r
+ EFI_VFR_RETURN_CODE GetDataFieldInfo (IN INT8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);\r
+\r
+ EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT INT8 ***, OUT UINT32 *);\r
+ BOOLEAN IsTypeNameDefined (IN INT8 *);\r
+\r
+#ifdef CVFR_VARDATATYPEDB_DEBUG\r
+ VOID ParserDB ();\r
+#endif\r
+};\r
+\r
+typedef enum {\r
+ EFI_VFR_VARSTORE_INVALID,\r
+ EFI_VFR_VARSTORE_BUFFER,\r
+ EFI_VFR_VARSTORE_EFI,\r
+ EFI_VFR_VARSTORE_NAME\r
+} EFI_VFR_VARSTORE_TYPE;\r
+\r
+struct SVfrVarStorageNode {\r
+ EFI_GUID mGuid;\r
+ INT8 *mVarStoreName;\r
+ EFI_VARSTORE_ID mVarStoreId;\r
+ struct SVfrVarStorageNode *mNext;\r
+\r
+ EFI_VFR_VARSTORE_TYPE mVarStoreType;\r
+ union {\r
+ // EFI Variable\r
+ struct {\r
+ EFI_STRING_ID mEfiVarName;\r
+ UINT32 mEfiVarSize;\r
+ } mEfiVar;\r
+\r
+ // Buffer Storage\r
+ SVfrDataType *mDataType;\r
+\r
+ // NameValue Storage\r
+ struct {\r
+ EFI_STRING_ID *mNameTable;\r
+ UINT32 mTableSize;\r
+ } mNameSpace;\r
+ } mStorageInfo;\r
+\r
+public:\r
+ SVfrVarStorageNode (IN EFI_GUID *, IN INT8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32);\r
+ SVfrVarStorageNode (IN EFI_GUID *, IN INT8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *);\r
+ SVfrVarStorageNode (IN INT8 *, IN EFI_VARSTORE_ID);\r
+ ~SVfrVarStorageNode (VOID);\r
+};\r
+\r
+struct EFI_VARSTORE_INFO {\r
+ EFI_VARSTORE_ID mVarStoreId;\r
+ union {\r
+ EFI_STRING_ID mVarName;\r
+ UINT16 mVarOffset;\r
+ } mInfo;\r
+ UINT8 mVarType;\r
+ UINT32 mVarTotalSize;\r
+\r
+ EFI_VARSTORE_INFO (VOID);\r
+ EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);\r
+ BOOLEAN operator == (IN EFI_VARSTORE_INFO *);\r
+};\r
+\r
+#define EFI_VARSTORE_ID_MAX 0xFFFF\r
+#define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
+\r
+class CVfrDataStorage {\r
+private:\r
+ UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];\r
+\r
+ struct SVfrVarStorageNode *mBufferVarStoreList;\r
+ struct SVfrVarStorageNode *mEfiVarStoreList;\r
+ struct SVfrVarStorageNode *mNameVarStoreList;\r
+\r
+ struct SVfrVarStorageNode *mCurrVarStorageNode;\r
+ struct SVfrVarStorageNode *mNewVarStorageNode;\r
+\r
+private:\r
+\r
+ EFI_VARSTORE_ID GetFreeVarStoreId (VOID);\r
+ BOOLEAN ChekVarStoreIdFree (IN EFI_VARSTORE_ID);\r
+ VOID MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);\r
+ VOID MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);\r
+\r
+public:\r
+ CVfrDataStorage ();\r
+ ~CVfrDataStorage ();\r
+\r
+ EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (INT8 *);\r
+ EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);\r
+ EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);\r
+\r
+ EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN INT8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32);\r
+\r
+ EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN INT8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN INT8 *, IN EFI_VARSTORE_ID);\r
+\r
+ EFI_VFR_RETURN_CODE GetVarStoreId (IN INT8 *, OUT EFI_VARSTORE_ID *);\r
+ EFI_VFR_RETURN_CODE GetVarStoreType (IN INT8 *, OUT EFI_VFR_VARSTORE_TYPE &);\r
+ EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT INT8 **);\r
+\r
+ EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN INT8 *, OUT INT8 **);\r
+ EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);\r
+ EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);\r
+\r
+ EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN INT8 *, IN EFI_VARSTORE_INFO &);\r
+};\r
+\r
+#define EFI_QUESTION_ID_MAX 0xFFFF\r
+#define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
+#define EFI_QUESTION_ID_INVALID 0x0\r
+\r
+#define DATE_YEAR_BITMASK 0x0000FFFF\r
+#define DATE_MONTH_BITMASK 0x00FF0000\r
+#define DATE_DAY_BITMASK 0xFF000000\r
+#define TIME_HOUR_BITMASK 0x000000FF\r
+#define TIME_MINUTE_BITMASK 0x0000FF00\r
+#define TIME_SECOND_BITMASK 0x00FF0000\r
+\r
+struct SVfrQuestionNode {\r
+ INT8 *mName;\r
+ INT8 *mVarIdStr;\r
+ EFI_QUESTION_ID mQuestionId;\r
+ UINT32 mBitMask;\r
+ SVfrQuestionNode *mNext;\r
+\r
+ SVfrQuestionNode (IN INT8 *, IN INT8 *, IN UINT32 BitMask = 0);\r
+ ~SVfrQuestionNode ();\r
+};\r
+\r
+class CVfrQuestionDB {\r
+private:\r
+ SVfrQuestionNode *mQuestionList;\r
+ UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];\r
+\r
+private:\r
+ EFI_QUESTION_ID GetFreeQuestionId (VOID);\r
+ BOOLEAN ChekQuestionIdFree (IN EFI_QUESTION_ID);\r
+ VOID MarkQuestionIdUsed (IN EFI_QUESTION_ID);\r
+ VOID MarkQuestionIdUnused (IN EFI_QUESTION_ID);\r
+\r
+public:\r
+ CVfrQuestionDB ();\r
+ ~CVfrQuestionDB();\r
+\r
+ EFI_VFR_RETURN_CODE RegisterQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);\r
+ VOID RegisterOldDateQuestion (IN INT8 *, IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);\r
+ VOID RegisterNewDateQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);\r
+ VOID RegisterOldTimeQuestion (IN INT8 *, IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);\r
+ VOID RegisterNewTimeQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);\r
+ EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);\r
+ VOID GetQuestionId (IN INT8 *, IN INT8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);\r
+ EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);\r
+ EFI_VFR_RETURN_CODE FindQuestion (IN INT8 *);\r
+ };\r
+\r
+struct SVfrDefaultStoreNode {\r
+ EFI_IFR_DEFAULTSTORE *mObjBinAddr;\r
+ INT8 *mRefName;\r
+ EFI_STRING_ID mDefaultStoreNameId;\r
+ UINT16 mDefaultId;\r
+\r
+ SVfrDefaultStoreNode *mNext;\r
+\r
+ SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN INT8 *, IN EFI_STRING_ID, IN UINT16);\r
+ ~SVfrDefaultStoreNode();\r
+};\r
+\r
+class CVfrDefaultStore {\r
+private:\r
+ SVfrDefaultStoreNode *mDefaultStoreList;\r
+\r
+public:\r
+ CVfrDefaultStore ();\r
+ ~CVfrDefaultStore ();\r
+\r
+ EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN INT8 *, IN EFI_STRING_ID, IN UINT16);\r
+ EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN INT8 *, IN EFI_STRING_ID);\r
+ BOOLEAN DefaultIdRegistered (IN UINT16);\r
+ EFI_VFR_RETURN_CODE GetDefaultId (IN INT8 *, OUT UINT16 *);\r
+ EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN INT8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);\r
+};\r
+\r
+#define EFI_RULE_ID_START 0x01\r
+#define EFI_RULE_ID_INVALID 0x00\r
+\r
+struct SVfrRuleNode {\r
+ UINT8 mRuleId;\r
+ INT8 *mRuleName;\r
+ SVfrRuleNode *mNext;\r
+\r
+ SVfrRuleNode(IN INT8 *, IN UINT8);\r
+ ~SVfrRuleNode();\r
+};\r
+\r
+class CVfrRulesDB {\r
+private:\r
+ SVfrRuleNode *mRuleList;\r
+ UINT8 mFreeRuleId;\r
+\r
+public:\r
+ CVfrRulesDB ();\r
+ ~CVfrRulesDB();\r
+\r
+ VOID RegisterRule (IN INT8 *);\r
+ UINT8 GetRuleId (IN INT8 *);\r
+};\r
+\r
+#define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))\r
+#define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))\r
+\r
+#endif\r