Sync EDKII BaseTools to BaseTools project r1903.
[efi/edk2/.git] / edk2 / BaseTools / Source / C / VfrCompile / VfrUtilityLib.h
1 /** @file\r
2   \r
3   Vfr common library functions.\r
4 \r
5 Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
6 All rights reserved. This program and the accompanying materials                          \r
7 are licensed and made available under the terms and conditions of the BSD License         \r
8 which accompanies this distribution.  The full text of the license may be found at        \r
9 http://opensource.org/licenses/bsd-license.php                                            \r
10                                                                                           \r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
12 WITHOUT 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
24 extern 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
37 class CVfrBinaryOutput {\r
38 public:\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
43 UINT32\r
44 _STR2U32 (\r
45   IN CHAR8 *Str\r
46   );\r
47 \r
48 struct 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
58 struct 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
64 public:\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
70 class CVfrBufferConfig {\r
71 private:\r
72   SConfigItem *mItemListHead;\r
73   SConfigItem *mItemListTail;\r
74   SConfigItem *mItemListPos;\r
75 \r
76 public:\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
92 extern CVfrBufferConfig gCVfrBufferConfig;\r
93 \r
94 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))\r
95 #define INVALID_ARRAY_INDEX      0xFFFFFFFF\r
96 \r
97 struct SVfrDataType;\r
98 \r
99 struct 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
107 struct 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
123 struct 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
159 class CVfrVarDataTypeDB {\r
160 private:\r
161   UINT32                    mPackAlign;\r
162   SVfrPackStackNode         *mPackStack;\r
163 \r
164 public:\r
165   EFI_VFR_RETURN_CODE       Pack (IN UINT32, IN UINT8, IN CHAR8 *Identifier = NULL, IN UINT32 Number = DEFAULT_PACK_ALIGN);\r
166 \r
167 private:\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
183 public:\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
212 extern CVfrVarDataTypeDB  gCVfrVarDataTypeDB;\r
213 \r
214 typedef 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
221 struct 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
246 public:\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
253 struct 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
270 class CVfrDataStorage {\r
271 private:\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
281 private:\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
288 public:\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
329 struct SVfrQuestionNode {\r
330   CHAR8                     *mName;\r
331   CHAR8                     *mVarIdStr;\r
332   EFI_QUESTION_ID           mQuestionId;\r
333   UINT32                    mBitMask;\r
334   SVfrQuestionNode          *mNext;\r
335   EFI_QUESION_TYPE          mQtype;\r
336 \r
337   SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);\r
338   ~SVfrQuestionNode ();\r
339 };\r
340 \r
341 class CVfrQuestionDB {\r
342 private:\r
343   SVfrQuestionNode          *mQuestionList;\r
344   UINT32                    mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];\r
345 \r
346 private:\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
352 public:\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
362   VOID                GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &, OUT EFI_QUESION_TYPE *QType = NULL);\r
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
373 struct 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
385 class CVfrDefaultStore {\r
386 private:\r
387   SVfrDefaultStoreNode      *mDefaultStoreList;\r
388 \r
389 public:\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
403 struct 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
412 class CVfrRulesDB {\r
413 private:\r
414   SVfrRuleNode              *mRuleList;\r
415   UINT8                     mFreeRuleId;\r
416 \r
417 public:\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
425 #endif\r