3 Vfr common library functions.
5 Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #ifndef _VFRUTILITYLIB_H_
17 #define _VFRUTILITYLIB_H_
20 #include "Common/UefiBaseTypes.h"
24 extern BOOLEAN VfrCompatibleMode
;
26 #define MAX_NAME_LEN 64
27 #define MAX_STRING_LEN 0x100
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 CONST CHAR8
*, IN CHAR8
*, IN UINT32
);
40 virtual VOID
WriteEnd (IN
FILE *, IN UINT32
, IN CONST CHAR8
*, IN CHAR8
*, IN UINT32
);
54 SConfigInfo (IN UINT8
, IN UINT16
, IN UINT32
, IN EFI_IFR_TYPE_VALUE
);
59 CHAR8
*mName
; // varstore name
60 EFI_GUID
*mGuid
; // varstore guid, varstore name + guid deside one varstore
61 CHAR8
*mId
; // default ID
62 SConfigInfo
*mInfoStrList
; // list of Offset/Value in the varstore
66 SConfigItem (IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*);
67 SConfigItem (IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*, IN UINT8
, IN UINT16
, IN UINT16
, IN EFI_IFR_TYPE_VALUE
);
68 virtual ~SConfigItem ();
71 class CVfrBufferConfig
{
73 SConfigItem
*mItemListHead
;
74 SConfigItem
*mItemListTail
;
75 SConfigItem
*mItemListPos
;
78 CVfrBufferConfig (VOID
);
79 virtual ~CVfrBufferConfig (VOID
);
81 virtual UINT8
Register (IN CHAR8
*, IN EFI_GUID
*,IN CHAR8
*Info
= NULL
);
82 virtual VOID
Open (VOID
);
83 virtual BOOLEAN
Eof(VOID
);
84 virtual UINT8
Select (IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*Info
= NULL
);
85 virtual UINT8
Write (IN CONST CHAR8
, IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*, IN UINT8
, IN UINT16
, IN UINT32
, IN EFI_IFR_TYPE_VALUE
);
87 virtual UINT8
Read (OUT CHAR8
**, OUT CHAR8
**, OUT CHAR8
**, OUT CHAR8
**, OUT CHAR8
**);
89 virtual VOID
Close (VOID
);
90 virtual VOID
OutputCFile (IN
FILE *, IN CHAR8
*);
93 extern CVfrBufferConfig gCVfrBufferConfig
;
95 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
96 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
100 struct SVfrDataField
{
101 CHAR8 mFieldName
[MAX_NAME_LEN
];
102 SVfrDataType
*mFieldType
;
105 SVfrDataField
*mNext
;
108 struct SVfrDataType
{
109 CHAR8 mTypeName
[MAX_NAME_LEN
];
113 SVfrDataField
*mMembers
;
117 #define VFR_PACK_ASSIGN 0x01
118 #define VFR_PACK_SHOW 0x02
119 #define VFR_PACK_PUSH 0x04
120 #define VFR_PACK_POP 0x08
122 #define PACKSTACK_MAX_SIZE 0x400
124 struct SVfrPackStackNode
{
127 SVfrPackStackNode
*mNext
;
129 SVfrPackStackNode (IN CHAR8
*Identifier
, IN UINT32 Number
) {
134 if (Identifier
!= NULL
) {
135 mIdentifier
= new CHAR8
[strlen (Identifier
) + 1];
136 strcpy (mIdentifier
, Identifier
);
140 ~SVfrPackStackNode (VOID
) {
141 if (mIdentifier
!= NULL
) {
147 bool Match (IN CHAR8
*Identifier
) {
148 if (Identifier
== NULL
) {
150 } else if (mIdentifier
== NULL
) {
152 } else if (strcmp (Identifier
, mIdentifier
) == 0) {
160 class CVfrVarDataTypeDB
{
163 SVfrPackStackNode
*mPackStack
;
166 EFI_VFR_RETURN_CODE
Pack (IN UINT32
, IN UINT8
, IN CHAR8
*Identifier
= NULL
, IN UINT32 Number
= DEFAULT_PACK_ALIGN
);
169 SVfrDataType
*mDataTypeList
;
171 SVfrDataType
*mNewDataType
;
172 SVfrDataType
*mCurrDataType
;
173 SVfrDataField
*mCurrDataField
;
175 VOID
InternalTypesListInit (VOID
);
176 VOID
RegisterNewType (IN SVfrDataType
*);
178 EFI_VFR_RETURN_CODE
ExtractStructTypeName (IN CHAR8
*&, OUT CHAR8
*);
179 EFI_VFR_RETURN_CODE
GetTypeField (IN CONST CHAR8
*, 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 CHAR8
*);
190 EFI_VFR_RETURN_CODE
DataTypeAddField (IN CHAR8
*, IN CHAR8
*, IN UINT32
);
191 VOID
DeclareDataTypeEnd (VOID
);
193 EFI_VFR_RETURN_CODE
GetDataType (IN CHAR8
*, OUT SVfrDataType
**);
194 EFI_VFR_RETURN_CODE
GetDataTypeSize (IN CHAR8
*, OUT UINT32
*);
195 EFI_VFR_RETURN_CODE
GetDataTypeSize (IN UINT8
, OUT UINT32
*);
196 EFI_VFR_RETURN_CODE
GetDataFieldInfo (IN CHAR8
*, OUT UINT16
&, OUT UINT8
&, OUT UINT32
&);
198 EFI_VFR_RETURN_CODE
GetUserDefinedTypeNameList (OUT CHAR8
***, OUT UINT32
*);
199 EFI_VFR_RETURN_CODE
ExtractFieldNameAndArrary (IN CHAR8
*&, OUT CHAR8
*, OUT UINT32
&);
201 BOOLEAN
IsTypeNameDefined (IN CHAR8
*);
203 VOID
Dump(IN
FILE *);
205 // First the declared
207 CHAR8
*mFirstNewDataTypeName
;
208 #ifdef CVFR_VARDATATYPEDB_DEBUG
213 extern CVfrVarDataTypeDB gCVfrVarDataTypeDB
;
216 EFI_VFR_VARSTORE_INVALID
,
217 EFI_VFR_VARSTORE_BUFFER
,
218 EFI_VFR_VARSTORE_EFI
,
219 EFI_VFR_VARSTORE_NAME
220 } EFI_VFR_VARSTORE_TYPE
;
222 struct SVfrVarStorageNode
{
224 CHAR8
*mVarStoreName
;
225 EFI_VARSTORE_ID mVarStoreId
;
226 BOOLEAN mAssignedFlag
; //Create varstore opcode
227 struct SVfrVarStorageNode
*mNext
;
229 EFI_VFR_VARSTORE_TYPE mVarStoreType
;
233 EFI_STRING_ID mEfiVarName
;
238 SVfrDataType
*mDataType
;
242 EFI_STRING_ID
*mNameTable
;
248 SVfrVarStorageNode (IN EFI_GUID
*, IN CHAR8
*, IN EFI_VARSTORE_ID
, IN EFI_STRING_ID
, IN UINT32
, IN BOOLEAN Flag
= TRUE
);
249 SVfrVarStorageNode (IN EFI_GUID
*, IN CHAR8
*, IN EFI_VARSTORE_ID
, IN SVfrDataType
*, IN BOOLEAN Flag
= TRUE
);
250 SVfrVarStorageNode (IN CHAR8
*, IN EFI_VARSTORE_ID
);
251 ~SVfrVarStorageNode (VOID
);
254 struct EFI_VARSTORE_INFO
{
255 EFI_VARSTORE_ID mVarStoreId
;
257 EFI_STRING_ID mVarName
;
261 UINT32 mVarTotalSize
;
263 EFI_VARSTORE_INFO (VOID
);
264 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO
&);
265 BOOLEAN
operator == (IN EFI_VARSTORE_INFO
*);
268 #define EFI_VARSTORE_ID_MAX 0xFFFF
269 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
271 class CVfrDataStorage
{
273 UINT32 mFreeVarStoreIdBitMap
[EFI_FREE_VARSTORE_ID_BITMAP_SIZE
];
275 struct SVfrVarStorageNode
*mBufferVarStoreList
;
276 struct SVfrVarStorageNode
*mEfiVarStoreList
;
277 struct SVfrVarStorageNode
*mNameVarStoreList
;
279 struct SVfrVarStorageNode
*mCurrVarStorageNode
;
280 struct SVfrVarStorageNode
*mNewVarStorageNode
;
284 EFI_VARSTORE_ID
GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType
= EFI_VFR_VARSTORE_BUFFER
);
285 BOOLEAN
ChekVarStoreIdFree (IN EFI_VARSTORE_ID
);
286 VOID
MarkVarStoreIdUsed (IN EFI_VARSTORE_ID
);
287 VOID
MarkVarStoreIdUnused (IN EFI_VARSTORE_ID
);
288 EFI_VARSTORE_ID
CheckGuidField (IN SVfrVarStorageNode
*,
291 OUT EFI_VFR_RETURN_CODE
*);
297 SVfrVarStorageNode
* GetBufferVarStoreList () {
298 return mBufferVarStoreList
;
300 SVfrVarStorageNode
* GetEfiVarStoreList () {
301 return mEfiVarStoreList
;
303 EFI_VFR_RETURN_CODE
DeclareNameVarStoreBegin (CHAR8
*, EFI_VARSTORE_ID
);
304 EFI_VFR_RETURN_CODE
NameTableAddItem (EFI_STRING_ID
);
305 EFI_VFR_RETURN_CODE
DeclareNameVarStoreEnd (EFI_GUID
*);
307 EFI_VFR_RETURN_CODE
DeclareEfiVarStore (IN CHAR8
*, IN EFI_GUID
*, IN EFI_STRING_ID
, IN UINT32
, IN BOOLEAN Flag
= TRUE
);
309 EFI_VFR_RETURN_CODE
DeclareBufferVarStore (IN CHAR8
*, IN EFI_GUID
*, IN CVfrVarDataTypeDB
*, IN CHAR8
*, IN EFI_VARSTORE_ID
, IN BOOLEAN Flag
= TRUE
);
311 EFI_VFR_RETURN_CODE
GetVarStoreId (IN CHAR8
*, OUT EFI_VARSTORE_ID
*, IN EFI_GUID
*VarGuid
= NULL
);
312 EFI_VFR_VARSTORE_TYPE
GetVarStoreType (IN EFI_VARSTORE_ID
);
313 EFI_GUID
* GetVarStoreGuid (IN EFI_VARSTORE_ID
);
314 EFI_VFR_RETURN_CODE
GetVarStoreName (IN EFI_VARSTORE_ID
, OUT CHAR8
**);
315 EFI_VFR_RETURN_CODE
GetVarStoreByDataType (IN CHAR8
*, OUT SVfrVarStorageNode
**, IN EFI_GUID
*VarGuid
= NULL
);
317 EFI_VFR_RETURN_CODE
GetBufferVarStoreDataTypeName (IN EFI_VARSTORE_ID
, OUT CHAR8
**);
318 EFI_VFR_RETURN_CODE
GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO
*);
319 EFI_VFR_RETURN_CODE
GetNameVarStoreInfo (IN EFI_VARSTORE_INFO
*, IN UINT32
);
322 #define EFI_QUESTION_ID_MAX 0xFFFF
323 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
324 #define EFI_QUESTION_ID_INVALID 0x0
326 #define DATE_YEAR_BITMASK 0x0000FFFF
327 #define DATE_MONTH_BITMASK 0x00FF0000
328 #define DATE_DAY_BITMASK 0xFF000000
329 #define TIME_HOUR_BITMASK 0x000000FF
330 #define TIME_MINUTE_BITMASK 0x0000FF00
331 #define TIME_SECOND_BITMASK 0x00FF0000
333 struct SVfrQuestionNode
{
336 EFI_QUESTION_ID mQuestionId
;
338 SVfrQuestionNode
*mNext
;
339 EFI_QUESION_TYPE mQtype
;
341 SVfrQuestionNode (IN CHAR8
*, IN CHAR8
*, IN UINT32 BitMask
= 0);
342 ~SVfrQuestionNode ();
345 class CVfrQuestionDB
{
347 SVfrQuestionNode
*mQuestionList
;
348 UINT32 mFreeQIdBitMap
[EFI_FREE_QUESTION_ID_BITMAP_SIZE
];
351 EFI_QUESTION_ID
GetFreeQuestionId (VOID
);
352 BOOLEAN
ChekQuestionIdFree (IN EFI_QUESTION_ID
);
353 VOID
MarkQuestionIdUsed (IN EFI_QUESTION_ID
);
354 VOID
MarkQuestionIdUnused (IN EFI_QUESTION_ID
);
360 EFI_VFR_RETURN_CODE
RegisterQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
361 VOID
RegisterOldDateQuestion (IN CHAR8
*, IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
362 VOID
RegisterNewDateQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
363 VOID
RegisterOldTimeQuestion (IN CHAR8
*, IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
364 VOID
RegisterNewTimeQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
365 VOID
RegisterRefQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
366 EFI_VFR_RETURN_CODE
UpdateQuestionId (IN EFI_QUESTION_ID
, IN EFI_QUESTION_ID
);
367 VOID
GetQuestionId (IN CHAR8
*, IN CHAR8
*, OUT EFI_QUESTION_ID
&, OUT UINT32
&, OUT EFI_QUESION_TYPE
*QType
= NULL
);
368 EFI_VFR_RETURN_CODE
FindQuestion (IN EFI_QUESTION_ID
);
369 EFI_VFR_RETURN_CODE
FindQuestion (IN CHAR8
*);
370 VOID
PrintAllQuestion (IN VOID
);
371 VOID
ResetInit (IN VOID
);
373 VOID
SetCompatibleMode (IN BOOLEAN Mode
) {
374 VfrCompatibleMode
= Mode
;
378 struct SVfrDefaultStoreNode
{
379 EFI_IFR_DEFAULTSTORE
*mObjBinAddr
;
381 EFI_STRING_ID mDefaultStoreNameId
;
384 SVfrDefaultStoreNode
*mNext
;
386 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE
*, IN CHAR8
*, IN EFI_STRING_ID
, IN UINT16
);
387 ~SVfrDefaultStoreNode();
390 class CVfrDefaultStore
{
392 SVfrDefaultStoreNode
*mDefaultStoreList
;
396 ~CVfrDefaultStore ();
398 EFI_VFR_RETURN_CODE
RegisterDefaultStore (IN CHAR8
*, IN CHAR8
*, IN EFI_STRING_ID
, IN UINT16
);
399 EFI_VFR_RETURN_CODE
ReRegisterDefaultStoreById (IN UINT16
, IN CHAR8
*, IN EFI_STRING_ID
);
400 BOOLEAN
DefaultIdRegistered (IN UINT16
);
401 EFI_VFR_RETURN_CODE
GetDefaultId (IN CHAR8
*, OUT UINT16
*);
402 EFI_VFR_RETURN_CODE
BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID
, IN EFI_VARSTORE_INFO
&, IN CHAR8
*, IN EFI_GUID
*, IN UINT8
, IN EFI_IFR_TYPE_VALUE
);
405 #define EFI_RULE_ID_START 0x01
406 #define EFI_RULE_ID_INVALID 0x00
408 struct SVfrRuleNode
{
413 SVfrRuleNode(IN CHAR8
*, IN UINT8
);
419 SVfrRuleNode
*mRuleList
;
426 VOID
RegisterRule (IN CHAR8
*);
427 UINT8
GetRuleId (IN CHAR8
*);
432 CHAR8
*mStringFileName
;
434 EFI_STATUS
FindStringBlock (
435 IN UINT8
*StringData
,
436 IN EFI_STRING_ID StringId
,
437 OUT UINT32
*StringTextOffset
,
441 UINT32
GetUnicodeStringTextSize (
445 BOOLEAN
GetBestLanguage (
446 IN CONST CHAR8
*SupportedLanguages
,
454 VOID
SetStringFileName (
455 IN CHAR8
*StringFileName
458 CHAR8
* GetVarStoreNameFormStringId (
459 IN EFI_STRING_ID StringId