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