Only Check the buffer var store CheckBox question to the boolean type according to...
[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_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID);\r
305   EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **);\r
306 \r
307   EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN CHAR8 *, OUT CHAR8 **);\r
308   EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);\r
309   EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);\r
310 \r
311   EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN CHAR8 *, IN EFI_VARSTORE_INFO &);\r
312 };\r
313 \r
314 #define EFI_QUESTION_ID_MAX              0xFFFF\r
315 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
316 #define EFI_QUESTION_ID_INVALID          0x0\r
317 \r
318 #define DATE_YEAR_BITMASK                0x0000FFFF\r
319 #define DATE_MONTH_BITMASK               0x00FF0000\r
320 #define DATE_DAY_BITMASK                 0xFF000000\r
321 #define TIME_HOUR_BITMASK                0x000000FF\r
322 #define TIME_MINUTE_BITMASK              0x0000FF00\r
323 #define TIME_SECOND_BITMASK              0x00FF0000\r
324 \r
325 struct SVfrQuestionNode {\r
326   CHAR8                     *mName;\r
327   CHAR8                     *mVarIdStr;\r
328   EFI_QUESTION_ID           mQuestionId;\r
329   UINT32                    mBitMask;\r
330   SVfrQuestionNode          *mNext;\r
331 \r
332   SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);\r
333   ~SVfrQuestionNode ();\r
334 };\r
335 \r
336 class CVfrQuestionDB {\r
337 private:\r
338   SVfrQuestionNode          *mQuestionList;\r
339   UINT32                    mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];\r
340 \r
341 private:\r
342   EFI_QUESTION_ID GetFreeQuestionId (VOID);\r
343   BOOLEAN         ChekQuestionIdFree (IN EFI_QUESTION_ID);\r
344   VOID            MarkQuestionIdUsed (IN EFI_QUESTION_ID);\r
345   VOID            MarkQuestionIdUnused (IN EFI_QUESTION_ID);\r
346 \r
347 public:\r
348   CVfrQuestionDB ();\r
349   ~CVfrQuestionDB();\r
350 \r
351   EFI_VFR_RETURN_CODE RegisterQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
352   VOID                RegisterOldDateQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
353   VOID                RegisterNewDateQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
354   VOID                RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
355   VOID                RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);\r
356   EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);\r
357   VOID                GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);\r
358   EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);\r
359   EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);\r
360   VOID                PrintAllQuestion (IN VOID);\r
361   VOID                ResetInit (IN VOID); \r
362 \r
363   VOID SetCompatibleMode (IN BOOLEAN Mode) {\r
364     VfrCompatibleMode = Mode;\r
365   }\r
366 };\r
367 \r
368 struct SVfrDefaultStoreNode {\r
369   EFI_IFR_DEFAULTSTORE      *mObjBinAddr;\r
370   CHAR8                     *mRefName;\r
371   EFI_STRING_ID             mDefaultStoreNameId;\r
372   UINT16                    mDefaultId;\r
373 \r
374   SVfrDefaultStoreNode      *mNext;\r
375 \r
376   SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);\r
377   ~SVfrDefaultStoreNode();\r
378 };\r
379 \r
380 class CVfrDefaultStore {\r
381 private:\r
382   SVfrDefaultStoreNode      *mDefaultStoreList;\r
383 \r
384 public:\r
385   CVfrDefaultStore ();\r
386   ~CVfrDefaultStore ();\r
387 \r
388   EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);\r
389   EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN CHAR8 *, IN EFI_STRING_ID);\r
390   BOOLEAN             DefaultIdRegistered (IN UINT16);\r
391   EFI_VFR_RETURN_CODE GetDefaultId (IN CHAR8 *, OUT UINT16 *);\r
392   EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);\r
393 };\r
394 \r
395 #define EFI_RULE_ID_START    0x01\r
396 #define EFI_RULE_ID_INVALID  0x00\r
397 \r
398 struct SVfrRuleNode {\r
399   UINT8                     mRuleId;\r
400   CHAR8                     *mRuleName;\r
401   SVfrRuleNode              *mNext;\r
402 \r
403   SVfrRuleNode(IN CHAR8 *, IN UINT8);\r
404   ~SVfrRuleNode();\r
405 };\r
406 \r
407 class CVfrRulesDB {\r
408 private:\r
409   SVfrRuleNode              *mRuleList;\r
410   UINT8                     mFreeRuleId;\r
411 \r
412 public:\r
413   CVfrRulesDB ();\r
414   ~CVfrRulesDB();\r
415 \r
416   VOID RegisterRule (IN CHAR8 *);\r
417   UINT8 GetRuleId (IN CHAR8 *);\r
418 };\r
419 \r
420 #define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))\r
421 #define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))\r
422 \r
423 #endif\r