3 Vfr common library functions.
\r
5 Copyright (c) 2004 - 2008, Intel Corporation
\r
6 All rights reserved. This program and the accompanying materials
\r
7 are licensed and made available under the terms and conditions of the BSD License
\r
8 which accompanies this distribution. The full text of the license may be found at
\r
9 http://opensource.org/licenses/bsd-license.php
\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
\r
16 #ifndef _VFRUTILITYLIB_H_
\r
17 #define _VFRUTILITYLIB_H_
\r
20 #include "Common/UefiBaseTypes.h"
\r
22 #include "VfrError.h"
\r
24 extern BOOLEAN VfrCompatibleMode;
\r
26 #define MAX_NAME_LEN 64
\r
27 #define MAX_STRING_LEN 0x100
\r
28 #define DEFAULT_ALIGN 1
\r
29 #define DEFAULT_PACK_ALIGN 0x8
\r
30 #define DEFAULT_NAME_TABLE_ITEMS 1024
\r
32 #define EFI_BITS_SHIFT_PER_UINT32 0x5
\r
33 #define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
\r
35 #define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
\r
37 class CVfrBinaryOutput {
\r
39 virtual VOID WriteLine (IN FILE *, IN UINT32, IN CHAR8 *, IN CHAR8 *, IN UINT32);
\r
40 virtual VOID WriteEnd (IN FILE *, IN UINT32, IN CHAR8 *, IN CHAR8 *, IN UINT32);
\r
48 struct SConfigInfo {
\r
54 SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
\r
55 ~SConfigInfo (VOID);
\r
58 struct SConfigItem {
\r
59 CHAR8 *mName; // varstore name
\r
60 CHAR8 *mId; // varstore ID
\r
61 SConfigInfo *mInfoStrList; // list of Offset/Value in the varstore
\r
65 SConfigItem (IN CHAR8 *, IN CHAR8 *);
\r
66 SConfigItem (IN CHAR8 *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);
\r
67 virtual ~SConfigItem ();
\r
70 class CVfrBufferConfig {
\r
72 SConfigItem *mItemListHead;
\r
73 SConfigItem *mItemListTail;
\r
74 SConfigItem *mItemListPos;
\r
77 CVfrBufferConfig (VOID);
\r
78 virtual ~CVfrBufferConfig (VOID);
\r
80 virtual UINT8 Register (IN CHAR8 *, IN CHAR8 *Info = NULL);
\r
81 virtual VOID Open (VOID);
\r
82 virtual BOOLEAN Eof(VOID);
\r
83 virtual UINT8 Select (IN CHAR8 *, IN CHAR8 *Info = NULL);
\r
84 virtual UINT8 Write (IN CONST CHAR8, IN CHAR8 *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
\r
86 virtual UINT8 Read (OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **);
\r
88 virtual VOID Close (VOID);
\r
89 virtual VOID OutputCFile (IN FILE *, IN CHAR8 *);
\r
92 extern CVfrBufferConfig gCVfrBufferConfig;
\r
94 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
\r
95 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
\r
97 struct SVfrDataType;
\r
99 struct SVfrDataField {
\r
100 CHAR8 mFieldName[MAX_NAME_LEN];
\r
101 SVfrDataType *mFieldType;
\r
104 SVfrDataField *mNext;
\r
107 struct SVfrDataType {
\r
108 CHAR8 mTypeName[MAX_NAME_LEN];
\r
112 SVfrDataField *mMembers;
\r
113 SVfrDataType *mNext;
\r
116 #define VFR_PACK_ASSIGN 0x01
\r
117 #define VFR_PACK_SHOW 0x02
\r
118 #define VFR_PACK_PUSH 0x04
\r
119 #define VFR_PACK_POP 0x08
\r
121 #define PACKSTACK_MAX_SIZE 0x400
\r
123 struct SVfrPackStackNode {
\r
124 CHAR8 *mIdentifier;
\r
126 SVfrPackStackNode *mNext;
\r
128 SVfrPackStackNode (IN CHAR8 *Identifier, IN UINT32 Number) {
\r
129 mIdentifier = NULL;
\r
133 if (Identifier != NULL) {
\r
134 mIdentifier = new CHAR8[strlen (Identifier) + 1];
\r
135 strcpy (mIdentifier, Identifier);
\r
139 ~SVfrPackStackNode (VOID) {
\r
140 if (mIdentifier != NULL) {
\r
141 delete mIdentifier;
\r
146 bool Match (IN CHAR8 *Identifier) {
\r
147 if (Identifier == NULL) {
\r
149 } else if (mIdentifier == NULL) {
\r
151 } else if (strcmp (Identifier, mIdentifier) == 0) {
\r
159 class CVfrVarDataTypeDB {
\r
162 SVfrPackStackNode *mPackStack;
\r
165 EFI_VFR_RETURN_CODE Pack (IN UINT32, IN UINT8, IN CHAR8 *Identifier = NULL, IN UINT32 Number = DEFAULT_PACK_ALIGN);
\r
168 SVfrDataType *mDataTypeList;
\r
170 SVfrDataType *mNewDataType;
\r
171 SVfrDataType *mCurrDataType;
\r
172 SVfrDataField *mCurrDataField;
\r
174 VOID InternalTypesListInit (VOID);
\r
175 VOID RegisterNewType (IN SVfrDataType *);
\r
177 EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *);
\r
178 EFI_VFR_RETURN_CODE GetTypeField (IN CHAR8 *, IN SVfrDataType *, IN SVfrDataField *&);
\r
179 EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);
\r
180 UINT8 GetFieldWidth (IN SVfrDataField *);
\r
181 UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);
\r
184 CVfrVarDataTypeDB (VOID);
\r
185 ~CVfrVarDataTypeDB (VOID);
\r
187 VOID DeclareDataTypeBegin (VOID);
\r
188 EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
\r
189 EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32);
\r
190 VOID DeclareDataTypeEnd (VOID);
\r
192 EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
\r
193 EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);
\r
194 EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *);
\r
195 EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);
\r
197 EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);
\r
198 EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &);
\r
200 BOOLEAN IsTypeNameDefined (IN CHAR8 *);
\r
202 // First the declared
\r
204 CHAR8 *mFirstNewDataTypeName;
\r
205 #ifdef CVFR_VARDATATYPEDB_DEBUG
\r
211 EFI_VFR_VARSTORE_INVALID,
\r
212 EFI_VFR_VARSTORE_BUFFER,
\r
213 EFI_VFR_VARSTORE_EFI,
\r
214 EFI_VFR_VARSTORE_NAME
\r
215 } EFI_VFR_VARSTORE_TYPE;
\r
217 struct SVfrVarStorageNode {
\r
219 CHAR8 *mVarStoreName;
\r
220 EFI_VARSTORE_ID mVarStoreId;
\r
221 BOOLEAN mAssignedFlag; //Create varstore opcode
\r
222 struct SVfrVarStorageNode *mNext;
\r
224 EFI_VFR_VARSTORE_TYPE mVarStoreType;
\r
228 EFI_STRING_ID mEfiVarName;
\r
229 UINT32 mEfiVarSize;
\r
233 SVfrDataType *mDataType;
\r
235 // NameValue Storage
\r
237 EFI_STRING_ID *mNameTable;
\r
243 SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
\r
244 SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *, IN BOOLEAN Flag = TRUE);
\r
245 SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);
\r
246 ~SVfrVarStorageNode (VOID);
\r
249 struct EFI_VARSTORE_INFO {
\r
250 EFI_VARSTORE_ID mVarStoreId;
\r
252 EFI_STRING_ID mVarName;
\r
256 UINT32 mVarTotalSize;
\r
258 EFI_VARSTORE_INFO (VOID);
\r
259 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
\r
260 BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
\r
263 #define EFI_VARSTORE_ID_MAX 0xFFFF
\r
264 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
\r
266 class CVfrDataStorage {
\r
268 UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
\r
270 struct SVfrVarStorageNode *mBufferVarStoreList;
\r
271 struct SVfrVarStorageNode *mEfiVarStoreList;
\r
272 struct SVfrVarStorageNode *mNameVarStoreList;
\r
274 struct SVfrVarStorageNode *mCurrVarStorageNode;
\r
275 struct SVfrVarStorageNode *mNewVarStorageNode;
\r
279 EFI_VARSTORE_ID GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType = EFI_VFR_VARSTORE_BUFFER);
\r
280 BOOLEAN ChekVarStoreIdFree (IN EFI_VARSTORE_ID);
\r
281 VOID MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);
\r
282 VOID MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);
\r
285 CVfrDataStorage ();
\r
286 ~CVfrDataStorage ();
\r
288 SVfrVarStorageNode * GetBufferVarStoreList () {
\r
289 return mBufferVarStoreList;
\r
291 SVfrVarStorageNode * GetEfiVarStoreList () {
\r
292 return mEfiVarStoreList;
\r
294 EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (CHAR8 *);
\r
295 EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
\r
296 EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
\r
298 EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
\r
300 EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);
\r
302 EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *);
\r
303 EFI_VFR_RETURN_CODE GetVarStoreType (IN CHAR8 *, OUT EFI_VFR_VARSTORE_TYPE &);
\r
304 EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **);
\r
306 EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN CHAR8 *, OUT CHAR8 **);
\r
307 EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);
\r
308 EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);
\r
310 EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN CHAR8 *, IN EFI_VARSTORE_INFO &);
\r
313 #define EFI_QUESTION_ID_MAX 0xFFFF
\r
314 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
\r
315 #define EFI_QUESTION_ID_INVALID 0x0
\r
317 #define DATE_YEAR_BITMASK 0x0000FFFF
\r
318 #define DATE_MONTH_BITMASK 0x00FF0000
\r
319 #define DATE_DAY_BITMASK 0xFF000000
\r
320 #define TIME_HOUR_BITMASK 0x000000FF
\r
321 #define TIME_MINUTE_BITMASK 0x0000FF00
\r
322 #define TIME_SECOND_BITMASK 0x00FF0000
\r
324 struct SVfrQuestionNode {
\r
327 EFI_QUESTION_ID mQuestionId;
\r
329 SVfrQuestionNode *mNext;
\r
331 SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);
\r
332 ~SVfrQuestionNode ();
\r
335 class CVfrQuestionDB {
\r
337 SVfrQuestionNode *mQuestionList;
\r
338 UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
\r
341 EFI_QUESTION_ID GetFreeQuestionId (VOID);
\r
342 BOOLEAN ChekQuestionIdFree (IN EFI_QUESTION_ID);
\r
343 VOID MarkQuestionIdUsed (IN EFI_QUESTION_ID);
\r
344 VOID MarkQuestionIdUnused (IN EFI_QUESTION_ID);
\r
350 EFI_VFR_RETURN_CODE RegisterQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
\r
351 VOID RegisterOldDateQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
\r
352 VOID RegisterNewDateQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
\r
353 VOID RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
\r
354 VOID RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
\r
355 EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
\r
356 VOID GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);
\r
357 EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
\r
358 EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);
\r
359 VOID PrintAllQuestion (IN VOID);
\r
360 VOID ResetInit (IN VOID);
\r
362 VOID SetCompatibleMode (IN BOOLEAN Mode) {
\r
363 VfrCompatibleMode = Mode;
\r
367 struct SVfrDefaultStoreNode {
\r
368 EFI_IFR_DEFAULTSTORE *mObjBinAddr;
\r
370 EFI_STRING_ID mDefaultStoreNameId;
\r
373 SVfrDefaultStoreNode *mNext;
\r
375 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
\r
376 ~SVfrDefaultStoreNode();
\r
379 class CVfrDefaultStore {
\r
381 SVfrDefaultStoreNode *mDefaultStoreList;
\r
384 CVfrDefaultStore ();
\r
385 ~CVfrDefaultStore ();
\r
387 EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
\r
388 EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN CHAR8 *, IN EFI_STRING_ID);
\r
389 BOOLEAN DefaultIdRegistered (IN UINT16);
\r
390 EFI_VFR_RETURN_CODE GetDefaultId (IN CHAR8 *, OUT UINT16 *);
\r
391 EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);
\r
394 #define EFI_RULE_ID_START 0x01
\r
395 #define EFI_RULE_ID_INVALID 0x00
\r
397 struct SVfrRuleNode {
\r
400 SVfrRuleNode *mNext;
\r
402 SVfrRuleNode(IN CHAR8 *, IN UINT8);
\r
406 class CVfrRulesDB {
\r
408 SVfrRuleNode *mRuleList;
\r
415 VOID RegisterRule (IN CHAR8 *);
\r
416 UINT8 GetRuleId (IN CHAR8 *);
\r
419 #define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))
\r
420 #define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))
\r