2 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
3 This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #ifndef _VFRUTILITYLIB_H_
19 #define _VFRUTILITYLIB_H_
27 #define MAX_NAME_LEN 64
28 #define DEFAULT_ALIGN 1
29 #define DEFAULT_PACK_ALIGN 0x8
30 #define DEFAULT_NAME_TABLE_ITEMS 1024
32 #define EFI_BITS_SHIFT_PER_UINT32 0x5
33 #define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
35 #define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
37 class CVfrBinaryOutput
{
39 virtual VOID
WriteLine (IN
FILE *, IN UINT32
, IN INT8
*, IN INT8
*, IN UINT32
);
40 virtual VOID
WriteEnd (IN
FILE *, IN UINT32
, IN INT8
*, IN INT8
*, IN UINT32
);
54 SConfigInfo (IN UINT8
, IN UINT16
, IN UINT32
, IN EFI_IFR_TYPE_VALUE
);
59 INT8
*mName
; // varstore name
60 INT8
*mId
; // varstore ID
61 SConfigInfo
*mInfoStrList
; // list of Offset/Value in the varstore
65 SConfigItem (IN INT8
*, IN INT8
*);
66 SConfigItem (IN INT8
*, IN INT8
*, IN UINT8
, IN UINT16
, IN UINT16
, IN EFI_IFR_TYPE_VALUE
);
67 virtual ~SConfigItem ();
70 class CVfrBufferConfig
{
72 SConfigItem
*mItemListHead
;
73 SConfigItem
*mItemListTail
;
74 SConfigItem
*mItemListPos
;
77 CVfrBufferConfig (VOID
);
78 virtual ~CVfrBufferConfig (VOID
);
80 virtual UINT8
Register (IN INT8
*, IN INT8
*Info
= NULL
);
81 virtual VOID
Open (VOID
);
82 virtual BOOLEAN
Eof(VOID
);
83 virtual UINT8
Select (IN INT8
*, IN INT8
*Info
= NULL
);
84 virtual UINT8
Write (IN CONST CHAR8
, IN INT8
*, IN INT8
*, IN UINT8
, IN UINT16
, IN UINT32
, IN EFI_IFR_TYPE_VALUE
);
86 virtual UINT8
Read (OUT INT8
**, OUT INT8
**, OUT INT8
**, OUT INT8
**, OUT INT8
**);
88 virtual VOID
Close (VOID
);
89 virtual VOID
OutputCFile (IN
FILE *, IN INT8
*);
92 extern CVfrBufferConfig gCVfrBufferConfig
;
94 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
95 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
99 struct SVfrDataField
{
100 INT8 mFieldName
[MAX_NAME_LEN
];
101 SVfrDataType
*mFieldType
;
104 SVfrDataField
*mNext
;
107 struct SVfrDataType
{
108 INT8 mTypeName
[MAX_NAME_LEN
];
112 SVfrDataField
*mMembers
;
116 #define VFR_PACK_ASSIGN 0x01
117 #define VFR_PACK_SHOW 0x02
118 #define VFR_PACK_PUSH 0x04
119 #define VFR_PACK_POP 0x08
121 #define PACKSTACK_MAX_SIZE 0x400
123 struct SVfrPackStackNode
{
126 SVfrPackStackNode
*mNext
;
128 SVfrPackStackNode (IN INT8
*Identifier
, IN UINT32 Number
) {
133 if (Identifier
!= NULL
) {
134 mIdentifier
= new INT8
[strlen (Identifier
) + 1];
135 strcpy (mIdentifier
, Identifier
);
139 ~SVfrPackStackNode (VOID
) {
140 if (mIdentifier
!= NULL
) {
146 bool Match (IN INT8
*Identifier
) {
147 if (Identifier
== NULL
) {
149 } else if (mIdentifier
== NULL
) {
151 } else if (strcmp (Identifier
, mIdentifier
) == 0) {
159 class CVfrVarDataTypeDB
{
162 SVfrPackStackNode
*mPackStack
;
165 EFI_VFR_RETURN_CODE
Pack (IN UINT32
, IN UINT8
, IN INT8
*Identifier
= NULL
, IN UINT32 Number
= DEFAULT_PACK_ALIGN
);
168 SVfrDataType
*mDataTypeList
;
170 SVfrDataType
*mNewDataType
;
171 SVfrDataType
*mCurrDataType
;
172 SVfrDataField
*mCurrDataField
;
174 VOID
InternalTypesListInit (VOID
);
175 VOID
RegisterNewType (IN SVfrDataType
*);
177 EFI_VFR_RETURN_CODE
ExtractStructTypeName (IN INT8
*&, OUT INT8
*);
178 EFI_VFR_RETURN_CODE
ExtractFieldNameAndArrary (IN INT8
*&, OUT INT8
*, OUT UINT32
&);
179 EFI_VFR_RETURN_CODE
GetTypeField (IN INT8
*, IN SVfrDataType
*, IN SVfrDataField
*&);
180 EFI_VFR_RETURN_CODE
GetFieldOffset (IN SVfrDataField
*, IN UINT32
, OUT UINT32
&);
181 UINT8
GetFieldWidth (IN SVfrDataField
*);
182 UINT32
GetFieldSize (IN SVfrDataField
*, IN UINT32
);
185 CVfrVarDataTypeDB (VOID
);
186 ~CVfrVarDataTypeDB (VOID
);
188 VOID
DeclareDataTypeBegin (VOID
);
189 EFI_VFR_RETURN_CODE
SetNewTypeName (IN INT8
*);
190 EFI_VFR_RETURN_CODE
DataTypeAddField (IN INT8
*, IN INT8
*, IN UINT32
);
191 VOID
DeclareDataTypeEnd (VOID
);
193 EFI_VFR_RETURN_CODE
GetDataType (IN INT8
*, OUT SVfrDataType
**);
194 EFI_VFR_RETURN_CODE
GetDataTypeSize (IN INT8
*, OUT UINT32
*);
195 EFI_VFR_RETURN_CODE
GetDataTypeSize (IN UINT8
, OUT UINT32
*);
196 EFI_VFR_RETURN_CODE
GetDataFieldInfo (IN INT8
*, OUT UINT16
&, OUT UINT8
&, OUT UINT32
&);
198 EFI_VFR_RETURN_CODE
GetUserDefinedTypeNameList (OUT INT8
***, OUT UINT32
*);
199 BOOLEAN
IsTypeNameDefined (IN INT8
*);
201 #ifdef CVFR_VARDATATYPEDB_DEBUG
207 EFI_VFR_VARSTORE_INVALID
,
208 EFI_VFR_VARSTORE_BUFFER
,
209 EFI_VFR_VARSTORE_EFI
,
210 EFI_VFR_VARSTORE_NAME
211 } EFI_VFR_VARSTORE_TYPE
;
213 struct SVfrVarStorageNode
{
216 EFI_VARSTORE_ID mVarStoreId
;
217 struct SVfrVarStorageNode
*mNext
;
219 EFI_VFR_VARSTORE_TYPE mVarStoreType
;
223 EFI_STRING_ID mEfiVarName
;
228 SVfrDataType
*mDataType
;
232 EFI_STRING_ID
*mNameTable
;
238 SVfrVarStorageNode (IN EFI_GUID
*, IN INT8
*, IN EFI_VARSTORE_ID
, IN EFI_STRING_ID
, IN UINT32
);
239 SVfrVarStorageNode (IN EFI_GUID
*, IN INT8
*, IN EFI_VARSTORE_ID
, IN SVfrDataType
*);
240 SVfrVarStorageNode (IN INT8
*, IN EFI_VARSTORE_ID
);
241 ~SVfrVarStorageNode (VOID
);
244 struct EFI_VARSTORE_INFO
{
245 EFI_VARSTORE_ID mVarStoreId
;
247 EFI_STRING_ID mVarName
;
251 UINT32 mVarTotalSize
;
253 EFI_VARSTORE_INFO (VOID
);
254 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO
&);
255 BOOLEAN
operator == (IN EFI_VARSTORE_INFO
*);
258 #define EFI_VARSTORE_ID_MAX 0xFFFF
259 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
261 class CVfrDataStorage
{
263 UINT32 mFreeVarStoreIdBitMap
[EFI_FREE_VARSTORE_ID_BITMAP_SIZE
];
265 struct SVfrVarStorageNode
*mBufferVarStoreList
;
266 struct SVfrVarStorageNode
*mEfiVarStoreList
;
267 struct SVfrVarStorageNode
*mNameVarStoreList
;
269 struct SVfrVarStorageNode
*mCurrVarStorageNode
;
270 struct SVfrVarStorageNode
*mNewVarStorageNode
;
274 EFI_VARSTORE_ID
GetFreeVarStoreId (VOID
);
275 BOOLEAN
ChekVarStoreIdFree (IN EFI_VARSTORE_ID
);
276 VOID
MarkVarStoreIdUsed (IN EFI_VARSTORE_ID
);
277 VOID
MarkVarStoreIdUnused (IN EFI_VARSTORE_ID
);
283 EFI_VFR_RETURN_CODE
DeclareNameVarStoreBegin (INT8
*);
284 EFI_VFR_RETURN_CODE
NameTableAddItem (EFI_STRING_ID
);
285 EFI_VFR_RETURN_CODE
DeclareNameVarStoreEnd (EFI_GUID
*);
287 EFI_VFR_RETURN_CODE
DeclareEfiVarStore (IN INT8
*, IN EFI_GUID
*, IN EFI_STRING_ID
, IN UINT32
);
289 EFI_VFR_RETURN_CODE
DeclareBufferVarStore (IN INT8
*, IN EFI_GUID
*, IN CVfrVarDataTypeDB
*, IN INT8
*, IN EFI_VARSTORE_ID
);
291 EFI_VFR_RETURN_CODE
GetVarStoreId (IN INT8
*, OUT EFI_VARSTORE_ID
*);
292 EFI_VFR_RETURN_CODE
GetVarStoreType (IN INT8
*, OUT EFI_VFR_VARSTORE_TYPE
&);
293 EFI_VFR_VARSTORE_TYPE
GetVarStoreType (IN EFI_VARSTORE_ID
);
294 EFI_VFR_RETURN_CODE
GetVarStoreName (IN EFI_VARSTORE_ID
, OUT INT8
**);
296 EFI_VFR_RETURN_CODE
GetBufferVarStoreDataTypeName (IN INT8
*, OUT INT8
**);
297 EFI_VFR_RETURN_CODE
GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO
*);
298 EFI_VFR_RETURN_CODE
GetNameVarStoreInfo (IN EFI_VARSTORE_INFO
*, IN UINT32
);
300 EFI_VFR_RETURN_CODE
BufferVarStoreRequestElementAdd (IN INT8
*, IN EFI_VARSTORE_INFO
&);
303 #define EFI_QUESTION_ID_MAX 0xFFFF
304 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
305 #define EFI_QUESTION_ID_INVALID 0x0
307 #define DATE_YEAR_BITMASK 0x0000FFFF
308 #define DATE_MONTH_BITMASK 0x00FF0000
309 #define DATE_DAY_BITMASK 0xFF000000
310 #define TIME_HOUR_BITMASK 0x000000FF
311 #define TIME_MINUTE_BITMASK 0x0000FF00
312 #define TIME_SECOND_BITMASK 0x00FF0000
314 struct SVfrQuestionNode
{
317 EFI_QUESTION_ID mQuestionId
;
319 SVfrQuestionNode
*mNext
;
321 SVfrQuestionNode (IN INT8
*, IN INT8
*, IN UINT32 BitMask
= 0);
322 ~SVfrQuestionNode ();
325 class CVfrQuestionDB
{
327 SVfrQuestionNode
*mQuestionList
;
328 UINT32 mFreeQIdBitMap
[EFI_FREE_QUESTION_ID_BITMAP_SIZE
];
331 EFI_QUESTION_ID
GetFreeQuestionId (VOID
);
332 BOOLEAN
ChekQuestionIdFree (IN EFI_QUESTION_ID
);
333 VOID
MarkQuestionIdUsed (IN EFI_QUESTION_ID
);
334 VOID
MarkQuestionIdUnused (IN EFI_QUESTION_ID
);
340 EFI_VFR_RETURN_CODE
RegisterQuestion (IN INT8
*, IN INT8
*, IN OUT EFI_QUESTION_ID
&);
341 VOID
RegisterOldDateQuestion (IN INT8
*, IN INT8
*, IN INT8
*, IN OUT EFI_QUESTION_ID
&);
342 VOID
RegisterNewDateQuestion (IN INT8
*, IN INT8
*, IN OUT EFI_QUESTION_ID
&);
343 VOID
RegisterOldTimeQuestion (IN INT8
*, IN INT8
*, IN INT8
*, IN OUT EFI_QUESTION_ID
&);
344 VOID
RegisterNewTimeQuestion (IN INT8
*, IN INT8
*, IN OUT EFI_QUESTION_ID
&);
345 EFI_VFR_RETURN_CODE
UpdateQuestionId (IN EFI_QUESTION_ID
, IN EFI_QUESTION_ID
);
346 VOID
GetQuestionId (IN INT8
*, IN INT8
*, OUT EFI_QUESTION_ID
&, OUT UINT32
&);
347 EFI_VFR_RETURN_CODE
FindQuestion (IN EFI_QUESTION_ID
);
348 EFI_VFR_RETURN_CODE
FindQuestion (IN INT8
*);
351 struct SVfrDefaultStoreNode
{
352 EFI_IFR_DEFAULTSTORE
*mObjBinAddr
;
354 EFI_STRING_ID mDefaultStoreNameId
;
357 SVfrDefaultStoreNode
*mNext
;
359 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE
*, IN INT8
*, IN EFI_STRING_ID
, IN UINT16
);
360 ~SVfrDefaultStoreNode();
363 class CVfrDefaultStore
{
365 SVfrDefaultStoreNode
*mDefaultStoreList
;
369 ~CVfrDefaultStore ();
371 EFI_VFR_RETURN_CODE
RegisterDefaultStore (IN CHAR8
*, IN INT8
*, IN EFI_STRING_ID
, IN UINT16
);
372 EFI_VFR_RETURN_CODE
ReRegisterDefaultStoreById (IN UINT16
, IN INT8
*, IN EFI_STRING_ID
);
373 BOOLEAN
DefaultIdRegistered (IN UINT16
);
374 EFI_VFR_RETURN_CODE
GetDefaultId (IN INT8
*, OUT UINT16
*);
375 EFI_VFR_RETURN_CODE
BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID
, IN EFI_VARSTORE_INFO
&, IN INT8
*, IN UINT8
, IN EFI_IFR_TYPE_VALUE
);
378 #define EFI_RULE_ID_START 0x01
379 #define EFI_RULE_ID_INVALID 0x00
381 struct SVfrRuleNode
{
386 SVfrRuleNode(IN INT8
*, IN UINT8
);
392 SVfrRuleNode
*mRuleList
;
399 VOID
RegisterRule (IN INT8
*);
400 UINT8
GetRuleId (IN INT8
*);
403 #define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))
404 #define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))