]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrUtilityLib.cpp
CommitLineData
5b19df7f 1/*++\r
4b1e1121
HT
2Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
3This program and the accompanying materials\r
5b19df7f
LG
4are licensed and made available under the terms and conditions of the BSD License\r
5which accompanies this distribution. The full text of the license may be found at\r
6http://opensource.org/licenses/bsd-license.php\r
7\r
8THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
9WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
10\r
11Module Name:\r
3e99020d 12 VfrUtilityLib.cpp\r
5b19df7f
LG
13\r
14Abstract:\r
15\r
16--*/\r
17\r
95d675b5 18#include "stdio.h"\r
19#include "stdlib.h"\r
20#include "VfrUtilityLib.h"\r
21#include "VfrFormPkg.h"\r
22\r
23VOID\r
24CVfrBinaryOutput::WriteLine (\r
25 IN FILE *pFile,\r
26 IN UINT32 LineBytes,\r
27 IN INT8 *LineHeader,\r
28 IN INT8 *BlkBuf,\r
29 IN UINT32 BlkSize\r
30 )\r
31{\r
32 UINT32 Index;\r
33\r
34 if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
35 return;\r
36 }\r
37\r
38 for (Index = 0; Index < BlkSize; Index++) {\r
39 if ((Index % LineBytes) == 0) {\r
40 fprintf (pFile, "\n%s", LineHeader);\r
41 }\r
42 fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
43 }\r
44}\r
45\r
46VOID\r
47CVfrBinaryOutput::WriteEnd (\r
48 IN FILE *pFile,\r
49 IN UINT32 LineBytes,\r
50 IN INT8 *LineHeader,\r
51 IN INT8 *BlkBuf,\r
52 IN UINT32 BlkSize\r
53 )\r
54{\r
55 UINT32 Index;\r
56\r
57 if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
58 return;\r
59 }\r
60\r
61 for (Index = 0; Index < BlkSize - 1; Index++) {\r
62 if ((Index % LineBytes) == 0) {\r
63 fprintf (pFile, "\n%s", LineHeader);\r
64 }\r
65 fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
66 }\r
67\r
68 if ((Index % LineBytes) == 0) {\r
69 fprintf (pFile, "\n%s", LineHeader);\r
70 }\r
71 fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);\r
72}\r
73\r
74SConfigInfo::SConfigInfo (\r
3e99020d
LG
75 IN UINT8 Type,\r
76 IN UINT16 Offset,\r
77 IN UINT32 Width,\r
95d675b5 78 IN EFI_IFR_TYPE_VALUE Value\r
79 )\r
80{\r
3e99020d 81 mNext = NULL;\r
95d675b5 82 mOffset = Offset;\r
83 mWidth = (UINT16)Width;\r
84 mValue = new UINT8[mWidth];\r
85 if (mValue == NULL) {\r
86 return;\r
87 }\r
88\r
89 switch (Type) {\r
90 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
91 memcpy (mValue, &Value.u8, mWidth);\r
92 break;\r
93 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
94 memcpy (mValue, &Value.u16, mWidth);\r
95 break;\r
96 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
97 memcpy (mValue, &Value.u32, mWidth);\r
98 break;\r
99 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
100 memcpy (mValue, &Value.u64, mWidth);\r
101 break;\r
102 case EFI_IFR_TYPE_BOOLEAN :\r
103 memcpy (mValue, &Value.b, mWidth);\r
104 break;\r
105 case EFI_IFR_TYPE_TIME :\r
106 memcpy (mValue, &Value.time, mWidth);\r
107 break;\r
108 case EFI_IFR_TYPE_DATE :\r
109 memcpy (mValue, &Value.date, mWidth);\r
110 break;\r
111 case EFI_IFR_TYPE_STRING :\r
112 memcpy (mValue, &Value.string, mWidth);\r
113 break;\r
114 case EFI_IFR_TYPE_OTHER :\r
115 return;\r
116 }\r
117}\r
118\r
119SConfigInfo::~SConfigInfo (\r
120 VOID\r
121 )\r
122{\r
123 BUFFER_SAFE_FREE (mValue);\r
124}\r
125\r
126SConfigItem::SConfigItem (\r
3e99020d
LG
127 IN INT8 *Name,\r
128 IN INT8 *Id\r
95d675b5 129 )\r
130{\r
3e99020d
LG
131 mName = NULL;\r
132 mId = NULL;\r
95d675b5 133 mInfoStrList = NULL;\r
134 mNext = NULL;\r
135\r
3e99020d
LG
136 if (Name != NULL) {\r
137 if ((mName = new INT8[strlen (Name) + 1]) != NULL) {\r
138 strcpy (mName, Name);\r
95d675b5 139 }\r
140 }\r
141\r
3e99020d
LG
142 if (Id != NULL) {\r
143 if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
144 strcpy (mId, Id);\r
95d675b5 145 }\r
146 }\r
147}\r
148\r
149SConfigItem::SConfigItem (\r
3e99020d
LG
150 IN INT8 *Name,\r
151 IN INT8 *Id,\r
95d675b5 152 IN UINT8 Type,\r
153 IN UINT16 Offset,\r
154 IN UINT16 Width,\r
155 IN EFI_IFR_TYPE_VALUE Value\r
156 )\r
157{\r
3e99020d 158 mName = NULL;\r
95d675b5 159 mId = NULL;\r
95d675b5 160 mInfoStrList = NULL;\r
161 mNext = NULL;\r
162\r
3e99020d
LG
163 if (Name != NULL) {\r
164 if ((mName = new INT8[strlen (Name) + 1]) != NULL) {\r
165 strcpy (mName, Name);\r
95d675b5 166 }\r
167 }\r
168\r
3e99020d
LG
169 if (Id != NULL) {\r
170 if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
171 strcpy (mId, Id);\r
95d675b5 172 }\r
173 }\r
174\r
175 mInfoStrList = new SConfigInfo(Type, Offset, Width, Value);\r
176}\r
177\r
178SConfigItem::~SConfigItem (\r
179 VOID\r
180 )\r
181{\r
182 SConfigInfo *Info;\r
183\r
3e99020d 184 BUFFER_SAFE_FREE (mName);\r
95d675b5 185 BUFFER_SAFE_FREE (mId);\r
95d675b5 186 while (mInfoStrList != NULL) {\r
187 Info = mInfoStrList;\r
188 mInfoStrList = mInfoStrList->mNext;\r
189\r
190 BUFFER_SAFE_FREE (Info);\r
191 }\r
192}\r
193\r
194UINT8\r
195CVfrBufferConfig::Register (\r
3e99020d
LG
196 IN INT8 *Name,\r
197 IN INT8 *Id\r
95d675b5 198 )\r
199{\r
200 SConfigItem *pNew;\r
201\r
3e99020d 202 if (Select (Name) == 0) {\r
95d675b5 203 return 1;\r
204 }\r
205\r
3e99020d 206 if ((pNew = new SConfigItem (Name, Id)) == NULL) {\r
95d675b5 207 return 2;\r
208 }\r
209 if (mItemListHead == NULL) {\r
210 mItemListHead = pNew;\r
211 mItemListTail = pNew;\r
212 } else {\r
213 mItemListTail->mNext = pNew;\r
214 mItemListTail = pNew;\r
215 }\r
216 mItemListPos = pNew;\r
217\r
218 return 0;\r
219}\r
220\r
221VOID\r
222CVfrBufferConfig::Open (\r
223 VOID\r
224 )\r
225{\r
226 mItemListPos = mItemListHead;\r
227}\r
228\r
229BOOLEAN\r
230CVfrBufferConfig::Eof(\r
231 VOID\r
232 )\r
233{\r
234 return (mItemListPos == NULL) ? TRUE : FALSE;\r
235}\r
236\r
237UINT8\r
238CVfrBufferConfig::Select (\r
3e99020d
LG
239 IN INT8 *Name,\r
240 IN INT8 *Id\r
95d675b5 241 )\r
242{\r
243 SConfigItem *p;\r
244\r
3e99020d 245 if (Name == NULL) {\r
95d675b5 246 mItemListPos = mItemListHead;\r
247 return 0;\r
248 } else {\r
249 for (p = mItemListHead; p != NULL; p = p->mNext) {\r
3e99020d 250 if (strcmp (p->mName, Name) != 0) {\r
95d675b5 251 continue;\r
252 }\r
253\r
3e99020d
LG
254 if (Id != NULL) {\r
255 if (p->mId == NULL || strcmp (p->mId, Id) != 0) {\r
95d675b5 256 continue;\r
257 }\r
3e99020d
LG
258 } else if (p->mId != NULL) {\r
259 continue;\r
95d675b5 260 }\r
261\r
262 mItemListPos = p;\r
263 return 0;\r
264 }\r
265 }\r
266\r
267 return 1;\r
268}\r
269\r
270UINT8\r
271CVfrBufferConfig::Write (\r
272 IN CONST CHAR8 Mode,\r
3e99020d
LG
273 IN INT8 *Name,\r
274 IN INT8 *Id,\r
95d675b5 275 IN UINT8 Type,\r
276 IN UINT16 Offset,\r
277 IN UINT32 Width,\r
278 IN EFI_IFR_TYPE_VALUE Value\r
279 )\r
280{\r
281 UINT8 Ret;\r
282 SConfigItem *pItem;\r
283 SConfigInfo *pInfo;\r
284\r
3e99020d
LG
285 if ((Ret = Select (Name)) != 0) {\r
286 return Ret;\r
287 }\r
288\r
95d675b5 289 switch (Mode) {\r
290 case 'a' : // add\r
3e99020d
LG
291 if (Select (Name, Id) != 0) {\r
292 if ((pItem = new SConfigItem (Name, Id, Type, Offset, Width, Value)) == NULL) {\r
95d675b5 293 return 2;\r
294 }\r
295 if (mItemListHead == NULL) {\r
296 mItemListHead = pItem;\r
297 mItemListTail = pItem;\r
298 } else {\r
299 mItemListTail->mNext = pItem;\r
300 mItemListTail = pItem;\r
301 }\r
302 mItemListPos = pItem;\r
3e99020d
LG
303 } else {\r
304 // tranverse the list to find out if there's already the value for the same offset\r
305 for (pInfo = mItemListPos->mInfoStrList; pInfo != NULL; pInfo = pInfo->mNext) {\r
306 if (pInfo->mOffset == Offset) {\r
307 // check if the value and width are the same; return error if not\r
308 if ((Id != NULL) && (pInfo->mWidth != Width || memcmp(pInfo->mValue, &Value, Width) != 0)) {\r
309 return VFR_RETURN_DEFAULT_VALUE_REDEFINED;\r
310 }\r
311 return 0;\r
312 }\r
313 }\r
314 if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) {\r
315 return 2;\r
316 }\r
317 pInfo->mNext = mItemListPos->mInfoStrList;\r
318 mItemListPos->mInfoStrList = pInfo;\r
95d675b5 319 }\r
320 break;\r
321\r
322 case 'd' : // delete\r
95d675b5 323 if (mItemListHead == mItemListPos) {\r
324 mItemListHead = mItemListPos->mNext;\r
325 delete mItemListPos;\r
326 break;\r
327 }\r
328\r
329 for (pItem = mItemListHead; pItem->mNext != mItemListPos; pItem = pItem->mNext)\r
330 ;\r
331\r
332 pItem->mNext = mItemListPos->mNext;\r
333 if (mItemListTail == mItemListPos) {\r
334 mItemListTail = pItem;\r
335 }\r
336 delete mItemListPos;\r
337 mItemListPos = pItem->mNext;\r
338 break;\r
339\r
340 case 'i' : // set info\r
3e99020d
LG
341 if (mItemListPos->mId != NULL) {\r
342 delete mItemListPos->mId;\r
95d675b5 343 }\r
3e99020d
LG
344 mItemListPos->mId = NULL;\r
345 if (Id != NULL) {\r
346 if ((mItemListPos->mId = new INT8[strlen (Id) + 1]) == NULL) {\r
95d675b5 347 return 2;\r
348 }\r
3e99020d 349 strcpy (mItemListPos->mId, Id);\r
95d675b5 350 }\r
351 break;\r
352\r
353 default :\r
354 return 1;\r
355 }\r
356\r
357 return 0;\r
358}\r
359\r
360#if 0\r
361UINT8\r
362CVfrBufferConfig::ReadId (\r
3e99020d
LG
363 OUT INT8 **Name,\r
364 OUT INT8 **Id\r
95d675b5 365 )\r
366{\r
367 if (mInfoStrItemListPos == NULL) {\r
368 return 1; // end read or some error occur\r
369 }\r
370\r
3e99020d
LG
371 if (Name != NULL) {\r
372 *Name = new INT8 (strlen (mInfoStrItemListPos->mName + 1));\r
373 strcpy (*Name, mInfoStrItemListPos->mName);\r
374 }\r
95d675b5 375 if (Id != NULL) {\r
376 *Id = new INT8 (strlen (mInfoStrItemListPos->mId + 1));\r
377 strcpy (*Id, mInfoStrItemListPos->mId);\r
378 }\r
95d675b5 379\r
380 return 0;\r
381}\r
382\r
383UINT8\r
384CVfrBufferConfig::ReadInfo (\r
3e99020d 385 IN INT8 *Name,\r
95d675b5 386 IN UINT32 Index,\r
387 IN OUT UINT32 &Number,\r
388 OUT INT8 *Offset,\r
389 OUT INT8 *Width,\r
390 OUT INT8 *Value\r
391 )\r
392{\r
393 UINT8 ret;\r
394 SConfigInfo *p;\r
395 UINT32 idx;\r
396 UINT32 num;\r
397\r
3e99020d
LG
398 if (Name != NULL) {\r
399 if ((ret = Select (Name)) != 0) {\r
95d675b5 400 return ret;\r
401 }\r
402 }\r
403\r
404 if (mInfoStrItemListPos == NULL) {\r
405 return 1; // end read or some error occur\r
406 }\r
407\r
408 p = mInfoStrItemListPos->mInfoStrList;\r
409 for (idx = 0; (idx < Index) && (p != NULL); idx++) {\r
410 p = p->mNext;\r
411 }\r
412 if (p == NULL) {\r
413 return 1;\r
414 }\r
415\r
416 if (Offset != NULL) {\r
417 Offset[0] = '\0';\r
418 }\r
419 if (Width != NULL) {\r
420 Width[0] = '\0';\r
421 }\r
422 if (Value != NULL) {\r
423 Value[0] = '\0';\r
424 }\r
425\r
426 while (num < Number) {\r
427 if (Offset != NULL) {\r
428 strcat (Offset, p->mOffset);\r
429 }\r
430 if (Width != NULL) {\r
431 strcat (Width, p->mWidth);\r
432 }\r
433 if (Value != NULL) {\r
434 strcat (Value, p->mValue);\r
435 }\r
436\r
437 num++;\r
438 if ((p = p->mNext) == NULL) {\r
439 break;\r
440 }\r
441 }\r
442 Number = num;\r
443\r
444 return 0;\r
445}\r
446\r
447VOID\r
448CVfrBufferConfig::ReadNext (\r
449 VOID\r
450 )\r
451{\r
452 if (mItemListPos != NULL) {\r
453 mItemListPos = mItemListPos->mNext;\r
454 }\r
455}\r
456#endif\r
457\r
458VOID\r
459CVfrBufferConfig::Close (\r
460 VOID\r
461 )\r
462{\r
463 mItemListPos = NULL;\r
464}\r
465\r
466#define BYTES_PRE_LINE 0x10\r
467\r
468VOID\r
469CVfrBufferConfig::OutputCFile (\r
470 IN FILE *pFile,\r
471 IN INT8 *BaseName\r
472 )\r
473{\r
474 CVfrBinaryOutput Output;\r
475 SConfigItem *Item;\r
476 SConfigInfo *Info;\r
477 UINT32 TotalLen;\r
478\r
479 if (pFile == NULL) {\r
480 return;\r
481 }\r
482\r
483 for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {\r
3e99020d
LG
484 if (Item->mId != NULL || Item->mInfoStrList == NULL) {\r
485 continue;\r
486 }\r
487 fprintf (pFile, "\nunsigned char %s%sBlockName[] = {", BaseName, Item->mName);\r
488\r
489 TotalLen = sizeof (UINT32);\r
490 for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
491 TotalLen += sizeof (UINT16) * 2;\r
492 }\r
493 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&TotalLen, sizeof (UINT32));\r
494\r
495 for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
496 fprintf (pFile, "\n");\r
497 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mOffset, sizeof (UINT16));\r
498 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mWidth, sizeof (UINT16));\r
499 }\r
500 fprintf (pFile, "\n};\n");\r
501 }\r
502\r
503 for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {\r
504 if (Item->mId != NULL && Item->mInfoStrList != NULL) {\r
505 fprintf (pFile, "\nunsigned char %s%sDefault%s[] = {", BaseName, Item->mName, Item->mId);\r
95d675b5 506\r
507 TotalLen = sizeof (UINT32);\r
508 for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
509 TotalLen += Info->mWidth + sizeof (UINT16) * 2;\r
510 }\r
511 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&TotalLen, sizeof (UINT32));\r
512\r
513 for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
3e99020d 514 fprintf (pFile, "\n");\r
95d675b5 515 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mOffset, sizeof (UINT16));\r
516 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mWidth, sizeof (UINT16));\r
517 if (Info->mNext == NULL) {\r
518 Output.WriteEnd (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);\r
519 } else {\r
520 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);\r
521 }\r
95d675b5 522 }\r
3e99020d 523 fprintf (pFile, "\n};\n");\r
95d675b5 524 }\r
525 }\r
526}\r
527\r
528CVfrBufferConfig::CVfrBufferConfig (\r
529 VOID\r
530 )\r
531{\r
532 mItemListHead = NULL;\r
533 mItemListTail = NULL;\r
534 mItemListPos = NULL;\r
535}\r
536\r
537CVfrBufferConfig::~CVfrBufferConfig (\r
538 VOID\r
539 )\r
540{\r
541 SConfigItem *p;\r
542\r
543 while (mItemListHead != NULL) {\r
544 p = mItemListHead;\r
545 mItemListHead = mItemListHead->mNext;\r
546 delete p;\r
547 }\r
548\r
549 mItemListHead = NULL;\r
550 mItemListTail = NULL;\r
551 mItemListPos = NULL;\r
552}\r
553\r
554CVfrBufferConfig gCVfrBufferConfig;\r
555\r
556static struct {\r
557 INT8 *mTypeName;\r
558 UINT8 mType;\r
559 UINT32 mSize;\r
560 UINT32 mAlign;\r
561} gInternalTypesTable [] = {\r
562 {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64, sizeof (UINT64), sizeof (UINT64)},\r
563 {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32, sizeof (UINT32), sizeof (UINT32)},\r
564 {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16, sizeof (UINT16), sizeof (UINT16)},\r
565 {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8, sizeof (UINT8), sizeof (UINT8)},\r
566 {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN, sizeof (BOOLEAN), sizeof (BOOLEAN)},\r
3e99020d 567 {"EFI_HII_DATE", EFI_IFR_TYPE_DATE, sizeof (EFI_HII_DATE), sizeof (UINT16)},\r
95d675b5 568 {"EFI_STRING_ID", EFI_IFR_TYPE_STRING, sizeof (EFI_STRING_ID),sizeof (EFI_STRING_ID)},\r
569 {"EFI_HII_TIME", EFI_IFR_TYPE_TIME, sizeof (EFI_HII_TIME), sizeof (UINT8)},\r
570 {NULL, EFI_IFR_TYPE_OTHER, 0, 0}\r
571};\r
572\r
573STATIC\r
574BOOLEAN\r
575_IS_INTERNAL_TYPE (\r
576 IN INT8 *TypeName\r
577 )\r
578{\r
579 UINT32 Index;\r
580\r
581 if (TypeName == NULL) {\r
582 return FALSE;\r
583 }\r
584\r
585 for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
586 if (strcmp (TypeName, gInternalTypesTable[Index].mTypeName) == 0) {\r
587 return TRUE;\r
588 }\r
589 }\r
590\r
591 return FALSE;\r
592}\r
593\r
594STATIC\r
595INT8 *\r
596TrimHex (\r
597 IN INT8 *Str,\r
598 OUT bool *IsHex\r
599 )\r
600{\r
601 *IsHex = FALSE;\r
602\r
603 while (*Str && *Str == ' ') {\r
604 Str++;\r
605 }\r
606 while (*Str && *Str == '0') {\r
607 Str++;\r
608 }\r
609 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
610 Str++;\r
611 *IsHex = TRUE;\r
612 }\r
613\r
614 return Str;\r
615}\r
616\r
617UINT32\r
618_STR2U32 (\r
619 IN INT8 *Str\r
620 )\r
621{\r
622 bool IsHex;\r
623 UINT32 Value;\r
624 INT8 c;\r
625\r
626 Str = TrimHex (Str, &IsHex);\r
627 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
628 //\r
629 // BUG: does not handle overflow here\r
630 //\r
631 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
632\r
633 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
634 Value += (c - 'a' + 10);\r
635 }\r
636 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
637 Value += (c - 'A' + 10);\r
638 }\r
639 if (c >= '0' && c <= '9') {\r
640 Value += (c - '0');\r
3e99020d 641 }\r
95d675b5 642 }\r
643\r
644 return Value;\r
645}\r
646\r
647VOID\r
648CVfrVarDataTypeDB::RegisterNewType (\r
649 IN SVfrDataType *New\r
650 )\r
651{\r
652 New->mNext = mDataTypeList;\r
653 mDataTypeList = New;\r
654}\r
655\r
656EFI_VFR_RETURN_CODE\r
657CVfrVarDataTypeDB::ExtractStructTypeName (\r
3e99020d 658 IN INT8 *&VarStr,\r
95d675b5 659 OUT INT8 *TName\r
660 )\r
661{\r
662 if (TName == NULL) {\r
663 return VFR_RETURN_FATAL_ERROR;\r
664 }\r
665\r
666 while((*VarStr != '\0') && (*VarStr != '.')) {\r
667 *TName = *VarStr;\r
668 VarStr++;\r
669 TName++;\r
670 }\r
671 *TName = '\0';\r
672 if (*VarStr == '.') {\r
673 VarStr++;\r
674 }\r
675\r
676 return VFR_RETURN_SUCCESS;\r
677}\r
678\r
679EFI_VFR_RETURN_CODE\r
680CVfrVarDataTypeDB::ExtractFieldNameAndArrary (\r
3e99020d 681 IN INT8 *&VarStr,\r
95d675b5 682 IN INT8 *FName,\r
683 OUT UINT32 &ArrayIdx\r
684 )\r
685{\r
686 UINT32 Idx;\r
687 INT8 ArrayStr[MAX_NAME_LEN + 1];\r
688\r
3e99020d 689 ArrayIdx = INVALID_ARRAY_INDEX;\r
95d675b5 690\r
691 if (FName == NULL) {\r
692 return VFR_RETURN_FATAL_ERROR;\r
693 }\r
694\r
695 while((*VarStr != '\0') &&\r
3e99020d
LG
696 (*VarStr != '.') &&\r
697 (*VarStr != '[') &&\r
95d675b5 698 (*VarStr != ']')) {\r
699 *FName = *VarStr;\r
700 VarStr++;\r
701 FName++;\r
702 }\r
703 *FName = '\0';\r
704\r
705 switch (*VarStr) {\r
706 case '.' :\r
707 VarStr++;\r
708 case '\0':\r
709 return VFR_RETURN_SUCCESS;\r
710 case '[' :\r
711 VarStr++;\r
712 for (Idx = 0; (Idx < MAX_NAME_LEN) && (*VarStr != '\0') && (*VarStr != ']'); VarStr++, Idx++) {\r
713 ArrayStr[Idx] = *VarStr;\r
714 }\r
715 ArrayStr[Idx] = '\0';\r
716\r
717 if ((*VarStr != ']') && (ArrayStr[0] == '\0')) {\r
718 return VFR_RETURN_DATA_STRING_ERROR;\r
719 }\r
720 ArrayIdx = _STR2U32 (ArrayStr);\r
721 if (*VarStr == ']') {\r
722 VarStr++;\r
723 }\r
724 return VFR_RETURN_SUCCESS;\r
725 case ']':\r
726 return VFR_RETURN_DATA_STRING_ERROR;\r
727 }\r
728\r
729 return VFR_RETURN_SUCCESS;\r
730}\r
731\r
732EFI_VFR_RETURN_CODE\r
733CVfrVarDataTypeDB::GetTypeField (\r
3e99020d
LG
734 IN INT8 *FName,\r
735 IN SVfrDataType *Type,\r
95d675b5 736 OUT SVfrDataField *&Field\r
737 )\r
738{\r
739 SVfrDataField *pField = NULL;\r
740\r
741 if ((FName == NULL) && (Type == NULL)) {\r
742 return VFR_RETURN_FATAL_ERROR;\r
743 }\r
744\r
745 for (pField = Type->mMembers; pField != NULL; pField = pField->mNext) {\r
746 if (strcmp (pField->mFieldName, FName) == 0) {\r
747 Field = pField;\r
748 return VFR_RETURN_SUCCESS;\r
749 }\r
750 }\r
751\r
752 return VFR_RETURN_UNDEFINED;\r
753}\r
754\r
755EFI_VFR_RETURN_CODE\r
756CVfrVarDataTypeDB::GetFieldOffset (\r
3e99020d 757 IN SVfrDataField *Field,\r
95d675b5 758 IN UINT32 ArrayIdx,\r
759 OUT UINT32 &Offset\r
760 )\r
761{\r
762 if (Field == NULL) {\r
763 return VFR_RETURN_FATAL_ERROR;\r
764 }\r
765\r
766 if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) {\r
767 return VFR_RETURN_ERROR_ARRARY_NUM;\r
768 }\r
769\r
770 Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
771 return VFR_RETURN_SUCCESS;\r
772}\r
773\r
774UINT8\r
775CVfrVarDataTypeDB::GetFieldWidth (\r
776 IN SVfrDataField *Field\r
777 )\r
778{\r
779 if (Field == NULL) {\r
780 return 0;\r
781 }\r
782\r
783 return Field->mFieldType->mType;\r
784}\r
785\r
786UINT32\r
787CVfrVarDataTypeDB::GetFieldSize (\r
788 IN SVfrDataField *Field,\r
789 IN UINT32 ArrayIdx\r
790 )\r
791{\r
792 if (Field == NULL) {\r
793 return VFR_RETURN_FATAL_ERROR;\r
794 }\r
795\r
796 if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {\r
797 return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
798 } else {\r
799 return Field->mFieldType->mTotalSize;\r
800 }\r
801}\r
802\r
803VOID\r
804CVfrVarDataTypeDB::InternalTypesListInit (\r
805 VOID\r
806 )\r
807{\r
808 SVfrDataType *New = NULL;\r
809 UINT32 Index;\r
810\r
811 for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
812 New = new SVfrDataType;\r
813 if (New != NULL) {\r
814 strcpy (New->mTypeName, gInternalTypesTable[Index].mTypeName);\r
815 New->mType = gInternalTypesTable[Index].mType;\r
816 New->mAlign = gInternalTypesTable[Index].mAlign;\r
817 New->mTotalSize = gInternalTypesTable[Index].mSize;\r
818 if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_DATE") == 0) {\r
819 SVfrDataField *pYearField = new SVfrDataField;\r
820 SVfrDataField *pMonthField = new SVfrDataField;\r
821 SVfrDataField *pDayField = new SVfrDataField;\r
822\r
823 strcpy (pYearField->mFieldName, "Year");\r
824 GetDataType ("UINT8", &pYearField->mFieldType);\r
825 pYearField->mOffset = 0;\r
826 pYearField->mNext = pMonthField;\r
827 pYearField->mArrayNum = 0;\r
828\r
829 strcpy (pMonthField->mFieldName, "Month");\r
830 GetDataType ("UINT8", &pMonthField->mFieldType);\r
831 pMonthField->mOffset = 1;\r
832 pMonthField->mNext = pDayField;\r
833 pMonthField->mArrayNum = 0;\r
834\r
835 strcpy (pDayField->mFieldName, "Day");\r
836 GetDataType ("UINT8", &pDayField->mFieldType);\r
837 pDayField->mOffset = 2;\r
838 pDayField->mNext = NULL;\r
839 pDayField->mArrayNum = 0;\r
840\r
841 New->mMembers = pYearField;\r
842 } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {\r
843 SVfrDataField *pHoursField = new SVfrDataField;\r
844 SVfrDataField *pMinutesField = new SVfrDataField;\r
845 SVfrDataField *pSecondsField = new SVfrDataField;\r
846\r
847 strcpy (pHoursField->mFieldName, "Hours");\r
848 GetDataType ("UINT8", &pHoursField->mFieldType);\r
849 pHoursField->mOffset = 0;\r
850 pHoursField->mNext = pMinutesField;\r
851 pHoursField->mArrayNum = 0;\r
852\r
853 strcpy (pMinutesField->mFieldName, "Minutes");\r
854 GetDataType ("UINT8", &pMinutesField->mFieldType);\r
855 pMinutesField->mOffset = 1;\r
856 pMinutesField->mNext = pSecondsField;\r
857 pMinutesField->mArrayNum = 0;\r
858\r
859 strcpy (pSecondsField->mFieldName, "Seconds");\r
860 GetDataType ("UINT8", &pSecondsField->mFieldType);\r
861 pSecondsField->mOffset = 2;\r
862 pSecondsField->mNext = NULL;\r
863 pSecondsField->mArrayNum = 0;\r
864\r
3e99020d 865 New->mMembers = pHoursField;\r
95d675b5 866 } else {\r
867 New->mMembers = NULL;\r
868 }\r
869 New->mNext = NULL;\r
870 RegisterNewType (New);\r
871 New = NULL;\r
872 }\r
873 }\r
874}\r
875\r
876CVfrVarDataTypeDB::CVfrVarDataTypeDB (\r
877 VOID\r
878 )\r
879{\r
880 mDataTypeList = NULL;\r
881 mNewDataType = NULL;\r
882 mCurrDataField = NULL;\r
883 mPackAlign = DEFAULT_PACK_ALIGN;\r
3e99020d 884 mPackStack = NULL;\r
95d675b5 885\r
886 InternalTypesListInit ();\r
887}\r
888\r
889CVfrVarDataTypeDB::~CVfrVarDataTypeDB (\r
890 VOID\r
891 )\r
892{\r
3e99020d
LG
893 SVfrDataType *pType;\r
894 SVfrDataField *pField;\r
895 SVfrPackStackNode *pPack;\r
95d675b5 896\r
897 if (mNewDataType != NULL) {\r
898 delete mNewDataType;\r
899 }\r
900\r
901 while (mDataTypeList != NULL) {\r
902 pType = mDataTypeList;\r
903 mDataTypeList = mDataTypeList->mNext;\r
904 while(pType->mMembers != NULL) {\r
905 pField = pType->mMembers;\r
906 pType->mMembers = pType->mMembers->mNext;\r
907 delete pField;\r
908 }\r
909 delete pType;\r
910 }\r
911\r
3e99020d
LG
912 while (mPackStack != NULL) {\r
913 pPack = mPackStack;\r
914 mPackStack = mPackStack->mNext;\r
915 delete pPack;\r
916 }\r
95d675b5 917}\r
918\r
919EFI_VFR_RETURN_CODE\r
920CVfrVarDataTypeDB::Pack (\r
3e99020d
LG
921 IN UINT32 LineNum,\r
922 IN UINT8 Action,\r
923 IN INT8 *Identifier,\r
924 IN UINT32 Number\r
95d675b5 925 )\r
926{\r
3e99020d
LG
927 UINT32 PackAlign;\r
928 INT8 Msg[64] = {0, };\r
929\r
930 if (Action & VFR_PACK_SHOW) {\r
931 sprintf (Msg, "value of pragma pack(show) == %d", mPackAlign);\r
932 gCVfrErrorHandle.PrintMsg (LineNum, "", "Warning", Msg);\r
95d675b5 933 }\r
934\r
3e99020d
LG
935 if (Action & VFR_PACK_PUSH) {\r
936 SVfrPackStackNode *pNew = NULL;\r
95d675b5 937\r
3e99020d
LG
938 if ((pNew = new SVfrPackStackNode (Identifier, mPackAlign)) == NULL) {\r
939 return VFR_RETURN_FATAL_ERROR;\r
940 }\r
941 pNew->mNext = mPackStack;\r
942 mPackStack = pNew;\r
943 }\r
944\r
945 if (Action & VFR_PACK_POP) {\r
946 SVfrPackStackNode *pNode = NULL;\r
947\r
948 if (mPackStack == NULL) {\r
949 gCVfrErrorHandle.PrintMsg (LineNum, "", "Warning", "#pragma pack(pop...) : more pops than pushes");\r
950 }\r
951\r
952 for (pNode = mPackStack; pNode != NULL; pNode = pNode->mNext) {\r
953 if (pNode->Match (Identifier) == TRUE) {\r
954 mPackAlign = pNode->mNumber;\r
955 mPackStack = pNode->mNext;\r
956 }\r
957 }\r
958 }\r
959\r
960 if (Action & VFR_PACK_ASSIGN) {\r
961 PackAlign = (Number > 1) ? Number + Number % 2 : Number;\r
962 if ((PackAlign == 0) || (PackAlign > 16)) {\r
963 gCVfrErrorHandle.PrintMsg (LineNum, "", "Warning", "expected pragma parameter to be '1', '2', '4', '8', or '16'");\r
964 } else {\r
965 mPackAlign = PackAlign;\r
966 }\r
967 }\r
968\r
969 return VFR_RETURN_SUCCESS;\r
95d675b5 970}\r
971\r
972VOID\r
973CVfrVarDataTypeDB::DeclareDataTypeBegin (\r
974 VOID\r
975 )\r
976{\r
977 SVfrDataType *pNewType = NULL;\r
978\r
979 pNewType = new SVfrDataType;\r
980 pNewType->mTypeName[0] = '\0';\r
981 pNewType->mType = EFI_IFR_TYPE_OTHER;\r
982 pNewType->mAlign = DEFAULT_ALIGN;\r
983 pNewType->mTotalSize = 0;\r
984 pNewType->mMembers = NULL;\r
985 pNewType->mNext = NULL;\r
986\r
987 mNewDataType = pNewType;\r
988}\r
989\r
990EFI_VFR_RETURN_CODE\r
991CVfrVarDataTypeDB::SetNewTypeName (\r
992 IN INT8 *TypeName\r
993 )\r
994{\r
995 SVfrDataType *pType;\r
996\r
997 if (mNewDataType == NULL) {\r
998 return VFR_RETURN_ERROR_SKIPED;\r
999 }\r
1000 if (TypeName == NULL) {\r
1001 return VFR_RETURN_FATAL_ERROR;\r
1002 }\r
1003 if (strlen(TypeName) >= MAX_NAME_LEN) {\r
1004 return VFR_RETURN_INVALID_PARAMETER;\r
1005 }\r
1006\r
1007 for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
1008 if (strcmp(pType->mTypeName, TypeName) == 0) {\r
1009 return VFR_RETURN_REDEFINED;\r
1010 }\r
1011 }\r
1012\r
1013 strcpy(mNewDataType->mTypeName, TypeName);\r
1014 return VFR_RETURN_SUCCESS;\r
1015}\r
1016\r
1017EFI_VFR_RETURN_CODE\r
1018CVfrVarDataTypeDB::DataTypeAddField (\r
3e99020d
LG
1019 IN INT8 *FieldName,\r
1020 IN INT8 *TypeName,\r
95d675b5 1021 IN UINT32 ArrayNum\r
1022 )\r
1023{\r
1024 SVfrDataField *pNewField = NULL;\r
1025 SVfrDataType *pFieldType = NULL;\r
1026 SVfrDataField *pTmp;\r
1027 UINT32 Align;\r
1028\r
1029 CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
1030\r
1031 if (strlen (FieldName) >= MAX_NAME_LEN) {\r
1032 return VFR_RETURN_INVALID_PARAMETER;\r
1033 }\r
1034\r
1035 for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {\r
1036 if (strcmp (pTmp->mFieldName, FieldName) == 0) {\r
1037 return VFR_RETURN_REDEFINED;\r
1038 }\r
1039 }\r
1040\r
1041 Align = MIN (mPackAlign, pFieldType->mAlign);\r
1042\r
1043 if ((pNewField = new SVfrDataField) == NULL) {\r
1044 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1045 }\r
1046 strcpy (pNewField->mFieldName, FieldName);\r
1047 pNewField->mFieldType = pFieldType;\r
1048 pNewField->mArrayNum = ArrayNum;\r
1049 if ((mNewDataType->mTotalSize % Align) == 0) {\r
1050 pNewField->mOffset = mNewDataType->mTotalSize;\r
1051 } else {\r
1052 pNewField->mOffset = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);\r
1053 }\r
1054 if (mNewDataType->mMembers == NULL) {\r
1055 mNewDataType->mMembers = pNewField;\r
1056 pNewField->mNext = NULL;\r
1057 } else {\r
3e99020d 1058 for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext)\r
95d675b5 1059 ;\r
1060 pTmp->mNext = pNewField;\r
1061 pNewField->mNext = NULL;\r
1062 }\r
1063\r
1064 mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
1065 mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
1066\r
1067 return VFR_RETURN_SUCCESS;\r
1068}\r
1069\r
1070VOID\r
1071CVfrVarDataTypeDB::DeclareDataTypeEnd (\r
1072 VOID\r
1073 )\r
1074{\r
1075 if (mNewDataType->mTypeName[0] == '\0') {\r
1076 return;\r
1077 }\r
1078\r
1079 if ((mNewDataType->mTotalSize % mNewDataType->mAlign) !=0) {\r
1080 mNewDataType->mTotalSize += ALIGN_STUFF (mNewDataType->mTotalSize, mNewDataType->mAlign);\r
1081 }\r
1082\r
1083 RegisterNewType (mNewDataType);\r
1084 mNewDataType = NULL;\r
1085}\r
1086\r
1087EFI_VFR_RETURN_CODE\r
1088CVfrVarDataTypeDB::GetDataType (\r
1089 IN INT8 *TypeName,\r
1090 OUT SVfrDataType **DataType\r
1091\r
1092 )\r
1093{\r
1094 SVfrDataType *pDataType = NULL;\r
1095\r
1096 if (TypeName == NULL) {\r
1097 return VFR_RETURN_ERROR_SKIPED;\r
1098 }\r
1099\r
1100 if (DataType == NULL) {\r
1101 return VFR_RETURN_FATAL_ERROR;\r
1102 }\r
1103\r
1104 *DataType = NULL;\r
1105\r
1106 for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
1107 if (strcmp (TypeName, pDataType->mTypeName) == 0) {\r
1108 *DataType = pDataType;\r
1109 return VFR_RETURN_SUCCESS;\r
1110 }\r
1111 }\r
1112\r
1113 return VFR_RETURN_UNDEFINED;\r
1114}\r
1115\r
3e99020d
LG
1116EFI_VFR_RETURN_CODE\r
1117CVfrVarDataTypeDB::GetDataTypeSize (\r
1118 IN UINT8 DataType,\r
1119 OUT UINT32 *Size\r
1120 )\r
1121{\r
1122 SVfrDataType *pDataType = NULL;\r
1123\r
1124 if (Size == NULL) {\r
1125 return VFR_RETURN_FATAL_ERROR;\r
1126 }\r
1127\r
1128 *Size = 0;\r
1129 DataType = DataType & 0x0F;\r
1130\r
1131 //\r
1132 // For user defined data type, the size can't be got by this function.\r
1133 //\r
1134 if (DataType == EFI_IFR_TYPE_OTHER) {\r
1135 return VFR_RETURN_SUCCESS;\r
1136 }\r
1137\r
1138 for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
1139 if (DataType == pDataType->mType) {\r
1140 *Size = pDataType->mTotalSize;\r
1141 return VFR_RETURN_SUCCESS;\r
1142 }\r
1143 }\r
1144\r
1145 return VFR_RETURN_UNDEFINED;\r
1146}\r
1147\r
95d675b5 1148EFI_VFR_RETURN_CODE\r
1149CVfrVarDataTypeDB::GetDataTypeSize (\r
1150 IN INT8 *TypeName,\r
1151 OUT UINT32 *Size\r
1152 )\r
1153{\r
1154 SVfrDataType *pDataType = NULL;\r
1155\r
1156 if (Size == NULL) {\r
1157 return VFR_RETURN_FATAL_ERROR;\r
1158 }\r
1159\r
1160 *Size = 0;\r
1161\r
1162 for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
1163 if (strcmp (TypeName, pDataType->mTypeName) == 0) {\r
1164 *Size = pDataType->mTotalSize;\r
1165 return VFR_RETURN_SUCCESS;\r
1166 }\r
1167 }\r
1168\r
1169 return VFR_RETURN_UNDEFINED;\r
1170}\r
1171\r
1172EFI_VFR_RETURN_CODE\r
1173CVfrVarDataTypeDB::GetDataFieldInfo (\r
3e99020d
LG
1174 IN INT8 *VarStr,\r
1175 OUT UINT16 &Offset,\r
1176 OUT UINT8 &Type,\r
95d675b5 1177 OUT UINT32 &Size\r
1178 )\r
1179{\r
1180 INT8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];\r
1181 UINT32 ArrayIdx, Tmp;\r
1182 SVfrDataType *pType = NULL;\r
1183 SVfrDataField *pField = NULL;\r
1184\r
1185 Offset = 0;\r
1186 Type = EFI_IFR_TYPE_OTHER;\r
1187 Size = 0;\r
1188\r
1189 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
1190 CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
1191\r
1192 //\r
1193 // if it is not struct data type\r
1194 //\r
1195 Type = pType->mType;\r
1196 Size = pType->mTotalSize;\r
1197\r
1198 while (*VarStr != '\0') {\r
1199 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
1200 CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
1201 pType = pField->mFieldType;\r
1202 CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);\r
1203 Offset += Tmp;\r
1204 Type = GetFieldWidth (pField);\r
1205 Size = GetFieldSize (pField, ArrayIdx);\r
1206 }\r
1207 return VFR_RETURN_SUCCESS;\r
1208}\r
1209\r
1210EFI_VFR_RETURN_CODE\r
1211CVfrVarDataTypeDB::GetUserDefinedTypeNameList (\r
3e99020d 1212 OUT INT8 ***NameList,\r
95d675b5 1213 OUT UINT32 *ListSize\r
1214 )\r
1215{\r
1216 UINT32 Index;\r
1217 SVfrDataType *pType;\r
1218\r
1219 if ((NameList == NULL) || (ListSize == NULL)) {\r
1220 return VFR_RETURN_FATAL_ERROR;\r
1221 }\r
1222\r
1223 *NameList = NULL;\r
1224 *ListSize = 0;\r
1225\r
1226 for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
1227 if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {\r
1228 (*ListSize)++;\r
1229 }\r
1230 }\r
1231\r
1232 if (*ListSize == 0) {\r
1233 return VFR_RETURN_SUCCESS;\r
1234 }\r
1235\r
1236 if ((*NameList = new INT8*[*ListSize]) == NULL) {\r
1237 *ListSize = 0;\r
1238 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1239 }\r
1240\r
1241 for (Index = 0, pType = mDataTypeList; pType != NULL; pType = pType->mNext, Index++) {\r
1242 if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {\r
1243 (*NameList)[Index] = pType->mTypeName;\r
1244 }\r
1245 }\r
1246 return VFR_RETURN_SUCCESS;\r
1247}\r
1248\r
1249BOOLEAN\r
1250CVfrVarDataTypeDB::IsTypeNameDefined (\r
1251 IN INT8 *TypeName\r
1252 )\r
1253{\r
1254 SVfrDataType *pType;\r
1255\r
1256 if (TypeName == NULL) {\r
1257 return FALSE;\r
1258 }\r
1259\r
1260 for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
1261 if (strcmp (pType->mTypeName, TypeName) == 0) {\r
1262 return TRUE;\r
1263 }\r
1264 }\r
1265\r
1266 return FALSE;\r
1267}\r
1268\r
1269#ifdef CVFR_VARDATATYPEDB_DEBUG\r
1270VOID\r
1271CVfrVarDataTypeDB::ParserDB (\r
1272 VOID\r
1273 )\r
1274{\r
1275 SVfrDataType *pTNode;\r
1276 SVfrDataField *pFNode;\r
1277\r
1278 printf ("***************************************************************\n");\r
1279 printf ("\t\tmPackAlign = %x\n", mPackAlign);\r
1280 for (pTNode = mDataTypeList; pTNode != NULL; pTNode = pTNode->mNext) {\r
1281 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode->mTypeName, pTNode->mAlign, pTNode->mTotalSize);\r
1282 printf ("\t\tstruct %s {\n", pTNode->mTypeName);\r
1283 for (pFNode = pTNode->mMembers; pFNode != NULL; pFNode = pFNode->mNext) {\r
1284 printf ("\t\t\t%s\t%s\n", pFNode->mFieldType->mTypeName, pFNode->mFieldName);\r
1285 }\r
1286 printf ("\t\t};\n");\r
1287 printf ("---------------------------------------------------------------\n");\r
1288 }\r
1289 printf ("***************************************************************\n");\r
1290}\r
1291#endif\r
1292\r
1293SVfrVarStorageNode::SVfrVarStorageNode (\r
1294 IN EFI_GUID *Guid,\r
1295 IN INT8 *StoreName,\r
1296 IN EFI_VARSTORE_ID VarStoreId,\r
1297 IN EFI_STRING_ID VarName,\r
1298 IN UINT32 VarSize\r
1299 )\r
1300{\r
1301 if (Guid != NULL) {\r
1302 mGuid = *Guid;\r
1303 } else {\r
1304 memset (&Guid, 0, sizeof (EFI_GUID));\r
1305 }\r
1306 if (StoreName != NULL) {\r
1307 mVarStoreName = new INT8[strlen(StoreName) + 1];\r
1308 strcpy (mVarStoreName, StoreName);\r
1309 } else {\r
1310 mVarStoreName = NULL;\r
1311 }\r
1312 mNext = NULL;\r
1313 mVarStoreId = VarStoreId;\r
1314 mVarStoreType = EFI_VFR_VARSTORE_EFI;\r
1315 mStorageInfo.mEfiVar.mEfiVarName = VarName;\r
1316 mStorageInfo.mEfiVar.mEfiVarSize = VarSize;\r
1317}\r
1318\r
1319SVfrVarStorageNode::SVfrVarStorageNode (\r
1320 IN EFI_GUID *Guid,\r
1321 IN INT8 *StoreName,\r
1322 IN EFI_VARSTORE_ID VarStoreId,\r
1323 IN SVfrDataType *DataType\r
1324 )\r
1325{\r
1326 if (Guid != NULL) {\r
1327 mGuid = *Guid;\r
1328 } else {\r
1329 memset (&Guid, 0, sizeof (EFI_GUID));\r
1330 }\r
1331 if (StoreName != NULL) {\r
1332 mVarStoreName = new INT8[strlen(StoreName) + 1];\r
1333 strcpy (mVarStoreName, StoreName);\r
1334 } else {\r
1335 mVarStoreName = NULL;\r
1336 }\r
1337 mNext = NULL;\r
1338 mVarStoreId = VarStoreId;\r
1339 mVarStoreType = EFI_VFR_VARSTORE_BUFFER;\r
1340 mStorageInfo.mDataType = DataType;\r
1341}\r
1342\r
1343SVfrVarStorageNode::SVfrVarStorageNode (\r
1344 IN INT8 *StoreName,\r
1345 IN EFI_VARSTORE_ID VarStoreId\r
1346 )\r
1347{\r
1348 if (StoreName != NULL) {\r
1349 mVarStoreName = new INT8[strlen(StoreName) + 1];\r
1350 strcpy (mVarStoreName, StoreName);\r
1351 } else {\r
1352 mVarStoreName = NULL;\r
1353 }\r
1354 mNext = NULL;\r
1355 mVarStoreId = VarStoreId;\r
1356 mVarStoreType = EFI_VFR_VARSTORE_NAME;\r
1357 mStorageInfo.mNameSpace.mNameTable = new EFI_VARSTORE_ID[DEFAULT_NAME_TABLE_ITEMS];\r
1358 mStorageInfo.mNameSpace.mTableSize = 0;\r
1359}\r
1360\r
1361SVfrVarStorageNode::~SVfrVarStorageNode (\r
1362 VOID\r
1363 )\r
1364{\r
1365 if (mVarStoreName != NULL) {\r
1366 delete mVarStoreName;\r
1367 }\r
1368\r
1369 if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {\r
1370 delete mStorageInfo.mNameSpace.mNameTable;\r
1371 }\r
1372}\r
1373\r
1374CVfrDataStorage::CVfrDataStorage (\r
1375 VOID\r
1376 )\r
1377{\r
1378 UINT32 Index;\r
1379\r
1380 for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
1381 mFreeVarStoreIdBitMap[Index] = 0;\r
1382 }\r
1383\r
1384 // Question ID 0 is reserved.\r
1385 mFreeVarStoreIdBitMap[0] = 0x80000000;\r
1386\r
1387 mBufferVarStoreList = NULL;\r
1388 mEfiVarStoreList = NULL;\r
1389 mNameVarStoreList = NULL;\r
1390 mCurrVarStorageNode = NULL;\r
1391 mNewVarStorageNode = NULL;\r
1392}\r
1393\r
1394CVfrDataStorage::~CVfrDataStorage (\r
1395 VOID\r
1396 )\r
1397{\r
1398 SVfrVarStorageNode *pNode;\r
1399\r
1400 while (mBufferVarStoreList != NULL) {\r
1401 pNode = mBufferVarStoreList;\r
1402 mBufferVarStoreList = mBufferVarStoreList->mNext;\r
1403 delete pNode;\r
1404 }\r
1405 while (mEfiVarStoreList != NULL) {\r
1406 pNode = mEfiVarStoreList;\r
1407 mEfiVarStoreList = mEfiVarStoreList->mNext;\r
1408 delete pNode;\r
1409 }\r
1410 while (mNameVarStoreList != NULL) {\r
1411 pNode = mNameVarStoreList;\r
1412 mNameVarStoreList = mNameVarStoreList->mNext;\r
1413 delete pNode;\r
1414 }\r
1415 if (mNewVarStorageNode != NULL) {\r
1416 delete mNewVarStorageNode;\r
1417 }\r
1418}\r
1419\r
1420EFI_VARSTORE_ID\r
1421CVfrDataStorage::GetFreeVarStoreId (\r
1422 VOID\r
1423 )\r
1424{\r
1425 UINT32 Index, Mask, Offset;\r
1426\r
1427 for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
1428 if (mFreeVarStoreIdBitMap[Index] != 0xFFFFFFFF) {\r
1429 break;\r
1430 }\r
1431 }\r
1432\r
1433 for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
1434 if ((mFreeVarStoreIdBitMap[Index] & Mask) == 0) {\r
1435 mFreeVarStoreIdBitMap[Index] |= Mask;\r
1436 return (EFI_VARSTORE_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);\r
1437 }\r
1438 }\r
1439\r
1440 return EFI_VARSTORE_ID_INVALID;\r
1441}\r
1442\r
1443BOOLEAN\r
1444CVfrDataStorage::ChekVarStoreIdFree (\r
1445 IN EFI_VARSTORE_ID VarStoreId\r
1446 )\r
1447{\r
1448 UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
1449 UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
1450\r
1451 return (mFreeVarStoreIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
1452}\r
1453\r
1454VOID\r
1455CVfrDataStorage::MarkVarStoreIdUsed (\r
1456 IN EFI_VARSTORE_ID VarStoreId\r
1457 )\r
1458{\r
1459 UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
1460 UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
1461\r
1462 mFreeVarStoreIdBitMap[Index] |= (0x80000000 >> Offset);\r
1463}\r
1464\r
1465VOID\r
1466CVfrDataStorage::MarkVarStoreIdUnused (\r
1467 IN EFI_VARSTORE_ID VarStoreId\r
1468 )\r
1469{\r
1470 UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
1471 UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
1472\r
1473 mFreeVarStoreIdBitMap[Index] &= ~(0x80000000 >> Offset);\r
1474}\r
1475\r
1476EFI_VFR_RETURN_CODE\r
1477CVfrDataStorage::DeclareNameVarStoreBegin (\r
1478 IN INT8 *StoreName\r
1479 )\r
1480{\r
1481 SVfrVarStorageNode *pNode = NULL;\r
1482 EFI_VARSTORE_ID VarStoreId;\r
1483\r
1484 if (StoreName == NULL) {\r
1485 return VFR_RETURN_FATAL_ERROR;\r
1486 }\r
1487\r
1488 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1489 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1490 return VFR_RETURN_REDEFINED;\r
1491 }\r
1492 }\r
1493\r
1494 VarStoreId = GetFreeVarStoreId ();\r
1495 if ((pNode = new SVfrVarStorageNode (StoreName, VarStoreId)) == NULL) {\r
1496 return VFR_RETURN_UNDEFINED;\r
1497 }\r
1498\r
1499 mNewVarStorageNode = pNode;\r
1500\r
1501 return VFR_RETURN_SUCCESS;\r
1502}\r
1503\r
1504EFI_VFR_RETURN_CODE\r
1505CVfrDataStorage::NameTableAddItem (\r
1506 IN EFI_STRING_ID Item\r
1507 )\r
1508{\r
1509 EFI_VARSTORE_ID *NewTable, *OldTable;\r
1510 UINT32 TableSize;\r
1511\r
1512 OldTable = mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable;\r
1513 TableSize = mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize;\r
1514\r
1515 if ((TableSize != 0) && ((TableSize % DEFAULT_NAME_TABLE_ITEMS) == 0)) {\r
1516 if ((NewTable = new EFI_VARSTORE_ID[TableSize + DEFAULT_NAME_TABLE_ITEMS]) == NULL) {\r
1517 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1518 }\r
1519 memcpy (NewTable, OldTable, TableSize);\r
1520 mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable = NewTable;\r
1521 }\r
1522\r
1523 mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable[TableSize++] = Item;\r
1524 mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize = TableSize;\r
1525\r
1526 return VFR_RETURN_SUCCESS;\r
1527}\r
1528\r
1529EFI_VFR_RETURN_CODE\r
1530CVfrDataStorage::DeclareNameVarStoreEnd (\r
1531 IN EFI_GUID *Guid\r
1532 )\r
1533{\r
1534 mNewVarStorageNode->mGuid = *Guid;\r
1535 mNewVarStorageNode->mNext = mNameVarStoreList;\r
1536 mNameVarStoreList = mNewVarStorageNode;\r
1537\r
1538 mNewVarStorageNode = NULL;\r
1539\r
1540 return VFR_RETURN_SUCCESS;\r
1541}\r
1542\r
3e99020d 1543EFI_VFR_RETURN_CODE\r
95d675b5 1544CVfrDataStorage::DeclareEfiVarStore (\r
3e99020d
LG
1545 IN INT8 *StoreName,\r
1546 IN EFI_GUID *Guid,\r
95d675b5 1547 IN EFI_STRING_ID NameStrId,\r
1548 IN UINT32 VarSize\r
1549 )\r
1550{\r
1551 SVfrVarStorageNode *pNode;\r
1552 EFI_VARSTORE_ID VarStoreId;\r
1553\r
1554 if ((StoreName == NULL) || (Guid == NULL)) {\r
1555 return VFR_RETURN_FATAL_ERROR;\r
1556 }\r
1557\r
1558 if (VarSize > sizeof (UINT64)) {\r
1559 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR;\r
1560 }\r
1561\r
1562 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1563 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1564 return VFR_RETURN_REDEFINED;\r
1565 }\r
1566 }\r
1567\r
1568 VarStoreId = GetFreeVarStoreId ();\r
1569 if ((pNode = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, NameStrId, VarSize)) == NULL) {\r
1570 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1571 }\r
1572\r
1573 pNode->mNext = mNameVarStoreList;\r
1574 mNameVarStoreList = pNode;\r
1575\r
1576 return VFR_RETURN_SUCCESS;\r
1577}\r
1578\r
3e99020d 1579EFI_VFR_RETURN_CODE\r
95d675b5 1580CVfrDataStorage::DeclareBufferVarStore (\r
3e99020d
LG
1581 IN INT8 *StoreName,\r
1582 IN EFI_GUID *Guid,\r
95d675b5 1583 IN CVfrVarDataTypeDB *DataTypeDB,\r
1584 IN INT8 *TypeName,\r
1585 IN EFI_VARSTORE_ID VarStoreId\r
1586 )\r
1587{\r
1588 SVfrVarStorageNode *pNew = NULL;\r
1589 SVfrDataType *pDataType = NULL;\r
1590\r
1591 if ((StoreName == NULL) || (Guid == NULL) || (DataTypeDB == NULL)) {\r
1592 return VFR_RETURN_FATAL_ERROR;\r
1593 }\r
1594\r
1595 CHECK_ERROR_RETURN(DataTypeDB->GetDataType (TypeName, &pDataType), VFR_RETURN_SUCCESS);\r
1596\r
1597 if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
1598 VarStoreId = GetFreeVarStoreId ();\r
1599 } else {\r
1600 if (ChekVarStoreIdFree (VarStoreId) == FALSE) {\r
1601 return VFR_RETURN_VARSTOREID_REDEFINED;\r
1602 }\r
1603 MarkVarStoreIdUsed (VarStoreId);\r
1604 }\r
1605\r
1606 if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType)) == NULL) {\r
1607 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1608 }\r
1609\r
1610 pNew->mNext = mBufferVarStoreList;\r
1611 mBufferVarStoreList = pNew;\r
1612\r
1613 if (gCVfrBufferConfig.Register(StoreName) != 0) {\r
1614 return VFR_RETURN_FATAL_ERROR;\r
1615 }\r
1616\r
1617 return VFR_RETURN_SUCCESS;\r
1618}\r
1619\r
3e99020d 1620EFI_VFR_RETURN_CODE\r
95d675b5 1621CVfrDataStorage::GetVarStoreId (\r
1622 IN INT8 *StoreName,\r
1623 OUT EFI_VARSTORE_ID *VarStoreId\r
1624 )\r
1625{\r
1626 SVfrVarStorageNode *pNode;\r
1627\r
1628 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1629 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1630 mCurrVarStorageNode = pNode;\r
1631 *VarStoreId = pNode->mVarStoreId;\r
1632 return VFR_RETURN_SUCCESS;\r
1633 }\r
1634 }\r
1635\r
1636 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1637 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1638 mCurrVarStorageNode = pNode;\r
1639 *VarStoreId = pNode->mVarStoreId;\r
1640 return VFR_RETURN_SUCCESS;\r
1641 }\r
1642 }\r
1643\r
1644 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1645 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1646 mCurrVarStorageNode = pNode;\r
1647 *VarStoreId = pNode->mVarStoreId;\r
1648 return VFR_RETURN_SUCCESS;\r
1649 }\r
1650 }\r
1651\r
1652 mCurrVarStorageNode = NULL;\r
1653 *VarStoreId = EFI_VARSTORE_ID_INVALID;\r
1654 return VFR_RETURN_UNDEFINED;\r
1655}\r
1656\r
1657EFI_VFR_RETURN_CODE\r
1658CVfrDataStorage::GetBufferVarStoreDataTypeName (\r
1659 IN INT8 *StoreName,\r
1660 OUT INT8 **DataTypeName\r
1661 )\r
1662{\r
1663 SVfrVarStorageNode *pNode;\r
1664\r
1665 if ((StoreName == NULL) || (DataTypeName == NULL)) {\r
1666 return VFR_RETURN_FATAL_ERROR;\r
1667 }\r
1668\r
1669 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1670 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1671 break;\r
1672 }\r
1673 }\r
1674\r
1675 if (pNode == NULL) {\r
1676 return VFR_RETURN_UNDEFINED;\r
1677 }\r
1678\r
1679 if (pNode->mStorageInfo.mDataType == NULL) {\r
1680 return VFR_RETURN_FATAL_ERROR;\r
1681 }\r
1682\r
1683 *DataTypeName = pNode->mStorageInfo.mDataType->mTypeName;\r
1684 return VFR_RETURN_SUCCESS;\r
1685}\r
1686\r
1687EFI_VFR_RETURN_CODE\r
1688CVfrDataStorage::GetVarStoreType (\r
1689 IN INT8 *StoreName,\r
1690 OUT EFI_VFR_VARSTORE_TYPE &VarStoreType\r
1691 )\r
1692{\r
1693 SVfrVarStorageNode *pNode;\r
1694\r
1695 if (StoreName == NULL) {\r
1696 return VFR_RETURN_FATAL_ERROR;\r
1697 }\r
1698\r
1699 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1700 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1701 VarStoreType = pNode->mVarStoreType;\r
1702 return VFR_RETURN_SUCCESS;\r
1703 }\r
1704 }\r
1705\r
1706 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1707 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1708 VarStoreType = pNode->mVarStoreType;\r
1709 return VFR_RETURN_SUCCESS;\r
1710 }\r
1711 }\r
1712\r
1713 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1714 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1715 VarStoreType = pNode->mVarStoreType;\r
1716 return VFR_RETURN_SUCCESS;\r
1717 }\r
1718 }\r
1719\r
1720 VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
1721 return VFR_RETURN_UNDEFINED;\r
1722}\r
1723\r
3e99020d
LG
1724EFI_VFR_VARSTORE_TYPE\r
1725CVfrDataStorage::GetVarStoreType (\r
1726 IN EFI_VARSTORE_ID VarStoreId\r
1727 )\r
1728{\r
1729 SVfrVarStorageNode *pNode;\r
1730 EFI_VFR_VARSTORE_TYPE VarStoreType;\r
1731\r
1732 VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
1733\r
1734 if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
1735 return VarStoreType;\r
1736 }\r
1737\r
1738 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1739 if (pNode->mVarStoreId == VarStoreId) {\r
1740 VarStoreType = pNode->mVarStoreType;\r
1741 return VarStoreType;\r
1742 }\r
1743 }\r
1744\r
1745 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1746 if (pNode->mVarStoreId == VarStoreId) {\r
1747 VarStoreType = pNode->mVarStoreType;\r
1748 return VarStoreType;\r
1749 }\r
1750 }\r
1751\r
1752 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1753 if (pNode->mVarStoreId == VarStoreId) {\r
1754 VarStoreType = pNode->mVarStoreType;\r
1755 return VarStoreType;\r
1756 }\r
1757 }\r
1758\r
1759 return VarStoreType;\r
1760}\r
1761\r
95d675b5 1762EFI_VFR_RETURN_CODE\r
1763CVfrDataStorage::GetVarStoreName (\r
3e99020d 1764 IN EFI_VARSTORE_ID VarStoreId,\r
95d675b5 1765 OUT INT8 **VarStoreName\r
1766 )\r
1767{\r
1768 SVfrVarStorageNode *pNode;\r
1769\r
1770 if (VarStoreName == NULL) {\r
1771 return VFR_RETURN_FATAL_ERROR;\r
1772 }\r
1773\r
1774 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1775 if (pNode->mVarStoreId == VarStoreId) {\r
1776 *VarStoreName = pNode->mVarStoreName;\r
1777 return VFR_RETURN_SUCCESS;\r
1778 }\r
1779 }\r
1780\r
1781 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1782 if (pNode->mVarStoreId == VarStoreId) {\r
1783 *VarStoreName = pNode->mVarStoreName;\r
1784 return VFR_RETURN_SUCCESS;\r
1785 }\r
1786 }\r
1787\r
1788 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1789 if (pNode->mVarStoreId == VarStoreId) {\r
1790 *VarStoreName = pNode->mVarStoreName;\r
1791 return VFR_RETURN_SUCCESS;\r
1792 }\r
1793 }\r
1794\r
1795 *VarStoreName = NULL;\r
1796 return VFR_RETURN_UNDEFINED;\r
1797}\r
1798\r
1799EFI_VFR_RETURN_CODE\r
1800CVfrDataStorage::GetEfiVarStoreInfo (\r
1801 IN OUT EFI_VARSTORE_INFO *Info\r
1802 )\r
1803{\r
1804 if (Info == NULL) {\r
1805 return VFR_RETURN_FATAL_ERROR;\r
1806 }\r
1807\r
1808 if (mCurrVarStorageNode == NULL) {\r
1809 return VFR_RETURN_GET_EFIVARSTORE_ERROR;\r
1810 }\r
1811\r
1812 Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarName;\r
1813 Info->mVarTotalSize = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarSize;\r
1814 switch (Info->mVarTotalSize) {\r
1815 case 1:\r
1816 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_8;\r
1817 break;\r
1818 case 2:\r
1819 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_16;\r
1820 break;\r
1821 case 4:\r
1822 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_32;\r
1823 break;\r
1824 case 8:\r
1825 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_64;\r
1826 break;\r
1827 default :\r
1828 return VFR_RETURN_FATAL_ERROR;\r
1829 }\r
1830\r
1831 return VFR_RETURN_SUCCESS;\r
1832}\r
1833\r
1834EFI_VFR_RETURN_CODE\r
1835CVfrDataStorage::GetNameVarStoreInfo (\r
1836 OUT EFI_VARSTORE_INFO *Info,\r
1837 IN UINT32 Index\r
1838 )\r
1839{\r
1840 if (Info == NULL) {\r
1841 return VFR_RETURN_FATAL_ERROR;\r
1842 }\r
1843\r
1844 if (mCurrVarStorageNode == NULL) {\r
1845 return VFR_RETURN_GET_NVVARSTORE_ERROR;\r
1846 }\r
1847\r
1848 Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mNameSpace.mNameTable[Index];\r
1849\r
1850 return VFR_RETURN_SUCCESS;\r
1851}\r
1852\r
1853EFI_VFR_RETURN_CODE\r
1854CVfrDataStorage::BufferVarStoreRequestElementAdd (\r
1855 IN INT8 *StoreName,\r
1856 IN EFI_VARSTORE_INFO &Info\r
1857 )\r
1858{\r
1859 INT8 NewReqElt[128] = {'\0',};\r
1860 INT8 *OldReqElt = NULL;\r
1861 SVfrVarStorageNode *pNode = NULL;\r
3e99020d 1862 EFI_IFR_TYPE_VALUE Value = {0};\r
95d675b5 1863\r
1864 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1865 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1866 break;\r
1867 }\r
1868 }\r
1869\r
1870 if (pNode == NULL) {\r
1871 return VFR_RETURN_UNDEFINED;\r
1872 }\r
1873\r
1874 gCVfrBufferConfig.Open ();\r
1875 Value.u8 = 0;\r
1876 if (gCVfrBufferConfig.Write ('a', StoreName, NULL, EFI_IFR_TYPE_NUM_SIZE_8, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
1877 return VFR_RETURN_FATAL_ERROR;\r
1878 }\r
1879 gCVfrBufferConfig.Close ();\r
1880\r
1881 return VFR_RETURN_SUCCESS;\r
1882}\r
1883\r
1884SVfrDefaultStoreNode::SVfrDefaultStoreNode (\r
1885 IN EFI_IFR_DEFAULTSTORE *ObjBinAddr,\r
3e99020d
LG
1886 IN INT8 *RefName,\r
1887 IN EFI_STRING_ID DefaultStoreNameId,\r
95d675b5 1888 IN UINT16 DefaultId\r
1889 )\r
1890{\r
1891 mObjBinAddr = ObjBinAddr;\r
1892\r
1893 if (RefName != NULL) {\r
1894 mRefName = new INT8[strlen (RefName) + 1];\r
1895 strcpy (mRefName, RefName);\r
1896 } else {\r
1897 mRefName = NULL;\r
1898 }\r
1899\r
1900 mNext = NULL;\r
1901 mDefaultId = DefaultId;\r
1902 mDefaultStoreNameId = DefaultStoreNameId;\r
1903}\r
1904\r
1905SVfrDefaultStoreNode::~SVfrDefaultStoreNode (\r
1906 VOID\r
1907 )\r
1908{\r
1909 if (mRefName != NULL) {\r
1910 delete mRefName;\r
1911 }\r
1912}\r
1913\r
1914CVfrDefaultStore::CVfrDefaultStore (\r
1915 VOID\r
1916 )\r
1917{\r
1918 mDefaultStoreList = NULL;\r
1919}\r
1920\r
1921CVfrDefaultStore::~CVfrDefaultStore (\r
1922 VOID\r
1923 )\r
1924{\r
1925 SVfrDefaultStoreNode *pTmp = NULL;\r
1926\r
1927 while (mDefaultStoreList != NULL) {\r
1928 pTmp = mDefaultStoreList;\r
1929 mDefaultStoreList = mDefaultStoreList->mNext;\r
1930 delete pTmp;\r
1931 }\r
1932}\r
1933\r
1934EFI_VFR_RETURN_CODE\r
1935CVfrDefaultStore::RegisterDefaultStore (\r
1936 IN CHAR8 *ObjBinAddr,\r
1937 IN INT8 *RefName,\r
1938 IN EFI_STRING_ID DefaultStoreNameId,\r
1939 IN UINT16 DefaultId\r
1940 )\r
1941{\r
1942 SVfrDefaultStoreNode *pNode = NULL;\r
1943\r
1944 if (RefName == NULL) {\r
1945 return VFR_RETURN_FATAL_ERROR;\r
1946 }\r
1947\r
1948 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1949 if (strcmp (pNode->mRefName, RefName) == 0) {\r
1950 return VFR_RETURN_REDEFINED;\r
1951 }\r
1952 }\r
1953\r
1954 if ((pNode = new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE *)ObjBinAddr, RefName, DefaultStoreNameId, DefaultId)) == NULL) {\r
1955 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1956 }\r
1957\r
1958 pNode->mNext = mDefaultStoreList;\r
1959 mDefaultStoreList = pNode;\r
1960\r
1961 return VFR_RETURN_SUCCESS;\r
1962}\r
1963\r
1964/*\r
3e99020d 1965 * assign new reference name or new default store name id only if\r
95d675b5 1966 * the original is invalid\r
1967 */\r
1968EFI_VFR_RETURN_CODE\r
1969CVfrDefaultStore::ReRegisterDefaultStoreById (\r
1970 IN UINT16 DefaultId,\r
1971 IN INT8 *RefName,\r
1972 IN EFI_STRING_ID DefaultStoreNameId\r
1973 )\r
1974{\r
1975 SVfrDefaultStoreNode *pNode = NULL;\r
1976\r
1977 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1978 if (pNode->mDefaultId == DefaultId) {\r
1979 break;\r
1980 }\r
1981 }\r
1982\r
1983 if (pNode == NULL) {\r
1984 return VFR_RETURN_UNDEFINED;\r
1985 } else {\r
1986 if (pNode->mDefaultStoreNameId == EFI_STRING_ID_INVALID) {\r
1987 pNode->mDefaultStoreNameId = DefaultStoreNameId;\r
1988 if (pNode->mObjBinAddr != NULL) {\r
1989 pNode->mObjBinAddr->DefaultName = DefaultStoreNameId;\r
1990 }\r
1991 } else {\r
1992 return VFR_RETURN_REDEFINED;\r
1993 }\r
1994\r
1995 if (RefName != NULL) {\r
1996 delete pNode->mRefName;\r
1997 pNode->mRefName = new INT8[strlen (RefName) + 1];\r
1998 if (pNode->mRefName != NULL) {\r
1999 strcpy (pNode->mRefName, RefName);\r
2000 }\r
2001 }\r
2002 }\r
2003\r
2004 return VFR_RETURN_SUCCESS;\r
2005}\r
2006\r
2007BOOLEAN\r
2008CVfrDefaultStore::DefaultIdRegistered (\r
2009 IN UINT16 DefaultId\r
2010 )\r
2011{\r
2012 SVfrDefaultStoreNode *pNode = NULL;\r
2013\r
2014 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
2015 if (pNode->mDefaultId == DefaultId) {\r
2016 return TRUE;\r
2017 }\r
2018 }\r
2019\r
2020 return FALSE;\r
2021}\r
2022\r
2023EFI_VFR_RETURN_CODE\r
2024CVfrDefaultStore::GetDefaultId (\r
2025 IN INT8 *RefName,\r
2026 OUT UINT16 *DefaultId\r
2027 )\r
2028{\r
2029 SVfrDefaultStoreNode *pTmp = NULL;\r
2030\r
2031 if (DefaultId == NULL) {\r
2032 return VFR_RETURN_FATAL_ERROR;\r
2033 }\r
2034\r
2035 for (pTmp = mDefaultStoreList; pTmp != NULL; pTmp = pTmp->mNext) {\r
2036 if (strcmp (pTmp->mRefName, RefName) == 0) {\r
2037 *DefaultId = pTmp->mDefaultId;\r
2038 return VFR_RETURN_SUCCESS;\r
2039 }\r
2040 }\r
2041\r
2042 return VFR_RETURN_UNDEFINED;\r
2043}\r
2044\r
2045STATIC\r
2046EFI_VFR_RETURN_CODE\r
2047AltCfgItemPrintToBuffer (\r
3e99020d
LG
2048 IN INT8 *NewAltCfg,\r
2049 IN EFI_VARSTORE_INFO Info,\r
95d675b5 2050 IN UINT8 Type,\r
2051 IN EFI_IFR_TYPE_VALUE Value\r
2052 )\r
2053{\r
2054 UINT32 Index;\r
2055 UINT8 *BufChar = NULL;\r
2056 UINT32 Count = 0;\r
2057\r
2058 if (NewAltCfg != NULL) {\r
2059 Count = sprintf (\r
3e99020d
LG
2060 NewAltCfg,\r
2061 "&OFFSET=%x&WIDTH=%x&VALUE=",\r
2062 Info.mInfo.mVarOffset,\r
95d675b5 2063 Info.mVarTotalSize\r
2064 );\r
2065 NewAltCfg += Count;\r
2066\r
2067 switch (Type) {\r
2068 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
2069 Count = sprintf (NewAltCfg, "%x", Value.u8);\r
2070 NewAltCfg += Count;\r
2071 break;\r
2072 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
2073 Count = sprintf (NewAltCfg, "%x", Value.u16);\r
2074 NewAltCfg += Count;\r
2075 break;\r
2076 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
2077 Count = sprintf (NewAltCfg, "%x", Value.u32);\r
2078 NewAltCfg += Count;\r
2079 break;\r
2080 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
2081 Count = sprintf (NewAltCfg, "%x", Value.u64);\r
2082 NewAltCfg += Count;\r
2083 break;\r
2084 case EFI_IFR_TYPE_BOOLEAN :\r
2085 Count = sprintf (NewAltCfg, "%x", Value.b);\r
2086 NewAltCfg += Count;\r
2087 break;\r
2088 case EFI_IFR_TYPE_TIME :\r
2089#if 1\r
2090 Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.time)));\r
2091 NewAltCfg += Count;\r
2092#else\r
2093 BufChar = (UINT8 *)&Value.time;\r
2094 for (Index = 0; Index < sizeof(EFI_HII_TIME); Index++) {\r
2095 Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);\r
2096 NewAltCfg += Count;\r
2097 }\r
2098#endif\r
2099 break;\r
2100 case EFI_IFR_TYPE_DATE :\r
2101#if 1\r
2102 Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.date)));\r
2103 NewAltCfg += Count;\r
2104#else\r
2105 BufChar = (UINT8 *)&Value.date;\r
2106 for (Index = 0; Index < sizeof(EFI_HII_DATE); Index++) {\r
2107 Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);\r
2108 NewAltCfg += Count;\r
2109 }\r
2110#endif\r
2111 break;\r
2112 case EFI_IFR_TYPE_STRING :\r
2113 Count = sprintf (NewAltCfg, "%x", Value.string);\r
2114 NewAltCfg += Count;\r
2115 break;\r
2116 case EFI_IFR_TYPE_OTHER :\r
2117 return VFR_RETURN_UNSUPPORTED;\r
2118 }\r
2119 }\r
2120\r
3e99020d 2121 return VFR_RETURN_FATAL_ERROR;\r
95d675b5 2122}\r
2123\r
2124EFI_VFR_RETURN_CODE\r
2125CVfrDefaultStore::BufferVarStoreAltConfigAdd (\r
2126 IN EFI_VARSTORE_ID DefaultId,\r
2127 IN EFI_VARSTORE_INFO &Info,\r
2128 IN INT8 *VarStoreName,\r
2129 IN UINT8 Type,\r
2130 IN EFI_IFR_TYPE_VALUE Value\r
2131 )\r
2132{\r
2133 SVfrDefaultStoreNode *pNode = NULL;\r
2134 INT8 NewAltCfg[2 * 2 * sizeof (UINT16) + 1] = {0,};\r
3e99020d 2135 INTN Returnvalue = 0;\r
95d675b5 2136\r
2137 if (VarStoreName == NULL) {\r
2138 return VFR_RETURN_FATAL_ERROR;\r
2139 }\r
2140\r
2141 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
2142 if (pNode->mDefaultId == DefaultId) {\r
2143 break;\r
2144 }\r
2145 }\r
2146\r
2147 if (pNode == NULL) {\r
2148 return VFR_RETURN_UNDEFINED;\r
2149 }\r
2150\r
2151 gCVfrBufferConfig.Open ();\r
2152\r
2153 sprintf (NewAltCfg, "%04x", pNode->mDefaultId);\r
3e99020d
LG
2154 if ((Returnvalue = gCVfrBufferConfig.Select(VarStoreName)) == 0) {\r
2155 if ((Returnvalue = gCVfrBufferConfig.Write ('a', VarStoreName, NewAltCfg, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value)) != 0) {\r
95d675b5 2156 goto WriteError;\r
2157 }\r
2158 }\r
2159\r
95d675b5 2160 gCVfrBufferConfig.Close ();\r
2161\r
2162 return VFR_RETURN_SUCCESS;\r
2163\r
2164WriteError:\r
2165 gCVfrBufferConfig.Close ();\r
3e99020d 2166 return (EFI_VFR_RETURN_CODE)Returnvalue;\r
95d675b5 2167}\r
2168\r
2169SVfrRuleNode::SVfrRuleNode (\r
3e99020d 2170 IN INT8 *RuleName,\r
95d675b5 2171 IN UINT8 RuleId\r
2172 )\r
2173{\r
2174 if (RuleName != NULL) {\r
2175 mRuleName = new INT8[strlen (RuleName) + 1];\r
2176 strcpy (mRuleName, RuleName);\r
2177 } else {\r
2178 mRuleName = NULL;\r
2179 }\r
2180\r
2181 mNext = NULL;\r
2182 mRuleId = RuleId;\r
2183}\r
2184\r
2185SVfrRuleNode::~SVfrRuleNode (\r
2186 VOID\r
2187 )\r
2188{\r
2189 if (mRuleName != NULL) {\r
2190 delete mRuleName;\r
2191 }\r
2192}\r
2193\r
2194CVfrRulesDB::CVfrRulesDB ()\r
2195{\r
2196 mRuleList = NULL;\r
2197 mFreeRuleId = EFI_VARSTORE_ID_START;\r
2198}\r
2199\r
2200CVfrRulesDB::~CVfrRulesDB ()\r
2201{\r
2202 SVfrRuleNode *pNode;\r
2203\r
2204 while(mRuleList != NULL) {\r
2205 pNode = mRuleList;\r
2206 mRuleList = mRuleList->mNext;\r
2207 delete pNode;\r
2208 }\r
2209}\r
2210\r
2211VOID\r
2212CVfrRulesDB::RegisterRule (\r
2213 IN INT8 *RuleName\r
2214 )\r
2215{\r
2216 SVfrRuleNode *pNew;\r
2217\r
2218 if (RuleName == NULL) {\r
2219 return ;\r
2220 }\r
2221\r
2222 if ((pNew = new SVfrRuleNode (RuleName, mFreeRuleId)) == NULL) {\r
2223 return ;\r
2224 }\r
2225\r
2226 mFreeRuleId++;\r
2227\r
2228 pNew->mNext = mRuleList;\r
2229 mRuleList = pNew;\r
2230}\r
2231\r
2232UINT8\r
2233CVfrRulesDB::GetRuleId (\r
2234 IN INT8 *RuleName\r
2235 )\r
2236{\r
2237 SVfrRuleNode *pNode;\r
2238\r
2239 if (RuleName == NULL) {\r
2240 return EFI_RULE_ID_INVALID;\r
2241 }\r
2242\r
2243 for (pNode = mRuleList; pNode != NULL; pNode = pNode->mNext) {\r
2244 if (strcmp (pNode->mRuleName, RuleName) == 0) {\r
2245 return pNode->mRuleId;\r
2246 }\r
2247 }\r
2248\r
2249 return EFI_RULE_ID_INVALID;\r
2250}\r
2251\r
2252CVfrRulesDB gCVfrRulesDB;\r
2253\r
2254EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
2255 VOID\r
2256 )\r
2257{\r
2258 mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
2259 mInfo.mVarName = EFI_STRING_ID_INVALID;\r
2260 mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
2261 mVarType = EFI_IFR_TYPE_OTHER;\r
2262 mVarTotalSize = 0;\r
2263}\r
2264\r
2265EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
2266 IN EFI_VARSTORE_INFO &Info\r
2267 )\r
2268{\r
2269 mVarStoreId = Info.mVarStoreId;\r
2270 mInfo.mVarName = Info.mInfo.mVarName;\r
2271 mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
2272 mVarType = Info.mVarType;\r
2273 mVarTotalSize = Info.mVarTotalSize;\r
2274}\r
2275\r
3e99020d 2276BOOLEAN\r
95d675b5 2277EFI_VARSTORE_INFO::operator == (\r
2278 IN EFI_VARSTORE_INFO *Info\r
2279 )\r
2280{\r
2281 if ((mVarStoreId == Info->mVarStoreId) &&\r
2282 (mInfo.mVarName == Info->mInfo.mVarName) &&\r
2283 (mInfo.mVarOffset == Info->mInfo.mVarOffset) &&\r
2284 (mVarType == Info->mVarType) &&\r
2285 (mVarTotalSize == Info->mVarTotalSize)) {\r
2286 return TRUE;\r
2287 }\r
2288\r
2289 return FALSE;\r
2290}\r
2291\r
2292static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo;\r
2293\r
2294EFI_QUESTION_ID\r
2295CVfrQuestionDB::GetFreeQuestionId (\r
2296 VOID\r
2297 )\r
2298{\r
2299 UINT32 Index, Mask, Offset;\r
2300\r
2301 for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {\r
2302 if (mFreeQIdBitMap[Index] != 0xFFFFFFFF) {\r
2303 break;\r
2304 }\r
2305 }\r
2306\r
2307 for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
2308 if ((mFreeQIdBitMap[Index] & Mask) == 0) {\r
2309 mFreeQIdBitMap[Index] |= Mask;\r
2310 return (EFI_QUESTION_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);\r
2311 }\r
2312 }\r
2313\r
2314 return EFI_QUESTION_ID_INVALID;\r
2315}\r
2316\r
2317BOOLEAN\r
2318CVfrQuestionDB::ChekQuestionIdFree (\r
2319 IN EFI_QUESTION_ID QId\r
2320 )\r
2321{\r
2322 UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
2323 UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
2324\r
2325 return (mFreeQIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
2326}\r
2327\r
3e99020d 2328VOID\r
95d675b5 2329CVfrQuestionDB::MarkQuestionIdUsed (\r
2330 IN EFI_QUESTION_ID QId\r
2331 )\r
2332{\r
2333 UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
2334 UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
2335\r
2336 mFreeQIdBitMap[Index] |= (0x80000000 >> Offset);\r
2337}\r
2338\r
3e99020d 2339VOID\r
95d675b5 2340CVfrQuestionDB::MarkQuestionIdUnused (\r
2341 IN EFI_QUESTION_ID QId\r
2342 )\r
2343{\r
2344 UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
2345 UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
2346\r
2347 mFreeQIdBitMap[Index] &= ~(0x80000000 >> Offset);\r
2348}\r
2349\r
2350SVfrQuestionNode::SVfrQuestionNode (\r
2351 IN INT8 *Name,\r
2352 IN INT8 *VarIdStr,\r
2353 IN UINT32 BitMask\r
2354 )\r
2355{\r
2356 mName = NULL;\r
2357 mVarIdStr = NULL;\r
2358 mQuestionId = EFI_QUESTION_ID_INVALID;\r
2359 mBitMask = BitMask;\r
2360 mNext = NULL;\r
2361\r
2362 if (Name == NULL) {\r
2363 mName = new INT8[strlen ("$DEFAULT") + 1];\r
2364 strcpy (mName, "$DEFAULT");\r
2365 } else {\r
2366 mName = new INT8[strlen (Name) + 1];\r
2367 strcpy (mName, Name);\r
2368 }\r
2369\r
2370 if (VarIdStr != NULL) {\r
2371 mVarIdStr = new INT8[strlen (VarIdStr) + 1];\r
2372 strcpy (mVarIdStr, VarIdStr);\r
2373 } else {\r
2374 mVarIdStr = new INT8[strlen ("$") + 1];\r
2375 strcpy (mVarIdStr, "$");\r
2376 }\r
2377}\r
2378\r
2379SVfrQuestionNode::~SVfrQuestionNode (\r
2380 VOID\r
2381 )\r
2382{\r
2383 if (mName != NULL) {\r
2384 delete mName;\r
2385 }\r
2386\r
2387 if (mVarIdStr != NULL) {\r
2388 delete mVarIdStr;\r
2389 }\r
2390}\r
2391\r
2392CVfrQuestionDB::CVfrQuestionDB ()\r
2393{\r
2394 UINT32 Index;\r
2395\r
2396 for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {\r
2397 mFreeQIdBitMap[Index] = 0;\r
2398 }\r
2399\r
2400 // Question ID 0 is reserved.\r
2401 mFreeQIdBitMap[0] = 0x80000000;\r
2402 mQuestionList = NULL;\r
2403}\r
2404\r
2405CVfrQuestionDB::~CVfrQuestionDB ()\r
2406{\r
2407 SVfrQuestionNode *pNode;\r
2408\r
2409 while (mQuestionList != NULL) {\r
2410 pNode = mQuestionList;\r
2411 mQuestionList = mQuestionList->mNext;\r
2412 delete pNode;\r
2413 }\r
2414}\r
2415\r
2416EFI_VFR_RETURN_CODE\r
2417CVfrQuestionDB::RegisterQuestion (\r
2418 IN INT8 *Name,\r
2419 IN INT8 *VarIdStr,\r
2420 IN OUT EFI_QUESTION_ID &QuestionId\r
2421 )\r
2422{\r
2423 SVfrQuestionNode *pNode = NULL;\r
2424\r
2425 if ((Name != NULL) && (FindQuestion(Name) == VFR_RETURN_SUCCESS)) {\r
2426 return VFR_RETURN_REDEFINED;\r
2427 }\r
2428\r
2429 if ((pNode = new SVfrQuestionNode (Name, VarIdStr)) == NULL) {\r
2430 return VFR_RETURN_OUT_FOR_RESOURCES;\r
2431 }\r
2432\r
2433 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2434 QuestionId = GetFreeQuestionId ();\r
2435 } else {\r
2436 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2437 delete pNode;\r
2438 return VFR_RETURN_QUESTIONID_REDEFINED;\r
2439 }\r
2440 MarkQuestionIdUsed (QuestionId);\r
2441 }\r
2442 pNode->mQuestionId = QuestionId;\r
2443\r
2444 pNode->mNext = mQuestionList;\r
2445 mQuestionList = pNode;\r
2446\r
2447 gCFormPkg.DoPendingAssign (VarIdStr, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2448\r
2449 return VFR_RETURN_SUCCESS;\r
2450}\r
2451\r
2452VOID\r
2453CVfrQuestionDB::RegisterOldDateQuestion (\r
3e99020d
LG
2454 IN INT8 *YearVarId,\r
2455 IN INT8 *MonthVarId,\r
2456 IN INT8 *DayVarId,\r
95d675b5 2457 IN OUT EFI_QUESTION_ID &QuestionId\r
2458 )\r
2459{\r
2460 SVfrQuestionNode *pNode[3] = {NULL, };\r
2461 UINT32 Index;\r
2462\r
2463 if ((YearVarId == NULL) || (MonthVarId == NULL) || (DayVarId == NULL)) {\r
2464 return;\r
2465 }\r
2466\r
2467 if ((pNode[0] = new SVfrQuestionNode (NULL, YearVarId, DATE_YEAR_BITMASK)) == NULL) {\r
2468 goto Err;\r
2469 }\r
2470 if ((pNode[1] = new SVfrQuestionNode (NULL, MonthVarId, DATE_MONTH_BITMASK)) == NULL) {\r
2471 goto Err;\r
2472 }\r
2473 if ((pNode[2] = new SVfrQuestionNode (NULL, DayVarId, DATE_DAY_BITMASK)) == NULL) {\r
2474 goto Err;\r
2475 }\r
2476\r
2477 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2478 QuestionId = GetFreeQuestionId ();\r
2479 } else {\r
2480 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2481 goto Err;\r
2482 }\r
2483 MarkQuestionIdUsed (QuestionId);\r
2484 }\r
2485\r
2486 pNode[0]->mQuestionId = QuestionId;\r
2487 pNode[1]->mQuestionId = QuestionId;\r
2488 pNode[2]->mQuestionId = QuestionId;\r
2489 pNode[0]->mNext = pNode[1];\r
2490 pNode[1]->mNext = pNode[2];\r
2491 pNode[2]->mNext = mQuestionList;\r
2492 mQuestionList = pNode[0];\r
2493\r
2494 gCFormPkg.DoPendingAssign (YearVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2495 gCFormPkg.DoPendingAssign (MonthVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2496 gCFormPkg.DoPendingAssign (DayVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2497\r
2498 return;\r
2499\r
2500Err:\r
2501 for (Index = 0; Index < 3; Index++) {\r
2502 if (pNode[Index] != NULL) {\r
2503 delete pNode[Index];\r
2504 }\r
2505 }\r
2506 QuestionId = EFI_QUESTION_ID_INVALID;\r
2507}\r
2508\r
2509VOID\r
2510CVfrQuestionDB::RegisterNewDateQuestion (\r
2511 IN INT8 *Name,\r
3e99020d 2512 IN INT8 *BaseVarId,\r
95d675b5 2513 IN OUT EFI_QUESTION_ID &QuestionId\r
2514 )\r
2515{\r
2516 SVfrQuestionNode *pNode[3] = {NULL, };\r
2517 UINT32 Len;\r
2518 INT8 *VarIdStr[3] = {NULL, };\r
2519 INT8 Index;\r
2520\r
2521 if (BaseVarId == NULL) {\r
2522 return;\r
2523 }\r
2524\r
2525 Len = strlen (BaseVarId);\r
2526\r
2527 VarIdStr[0] = new INT8[Len + strlen (".Year") + 1];\r
2528 if (VarIdStr[0] != NULL) {\r
2529 strcpy (VarIdStr[0], BaseVarId);\r
2530 strcat (VarIdStr[0], ".Year");\r
2531 }\r
2532 VarIdStr[1] = new INT8[Len + strlen (".Month") + 1];\r
2533 if (VarIdStr[1] != NULL) {\r
2534 strcpy (VarIdStr[1], BaseVarId);\r
2535 strcat (VarIdStr[1], ".Month");\r
2536 }\r
2537 VarIdStr[2] = new INT8[Len + strlen (".Day") + 1];\r
2538 if (VarIdStr[2] != NULL) {\r
2539 strcpy (VarIdStr[2], BaseVarId);\r
2540 strcat (VarIdStr[2], ".Day");\r
2541 }\r
2542\r
2543 if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], DATE_YEAR_BITMASK)) == NULL) {\r
2544 goto Err;\r
2545 }\r
2546 if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], DATE_MONTH_BITMASK)) == NULL) {\r
2547 goto Err;\r
2548 }\r
2549 if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], DATE_DAY_BITMASK)) == NULL) {\r
2550 goto Err;\r
2551 }\r
2552\r
2553 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2554 QuestionId = GetFreeQuestionId ();\r
2555 } else {\r
2556 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2557 goto Err;\r
2558 }\r
2559 MarkQuestionIdUsed (QuestionId);\r
2560 }\r
2561\r
2562 pNode[0]->mQuestionId = QuestionId;\r
2563 pNode[1]->mQuestionId = QuestionId;\r
2564 pNode[2]->mQuestionId = QuestionId;\r
2565 pNode[0]->mNext = pNode[1];\r
2566 pNode[1]->mNext = pNode[2];\r
2567 pNode[2]->mNext = mQuestionList;\r
2568 mQuestionList = pNode[0];\r
2569\r
2570 for (Index = 0; Index < 3; Index++) {\r
2571 if (VarIdStr[Index] != NULL) {\r
2572 delete VarIdStr[Index];\r
2573 }\r
2574 }\r
2575\r
2576 gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2577 gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2578 gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2579\r
2580 return;\r
2581\r
2582Err:\r
2583 for (Index = 0; Index < 3; Index++) {\r
2584 if (pNode[Index] != NULL) {\r
2585 delete pNode[Index];\r
2586 }\r
2587\r
2588 if (VarIdStr[Index] != NULL) {\r
2589 delete VarIdStr[Index];\r
2590 }\r
2591 }\r
2592}\r
2593\r
2594VOID\r
2595CVfrQuestionDB::RegisterOldTimeQuestion (\r
3e99020d
LG
2596 IN INT8 *HourVarId,\r
2597 IN INT8 *MinuteVarId,\r
2598 IN INT8 *SecondVarId,\r
95d675b5 2599 IN OUT EFI_QUESTION_ID &QuestionId\r
2600 )\r
2601{\r
2602 SVfrQuestionNode *pNode[3] = {NULL, };\r
2603 UINT32 Index;\r
2604\r
2605 if ((HourVarId == NULL) || (MinuteVarId == NULL) || (SecondVarId == NULL)) {\r
2606 return;\r
2607 }\r
2608\r
2609 if ((pNode[0] = new SVfrQuestionNode (NULL, HourVarId, TIME_HOUR_BITMASK)) == NULL) {\r
2610 goto Err;\r
2611 }\r
2612 if ((pNode[1] = new SVfrQuestionNode (NULL, MinuteVarId, TIME_MINUTE_BITMASK)) == NULL) {\r
2613 goto Err;\r
2614 }\r
2615 if ((pNode[2] = new SVfrQuestionNode (NULL, SecondVarId, TIME_SECOND_BITMASK)) == NULL) {\r
2616 goto Err;\r
2617 }\r
2618\r
2619 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2620 QuestionId = GetFreeQuestionId ();\r
2621 } else {\r
2622 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2623 goto Err;\r
2624 }\r
2625 MarkQuestionIdUsed (QuestionId);\r
2626 }\r
2627\r
2628 pNode[0]->mQuestionId = QuestionId;\r
2629 pNode[1]->mQuestionId = QuestionId;\r
2630 pNode[2]->mQuestionId = QuestionId;\r
2631 pNode[0]->mNext = pNode[1];\r
2632 pNode[1]->mNext = pNode[2];\r
2633 pNode[2]->mNext = mQuestionList;\r
2634 mQuestionList = pNode[0];\r
2635\r
2636 gCFormPkg.DoPendingAssign (HourVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2637 gCFormPkg.DoPendingAssign (MinuteVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2638 gCFormPkg.DoPendingAssign (SecondVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2639\r
2640 return;\r
2641\r
2642Err:\r
2643 for (Index = 0; Index < 3; Index++) {\r
2644 if (pNode[Index] != NULL) {\r
2645 delete pNode[Index];\r
2646 }\r
2647 }\r
2648 QuestionId = EFI_QUESTION_ID_INVALID;\r
2649}\r
2650\r
2651VOID\r
2652CVfrQuestionDB::RegisterNewTimeQuestion (\r
2653 IN INT8 *Name,\r
2654 IN INT8 *BaseVarId,\r
2655 IN OUT EFI_QUESTION_ID &QuestionId\r
2656 )\r
2657{\r
2658 SVfrQuestionNode *pNode[3] = {NULL, };\r
2659 UINT32 Len;\r
2660 INT8 *VarIdStr[3] = {NULL, };\r
2661 INT8 Index;\r
2662\r
2663 if (BaseVarId == NULL) {\r
2664 return;\r
2665 }\r
2666\r
2667 Len = strlen (BaseVarId);\r
2668\r
2669 VarIdStr[0] = new INT8[Len + strlen (".Hour") + 1];\r
2670 if (VarIdStr[0] != NULL) {\r
2671 strcpy (VarIdStr[0], BaseVarId);\r
2672 strcat (VarIdStr[0], ".Hour");\r
2673 }\r
2674 VarIdStr[1] = new INT8[Len + strlen (".Minute") + 1];\r
2675 if (VarIdStr[1] != NULL) {\r
2676 strcpy (VarIdStr[1], BaseVarId);\r
2677 strcat (VarIdStr[1], ".Minute");\r
2678 }\r
2679 VarIdStr[2] = new INT8[Len + strlen (".Second") + 1];\r
2680 if (VarIdStr[2] != NULL) {\r
2681 strcpy (VarIdStr[2], BaseVarId);\r
2682 strcat (VarIdStr[2], ".Second");\r
2683 }\r
2684\r
2685 if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], TIME_HOUR_BITMASK)) == NULL) {\r
2686 goto Err;\r
2687 }\r
2688 if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], TIME_MINUTE_BITMASK)) == NULL) {\r
2689 goto Err;\r
2690 }\r
2691 if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], TIME_SECOND_BITMASK)) == NULL) {\r
2692 goto Err;\r
2693 }\r
2694\r
2695 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2696 QuestionId = GetFreeQuestionId ();\r
2697 } else {\r
2698 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2699 goto Err;\r
2700 }\r
2701 MarkQuestionIdUsed (QuestionId);\r
2702 }\r
2703\r
2704 pNode[0]->mQuestionId = QuestionId;\r
2705 pNode[1]->mQuestionId = QuestionId;\r
2706 pNode[2]->mQuestionId = QuestionId;\r
2707 pNode[0]->mNext = pNode[1];\r
2708 pNode[1]->mNext = pNode[2];\r
2709 pNode[2]->mNext = mQuestionList;\r
2710 mQuestionList = pNode[0];\r
2711\r
2712 for (Index = 0; Index < 3; Index++) {\r
2713 if (VarIdStr[Index] != NULL) {\r
2714 delete VarIdStr[Index];\r
2715 }\r
2716 }\r
2717\r
2718 gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2719 gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2720 gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2721\r
2722 return;\r
2723\r
2724Err:\r
2725 for (Index = 0; Index < 3; Index++) {\r
2726 if (pNode[Index] != NULL) {\r
2727 delete pNode[Index];\r
2728 }\r
2729\r
2730 if (VarIdStr[Index] != NULL) {\r
2731 delete VarIdStr[Index];\r
2732 }\r
2733 }\r
2734}\r
2735\r
2736EFI_VFR_RETURN_CODE\r
2737CVfrQuestionDB::UpdateQuestionId (\r
2738 IN EFI_QUESTION_ID QId,\r
2739 IN EFI_QUESTION_ID NewQId\r
2740 )\r
2741{\r
2742 SVfrQuestionNode *pNode = NULL;\r
2743\r
2744 if (ChekQuestionIdFree (NewQId) == FALSE) {\r
2745 return VFR_RETURN_REDEFINED;\r
2746 }\r
2747\r
2748 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2749 if (pNode->mQuestionId == QId) {\r
2750 break;\r
2751 }\r
2752 }\r
2753\r
2754 if (pNode == NULL) {\r
2755 return VFR_RETURN_UNDEFINED;\r
2756 }\r
2757\r
2758 MarkQuestionIdUnused (QId);\r
2759 pNode->mQuestionId = NewQId;\r
2760 MarkQuestionIdUsed (NewQId);\r
2761\r
2762 gCFormPkg.DoPendingAssign (pNode->mVarIdStr, (VOID *)&NewQId, sizeof(EFI_QUESTION_ID));\r
2763\r
2764 return VFR_RETURN_SUCCESS;\r
2765}\r
2766\r
3e99020d 2767VOID\r
95d675b5 2768CVfrQuestionDB::GetQuestionId (\r
2769 IN INT8 *Name,\r
2770 IN INT8 *VarIdStr,\r
2771 OUT EFI_QUESTION_ID &QuestionId,\r
2772 OUT UINT32 &BitMask\r
2773 )\r
2774{\r
2775 SVfrQuestionNode *pNode;\r
2776\r
2777 QuestionId = EFI_QUESTION_ID_INVALID;\r
2778 BitMask = 0x00000000;\r
2779\r
2780 if ((Name == NULL) && (VarIdStr == NULL)) {\r
2781 return ;\r
2782 }\r
2783\r
2784 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2785 if (Name != NULL) {\r
2786 if (strcmp (pNode->mName, Name) != 0) {\r
2787 continue;\r
2788 }\r
2789 }\r
2790\r
2791 if (VarIdStr != NULL) {\r
2792 if (strcmp (pNode->mVarIdStr, VarIdStr) != 0) {\r
2793 continue;\r
2794 }\r
2795 }\r
2796\r
2797 QuestionId = pNode->mQuestionId;\r
2798 BitMask = pNode->mBitMask;\r
2799 break;\r
2800 }\r
2801\r
2802 return ;\r
2803}\r
2804\r
3e99020d 2805EFI_VFR_RETURN_CODE\r
95d675b5 2806CVfrQuestionDB::FindQuestion (\r
2807 IN EFI_QUESTION_ID QuestionId\r
2808 )\r
2809{\r
2810 SVfrQuestionNode *pNode;\r
2811\r
2812 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2813 return VFR_RETURN_INVALID_PARAMETER;\r
2814 }\r
2815\r
2816 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2817 if (pNode->mQuestionId == QuestionId) {\r
2818 return VFR_RETURN_SUCCESS;\r
2819 }\r
2820 }\r
2821\r
2822 return VFR_RETURN_UNDEFINED;\r
2823}\r
2824\r
3e99020d 2825EFI_VFR_RETURN_CODE\r
95d675b5 2826CVfrQuestionDB::FindQuestion (\r
2827 IN INT8 *Name\r
2828 )\r
2829{\r
2830 SVfrQuestionNode *pNode;\r
2831\r
2832 if (Name == NULL) {\r
2833 return VFR_RETURN_FATAL_ERROR;\r
2834 }\r
2835\r
2836 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2837 if (strcmp (pNode->mName, Name) == 0) {\r
2838 return VFR_RETURN_SUCCESS;\r
2839 }\r
2840 }\r
2841\r
2842 return VFR_RETURN_UNDEFINED;\r
2843}\r
2844\r