mirror of https://github.com/acidanthera/audk.git
462 lines
15 KiB
C++
462 lines
15 KiB
C++
/** @file
|
|
|
|
Vfr common library functions.
|
|
|
|
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#ifndef _VFRUTILITYLIB_H_
|
|
#define _VFRUTILITYLIB_H_
|
|
|
|
#include "string.h"
|
|
#include "Common/UefiBaseTypes.h"
|
|
#include "EfiVfr.h"
|
|
#include "VfrError.h"
|
|
|
|
extern BOOLEAN VfrCompatibleMode;
|
|
|
|
#define MAX_NAME_LEN 64
|
|
#define MAX_STRING_LEN 0x100
|
|
#define DEFAULT_ALIGN 1
|
|
#define DEFAULT_PACK_ALIGN 0x8
|
|
#define DEFAULT_NAME_TABLE_ITEMS 1024
|
|
|
|
#define EFI_BITS_SHIFT_PER_UINT32 0x5
|
|
#define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
|
|
|
|
#define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
|
|
|
|
class CVfrBinaryOutput {
|
|
public:
|
|
virtual VOID WriteLine (IN FILE *, IN UINT32, IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);
|
|
virtual VOID WriteEnd (IN FILE *, IN UINT32, IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);
|
|
};
|
|
|
|
UINT32
|
|
_STR2U32 (
|
|
IN CHAR8 *Str
|
|
);
|
|
|
|
struct SConfigInfo {
|
|
UINT16 mOffset;
|
|
UINT16 mWidth;
|
|
UINT8 *mValue;
|
|
SConfigInfo *mNext;
|
|
|
|
SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
|
|
~SConfigInfo (VOID);
|
|
};
|
|
|
|
struct SConfigItem {
|
|
CHAR8 *mName; // varstore name
|
|
CHAR8 *mId; // varstore ID
|
|
SConfigInfo *mInfoStrList; // list of Offset/Value in the varstore
|
|
SConfigItem *mNext;
|
|
|
|
public:
|
|
SConfigItem (IN CHAR8 *, IN CHAR8 *);
|
|
SConfigItem (IN CHAR8 *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);
|
|
virtual ~SConfigItem ();
|
|
};
|
|
|
|
class CVfrBufferConfig {
|
|
private:
|
|
SConfigItem *mItemListHead;
|
|
SConfigItem *mItemListTail;
|
|
SConfigItem *mItemListPos;
|
|
|
|
public:
|
|
CVfrBufferConfig (VOID);
|
|
virtual ~CVfrBufferConfig (VOID);
|
|
|
|
virtual UINT8 Register (IN CHAR8 *, IN CHAR8 *Info = NULL);
|
|
virtual VOID Open (VOID);
|
|
virtual BOOLEAN Eof(VOID);
|
|
virtual UINT8 Select (IN CHAR8 *, IN CHAR8 *Info = NULL);
|
|
virtual UINT8 Write (IN CONST CHAR8, IN CHAR8 *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
|
|
#if 0
|
|
virtual UINT8 Read (OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **);
|
|
#endif
|
|
virtual VOID Close (VOID);
|
|
virtual VOID OutputCFile (IN FILE *, IN CHAR8 *);
|
|
};
|
|
|
|
extern CVfrBufferConfig gCVfrBufferConfig;
|
|
|
|
#define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
|
|
#define INVALID_ARRAY_INDEX 0xFFFFFFFF
|
|
|
|
struct SVfrDataType;
|
|
|
|
struct SVfrDataField {
|
|
CHAR8 mFieldName[MAX_NAME_LEN];
|
|
SVfrDataType *mFieldType;
|
|
UINT32 mOffset;
|
|
UINT32 mArrayNum;
|
|
SVfrDataField *mNext;
|
|
};
|
|
|
|
struct SVfrDataType {
|
|
CHAR8 mTypeName[MAX_NAME_LEN];
|
|
UINT8 mType;
|
|
UINT32 mAlign;
|
|
UINT32 mTotalSize;
|
|
SVfrDataField *mMembers;
|
|
SVfrDataType *mNext;
|
|
};
|
|
|
|
#define VFR_PACK_ASSIGN 0x01
|
|
#define VFR_PACK_SHOW 0x02
|
|
#define VFR_PACK_PUSH 0x04
|
|
#define VFR_PACK_POP 0x08
|
|
|
|
#define PACKSTACK_MAX_SIZE 0x400
|
|
|
|
struct SVfrPackStackNode {
|
|
CHAR8 *mIdentifier;
|
|
UINT32 mNumber;
|
|
SVfrPackStackNode *mNext;
|
|
|
|
SVfrPackStackNode (IN CHAR8 *Identifier, IN UINT32 Number) {
|
|
mIdentifier = NULL;
|
|
mNumber = Number;
|
|
mNext = NULL;
|
|
|
|
if (Identifier != NULL) {
|
|
mIdentifier = new CHAR8[strlen (Identifier) + 1];
|
|
strcpy (mIdentifier, Identifier);
|
|
}
|
|
}
|
|
|
|
~SVfrPackStackNode (VOID) {
|
|
if (mIdentifier != NULL) {
|
|
delete mIdentifier;
|
|
}
|
|
mNext = NULL;
|
|
}
|
|
|
|
bool Match (IN CHAR8 *Identifier) {
|
|
if (Identifier == NULL) {
|
|
return TRUE;
|
|
} else if (mIdentifier == NULL) {
|
|
return FALSE;
|
|
} else if (strcmp (Identifier, mIdentifier) == 0) {
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
};
|
|
|
|
class CVfrVarDataTypeDB {
|
|
private:
|
|
UINT32 mPackAlign;
|
|
SVfrPackStackNode *mPackStack;
|
|
|
|
public:
|
|
EFI_VFR_RETURN_CODE Pack (IN UINT32, IN UINT8, IN CHAR8 *Identifier = NULL, IN UINT32 Number = DEFAULT_PACK_ALIGN);
|
|
|
|
private:
|
|
SVfrDataType *mDataTypeList;
|
|
|
|
SVfrDataType *mNewDataType;
|
|
SVfrDataType *mCurrDataType;
|
|
SVfrDataField *mCurrDataField;
|
|
|
|
VOID InternalTypesListInit (VOID);
|
|
VOID RegisterNewType (IN SVfrDataType *);
|
|
|
|
EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *);
|
|
EFI_VFR_RETURN_CODE GetTypeField (IN CONST CHAR8 *, IN SVfrDataType *, IN SVfrDataField *&);
|
|
EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);
|
|
UINT8 GetFieldWidth (IN SVfrDataField *);
|
|
UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);
|
|
|
|
public:
|
|
CVfrVarDataTypeDB (VOID);
|
|
~CVfrVarDataTypeDB (VOID);
|
|
|
|
VOID DeclareDataTypeBegin (VOID);
|
|
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
|
|
EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32);
|
|
VOID DeclareDataTypeEnd (VOID);
|
|
|
|
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
|
|
EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);
|
|
EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *);
|
|
EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);
|
|
|
|
EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);
|
|
EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &);
|
|
|
|
BOOLEAN IsTypeNameDefined (IN CHAR8 *);
|
|
|
|
VOID Dump(IN FILE *);
|
|
//
|
|
// First the declared
|
|
//
|
|
CHAR8 *mFirstNewDataTypeName;
|
|
#ifdef CVFR_VARDATATYPEDB_DEBUG
|
|
VOID ParserDB ();
|
|
#endif
|
|
};
|
|
|
|
extern CVfrVarDataTypeDB gCVfrVarDataTypeDB;
|
|
|
|
typedef enum {
|
|
EFI_VFR_VARSTORE_INVALID,
|
|
EFI_VFR_VARSTORE_BUFFER,
|
|
EFI_VFR_VARSTORE_EFI,
|
|
EFI_VFR_VARSTORE_NAME
|
|
} EFI_VFR_VARSTORE_TYPE;
|
|
|
|
struct SVfrVarStorageNode {
|
|
EFI_GUID mGuid;
|
|
CHAR8 *mVarStoreName;
|
|
EFI_VARSTORE_ID mVarStoreId;
|
|
BOOLEAN mAssignedFlag; //Create varstore opcode
|
|
struct SVfrVarStorageNode *mNext;
|
|
|
|
EFI_VFR_VARSTORE_TYPE mVarStoreType;
|
|
union {
|
|
// EFI Variable
|
|
struct {
|
|
EFI_STRING_ID mEfiVarName;
|
|
UINT32 mEfiVarSize;
|
|
} mEfiVar;
|
|
|
|
// Buffer Storage
|
|
SVfrDataType *mDataType;
|
|
|
|
// NameValue Storage
|
|
struct {
|
|
EFI_STRING_ID *mNameTable;
|
|
UINT32 mTableSize;
|
|
} mNameSpace;
|
|
} mStorageInfo;
|
|
|
|
public:
|
|
SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
|
|
SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *, IN BOOLEAN Flag = TRUE);
|
|
SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);
|
|
~SVfrVarStorageNode (VOID);
|
|
};
|
|
|
|
struct EFI_VARSTORE_INFO {
|
|
EFI_VARSTORE_ID mVarStoreId;
|
|
union {
|
|
EFI_STRING_ID mVarName;
|
|
UINT16 mVarOffset;
|
|
} mInfo;
|
|
UINT8 mVarType;
|
|
UINT32 mVarTotalSize;
|
|
|
|
EFI_VARSTORE_INFO (VOID);
|
|
EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
|
|
BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
|
|
};
|
|
|
|
#define EFI_VARSTORE_ID_MAX 0xFFFF
|
|
#define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
|
|
|
|
class CVfrDataStorage {
|
|
private:
|
|
UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
|
|
|
|
struct SVfrVarStorageNode *mBufferVarStoreList;
|
|
struct SVfrVarStorageNode *mEfiVarStoreList;
|
|
struct SVfrVarStorageNode *mNameVarStoreList;
|
|
|
|
struct SVfrVarStorageNode *mCurrVarStorageNode;
|
|
struct SVfrVarStorageNode *mNewVarStorageNode;
|
|
|
|
private:
|
|
|
|
EFI_VARSTORE_ID GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType = EFI_VFR_VARSTORE_BUFFER);
|
|
BOOLEAN ChekVarStoreIdFree (IN EFI_VARSTORE_ID);
|
|
VOID MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);
|
|
VOID MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);
|
|
|
|
public:
|
|
CVfrDataStorage ();
|
|
~CVfrDataStorage ();
|
|
|
|
SVfrVarStorageNode * GetBufferVarStoreList () {
|
|
return mBufferVarStoreList;
|
|
}
|
|
SVfrVarStorageNode * GetEfiVarStoreList () {
|
|
return mEfiVarStoreList;
|
|
}
|
|
EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (CHAR8 *);
|
|
EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
|
|
EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
|
|
|
|
EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
|
|
|
|
EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);
|
|
|
|
EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *);
|
|
EFI_VFR_RETURN_CODE GetVarStoreType (IN CHAR8 *, OUT EFI_VFR_VARSTORE_TYPE &);
|
|
EFI_VFR_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID);
|
|
EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **);
|
|
EFI_VFR_RETURN_CODE GetVarStoreByDataType (IN CHAR8 *, OUT SVfrVarStorageNode **);
|
|
|
|
EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN CHAR8 *, OUT CHAR8 **);
|
|
EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);
|
|
EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);
|
|
|
|
EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN CHAR8 *, IN EFI_VARSTORE_INFO &);
|
|
};
|
|
|
|
#define EFI_QUESTION_ID_MAX 0xFFFF
|
|
#define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
|
|
#define EFI_QUESTION_ID_INVALID 0x0
|
|
|
|
#define DATE_YEAR_BITMASK 0x0000FFFF
|
|
#define DATE_MONTH_BITMASK 0x00FF0000
|
|
#define DATE_DAY_BITMASK 0xFF000000
|
|
#define TIME_HOUR_BITMASK 0x000000FF
|
|
#define TIME_MINUTE_BITMASK 0x0000FF00
|
|
#define TIME_SECOND_BITMASK 0x00FF0000
|
|
|
|
struct SVfrQuestionNode {
|
|
CHAR8 *mName;
|
|
CHAR8 *mVarIdStr;
|
|
EFI_QUESTION_ID mQuestionId;
|
|
UINT32 mBitMask;
|
|
SVfrQuestionNode *mNext;
|
|
EFI_QUESION_TYPE mQtype;
|
|
|
|
SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);
|
|
~SVfrQuestionNode ();
|
|
};
|
|
|
|
class CVfrQuestionDB {
|
|
private:
|
|
SVfrQuestionNode *mQuestionList;
|
|
UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
|
|
|
|
private:
|
|
EFI_QUESTION_ID GetFreeQuestionId (VOID);
|
|
BOOLEAN ChekQuestionIdFree (IN EFI_QUESTION_ID);
|
|
VOID MarkQuestionIdUsed (IN EFI_QUESTION_ID);
|
|
VOID MarkQuestionIdUnused (IN EFI_QUESTION_ID);
|
|
|
|
public:
|
|
CVfrQuestionDB ();
|
|
~CVfrQuestionDB();
|
|
|
|
EFI_VFR_RETURN_CODE RegisterQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
|
|
VOID RegisterOldDateQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
|
|
VOID RegisterNewDateQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
|
|
VOID RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
|
|
VOID RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
|
|
VOID RegisterRefQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
|
|
EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
|
|
VOID GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &, OUT EFI_QUESION_TYPE *QType = NULL);
|
|
EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
|
|
EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);
|
|
VOID PrintAllQuestion (IN VOID);
|
|
VOID ResetInit (IN VOID);
|
|
|
|
VOID SetCompatibleMode (IN BOOLEAN Mode) {
|
|
VfrCompatibleMode = Mode;
|
|
}
|
|
};
|
|
|
|
struct SVfrDefaultStoreNode {
|
|
EFI_IFR_DEFAULTSTORE *mObjBinAddr;
|
|
CHAR8 *mRefName;
|
|
EFI_STRING_ID mDefaultStoreNameId;
|
|
UINT16 mDefaultId;
|
|
|
|
SVfrDefaultStoreNode *mNext;
|
|
|
|
SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
|
|
~SVfrDefaultStoreNode();
|
|
};
|
|
|
|
class CVfrDefaultStore {
|
|
private:
|
|
SVfrDefaultStoreNode *mDefaultStoreList;
|
|
|
|
public:
|
|
CVfrDefaultStore ();
|
|
~CVfrDefaultStore ();
|
|
|
|
EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
|
|
EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN CHAR8 *, IN EFI_STRING_ID);
|
|
BOOLEAN DefaultIdRegistered (IN UINT16);
|
|
EFI_VFR_RETURN_CODE GetDefaultId (IN CHAR8 *, OUT UINT16 *);
|
|
EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);
|
|
};
|
|
|
|
#define EFI_RULE_ID_START 0x01
|
|
#define EFI_RULE_ID_INVALID 0x00
|
|
|
|
struct SVfrRuleNode {
|
|
UINT8 mRuleId;
|
|
CHAR8 *mRuleName;
|
|
SVfrRuleNode *mNext;
|
|
|
|
SVfrRuleNode(IN CHAR8 *, IN UINT8);
|
|
~SVfrRuleNode();
|
|
};
|
|
|
|
class CVfrRulesDB {
|
|
private:
|
|
SVfrRuleNode *mRuleList;
|
|
UINT8 mFreeRuleId;
|
|
|
|
public:
|
|
CVfrRulesDB ();
|
|
~CVfrRulesDB();
|
|
|
|
VOID RegisterRule (IN CHAR8 *);
|
|
UINT8 GetRuleId (IN CHAR8 *);
|
|
};
|
|
|
|
class CVfrStringDB {
|
|
private:
|
|
CHAR8 *mStringFileName;
|
|
|
|
EFI_STATUS FindStringBlock (
|
|
IN UINT8 *StringData,
|
|
IN EFI_STRING_ID StringId,
|
|
OUT UINT32 *StringTextOffset,
|
|
OUT UINT8 *BlockType
|
|
);
|
|
|
|
UINT32 GetUnicodeStringTextSize (
|
|
IN UINT8 *StringSrc
|
|
);
|
|
|
|
BOOLEAN GetBestLanguage (
|
|
IN CONST CHAR8 *SupportedLanguages,
|
|
IN CHAR8 *Language
|
|
);
|
|
|
|
public:
|
|
CVfrStringDB ();
|
|
~CVfrStringDB ();
|
|
|
|
VOID SetStringFileName (
|
|
IN CHAR8 *StringFileName
|
|
);
|
|
|
|
CHAR8 * GetVarStoreNameFormStringId (
|
|
IN EFI_STRING_ID StringId
|
|
);
|
|
|
|
};
|
|
|
|
#endif
|