]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/VfrCompile/VfrUtilityLib.h
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrUtilityLib.h
1 /** @file
2
3 Vfr common library functions.
4
5 Copyright (c) 2004 - 2011, 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 CHAR8 *mId; // varstore ID
61 SConfigInfo *mInfoStrList; // list of Offset/Value in the varstore
62 SConfigItem *mNext;
63
64 public:
65 SConfigItem (IN CHAR8 *, IN CHAR8 *);
66 SConfigItem (IN CHAR8 *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);
67 virtual ~SConfigItem ();
68 };
69
70 class CVfrBufferConfig {
71 private:
72 SConfigItem *mItemListHead;
73 SConfigItem *mItemListTail;
74 SConfigItem *mItemListPos;
75
76 public:
77 CVfrBufferConfig (VOID);
78 virtual ~CVfrBufferConfig (VOID);
79
80 virtual UINT8 Register (IN CHAR8 *, IN CHAR8 *Info = NULL);
81 virtual VOID Open (VOID);
82 virtual BOOLEAN Eof(VOID);
83 virtual UINT8 Select (IN CHAR8 *, IN CHAR8 *Info = NULL);
84 virtual UINT8 Write (IN CONST CHAR8, IN CHAR8 *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
85 #if 0
86 virtual UINT8 Read (OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **);
87 #endif
88 virtual VOID Close (VOID);
89 virtual VOID OutputCFile (IN FILE *, IN CHAR8 *);
90 };
91
92 extern CVfrBufferConfig gCVfrBufferConfig;
93
94 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
95 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
96
97 struct SVfrDataType;
98
99 struct SVfrDataField {
100 CHAR8 mFieldName[MAX_NAME_LEN];
101 SVfrDataType *mFieldType;
102 UINT32 mOffset;
103 UINT32 mArrayNum;
104 SVfrDataField *mNext;
105 };
106
107 struct SVfrDataType {
108 CHAR8 mTypeName[MAX_NAME_LEN];
109 UINT8 mType;
110 UINT32 mAlign;
111 UINT32 mTotalSize;
112 SVfrDataField *mMembers;
113 SVfrDataType *mNext;
114 };
115
116 #define VFR_PACK_ASSIGN 0x01
117 #define VFR_PACK_SHOW 0x02
118 #define VFR_PACK_PUSH 0x04
119 #define VFR_PACK_POP 0x08
120
121 #define PACKSTACK_MAX_SIZE 0x400
122
123 struct SVfrPackStackNode {
124 CHAR8 *mIdentifier;
125 UINT32 mNumber;
126 SVfrPackStackNode *mNext;
127
128 SVfrPackStackNode (IN CHAR8 *Identifier, IN UINT32 Number) {
129 mIdentifier = NULL;
130 mNumber = Number;
131 mNext = NULL;
132
133 if (Identifier != NULL) {
134 mIdentifier = new CHAR8[strlen (Identifier) + 1];
135 strcpy (mIdentifier, Identifier);
136 }
137 }
138
139 ~SVfrPackStackNode (VOID) {
140 if (mIdentifier != NULL) {
141 delete mIdentifier;
142 }
143 mNext = NULL;
144 }
145
146 bool Match (IN CHAR8 *Identifier) {
147 if (Identifier == NULL) {
148 return TRUE;
149 } else if (mIdentifier == NULL) {
150 return FALSE;
151 } else if (strcmp (Identifier, mIdentifier) == 0) {
152 return TRUE;
153 } else {
154 return FALSE;
155 }
156 }
157 };
158
159 class CVfrVarDataTypeDB {
160 private:
161 UINT32 mPackAlign;
162 SVfrPackStackNode *mPackStack;
163
164 public:
165 EFI_VFR_RETURN_CODE Pack (IN UINT32, IN UINT8, IN CHAR8 *Identifier = NULL, IN UINT32 Number = DEFAULT_PACK_ALIGN);
166
167 private:
168 SVfrDataType *mDataTypeList;
169
170 SVfrDataType *mNewDataType;
171 SVfrDataType *mCurrDataType;
172 SVfrDataField *mCurrDataField;
173
174 VOID InternalTypesListInit (VOID);
175 VOID RegisterNewType (IN SVfrDataType *);
176
177 EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *);
178 EFI_VFR_RETURN_CODE GetTypeField (IN CONST CHAR8 *, IN SVfrDataType *, IN SVfrDataField *&);
179 EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);
180 UINT8 GetFieldWidth (IN SVfrDataField *);
181 UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);
182
183 public:
184 CVfrVarDataTypeDB (VOID);
185 ~CVfrVarDataTypeDB (VOID);
186
187 VOID DeclareDataTypeBegin (VOID);
188 EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
189 EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32);
190 VOID DeclareDataTypeEnd (VOID);
191
192 EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
193 EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);
194 EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *);
195 EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);
196
197 EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);
198 EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &);
199
200 BOOLEAN IsTypeNameDefined (IN CHAR8 *);
201
202 VOID Dump(IN FILE *);
203 //
204 // First the declared
205 //
206 CHAR8 *mFirstNewDataTypeName;
207 #ifdef CVFR_VARDATATYPEDB_DEBUG
208 VOID ParserDB ();
209 #endif
210 };
211
212 extern CVfrVarDataTypeDB gCVfrVarDataTypeDB;
213
214 typedef enum {
215 EFI_VFR_VARSTORE_INVALID,
216 EFI_VFR_VARSTORE_BUFFER,
217 EFI_VFR_VARSTORE_EFI,
218 EFI_VFR_VARSTORE_NAME
219 } EFI_VFR_VARSTORE_TYPE;
220
221 struct SVfrVarStorageNode {
222 EFI_GUID mGuid;
223 CHAR8 *mVarStoreName;
224 EFI_VARSTORE_ID mVarStoreId;
225 BOOLEAN mAssignedFlag; //Create varstore opcode
226 struct SVfrVarStorageNode *mNext;
227
228 EFI_VFR_VARSTORE_TYPE mVarStoreType;
229 union {
230 // EFI Variable
231 struct {
232 EFI_STRING_ID mEfiVarName;
233 UINT32 mEfiVarSize;
234 } mEfiVar;
235
236 // Buffer Storage
237 SVfrDataType *mDataType;
238
239 // NameValue Storage
240 struct {
241 EFI_STRING_ID *mNameTable;
242 UINT32 mTableSize;
243 } mNameSpace;
244 } mStorageInfo;
245
246 public:
247 SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
248 SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *, IN BOOLEAN Flag = TRUE);
249 SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);
250 ~SVfrVarStorageNode (VOID);
251 };
252
253 struct EFI_VARSTORE_INFO {
254 EFI_VARSTORE_ID mVarStoreId;
255 union {
256 EFI_STRING_ID mVarName;
257 UINT16 mVarOffset;
258 } mInfo;
259 UINT8 mVarType;
260 UINT32 mVarTotalSize;
261
262 EFI_VARSTORE_INFO (VOID);
263 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
264 BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
265 };
266
267 #define EFI_VARSTORE_ID_MAX 0xFFFF
268 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
269
270 class CVfrDataStorage {
271 private:
272 UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
273
274 struct SVfrVarStorageNode *mBufferVarStoreList;
275 struct SVfrVarStorageNode *mEfiVarStoreList;
276 struct SVfrVarStorageNode *mNameVarStoreList;
277
278 struct SVfrVarStorageNode *mCurrVarStorageNode;
279 struct SVfrVarStorageNode *mNewVarStorageNode;
280
281 private:
282
283 EFI_VARSTORE_ID GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType = EFI_VFR_VARSTORE_BUFFER);
284 BOOLEAN ChekVarStoreIdFree (IN EFI_VARSTORE_ID);
285 VOID MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);
286 VOID MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);
287
288 public:
289 CVfrDataStorage ();
290 ~CVfrDataStorage ();
291
292 SVfrVarStorageNode * GetBufferVarStoreList () {
293 return mBufferVarStoreList;
294 }
295 SVfrVarStorageNode * GetEfiVarStoreList () {
296 return mEfiVarStoreList;
297 }
298 EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (CHAR8 *);
299 EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
300 EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
301
302 EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
303
304 EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);
305
306 EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *);
307 EFI_VFR_RETURN_CODE GetVarStoreType (IN CHAR8 *, OUT EFI_VFR_VARSTORE_TYPE &);
308 EFI_VFR_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID);
309 EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **);
310 EFI_VFR_RETURN_CODE GetVarStoreByDataType (IN CHAR8 *, OUT SVfrVarStorageNode **);
311
312 EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN CHAR8 *, OUT CHAR8 **);
313 EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);
314 EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);
315
316 EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN CHAR8 *, IN EFI_VARSTORE_INFO &);
317 };
318
319 #define EFI_QUESTION_ID_MAX 0xFFFF
320 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
321 #define EFI_QUESTION_ID_INVALID 0x0
322
323 #define DATE_YEAR_BITMASK 0x0000FFFF
324 #define DATE_MONTH_BITMASK 0x00FF0000
325 #define DATE_DAY_BITMASK 0xFF000000
326 #define TIME_HOUR_BITMASK 0x000000FF
327 #define TIME_MINUTE_BITMASK 0x0000FF00
328 #define TIME_SECOND_BITMASK 0x00FF0000
329
330 struct SVfrQuestionNode {
331 CHAR8 *mName;
332 CHAR8 *mVarIdStr;
333 EFI_QUESTION_ID mQuestionId;
334 UINT32 mBitMask;
335 SVfrQuestionNode *mNext;
336 EFI_QUESION_TYPE mQtype;
337
338 SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);
339 ~SVfrQuestionNode ();
340 };
341
342 class CVfrQuestionDB {
343 private:
344 SVfrQuestionNode *mQuestionList;
345 UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
346
347 private:
348 EFI_QUESTION_ID GetFreeQuestionId (VOID);
349 BOOLEAN ChekQuestionIdFree (IN EFI_QUESTION_ID);
350 VOID MarkQuestionIdUsed (IN EFI_QUESTION_ID);
351 VOID MarkQuestionIdUnused (IN EFI_QUESTION_ID);
352
353 public:
354 CVfrQuestionDB ();
355 ~CVfrQuestionDB();
356
357 EFI_VFR_RETURN_CODE RegisterQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
358 VOID RegisterOldDateQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
359 VOID RegisterNewDateQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
360 VOID RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
361 VOID RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
362 VOID RegisterRefQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
363 EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
364 VOID GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &, OUT EFI_QUESION_TYPE *QType = NULL);
365 EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
366 EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);
367 VOID PrintAllQuestion (IN VOID);
368 VOID ResetInit (IN VOID);
369
370 VOID SetCompatibleMode (IN BOOLEAN Mode) {
371 VfrCompatibleMode = Mode;
372 }
373 };
374
375 struct SVfrDefaultStoreNode {
376 EFI_IFR_DEFAULTSTORE *mObjBinAddr;
377 CHAR8 *mRefName;
378 EFI_STRING_ID mDefaultStoreNameId;
379 UINT16 mDefaultId;
380
381 SVfrDefaultStoreNode *mNext;
382
383 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
384 ~SVfrDefaultStoreNode();
385 };
386
387 class CVfrDefaultStore {
388 private:
389 SVfrDefaultStoreNode *mDefaultStoreList;
390
391 public:
392 CVfrDefaultStore ();
393 ~CVfrDefaultStore ();
394
395 EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
396 EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN CHAR8 *, IN EFI_STRING_ID);
397 BOOLEAN DefaultIdRegistered (IN UINT16);
398 EFI_VFR_RETURN_CODE GetDefaultId (IN CHAR8 *, OUT UINT16 *);
399 EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);
400 };
401
402 #define EFI_RULE_ID_START 0x01
403 #define EFI_RULE_ID_INVALID 0x00
404
405 struct SVfrRuleNode {
406 UINT8 mRuleId;
407 CHAR8 *mRuleName;
408 SVfrRuleNode *mNext;
409
410 SVfrRuleNode(IN CHAR8 *, IN UINT8);
411 ~SVfrRuleNode();
412 };
413
414 class CVfrRulesDB {
415 private:
416 SVfrRuleNode *mRuleList;
417 UINT8 mFreeRuleId;
418
419 public:
420 CVfrRulesDB ();
421 ~CVfrRulesDB();
422
423 VOID RegisterRule (IN CHAR8 *);
424 UINT8 GetRuleId (IN CHAR8 *);
425 };
426
427 class CVfrStringDB {
428 private:
429 CHAR8 *mStringFileName;
430
431 EFI_STATUS FindStringBlock (
432 IN UINT8 *StringData,
433 IN EFI_STRING_ID StringId,
434 OUT UINT32 *StringTextOffset,
435 OUT UINT8 *BlockType
436 );
437
438 UINT32 GetUnicodeStringTextSize (
439 IN UINT8 *StringSrc
440 );
441
442 public:
443 CVfrStringDB ();
444 ~CVfrStringDB ();
445
446 VOID SetStringFileName (
447 IN CHAR8 *StringFileName
448 );
449
450 CHAR8 * GetVarStoreNameFormStringId (
451 IN EFI_STRING_ID StringId
452 );
453
454 };
455
456 #endif