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