3 Vfr common library functions.
5 Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #ifndef _VFRUTILITYLIB_H_
11 #define _VFRUTILITYLIB_H_
14 #include "Common/UefiBaseTypes.h"
18 static EFI_GUID gEdkiiIfrBitVarGuid
= EDKII_IFR_BIT_VARSTORE_GUID
;
20 #define MAX_BIT_WIDTH 32
21 #define MAX_NAME_LEN 64
22 #define MAX_STRING_LEN 0x100
23 #define DEFAULT_ALIGN 1
24 #define DEFAULT_PACK_ALIGN 0x8
25 #define DEFAULT_NAME_TABLE_ITEMS 1024
27 #define EFI_BITS_SHIFT_PER_UINT32 0x5
28 #define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
30 #define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
31 #define ARRAY_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete[] (Buf); } } while (0);
34 class CVfrBinaryOutput
{
36 virtual VOID
WriteLine (IN
FILE *, IN UINT32
, IN CONST CHAR8
*, IN CHAR8
*, IN UINT32
);
37 virtual VOID
WriteEnd (IN
FILE *, IN UINT32
, IN CONST CHAR8
*, IN CHAR8
*, IN UINT32
);
51 SConfigInfo (IN UINT8
, IN UINT16
, IN UINT32
, IN EFI_IFR_TYPE_VALUE
);
55 SConfigInfo (IN CONST SConfigInfo
&); // Prevent copy-construction
56 SConfigInfo
& operator= (IN CONST SConfigInfo
&); // Prevent assignment
60 CHAR8
*mName
; // varstore name
61 EFI_GUID
*mGuid
; // varstore guid, varstore name + guid deside one varstore
62 CHAR8
*mId
; // default ID
63 SConfigInfo
*mInfoStrList
; // list of Offset/Value in the varstore
67 SConfigItem (IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*);
68 SConfigItem (IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*, IN UINT8
, IN UINT16
, IN UINT16
, IN EFI_IFR_TYPE_VALUE
);
69 virtual ~SConfigItem ();
72 SConfigItem (IN CONST SConfigItem
&); // Prevent copy-construction
73 SConfigItem
& operator= (IN CONST SConfigItem
&); // Prevent assignment
76 class CVfrBufferConfig
{
78 SConfigItem
*mItemListHead
;
79 SConfigItem
*mItemListTail
;
80 SConfigItem
*mItemListPos
;
83 CVfrBufferConfig (VOID
);
84 virtual ~CVfrBufferConfig (VOID
);
86 virtual UINT8
Register (IN CHAR8
*, IN EFI_GUID
*,IN CHAR8
*Info
= NULL
);
87 virtual VOID
Open (VOID
);
88 virtual BOOLEAN
Eof(VOID
);
89 virtual UINT8
Select (IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*Info
= NULL
);
90 virtual UINT8
Write (IN CONST CHAR8
, IN CHAR8
*, IN EFI_GUID
*, IN CHAR8
*, IN UINT8
, IN UINT16
, IN UINT32
, IN EFI_IFR_TYPE_VALUE
);
92 virtual UINT8
Read (OUT CHAR8
**, OUT CHAR8
**, OUT CHAR8
**, OUT CHAR8
**, OUT CHAR8
**);
94 virtual VOID
Close (VOID
);
95 virtual VOID
OutputCFile (IN
FILE *, IN CHAR8
*);
98 CVfrBufferConfig (IN CONST CVfrBufferConfig
&); // Prevent copy-construction
99 CVfrBufferConfig
& operator= (IN CONST CVfrBufferConfig
&); // Prevent assignment
102 extern CVfrBufferConfig gCVfrBufferConfig
;
104 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
105 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
109 struct SVfrDataField
{
110 CHAR8 mFieldName
[MAX_NAME_LEN
];
111 SVfrDataType
*mFieldType
;
117 SVfrDataField
*mNext
;
120 struct SVfrDataType
{
121 CHAR8 mTypeName
[MAX_NAME_LEN
];
125 BOOLEAN mHasBitField
;
126 SVfrDataField
*mMembers
;
130 #define VFR_PACK_ASSIGN 0x01
131 #define VFR_PACK_SHOW 0x02
132 #define VFR_PACK_PUSH 0x04
133 #define VFR_PACK_POP 0x08
135 #define PACKSTACK_MAX_SIZE 0x400
137 struct SVfrPackStackNode
{
140 SVfrPackStackNode
*mNext
;
142 SVfrPackStackNode (IN CHAR8
*Identifier
, IN UINT32 Number
) {
147 if (Identifier
!= NULL
) {
148 mIdentifier
= new CHAR8
[strlen (Identifier
) + 1];
149 strcpy (mIdentifier
, Identifier
);
153 ~SVfrPackStackNode (VOID
) {
154 if (mIdentifier
!= NULL
) {
155 delete[] mIdentifier
;
160 bool Match (IN CHAR8
*Identifier
) {
161 if (Identifier
== NULL
) {
163 } else if (mIdentifier
== NULL
) {
165 } else if (strcmp (Identifier
, mIdentifier
) == 0) {
173 SVfrPackStackNode (IN CONST SVfrPackStackNode
&); // Prevent copy-construction
174 SVfrPackStackNode
& operator= (IN CONST SVfrPackStackNode
&); // Prevent assignment
177 class CVfrVarDataTypeDB
{
180 SVfrPackStackNode
*mPackStack
;
183 EFI_VFR_RETURN_CODE
Pack (IN UINT32
, IN UINT8
, IN CHAR8
*Identifier
= NULL
, IN UINT32 Number
= DEFAULT_PACK_ALIGN
);
186 SVfrDataType
*mDataTypeList
;
188 SVfrDataType
*mNewDataType
;
189 SVfrDataType
*mCurrDataType
;
190 SVfrDataField
*mCurrDataField
;
192 VOID
InternalTypesListInit (VOID
);
193 VOID
RegisterNewType (IN SVfrDataType
*);
195 EFI_VFR_RETURN_CODE
ExtractStructTypeName (IN CHAR8
*&, OUT CHAR8
*);
196 EFI_VFR_RETURN_CODE
GetTypeField (IN CONST CHAR8
*, IN SVfrDataType
*, IN SVfrDataField
*&);
197 EFI_VFR_RETURN_CODE
GetFieldOffset (IN SVfrDataField
*, IN UINT32
, OUT UINT32
&, IN BOOLEAN
);
198 UINT8
GetFieldWidth (IN SVfrDataField
*);
199 UINT32
GetFieldSize (IN SVfrDataField
*, IN UINT32
, IN BOOLEAN
);
202 CVfrVarDataTypeDB (VOID
);
203 ~CVfrVarDataTypeDB (VOID
);
205 VOID
DeclareDataTypeBegin (VOID
);
206 EFI_VFR_RETURN_CODE
SetNewTypeName (IN CHAR8
*);
207 EFI_VFR_RETURN_CODE
DataTypeAddField (IN CHAR8
*, IN CHAR8
*, IN UINT32
, IN BOOLEAN
);
208 EFI_VFR_RETURN_CODE
DataTypeAddBitField (IN CHAR8
*, IN CHAR8
*, IN UINT32
, IN BOOLEAN
);
209 VOID
DeclareDataTypeEnd (VOID
);
211 EFI_VFR_RETURN_CODE
GetDataType (IN CHAR8
*, OUT SVfrDataType
**);
212 EFI_VFR_RETURN_CODE
GetDataTypeSize (IN CHAR8
*, OUT UINT32
*);
213 EFI_VFR_RETURN_CODE
GetDataTypeSize (IN UINT8
, OUT UINT32
*);
214 EFI_VFR_RETURN_CODE
GetDataFieldInfo (IN CHAR8
*, OUT UINT16
&, OUT UINT8
&, OUT UINT32
&, OUT BOOLEAN
&);
216 EFI_VFR_RETURN_CODE
GetUserDefinedTypeNameList (OUT CHAR8
***, OUT UINT32
*);
217 EFI_VFR_RETURN_CODE
ExtractFieldNameAndArrary (IN CHAR8
*&, OUT CHAR8
*, OUT UINT32
&);
218 BOOLEAN
DataTypeHasBitField (IN CHAR8
*);
219 BOOLEAN
IsThisBitField (IN CHAR8
*);
221 BOOLEAN
IsTypeNameDefined (IN CHAR8
*);
223 VOID
Dump(IN
FILE *);
225 // First the declared
227 CHAR8
*mFirstNewDataTypeName
;
228 #ifdef CVFR_VARDATATYPEDB_DEBUG
233 CVfrVarDataTypeDB (IN CONST CVfrVarDataTypeDB
&); // Prevent copy-construction
234 CVfrVarDataTypeDB
& operator= (IN CONST CVfrVarDataTypeDB
&); // Prevent assignment
237 extern CVfrVarDataTypeDB gCVfrVarDataTypeDB
;
240 EFI_VFR_VARSTORE_INVALID
,
241 EFI_VFR_VARSTORE_BUFFER
,
242 EFI_VFR_VARSTORE_EFI
,
243 EFI_VFR_VARSTORE_NAME
,
244 EFI_VFR_VARSTORE_BUFFER_BITS
245 } EFI_VFR_VARSTORE_TYPE
;
247 struct SVfrVarStorageNode
{
249 CHAR8
*mVarStoreName
;
250 EFI_VARSTORE_ID mVarStoreId
;
251 BOOLEAN mAssignedFlag
; //Create varstore opcode
252 struct SVfrVarStorageNode
*mNext
;
254 EFI_VFR_VARSTORE_TYPE mVarStoreType
;
258 EFI_STRING_ID mEfiVarName
;
263 SVfrDataType
*mDataType
;
267 EFI_STRING_ID
*mNameTable
;
273 SVfrVarStorageNode (IN EFI_GUID
*, IN CHAR8
*, IN EFI_VARSTORE_ID
, IN EFI_STRING_ID
, IN UINT32
, IN BOOLEAN Flag
= TRUE
);
274 SVfrVarStorageNode (IN EFI_GUID
*, IN CHAR8
*, IN EFI_VARSTORE_ID
, IN SVfrDataType
*,IN BOOLEAN
, IN BOOLEAN Flag
= TRUE
);
275 SVfrVarStorageNode (IN CHAR8
*, IN EFI_VARSTORE_ID
);
276 ~SVfrVarStorageNode (VOID
);
279 SVfrVarStorageNode (IN CONST SVfrVarStorageNode
&); // Prevent copy-construction
280 SVfrVarStorageNode
& operator= (IN CONST SVfrVarStorageNode
&); // Prevent assignment
283 struct EFI_VARSTORE_INFO
{
284 EFI_VARSTORE_ID mVarStoreId
;
286 EFI_STRING_ID mVarName
;
290 UINT32 mVarTotalSize
;
293 EFI_VARSTORE_INFO (VOID
);
294 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO
&);
295 EFI_VARSTORE_INFO
& operator=(IN CONST EFI_VARSTORE_INFO
&);
296 BOOLEAN
operator == (IN EFI_VARSTORE_INFO
*);
299 struct BufferVarStoreFieldInfoNode
{
300 EFI_VARSTORE_INFO mVarStoreInfo
;
301 struct BufferVarStoreFieldInfoNode
*mNext
;
303 BufferVarStoreFieldInfoNode( IN EFI_VARSTORE_INFO
*Info
);
304 ~BufferVarStoreFieldInfoNode ();
307 #define EFI_VARSTORE_ID_MAX 0xFFFF
308 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
310 class CVfrDataStorage
{
312 UINT32 mFreeVarStoreIdBitMap
[EFI_FREE_VARSTORE_ID_BITMAP_SIZE
];
314 struct SVfrVarStorageNode
*mBufferVarStoreList
;
315 struct SVfrVarStorageNode
*mEfiVarStoreList
;
316 struct SVfrVarStorageNode
*mNameVarStoreList
;
318 struct SVfrVarStorageNode
*mCurrVarStorageNode
;
319 struct SVfrVarStorageNode
*mNewVarStorageNode
;
320 BufferVarStoreFieldInfoNode
*mBufferFieldInfoListHead
;
321 BufferVarStoreFieldInfoNode
*mBufferFieldInfoListTail
;
325 EFI_VARSTORE_ID
GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType
= EFI_VFR_VARSTORE_BUFFER
);
326 BOOLEAN
ChekVarStoreIdFree (IN EFI_VARSTORE_ID
);
327 VOID
MarkVarStoreIdUsed (IN EFI_VARSTORE_ID
);
328 VOID
MarkVarStoreIdUnused (IN EFI_VARSTORE_ID
);
329 EFI_VARSTORE_ID
CheckGuidField (IN SVfrVarStorageNode
*,
332 OUT EFI_VFR_RETURN_CODE
*);
338 SVfrVarStorageNode
* GetBufferVarStoreList () {
339 return mBufferVarStoreList
;
341 SVfrVarStorageNode
* GetEfiVarStoreList () {
342 return mEfiVarStoreList
;
344 EFI_VFR_RETURN_CODE
DeclareNameVarStoreBegin (CHAR8
*, EFI_VARSTORE_ID
);
345 EFI_VFR_RETURN_CODE
NameTableAddItem (EFI_STRING_ID
);
346 EFI_VFR_RETURN_CODE
DeclareNameVarStoreEnd (EFI_GUID
*);
348 EFI_VFR_RETURN_CODE
DeclareEfiVarStore (IN CHAR8
*, IN EFI_GUID
*, IN EFI_STRING_ID
, IN UINT32
, IN BOOLEAN Flag
= TRUE
);
350 EFI_VFR_RETURN_CODE
DeclareBufferVarStore (IN CHAR8
*, IN EFI_GUID
*, IN CVfrVarDataTypeDB
*, IN CHAR8
*, IN EFI_VARSTORE_ID
, IN BOOLEAN
, IN BOOLEAN Flag
= TRUE
);
352 EFI_VFR_RETURN_CODE
GetVarStoreId (IN CHAR8
*, OUT EFI_VARSTORE_ID
*, IN EFI_GUID
*VarGuid
= NULL
);
353 EFI_VFR_VARSTORE_TYPE
GetVarStoreType (IN EFI_VARSTORE_ID
);
354 EFI_GUID
* GetVarStoreGuid (IN EFI_VARSTORE_ID
);
355 EFI_VFR_RETURN_CODE
GetVarStoreName (IN EFI_VARSTORE_ID
, OUT CHAR8
**);
356 EFI_VFR_RETURN_CODE
GetVarStoreByDataType (IN CHAR8
*, OUT SVfrVarStorageNode
**, IN EFI_GUID
*VarGuid
= NULL
);
358 EFI_VFR_RETURN_CODE
GetBufferVarStoreDataTypeName (IN EFI_VARSTORE_ID
, OUT CHAR8
**);
359 EFI_VFR_RETURN_CODE
GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO
*);
360 EFI_VFR_RETURN_CODE
GetNameVarStoreInfo (IN EFI_VARSTORE_INFO
*, IN UINT32
);
361 EFI_VFR_RETURN_CODE
AddBufferVarStoreFieldInfo (IN EFI_VARSTORE_INFO
*);
362 EFI_VFR_RETURN_CODE
GetBufferVarStoreFieldInfo (IN OUT EFI_VARSTORE_INFO
*);
365 CVfrDataStorage (IN CONST CVfrDataStorage
&); // Prevent copy-construction
366 CVfrDataStorage
& operator= (IN CONST CVfrDataStorage
&); // Prevent assignment
369 extern CVfrDataStorage gCVfrDataStorage
;
371 #define EFI_QUESTION_ID_MAX 0xFFFF
372 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
373 #define EFI_QUESTION_ID_INVALID 0x0
375 #define DATE_YEAR_BITMASK 0x0000FFFF
376 #define DATE_MONTH_BITMASK 0x00FF0000
377 #define DATE_DAY_BITMASK 0xFF000000
378 #define TIME_HOUR_BITMASK 0x000000FF
379 #define TIME_MINUTE_BITMASK 0x0000FF00
380 #define TIME_SECOND_BITMASK 0x00FF0000
382 struct SVfrQuestionNode
{
385 EFI_QUESTION_ID mQuestionId
;
387 SVfrQuestionNode
*mNext
;
388 EFI_QUESION_TYPE mQtype
;
390 SVfrQuestionNode (IN CHAR8
*, IN CHAR8
*, IN UINT32 BitMask
= 0);
391 ~SVfrQuestionNode ();
394 SVfrQuestionNode (IN CONST SVfrQuestionNode
&); // Prevent copy-construction
395 SVfrQuestionNode
& operator= (IN CONST SVfrQuestionNode
&); // Prevent assignment
398 class CVfrQuestionDB
{
400 SVfrQuestionNode
*mQuestionList
;
401 UINT32 mFreeQIdBitMap
[EFI_FREE_QUESTION_ID_BITMAP_SIZE
];
404 EFI_QUESTION_ID
GetFreeQuestionId (VOID
);
405 BOOLEAN
ChekQuestionIdFree (IN EFI_QUESTION_ID
);
406 VOID
MarkQuestionIdUsed (IN EFI_QUESTION_ID
);
407 VOID
MarkQuestionIdUnused (IN EFI_QUESTION_ID
);
413 EFI_VFR_RETURN_CODE
RegisterQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
414 VOID
RegisterOldDateQuestion (IN CHAR8
*, IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
415 VOID
RegisterNewDateQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
416 VOID
RegisterOldTimeQuestion (IN CHAR8
*, IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
417 VOID
RegisterNewTimeQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
418 VOID
RegisterRefQuestion (IN CHAR8
*, IN CHAR8
*, IN OUT EFI_QUESTION_ID
&);
419 EFI_VFR_RETURN_CODE
UpdateQuestionId (IN EFI_QUESTION_ID
, IN EFI_QUESTION_ID
);
420 VOID
GetQuestionId (IN CHAR8
*, IN CHAR8
*, OUT EFI_QUESTION_ID
&, OUT UINT32
&, OUT EFI_QUESION_TYPE
*QType
= NULL
);
421 EFI_VFR_RETURN_CODE
FindQuestion (IN EFI_QUESTION_ID
);
422 EFI_VFR_RETURN_CODE
FindQuestion (IN CHAR8
*);
423 VOID
PrintAllQuestion (IN VOID
);
424 VOID
ResetInit (IN VOID
);
427 CVfrQuestionDB (IN CONST CVfrQuestionDB
&); // Prevent copy-construction
428 CVfrQuestionDB
& operator= (IN CONST CVfrQuestionDB
&); // Prevent assignment
431 struct SVfrDefaultStoreNode
{
432 EFI_IFR_DEFAULTSTORE
*mObjBinAddr
;
434 EFI_STRING_ID mDefaultStoreNameId
;
437 SVfrDefaultStoreNode
*mNext
;
439 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE
*, IN CHAR8
*, IN EFI_STRING_ID
, IN UINT16
);
440 ~SVfrDefaultStoreNode();
443 SVfrDefaultStoreNode (IN CONST SVfrDefaultStoreNode
&); // Prevent copy-construction
444 SVfrDefaultStoreNode
& operator= (IN CONST SVfrDefaultStoreNode
&); // Prevent assignment
447 class CVfrDefaultStore
{
449 SVfrDefaultStoreNode
*mDefaultStoreList
;
453 ~CVfrDefaultStore ();
455 EFI_VFR_RETURN_CODE
RegisterDefaultStore (IN CHAR8
*, IN CHAR8
*, IN EFI_STRING_ID
, IN UINT16
);
456 EFI_VFR_RETURN_CODE
ReRegisterDefaultStoreById (IN UINT16
, IN CHAR8
*, IN EFI_STRING_ID
);
457 BOOLEAN
DefaultIdRegistered (IN UINT16
);
458 EFI_VFR_RETURN_CODE
GetDefaultId (IN CHAR8
*, OUT UINT16
*);
459 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
);
462 CVfrDefaultStore (IN CONST CVfrDefaultStore
&); // Prevent copy-construction
463 CVfrDefaultStore
& operator= (IN CONST CVfrDefaultStore
&); // Prevent assignment
466 extern CVfrDefaultStore gCVfrDefaultStore
;
468 #define EFI_RULE_ID_START 0x01
469 #define EFI_RULE_ID_INVALID 0x00
471 struct SVfrRuleNode
{
476 SVfrRuleNode(IN CHAR8
*, IN UINT8
);
480 SVfrRuleNode (IN CONST SVfrRuleNode
&); // Prevent copy-construction
481 SVfrRuleNode
& operator= (IN CONST SVfrRuleNode
&); // Prevent assignment
486 SVfrRuleNode
*mRuleList
;
493 VOID
RegisterRule (IN CHAR8
*);
494 UINT8
GetRuleId (IN CHAR8
*);
497 CVfrRulesDB (IN CONST CVfrRulesDB
&); // Prevent copy-construction
498 CVfrRulesDB
& operator= (IN CONST CVfrRulesDB
&); // Prevent assignment
503 CHAR8
*mStringFileName
;
505 EFI_STATUS
FindStringBlock (
506 IN UINT8
*StringData
,
507 IN EFI_STRING_ID StringId
,
508 OUT UINT32
*StringTextOffset
,
512 UINT32
GetUnicodeStringTextSize (
516 BOOLEAN
GetBestLanguage (
517 IN CONST CHAR8
*SupportedLanguages
,
525 VOID
SetStringFileName (
526 IN CHAR8
*StringFileName
529 CHAR8
* GetVarStoreNameFormStringId (
530 IN EFI_STRING_ID StringId
534 CVfrStringDB (IN CONST CVfrStringDB
&); // Prevent copy-construction
535 CVfrStringDB
& operator= (IN CONST CVfrStringDB
&); // Prevent assignment