d169e2d464bd1a6dbce3f502bc8c912a2e78130b
[people/mcb30/basetools.git] / Source / C / VfrCompile / VfrUtilityLib.h
1 /** @file\r
2   \r
3   Vfr common library functions.\r
4 \r
5 Copyright (c) 2004 - 2008, 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 CHAR8 *, IN CHAR8 *, IN UINT32);\r
40   virtual VOID WriteEnd (IN FILE *, IN UINT32, IN 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   // First the declared \r
203   //\r
204   CHAR8               *mFirstNewDataTypeName;\r
205 #ifdef CVFR_VARDATATYPEDB_DEBUG\r
206   VOID ParserDB ();\r
207 #endif\r
208 };\r
209 \r
210 typedef enum {\r
211   EFI_VFR_VARSTORE_INVALID,\r
212   EFI_VFR_VARSTORE_BUFFER,\r
213   EFI_VFR_VARSTORE_EFI,\r
214   EFI_VFR_VARSTORE_NAME\r
215 } EFI_VFR_VARSTORE_TYPE;\r
216 \r
217 struct SVfrVarStorageNode {\r
218   EFI_GUID                  mGuid;\r
219   CHAR8                     *mVarStoreName;\r
220   EFI_VARSTORE_ID           mVarStoreId;\r
221   BOOLEAN                   mAssignedFlag; //Create varstore opcode\r
222   struct SVfrVarStorageNode *mNext;\r
223 \r
224   EFI_VFR_VARSTORE_TYPE     mVarStoreType;\r
225   union {\r
226     // EFI Variable\r
227     struct {\r
228       EFI_STRING_ID           mEfiVarName;\r
229       UINT32                  mEfiVarSize;\r
230     } mEfiVar;\r
231 \r
232     // Buffer Storage\r
233     SVfrDataType            *mDataType;\r
234 \r
235     // NameValue Storage\r
236         struct {\r
237       EFI_STRING_ID         *mNameTable;\r
238       UINT32                mTableSize;\r
239     } mNameSpace;\r
240   } mStorageInfo;\r
241 \r
242 public:\r
243   SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);\r
244   SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *, IN BOOLEAN Flag = TRUE);\r
245   SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);\r
246   ~SVfrVarStorageNode (VOID);\r
247 };\r
248 \r
249 struct EFI_VARSTORE_INFO {\r
250   EFI_VARSTORE_ID           mVarStoreId;\r
251   union {\r
252     EFI_STRING_ID           mVarName;\r
253     UINT16                  mVarOffset;\r
254   } mInfo;\r
255   UINT8                     mVarType;\r
256   UINT32                    mVarTotalSize;\r
257 \r
258   EFI_VARSTORE_INFO (VOID);\r
259   EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);\r
260   BOOLEAN operator == (IN EFI_VARSTORE_INFO *);\r
261 };\r
262 \r
263 #define EFI_VARSTORE_ID_MAX              0xFFFF\r
264 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
265 \r
266 class CVfrDataStorage {\r
267 private:\r
268   UINT32                    mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];\r
269 \r
270   struct SVfrVarStorageNode *mBufferVarStoreList;\r
271   struct SVfrVarStorageNode *mEfiVarStoreList;\r
272   struct SVfrVarStorageNode *mNameVarStoreList;\r
273 \r
274   struct SVfrVarStorageNode *mCurrVarStorageNode;\r
275   struct SVfrVarStorageNode *mNewVarStorageNode;\r
276 \r
277 private:\r
278 \r
279   EFI_VARSTORE_ID GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType = EFI_VFR_VARSTORE_BUFFER);\r
280   BOOLEAN         ChekVarStoreIdFree (IN EFI_VARSTORE_ID);\r
281   VOID            MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);\r
282   VOID            MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);\r
283 \r
284 public:\r
285   CVfrDataStorage ();\r
286   ~CVfrDataStorage ();\r
287   \r
288   SVfrVarStorageNode * GetBufferVarStoreList () {\r
289     return mBufferVarStoreList;\r
290   }\r
291   SVfrVarStorageNode * GetEfiVarStoreList () {\r
292     return mEfiVarStoreList;\r
293   }\r
294   EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (CHAR8 *);\r
295   EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);\r
296   EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);\r
297 \r
298   EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);\r
299 \r
300   EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);\r
301 \r
302   EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *);\r
303   EFI_VFR_RETURN_CODE GetVarStoreType (IN CHAR8 *, OUT EFI_VFR_VARSTORE_TYPE &);\r
304   EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **);\r
305 \r
306   EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN CHAR8 *, OUT CHAR8 **);\r
307   EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);\r
308   EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);\r
309 \r
310   EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN CHAR8 *, IN EFI_VARSTORE_INFO &);\r
311 };\r
312 \r
313 #define EFI_QUESTION_ID_MAX              0xFFFF\r
314 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
315 #define EFI_QUESTION_ID_INVALID          0x0\r
316 \r
317 #define DATE_YEAR_BITMASK                0x0000FFFF\r
318 #define DATE_MONTH_BITMASK               0x00FF0000\r
319 #define DATE_DAY_BITMASK                 0xFF000000\r
320 #define TIME_HOUR_BITMASK                0x000000FF\r
321 #define TIME_MINUTE_BITMASK              0x0000FF00\r
322 #define TIME_SECOND_BITMASK              0x00FF0000\r
323 \r
324 struct SVfrQuestionNode {\r
325   CHAR8                     *mName;\r
326   CHAR8                     *mVarIdStr;\r
327   EFI_QUESTION_ID           mQuestionId;\r
328   UINT32                    mBitMask;\r
329   SVfrQuestionNode          *mNext;\r
330 \r
331   SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);\r
332   ~SVfrQuestionNode ();\r
333 };\r
334 \r
335 class CVfrQuestionDB {\r
336 private:\r
337   SVfrQuestionNode          *mQuestionList;\r
338   UINT32                    mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];\r
339 \r
340 private:\r
341   EFI_QUESTION_ID GetFreeQuestionId (VOID);\r
342   BOOLEAN         ChekQuestionIdFree (IN EFI_QUESTION_ID);\r
343   VOID            MarkQuestionIdUsed (IN EFI_QUESTION_ID);\r
344   VOID            MarkQuestionIdUnused (IN EFI_QUESTION_ID);\r
345 \r
346 public:\r
347   CVfrQuestionDB ();\r
348   ~CVfrQuestionDB();\r
349 \r
350   EFI_VFR_RETURN_CODE RegisterQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
351   VOID                RegisterOldDateQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
352   VOID                RegisterNewDateQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
353   VOID                RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
354   VOID                RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
355   EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);\r
356   VOID                GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);\r
357   EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);\r
358   EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);\r
359   VOID                PrintAllQuestion (IN VOID);\r
360   VOID                ResetInit (IN VOID); \r
361 \r
362   VOID SetCompatibleMode (IN BOOLEAN Mode) {\r
363     VfrCompatibleMode = Mode;\r
364   }\r
365 };\r
366 \r
367 struct SVfrDefaultStoreNode {\r
368   EFI_IFR_DEFAULTSTORE      *mObjBinAddr;\r
369   CHAR8                     *mRefName;\r
370   EFI_STRING_ID             mDefaultStoreNameId;\r
371   UINT16                    mDefaultId;\r
372 \r
373   SVfrDefaultStoreNode      *mNext;\r
374 \r
375   SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);\r
376   ~SVfrDefaultStoreNode();\r
377 };\r
378 \r
379 class CVfrDefaultStore {\r
380 private:\r
381   SVfrDefaultStoreNode      *mDefaultStoreList;\r
382 \r
383 public:\r
384   CVfrDefaultStore ();\r
385   ~CVfrDefaultStore ();\r
386 \r
387   EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);\r
388   EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN CHAR8 *, IN EFI_STRING_ID);\r
389   BOOLEAN             DefaultIdRegistered (IN UINT16);\r
390   EFI_VFR_RETURN_CODE GetDefaultId (IN CHAR8 *, OUT UINT16 *);\r
391   EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);\r
392 };\r
393 \r
394 #define EFI_RULE_ID_START    0x01\r
395 #define EFI_RULE_ID_INVALID  0x00\r
396 \r
397 struct SVfrRuleNode {\r
398   UINT8                     mRuleId;\r
399   CHAR8                     *mRuleName;\r
400   SVfrRuleNode              *mNext;\r
401 \r
402   SVfrRuleNode(IN CHAR8 *, IN UINT8);\r
403   ~SVfrRuleNode();\r
404 };\r
405 \r
406 class CVfrRulesDB {\r
407 private:\r
408   SVfrRuleNode              *mRuleList;\r
409   UINT8                     mFreeRuleId;\r
410 \r
411 public:\r
412   CVfrRulesDB ();\r
413   ~CVfrRulesDB();\r
414 \r
415   VOID RegisterRule (IN CHAR8 *);\r
416   UINT8 GetRuleId (IN CHAR8 *);\r
417 };\r
418 \r
419 #define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))\r
420 #define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))\r
421 \r
422 #endif\r