]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.h
38687b948df8955bcf35c5f4bd1dc9e50240bf50
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrUtilityLib.h
1 /*++
2
3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 VfrUtilityLib.h
15
16 Abstract:
17
18 --*/
19
20 #ifndef _VFRUTILITYLIB_H_
21 #define _VFRUTILITYLIB_H_
22
23 #include "Tiano.h"
24 #include "string.h"
25 #include "EfiTypes.h"
26 #include "EfiVfr.h"
27 #include "VfrError.h"
28
29 #define MAX_NAME_LEN 64
30 #define DEFAULT_ALIGN 1
31 #define DEFAULT_PACK_ALIGN 0xFFFFFFFF
32 #define DEFAULT_NAME_TABLE_ITEMS 1024
33
34 #define EFI_BITS_SHIFT_PER_UINT32 0x5
35 #define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
36
37 #define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
38
39 class CVfrBinaryOutput {
40 public:
41 virtual VOID WriteLine (IN FILE *, IN UINT32, IN INT8 *, IN INT8 *, IN UINT32);
42 virtual VOID WriteEnd (IN FILE *, IN UINT32, IN INT8 *, IN INT8 *, IN UINT32);
43 };
44
45 UINT32
46 _STR2U32 (
47 IN INT8 *Str
48 );
49
50 struct SConfigInfo {
51 UINT16 mOffset;
52 UINT16 mWidth;
53 UINT8 *mValue;
54 SConfigInfo *mNext;
55
56 SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
57 ~SConfigInfo (VOID);
58 };
59
60 struct SConfigItem {
61 INT8 *mId;
62 INT8 *mInfo;
63 SConfigInfo *mInfoStrList;
64 SConfigItem *mNext;
65
66 public:
67 SConfigItem (IN INT8 *, IN INT8 *);
68 SConfigItem (IN INT8 *, IN INT8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);
69 virtual ~SConfigItem ();
70 };
71
72 class CVfrBufferConfig {
73 private:
74 SConfigItem *mItemListHead;
75 SConfigItem *mItemListTail;
76 SConfigItem *mItemListPos;
77
78 public:
79 CVfrBufferConfig (VOID);
80 virtual ~CVfrBufferConfig (VOID);
81
82 virtual UINT8 Register (IN INT8 *, IN INT8 *Info = NULL);
83 virtual VOID Open (VOID);
84 virtual BOOLEAN Eof(VOID);
85 virtual UINT8 Select (IN INT8 *, IN INT8 *Info = NULL);
86 virtual UINT8 Write (IN CONST CHAR8, IN INT8 *, IN INT8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
87 #if 0
88 virtual UINT8 Read (OUT INT8 **, OUT INT8 **, OUT INT8 **, OUT INT8 **, OUT INT8 **);
89 #endif
90 virtual VOID Close (VOID);
91 virtual VOID OutputCFile (IN FILE *, IN INT8 *);
92 };
93
94 extern CVfrBufferConfig gCVfrBufferConfig;
95
96 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
97 #define INVALID_ARRAY_INDEX 0xFFFFFFFF
98
99 struct SVfrDataType;
100
101 struct SVfrDataField {
102 INT8 mFieldName[MAX_NAME_LEN];
103 SVfrDataType *mFieldType;
104 UINT32 mOffset;
105 UINT32 mArrayNum;
106 SVfrDataField *mNext;
107 };
108
109 struct SVfrDataType {
110 INT8 mTypeName[MAX_NAME_LEN];
111 UINT8 mType;
112 UINT32 mAlign;
113 UINT32 mTotalSize;
114 SVfrDataField *mMembers;
115 SVfrDataType *mNext;
116 };
117
118 class CVfrVarDataTypeDB {
119 private:
120 SVfrDataType *mDataTypeList;
121 UINT32 mPackAlign;
122
123 SVfrDataType *mNewDataType;
124 SVfrDataType *mCurrDataType;
125 SVfrDataField *mCurrDataField;
126
127 VOID InternalTypesListInit (VOID);
128 VOID RegisterNewType (IN SVfrDataType *);
129
130 EFI_VFR_RETURN_CODE ExtractStructTypeName (IN INT8 *&, OUT INT8 *);
131 EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN INT8 *&, OUT INT8 *, OUT UINT32 &);
132 EFI_VFR_RETURN_CODE GetTypeField (IN INT8 *, IN SVfrDataType *, IN SVfrDataField *&);
133 EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);
134 UINT8 GetFieldWidth (IN SVfrDataField *);
135 UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);
136
137 public:
138 CVfrVarDataTypeDB (VOID);
139 ~CVfrVarDataTypeDB (VOID);
140
141 EFI_VFR_RETURN_CODE Pack (IN UINT32);
142 VOID UnPack (VOID);
143
144 VOID DeclareDataTypeBegin (VOID);
145 EFI_VFR_RETURN_CODE SetNewTypeName (IN INT8 *);
146 EFI_VFR_RETURN_CODE DataTypeAddField (IN INT8 *, IN INT8 *, IN UINT32);
147 VOID DeclareDataTypeEnd (VOID);
148
149 EFI_VFR_RETURN_CODE GetDataType (IN INT8 *, OUT SVfrDataType **);
150 EFI_VFR_RETURN_CODE GetDataTypeSize (IN INT8 *, OUT UINT32 *);
151 EFI_VFR_RETURN_CODE GetDataFieldInfo (IN INT8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);
152
153 EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT INT8 ***, OUT UINT32 *);
154 BOOLEAN IsTypeNameDefined (IN INT8 *);
155
156 #ifdef CVFR_VARDATATYPEDB_DEBUG
157 VOID ParserDB ();
158 #endif
159 };
160
161 typedef enum {
162 EFI_VFR_VARSTORE_INVALID,
163 EFI_VFR_VARSTORE_BUFFER,
164 EFI_VFR_VARSTORE_EFI,
165 EFI_VFR_VARSTORE_NAME
166 } EFI_VFR_VARSTORE_TYPE;
167
168 struct SVfrVarStorageNode {
169 EFI_GUID mGuid;
170 INT8 *mVarStoreName;
171 EFI_VARSTORE_ID mVarStoreId;
172 struct SVfrVarStorageNode *mNext;
173
174 EFI_VFR_VARSTORE_TYPE mVarStoreType;
175 union {
176 // EFI Variable
177 struct {
178 EFI_STRING_ID mEfiVarName;
179 UINT32 mEfiVarSize;
180 } mEfiVar;
181
182 // Buffer Storage
183 SVfrDataType *mDataType;
184
185 // NameValue Storage
186 struct {
187 EFI_STRING_ID *mNameTable;
188 UINT32 mTableSize;
189 } mNameSpace;
190 } mStorageInfo;
191
192 public:
193 SVfrVarStorageNode (IN EFI_GUID *, IN INT8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32);
194 SVfrVarStorageNode (IN EFI_GUID *, IN INT8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *);
195 SVfrVarStorageNode (IN INT8 *, IN EFI_VARSTORE_ID);
196 ~SVfrVarStorageNode (VOID);
197 };
198
199 struct EFI_VARSTORE_INFO {
200 EFI_VARSTORE_ID mVarStoreId;
201 union {
202 EFI_STRING_ID mVarName;
203 UINT16 mVarOffset;
204 } mInfo;
205 UINT8 mVarType;
206 UINT32 mVarTotalSize;
207
208 EFI_VARSTORE_INFO (VOID);
209 EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
210 BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
211 };
212
213 #define EFI_VARSTORE_ID_MAX 0xFFFF
214 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
215
216 class CVfrDataStorage {
217 private:
218 UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
219
220 struct SVfrVarStorageNode *mBufferVarStoreList;
221 struct SVfrVarStorageNode *mEfiVarStoreList;
222 struct SVfrVarStorageNode *mNameVarStoreList;
223
224 struct SVfrVarStorageNode *mCurrVarStorageNode;
225 struct SVfrVarStorageNode *mNewVarStorageNode;
226
227 private:
228
229 EFI_VARSTORE_ID GetFreeVarStoreId (VOID);
230 BOOLEAN ChekVarStoreIdFree (IN EFI_VARSTORE_ID);
231 VOID MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);
232 VOID MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);
233
234 public:
235 CVfrDataStorage ();
236 ~CVfrDataStorage ();
237
238 EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (INT8 *);
239 EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
240 EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
241
242 EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN INT8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32);
243
244 EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN INT8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN INT8 *, IN EFI_VARSTORE_ID);
245
246 EFI_VFR_RETURN_CODE GetVarStoreId (IN INT8 *, OUT EFI_VARSTORE_ID *);
247 EFI_VFR_RETURN_CODE GetVarStoreType (IN INT8 *, OUT EFI_VFR_VARSTORE_TYPE &);
248 EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT INT8 **);
249
250 EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN INT8 *, OUT INT8 **);
251 EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);
252 EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);
253
254 EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN INT8 *, IN EFI_VARSTORE_INFO &);
255 };
256
257 #define EFI_QUESTION_ID_MAX 0xFFFF
258 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
259 #define EFI_QUESTION_ID_INVALID 0x0
260
261 #define DATE_YEAR_BITMASK 0x0000FFFF
262 #define DATE_MONTH_BITMASK 0x00FF0000
263 #define DATE_DAY_BITMASK 0xFF000000
264 #define TIME_HOUR_BITMASK 0x000000FF
265 #define TIME_MINUTE_BITMASK 0x0000FF00
266 #define TIME_SECOND_BITMASK 0x00FF0000
267
268 struct SVfrQuestionNode {
269 INT8 *mName;
270 INT8 *mVarIdStr;
271 EFI_QUESTION_ID mQuestionId;
272 UINT32 mBitMask;
273 SVfrQuestionNode *mNext;
274
275 SVfrQuestionNode (IN INT8 *, IN INT8 *, IN UINT32 BitMask = 0);
276 ~SVfrQuestionNode ();
277 };
278
279 class CVfrQuestionDB {
280 private:
281 SVfrQuestionNode *mQuestionList;
282 UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
283
284 private:
285 EFI_QUESTION_ID GetFreeQuestionId (VOID);
286 BOOLEAN ChekQuestionIdFree (IN EFI_QUESTION_ID);
287 VOID MarkQuestionIdUsed (IN EFI_QUESTION_ID);
288 VOID MarkQuestionIdUnused (IN EFI_QUESTION_ID);
289
290 public:
291 CVfrQuestionDB ();
292 ~CVfrQuestionDB();
293
294 EFI_VFR_RETURN_CODE RegisterQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
295 VOID RegisterOldDateQuestion (IN INT8 *, IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
296 VOID RegisterNewDateQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
297 VOID RegisterOldTimeQuestion (IN INT8 *, IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
298 VOID RegisterNewTimeQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
299 EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
300 VOID GetQuestionId (IN INT8 *, IN INT8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);
301 EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
302 EFI_VFR_RETURN_CODE FindQuestion (IN INT8 *);
303 };
304
305 struct SVfrDefaultStoreNode {
306 EFI_IFR_DEFAULTSTORE *mObjBinAddr;
307 INT8 *mRefName;
308 EFI_STRING_ID mDefaultStoreNameId;
309 UINT16 mDefaultId;
310
311 SVfrDefaultStoreNode *mNext;
312
313 SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN INT8 *, IN EFI_STRING_ID, IN UINT16);
314 ~SVfrDefaultStoreNode();
315 };
316
317 class CVfrDefaultStore {
318 private:
319 SVfrDefaultStoreNode *mDefaultStoreList;
320
321 public:
322 CVfrDefaultStore ();
323 ~CVfrDefaultStore ();
324
325 EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN INT8 *, IN EFI_STRING_ID, IN UINT16);
326 EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN INT8 *, IN EFI_STRING_ID);
327 BOOLEAN DefaultIdRegistered (IN UINT16);
328 EFI_VFR_RETURN_CODE GetDefaultId (IN INT8 *, OUT UINT16 *);
329 EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN INT8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);
330 };
331
332 #define EFI_RULE_ID_START 0x01
333 #define EFI_RULE_ID_INVALID 0x00
334
335 struct SVfrRuleNode {
336 UINT8 mRuleId;
337 INT8 *mRuleName;
338 SVfrRuleNode *mNext;
339
340 SVfrRuleNode(IN INT8 *, IN UINT8);
341 ~SVfrRuleNode();
342 };
343
344 class CVfrRulesDB {
345 private:
346 SVfrRuleNode *mRuleList;
347 UINT8 mFreeRuleId;
348
349 public:
350 CVfrRulesDB ();
351 ~CVfrRulesDB();
352
353 VOID RegisterRule (IN INT8 *);
354 UINT8 GetRuleId (IN INT8 *);
355 };
356
357 #define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))
358 #define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))
359
360 #endif