]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/VfrCompile/VfrUtilityLib.h
Sync BaseTool trunk (version r2599) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrUtilityLib.h
1 /** @file
2
3 Vfr common library functions.
4
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
10
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.
13
14 **/
15
16 #ifndef _VFRUTILITYLIB_H_
17 #define _VFRUTILITYLIB_H_
18
19 #include "string.h"
20 #include "Common/UefiBaseTypes.h"
21 #include "EfiVfr.h"
22 #include "VfrError.h"
23
24 extern BOOLEAN VfrCompatibleMode;
25
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
31
32 #define EFI_BITS_SHIFT_PER_UINT32 0x5
33 #define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
34
35 #define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
36
37 class CVfrBinaryOutput {
38 public:
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);
41 };
42
43 UINT32
44 _STR2U32 (
45 IN CHAR8 *Str
46 );
47
48 struct SConfigInfo {
49 UINT16 mOffset;
50 UINT16 mWidth;
51 UINT8 *mValue;
52 SConfigInfo *mNext;
53
54 SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
55 ~SConfigInfo (VOID);
56 };
57
58 struct SConfigItem {
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
63 SConfigItem *mNext;
64
65 public:
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 ();
69 };
70
71 class CVfrBufferConfig {
72 private:
73 SConfigItem *mItemListHead;
74 SConfigItem *mItemListTail;
75 SConfigItem *mItemListPos;
76
77 public:
78 CVfrBufferConfig (VOID);
79 virtual ~CVfrBufferConfig (VOID);
80
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);
86 #if 0
87 virtual UINT8 Read (OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **);
88 #endif
89 virtual VOID Close (VOID);
90 virtual VOID OutputCFile (IN FILE *, IN CHAR8 *);
91 };
92
93 extern CVfrBufferConfig gCVfrBufferConfig;
94
95 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
96 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
97
98 struct SVfrDataType;
99
100 struct SVfrDataField {
101 CHAR8 mFieldName[MAX_NAME_LEN];
102 SVfrDataType *mFieldType;
103 UINT32 mOffset;
104 UINT32 mArrayNum;
105 SVfrDataField *mNext;
106 };
107
108 struct SVfrDataType {
109 CHAR8 mTypeName[MAX_NAME_LEN];
110 UINT8 mType;
111 UINT32 mAlign;
112 UINT32 mTotalSize;
113 SVfrDataField *mMembers;
114 SVfrDataType *mNext;
115 };
116
117 #define VFR_PACK_ASSIGN 0x01
118 #define VFR_PACK_SHOW 0x02
119 #define VFR_PACK_PUSH 0x04
120 #define VFR_PACK_POP 0x08
121
122 #define PACKSTACK_MAX_SIZE 0x400
123
124 struct SVfrPackStackNode {
125 CHAR8 *mIdentifier;
126 UINT32 mNumber;
127 SVfrPackStackNode *mNext;
128
129 SVfrPackStackNode (IN CHAR8 *Identifier, IN UINT32 Number) {
130 mIdentifier = NULL;
131 mNumber = Number;
132 mNext = NULL;
133
134 if (Identifier != NULL) {
135 mIdentifier = new CHAR8[strlen (Identifier) + 1];
136 strcpy (mIdentifier, Identifier);
137 }
138 }
139
140 ~SVfrPackStackNode (VOID) {
141 if (mIdentifier != NULL) {
142 delete mIdentifier;
143 }
144 mNext = NULL;
145 }
146
147 bool Match (IN CHAR8 *Identifier) {
148 if (Identifier == NULL) {
149 return TRUE;
150 } else if (mIdentifier == NULL) {
151 return FALSE;
152 } else if (strcmp (Identifier, mIdentifier) == 0) {
153 return TRUE;
154 } else {
155 return FALSE;
156 }
157 }
158 };
159
160 class CVfrVarDataTypeDB {
161 private:
162 UINT32 mPackAlign;
163 SVfrPackStackNode *mPackStack;
164
165 public:
166 EFI_VFR_RETURN_CODE Pack (IN UINT32, IN UINT8, IN CHAR8 *Identifier = NULL, IN UINT32 Number = DEFAULT_PACK_ALIGN);
167
168 private:
169 SVfrDataType *mDataTypeList;
170
171 SVfrDataType *mNewDataType;
172 SVfrDataType *mCurrDataType;
173 SVfrDataField *mCurrDataField;
174
175 VOID InternalTypesListInit (VOID);
176 VOID RegisterNewType (IN SVfrDataType *);
177
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);
183
184 public:
185 CVfrVarDataTypeDB (VOID);
186 ~CVfrVarDataTypeDB (VOID);
187
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);
192
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 &);
197
198 EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);
199 EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &);
200
201 BOOLEAN IsTypeNameDefined (IN CHAR8 *);
202
203 VOID Dump(IN FILE *);
204 //
205 // First the declared
206 //
207 CHAR8 *mFirstNewDataTypeName;
208 #ifdef CVFR_VARDATATYPEDB_DEBUG
209 VOID ParserDB ();
210 #endif
211 };
212
213 extern CVfrVarDataTypeDB gCVfrVarDataTypeDB;
214
215 typedef enum {
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;
221
222 struct SVfrVarStorageNode {
223 EFI_GUID mGuid;
224 CHAR8 *mVarStoreName;
225 EFI_VARSTORE_ID mVarStoreId;
226 BOOLEAN mAssignedFlag; //Create varstore opcode
227 struct SVfrVarStorageNode *mNext;
228
229 EFI_VFR_VARSTORE_TYPE mVarStoreType;
230 union {
231 // EFI Variable
232 struct {
233 EFI_STRING_ID mEfiVarName;
234 UINT32 mEfiVarSize;
235 } mEfiVar;
236
237 // Buffer Storage
238 SVfrDataType *mDataType;
239
240 // NameValue Storage
241 struct {
242 EFI_STRING_ID *mNameTable;
243 UINT32 mTableSize;
244 } mNameSpace;
245 } mStorageInfo;
246
247 public:
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);
252 };
253
254 struct EFI_VARSTORE_INFO {
255 EFI_VARSTORE_ID mVarStoreId;
256 union {
257 EFI_STRING_ID mVarName;
258 UINT16 mVarOffset;
259 } mInfo;
260 UINT8 mVarType;
261 UINT32 mVarTotalSize;
262
263 EFI_VARSTORE_INFO (VOID);
264 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
265 BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
266 };
267
268 #define EFI_VARSTORE_ID_MAX 0xFFFF
269 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
270
271 class CVfrDataStorage {
272 private:
273 UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
274
275 struct SVfrVarStorageNode *mBufferVarStoreList;
276 struct SVfrVarStorageNode *mEfiVarStoreList;
277 struct SVfrVarStorageNode *mNameVarStoreList;
278
279 struct SVfrVarStorageNode *mCurrVarStorageNode;
280 struct SVfrVarStorageNode *mNewVarStorageNode;
281
282 private:
283
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 *,
289 IN EFI_GUID *,
290 IN BOOLEAN *,
291 OUT EFI_VFR_RETURN_CODE *);
292
293 public:
294 CVfrDataStorage ();
295 ~CVfrDataStorage ();
296
297 SVfrVarStorageNode * GetBufferVarStoreList () {
298 return mBufferVarStoreList;
299 }
300 SVfrVarStorageNode * GetEfiVarStoreList () {
301 return mEfiVarStoreList;
302 }
303 EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (CHAR8 *);
304 EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
305 EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
306
307 EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
308
309 EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);
310
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);
316
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);
320 };
321
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
325
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
332
333 struct SVfrQuestionNode {
334 CHAR8 *mName;
335 CHAR8 *mVarIdStr;
336 EFI_QUESTION_ID mQuestionId;
337 UINT32 mBitMask;
338 SVfrQuestionNode *mNext;
339 EFI_QUESION_TYPE mQtype;
340
341 SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);
342 ~SVfrQuestionNode ();
343 };
344
345 class CVfrQuestionDB {
346 private:
347 SVfrQuestionNode *mQuestionList;
348 UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
349
350 private:
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);
355
356 public:
357 CVfrQuestionDB ();
358 ~CVfrQuestionDB();
359
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);
372
373 VOID SetCompatibleMode (IN BOOLEAN Mode) {
374 VfrCompatibleMode = Mode;
375 }
376 };
377
378 struct SVfrDefaultStoreNode {
379 EFI_IFR_DEFAULTSTORE *mObjBinAddr;
380 CHAR8 *mRefName;
381 EFI_STRING_ID mDefaultStoreNameId;
382 UINT16 mDefaultId;
383
384 SVfrDefaultStoreNode *mNext;
385
386 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
387 ~SVfrDefaultStoreNode();
388 };
389
390 class CVfrDefaultStore {
391 private:
392 SVfrDefaultStoreNode *mDefaultStoreList;
393
394 public:
395 CVfrDefaultStore ();
396 ~CVfrDefaultStore ();
397
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);
403 };
404
405 #define EFI_RULE_ID_START 0x01
406 #define EFI_RULE_ID_INVALID 0x00
407
408 struct SVfrRuleNode {
409 UINT8 mRuleId;
410 CHAR8 *mRuleName;
411 SVfrRuleNode *mNext;
412
413 SVfrRuleNode(IN CHAR8 *, IN UINT8);
414 ~SVfrRuleNode();
415 };
416
417 class CVfrRulesDB {
418 private:
419 SVfrRuleNode *mRuleList;
420 UINT8 mFreeRuleId;
421
422 public:
423 CVfrRulesDB ();
424 ~CVfrRulesDB();
425
426 VOID RegisterRule (IN CHAR8 *);
427 UINT8 GetRuleId (IN CHAR8 *);
428 };
429
430 class CVfrStringDB {
431 private:
432 CHAR8 *mStringFileName;
433
434 EFI_STATUS FindStringBlock (
435 IN UINT8 *StringData,
436 IN EFI_STRING_ID StringId,
437 OUT UINT32 *StringTextOffset,
438 OUT UINT8 *BlockType
439 );
440
441 UINT32 GetUnicodeStringTextSize (
442 IN UINT8 *StringSrc
443 );
444
445 BOOLEAN GetBestLanguage (
446 IN CONST CHAR8 *SupportedLanguages,
447 IN CHAR8 *Language
448 );
449
450 public:
451 CVfrStringDB ();
452 ~CVfrStringDB ();
453
454 VOID SetStringFileName (
455 IN CHAR8 *StringFileName
456 );
457
458 CHAR8 * GetVarStoreNameFormStringId (
459 IN EFI_STRING_ID StringId
460 );
461
462 };
463
464 #endif