3 Vfr common library functions.
5 Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "VfrUtilityLib.h"
19 #include "VfrFormPkg.h"
22 CVfrBinaryOutput::WriteLine (
25 IN CONST CHAR8
*LineHeader
,
32 if ((pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
36 for (Index
= 0; Index
< BlkSize
; Index
++) {
37 if ((Index
% LineBytes
) == 0) {
38 fprintf (pFile
, "\n%s", LineHeader
);
40 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
45 CVfrBinaryOutput::WriteEnd (
48 IN CONST CHAR8
*LineHeader
,
55 if ((BlkSize
== 0) || (pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
59 for (Index
= 0; Index
< BlkSize
- 1; Index
++) {
60 if ((Index
% LineBytes
) == 0) {
61 fprintf (pFile
, "\n%s", LineHeader
);
63 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
66 if ((Index
% LineBytes
) == 0) {
67 fprintf (pFile
, "\n%s", LineHeader
);
69 fprintf (pFile
, "0x%02X\n", (UINT8
)BlkBuf
[Index
]);
72 SConfigInfo::SConfigInfo (
76 IN EFI_IFR_TYPE_VALUE Value
81 mWidth
= (UINT16
)Width
;
82 mValue
= new UINT8
[mWidth
];
88 case EFI_IFR_TYPE_NUM_SIZE_8
:
89 memcpy (mValue
, &Value
.u8
, mWidth
);
91 case EFI_IFR_TYPE_NUM_SIZE_16
:
92 memcpy (mValue
, &Value
.u16
, mWidth
);
94 case EFI_IFR_TYPE_NUM_SIZE_32
:
95 memcpy (mValue
, &Value
.u32
, mWidth
);
97 case EFI_IFR_TYPE_NUM_SIZE_64
:
98 memcpy (mValue
, &Value
.u64
, mWidth
);
100 case EFI_IFR_TYPE_BOOLEAN
:
101 memcpy (mValue
, &Value
.b
, mWidth
);
103 case EFI_IFR_TYPE_TIME
:
104 memcpy (mValue
, &Value
.time
, mWidth
);
106 case EFI_IFR_TYPE_DATE
:
107 memcpy (mValue
, &Value
.date
, mWidth
);
109 case EFI_IFR_TYPE_STRING
:
110 memcpy (mValue
, &Value
.string
, mWidth
);
112 case EFI_IFR_TYPE_OTHER
:
117 SConfigInfo::~SConfigInfo (
121 BUFFER_SAFE_FREE (mValue
);
124 SConfigItem::SConfigItem (
135 if ((mName
= new CHAR8
[strlen (Name
) + 1]) != NULL
) {
136 strcpy (mName
, Name
);
141 if ((mId
= new CHAR8
[strlen (Id
) + 1]) != NULL
) {
147 SConfigItem::SConfigItem (
153 IN EFI_IFR_TYPE_VALUE Value
162 if ((mName
= new CHAR8
[strlen (Name
) + 1]) != NULL
) {
163 strcpy (mName
, Name
);
168 if ((mId
= new CHAR8
[strlen (Id
) + 1]) != NULL
) {
173 mInfoStrList
= new SConfigInfo(Type
, Offset
, Width
, Value
);
176 SConfigItem::~SConfigItem (
182 BUFFER_SAFE_FREE (mName
);
183 BUFFER_SAFE_FREE (mId
);
184 while (mInfoStrList
!= NULL
) {
186 mInfoStrList
= mInfoStrList
->mNext
;
188 BUFFER_SAFE_FREE (Info
);
193 CVfrBufferConfig::Register (
200 if (Select (Name
) == 0) {
204 if ((pNew
= new SConfigItem (Name
, Id
)) == NULL
) {
207 if (mItemListHead
== NULL
) {
208 mItemListHead
= pNew
;
209 mItemListTail
= pNew
;
211 mItemListTail
->mNext
= pNew
;
212 mItemListTail
= pNew
;
220 CVfrBufferConfig::Open (
224 mItemListPos
= mItemListHead
;
228 CVfrBufferConfig::Eof(
232 return (mItemListPos
== NULL
) ? TRUE
: FALSE
;
236 CVfrBufferConfig::Select (
244 mItemListPos
= mItemListHead
;
247 for (p
= mItemListHead
; p
!= NULL
; p
= p
->mNext
) {
248 if (strcmp (p
->mName
, Name
) != 0) {
253 if (p
->mId
== NULL
|| strcmp (p
->mId
, Id
) != 0) {
256 } else if (p
->mId
!= NULL
) {
269 CVfrBufferConfig::Write (
276 IN EFI_IFR_TYPE_VALUE Value
283 if ((Ret
= Select (Name
)) != 0) {
289 if (Select (Name
, Id
) != 0) {
290 if ((pItem
= new SConfigItem (Name
, Id
, Type
, Offset
, (UINT16
) Width
, Value
)) == NULL
) {
293 if (mItemListHead
== NULL
) {
294 mItemListHead
= pItem
;
295 mItemListTail
= pItem
;
297 mItemListTail
->mNext
= pItem
;
298 mItemListTail
= pItem
;
300 mItemListPos
= pItem
;
302 // tranverse the list to find out if there's already the value for the same offset
303 for (pInfo
= mItemListPos
->mInfoStrList
; pInfo
!= NULL
; pInfo
= pInfo
->mNext
) {
304 if (pInfo
->mOffset
== Offset
) {
305 // check if the value and width are the same; return error if not
306 if ((Id
!= NULL
) && (pInfo
->mWidth
!= Width
|| memcmp(pInfo
->mValue
, &Value
, Width
) != 0)) {
307 return VFR_RETURN_DEFAULT_VALUE_REDEFINED
;
312 if((pInfo
= new SConfigInfo (Type
, Offset
, Width
, Value
)) == NULL
) {
315 pInfo
->mNext
= mItemListPos
->mInfoStrList
;
316 mItemListPos
->mInfoStrList
= pInfo
;
321 if (mItemListHead
== mItemListPos
) {
322 mItemListHead
= mItemListPos
->mNext
;
327 for (pItem
= mItemListHead
; pItem
->mNext
!= mItemListPos
; pItem
= pItem
->mNext
)
330 pItem
->mNext
= mItemListPos
->mNext
;
331 if (mItemListTail
== mItemListPos
) {
332 mItemListTail
= pItem
;
335 mItemListPos
= pItem
->mNext
;
338 case 'i' : // set info
339 if (mItemListPos
->mId
!= NULL
) {
340 delete mItemListPos
->mId
;
342 mItemListPos
->mId
= NULL
;
344 if ((mItemListPos
->mId
= new CHAR8
[strlen (Id
) + 1]) == NULL
) {
347 strcpy (mItemListPos
->mId
, Id
);
360 CVfrBufferConfig::Close (
367 #define BYTES_PRE_LINE 0x10
370 CVfrBufferConfig::OutputCFile (
375 CVfrBinaryOutput Output
;
384 for (Item
= mItemListHead
; Item
!= NULL
; Item
= Item
->mNext
) {
385 if (Item
->mId
!= NULL
|| Item
->mInfoStrList
== NULL
) {
388 fprintf (pFile
, "\nunsigned char %s%sBlockName[] = {", BaseName
, Item
->mName
);
390 TotalLen
= sizeof (UINT32
);
391 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
392 TotalLen
+= sizeof (UINT16
) * 2;
394 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)&TotalLen
, sizeof (UINT32
));
396 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
397 fprintf (pFile
, "\n");
398 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)&Info
->mOffset
, sizeof (UINT16
));
399 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)&Info
->mWidth
, sizeof (UINT16
));
401 fprintf (pFile
, "\n};\n");
404 for (Item
= mItemListHead
; Item
!= NULL
; Item
= Item
->mNext
) {
405 if (Item
->mId
!= NULL
&& Item
->mInfoStrList
!= NULL
) {
406 fprintf (pFile
, "\nunsigned char %s%sDefault%s[] = {", BaseName
, Item
->mName
, Item
->mId
);
408 TotalLen
= sizeof (UINT32
);
409 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
410 TotalLen
+= Info
->mWidth
+ sizeof (UINT16
) * 2;
412 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)&TotalLen
, sizeof (UINT32
));
414 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
415 fprintf (pFile
, "\n");
416 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)&Info
->mOffset
, sizeof (UINT16
));
417 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)&Info
->mWidth
, sizeof (UINT16
));
418 if (Info
->mNext
== NULL
) {
419 Output
.WriteEnd (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)Info
->mValue
, Info
->mWidth
);
421 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (CHAR8
*)Info
->mValue
, Info
->mWidth
);
424 fprintf (pFile
, "\n};\n");
429 CVfrBufferConfig::CVfrBufferConfig (
433 mItemListHead
= NULL
;
434 mItemListTail
= NULL
;
438 CVfrBufferConfig::~CVfrBufferConfig (
444 while (mItemListHead
!= NULL
) {
446 mItemListHead
= mItemListHead
->mNext
;
450 mItemListHead
= NULL
;
451 mItemListTail
= NULL
;
455 CVfrBufferConfig gCVfrBufferConfig
;
458 CONST CHAR8
*mTypeName
;
462 } gInternalTypesTable
[] = {
463 {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64
, sizeof (UINT64
), sizeof (UINT64
)},
464 {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32
, sizeof (UINT32
), sizeof (UINT32
)},
465 {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16
, sizeof (UINT16
), sizeof (UINT16
)},
466 {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8
, sizeof (UINT8
), sizeof (UINT8
)},
467 {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN
, sizeof (BOOLEAN
), sizeof (BOOLEAN
)},
468 {"EFI_HII_DATE", EFI_IFR_TYPE_DATE
, sizeof (EFI_HII_DATE
), sizeof (UINT16
)},
469 {"EFI_STRING_ID", EFI_IFR_TYPE_STRING
, sizeof (EFI_STRING_ID
),sizeof (EFI_STRING_ID
)},
470 {"EFI_HII_TIME", EFI_IFR_TYPE_TIME
, sizeof (EFI_HII_TIME
), sizeof (UINT8
)},
471 {NULL
, EFI_IFR_TYPE_OTHER
, 0, 0}
482 if (TypeName
== NULL
) {
486 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
487 if (strcmp (TypeName
, gInternalTypesTable
[Index
].mTypeName
) == 0) {
504 while (*Str
&& *Str
== ' ') {
507 while (*Str
&& *Str
== '0') {
510 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
527 Str
= TrimHex (Str
, &IsHex
);
528 for (Value
= 0; (c
= *Str
) != '\0'; Str
++) {
530 // BUG: does not handle overflow here
532 (IsHex
== TRUE
) ? (Value
<<= 4) : (Value
*= 10);
534 if ((IsHex
== TRUE
) && (c
>= 'a') && (c
<= 'f')) {
535 Value
+= (c
- 'a' + 10);
537 if ((IsHex
== TRUE
) && (c
>= 'A') && (c
<= 'F')) {
538 Value
+= (c
- 'A' + 10);
540 if (c
>= '0' && c
<= '9') {
549 CVfrVarDataTypeDB::RegisterNewType (
553 New
->mNext
= mDataTypeList
;
558 CVfrVarDataTypeDB::ExtractStructTypeName (
564 return VFR_RETURN_FATAL_ERROR
;
567 while((*VarStr
!= '\0') && (*VarStr
!= '.')) {
573 if (*VarStr
== '.') {
577 return VFR_RETURN_SUCCESS
;
581 CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
588 CHAR8 ArrayStr
[MAX_NAME_LEN
+ 1];
590 ArrayIdx
= INVALID_ARRAY_INDEX
;
593 return VFR_RETURN_FATAL_ERROR
;
596 while((*VarStr
!= '\0') &&
610 return VFR_RETURN_SUCCESS
;
613 for (Idx
= 0; (Idx
< MAX_NAME_LEN
) && (*VarStr
!= '\0') && (*VarStr
!= ']'); VarStr
++, Idx
++) {
614 ArrayStr
[Idx
] = *VarStr
;
616 ArrayStr
[Idx
] = '\0';
618 if ((*VarStr
!= ']') && (ArrayStr
[0] == '\0')) {
619 return VFR_RETURN_DATA_STRING_ERROR
;
621 ArrayIdx
= _STR2U32 (ArrayStr
);
622 if (*VarStr
== ']') {
625 return VFR_RETURN_SUCCESS
;
627 return VFR_RETURN_DATA_STRING_ERROR
;
630 return VFR_RETURN_SUCCESS
;
634 CVfrVarDataTypeDB::GetTypeField (
636 IN SVfrDataType
*Type
,
637 OUT SVfrDataField
*&Field
640 SVfrDataField
*pField
= NULL
;
642 if ((FName
== NULL
) && (Type
== NULL
)) {
643 return VFR_RETURN_FATAL_ERROR
;
646 for (pField
= Type
->mMembers
; pField
!= NULL
; pField
= pField
->mNext
) {
647 if (strcmp (pField
->mFieldName
, FName
) == 0) {
649 return VFR_RETURN_SUCCESS
;
653 return VFR_RETURN_UNDEFINED
;
657 CVfrVarDataTypeDB::GetFieldOffset (
658 IN SVfrDataField
*Field
,
664 return VFR_RETURN_FATAL_ERROR
;
668 // Framework Vfr file Array Index is from 1.
669 // But Uefi Vfr file Array Index is from 0.
671 if (VfrCompatibleMode
&& ArrayIdx
!= INVALID_ARRAY_INDEX
) {
673 return VFR_RETURN_ERROR_ARRARY_NUM
;
675 ArrayIdx
= ArrayIdx
- 1;
678 if ((ArrayIdx
!= INVALID_ARRAY_INDEX
) && ((Field
->mArrayNum
== 0) || (Field
->mArrayNum
<= ArrayIdx
))) {
679 return VFR_RETURN_ERROR_ARRARY_NUM
;
683 // Be compatible with the current usage
684 // If ArraryIdx is not specified, the first one is used.
686 // if ArrayNum is larger than zero, ArraryIdx must be specified.
688 // if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum > 0)) {
689 // return VFR_RETURN_ERROR_ARRARY_NUM;
693 Offset
= Field
->mOffset
+ Field
->mFieldType
->mTotalSize
* ((ArrayIdx
== INVALID_ARRAY_INDEX
) ? 0 : ArrayIdx
);
694 return VFR_RETURN_SUCCESS
;
698 CVfrVarDataTypeDB::GetFieldWidth (
699 IN SVfrDataField
*Field
706 return Field
->mFieldType
->mType
;
710 CVfrVarDataTypeDB::GetFieldSize (
711 IN SVfrDataField
*Field
,
716 return VFR_RETURN_FATAL_ERROR
;
719 if ((ArrayIdx
== INVALID_ARRAY_INDEX
) && (Field
->mArrayNum
!= 0)) {
720 return Field
->mFieldType
->mTotalSize
* Field
->mArrayNum
;
722 return Field
->mFieldType
->mTotalSize
;
727 CVfrVarDataTypeDB::InternalTypesListInit (
731 SVfrDataType
*New
= NULL
;
734 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
735 New
= new SVfrDataType
;
737 strcpy (New
->mTypeName
, gInternalTypesTable
[Index
].mTypeName
);
738 New
->mType
= gInternalTypesTable
[Index
].mType
;
739 New
->mAlign
= gInternalTypesTable
[Index
].mAlign
;
740 New
->mTotalSize
= gInternalTypesTable
[Index
].mSize
;
741 if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_DATE") == 0) {
742 SVfrDataField
*pYearField
= new SVfrDataField
;
743 SVfrDataField
*pMonthField
= new SVfrDataField
;
744 SVfrDataField
*pDayField
= new SVfrDataField
;
746 strcpy (pYearField
->mFieldName
, "Year");
747 GetDataType ((CHAR8
*)"UINT16", &pYearField
->mFieldType
);
748 pYearField
->mOffset
= 0;
749 pYearField
->mNext
= pMonthField
;
750 pYearField
->mArrayNum
= 0;
752 strcpy (pMonthField
->mFieldName
, "Month");
753 GetDataType ((CHAR8
*)"UINT8", &pMonthField
->mFieldType
);
754 pMonthField
->mOffset
= 2;
755 pMonthField
->mNext
= pDayField
;
756 pMonthField
->mArrayNum
= 0;
758 strcpy (pDayField
->mFieldName
, "Day");
759 GetDataType ((CHAR8
*)"UINT8", &pDayField
->mFieldType
);
760 pDayField
->mOffset
= 3;
761 pDayField
->mNext
= NULL
;
762 pDayField
->mArrayNum
= 0;
764 New
->mMembers
= pYearField
;
765 } else if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_TIME") == 0) {
766 SVfrDataField
*pHoursField
= new SVfrDataField
;
767 SVfrDataField
*pMinutesField
= new SVfrDataField
;
768 SVfrDataField
*pSecondsField
= new SVfrDataField
;
770 strcpy (pHoursField
->mFieldName
, "Hours");
771 GetDataType ((CHAR8
*)"UINT8", &pHoursField
->mFieldType
);
772 pHoursField
->mOffset
= 0;
773 pHoursField
->mNext
= pMinutesField
;
774 pHoursField
->mArrayNum
= 0;
776 strcpy (pMinutesField
->mFieldName
, "Minutes");
777 GetDataType ((CHAR8
*)"UINT8", &pMinutesField
->mFieldType
);
778 pMinutesField
->mOffset
= 1;
779 pMinutesField
->mNext
= pSecondsField
;
780 pMinutesField
->mArrayNum
= 0;
782 strcpy (pSecondsField
->mFieldName
, "Seconds");
783 GetDataType ((CHAR8
*)"UINT8", &pSecondsField
->mFieldType
);
784 pSecondsField
->mOffset
= 2;
785 pSecondsField
->mNext
= NULL
;
786 pSecondsField
->mArrayNum
= 0;
788 New
->mMembers
= pHoursField
;
790 New
->mMembers
= NULL
;
793 RegisterNewType (New
);
799 CVfrVarDataTypeDB::CVfrVarDataTypeDB (
803 mDataTypeList
= NULL
;
805 mCurrDataField
= NULL
;
806 mPackAlign
= DEFAULT_PACK_ALIGN
;
808 mFirstNewDataTypeName
= NULL
;
810 InternalTypesListInit ();
813 CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
818 SVfrDataField
*pField
;
819 SVfrPackStackNode
*pPack
;
821 if (mNewDataType
!= NULL
) {
825 while (mDataTypeList
!= NULL
) {
826 pType
= mDataTypeList
;
827 mDataTypeList
= mDataTypeList
->mNext
;
828 while(pType
->mMembers
!= NULL
) {
829 pField
= pType
->mMembers
;
830 pType
->mMembers
= pType
->mMembers
->mNext
;
836 while (mPackStack
!= NULL
) {
838 mPackStack
= mPackStack
->mNext
;
844 CVfrVarDataTypeDB::Pack (
847 IN CHAR8
*Identifier
,
852 CHAR8 Msg
[MAX_STRING_LEN
] = {0, };
854 if (Action
& VFR_PACK_SHOW
) {
855 sprintf (Msg
, "value of pragma pack(show) == %d", mPackAlign
);
856 gCVfrErrorHandle
.PrintMsg (LineNum
, NULL
, "Warning", Msg
);
859 if (Action
& VFR_PACK_PUSH
) {
860 SVfrPackStackNode
*pNew
= NULL
;
862 if ((pNew
= new SVfrPackStackNode (Identifier
, mPackAlign
)) == NULL
) {
863 return VFR_RETURN_FATAL_ERROR
;
865 pNew
->mNext
= mPackStack
;
869 if (Action
& VFR_PACK_POP
) {
870 SVfrPackStackNode
*pNode
= NULL
;
872 if (mPackStack
== NULL
) {
873 gCVfrErrorHandle
.PrintMsg (LineNum
, NULL
, "Error", "#pragma pack(pop...) : more pops than pushes");
876 for (pNode
= mPackStack
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
877 if (pNode
->Match (Identifier
) == TRUE
) {
878 mPackAlign
= pNode
->mNumber
;
879 mPackStack
= pNode
->mNext
;
884 if (Action
& VFR_PACK_ASSIGN
) {
885 PackAlign
= (Number
> 1) ? Number
+ Number
% 2 : Number
;
886 if ((PackAlign
== 0) || (PackAlign
> 16)) {
887 gCVfrErrorHandle
.PrintMsg (LineNum
, NULL
, "Error", "expected pragma parameter to be '1', '2', '4', '8', or '16'");
889 mPackAlign
= PackAlign
;
893 return VFR_RETURN_SUCCESS
;
897 CVfrVarDataTypeDB::DeclareDataTypeBegin (
901 SVfrDataType
*pNewType
= NULL
;
903 pNewType
= new SVfrDataType
;
904 pNewType
->mTypeName
[0] = '\0';
905 pNewType
->mType
= EFI_IFR_TYPE_OTHER
;
906 pNewType
->mAlign
= DEFAULT_ALIGN
;
907 pNewType
->mTotalSize
= 0;
908 pNewType
->mMembers
= NULL
;
909 pNewType
->mNext
= NULL
;
911 mNewDataType
= pNewType
;
915 CVfrVarDataTypeDB::SetNewTypeName (
921 if (mNewDataType
== NULL
) {
922 return VFR_RETURN_ERROR_SKIPED
;
924 if (TypeName
== NULL
) {
925 return VFR_RETURN_FATAL_ERROR
;
927 if (strlen(TypeName
) >= MAX_NAME_LEN
) {
928 return VFR_RETURN_INVALID_PARAMETER
;
931 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
932 if (strcmp(pType
->mTypeName
, TypeName
) == 0) {
933 return VFR_RETURN_REDEFINED
;
937 strcpy(mNewDataType
->mTypeName
, TypeName
);
938 return VFR_RETURN_SUCCESS
;
942 CVfrVarDataTypeDB::DataTypeAddField (
948 SVfrDataField
*pNewField
= NULL
;
949 SVfrDataType
*pFieldType
= NULL
;
953 CHECK_ERROR_RETURN (GetDataType (TypeName
, &pFieldType
), VFR_RETURN_SUCCESS
);
955 if (strlen (FieldName
) >= MAX_NAME_LEN
) {
956 return VFR_RETURN_INVALID_PARAMETER
;
959 for (pTmp
= mNewDataType
->mMembers
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
960 if (strcmp (pTmp
->mFieldName
, FieldName
) == 0) {
961 return VFR_RETURN_REDEFINED
;
965 Align
= MIN (mPackAlign
, pFieldType
->mAlign
);
967 if ((pNewField
= new SVfrDataField
) == NULL
) {
968 return VFR_RETURN_OUT_FOR_RESOURCES
;
970 strcpy (pNewField
->mFieldName
, FieldName
);
971 pNewField
->mFieldType
= pFieldType
;
972 pNewField
->mArrayNum
= ArrayNum
;
973 if ((mNewDataType
->mTotalSize
% Align
) == 0) {
974 pNewField
->mOffset
= mNewDataType
->mTotalSize
;
976 pNewField
->mOffset
= mNewDataType
->mTotalSize
+ ALIGN_STUFF(mNewDataType
->mTotalSize
, Align
);
978 if (mNewDataType
->mMembers
== NULL
) {
979 mNewDataType
->mMembers
= pNewField
;
980 pNewField
->mNext
= NULL
;
982 for (pTmp
= mNewDataType
->mMembers
; pTmp
->mNext
!= NULL
; pTmp
= pTmp
->mNext
)
984 pTmp
->mNext
= pNewField
;
985 pNewField
->mNext
= NULL
;
988 mNewDataType
->mAlign
= MIN (mPackAlign
, MAX (pFieldType
->mAlign
, mNewDataType
->mAlign
));
989 mNewDataType
->mTotalSize
= pNewField
->mOffset
+ (pNewField
->mFieldType
->mTotalSize
) * ((ArrayNum
== 0) ? 1 : ArrayNum
);
991 return VFR_RETURN_SUCCESS
;
995 CVfrVarDataTypeDB::DeclareDataTypeEnd (
999 if (mNewDataType
->mTypeName
[0] == '\0') {
1003 if ((mNewDataType
->mTotalSize
% mNewDataType
->mAlign
) !=0) {
1004 mNewDataType
->mTotalSize
+= ALIGN_STUFF (mNewDataType
->mTotalSize
, mNewDataType
->mAlign
);
1007 RegisterNewType (mNewDataType
);
1008 if (mFirstNewDataTypeName
== NULL
) {
1009 mFirstNewDataTypeName
= mNewDataType
->mTypeName
;
1012 mNewDataType
= NULL
;
1016 CVfrVarDataTypeDB::GetDataType (
1018 OUT SVfrDataType
**DataType
1021 SVfrDataType
*pDataType
= NULL
;
1023 if (TypeName
== NULL
) {
1024 return VFR_RETURN_ERROR_SKIPED
;
1027 if (DataType
== NULL
) {
1028 return VFR_RETURN_FATAL_ERROR
;
1033 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1034 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1035 *DataType
= pDataType
;
1036 return VFR_RETURN_SUCCESS
;
1040 return VFR_RETURN_UNDEFINED
;
1044 CVfrVarDataTypeDB::GetDataTypeSize (
1049 SVfrDataType
*pDataType
= NULL
;
1052 return VFR_RETURN_FATAL_ERROR
;
1056 DataType
= DataType
& 0x0F;
1059 // For user defined data type, the size can't be got by this function.
1061 if (DataType
== EFI_IFR_TYPE_OTHER
) {
1062 return VFR_RETURN_SUCCESS
;
1065 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1066 if (DataType
== pDataType
->mType
) {
1067 *Size
= pDataType
->mTotalSize
;
1068 return VFR_RETURN_SUCCESS
;
1072 return VFR_RETURN_UNDEFINED
;
1076 CVfrVarDataTypeDB::GetDataTypeSize (
1081 SVfrDataType
*pDataType
= NULL
;
1084 return VFR_RETURN_FATAL_ERROR
;
1089 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1090 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1091 *Size
= pDataType
->mTotalSize
;
1092 return VFR_RETURN_SUCCESS
;
1096 return VFR_RETURN_UNDEFINED
;
1100 CVfrVarDataTypeDB::GetDataFieldInfo (
1107 CHAR8 TName
[MAX_NAME_LEN
], FName
[MAX_NAME_LEN
];
1108 UINT32 ArrayIdx
, Tmp
;
1109 SVfrDataType
*pType
= NULL
;
1110 SVfrDataField
*pField
= NULL
;
1113 Type
= EFI_IFR_TYPE_OTHER
;
1116 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr
, TName
), VFR_RETURN_SUCCESS
);
1117 CHECK_ERROR_RETURN (GetDataType (TName
, &pType
), VFR_RETURN_SUCCESS
);
1120 // if it is not struct data type
1122 Type
= pType
->mType
;
1123 Size
= pType
->mTotalSize
;
1125 while (*VarStr
!= '\0') {
1126 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr
, FName
, ArrayIdx
), VFR_RETURN_SUCCESS
);
1127 CHECK_ERROR_RETURN(GetTypeField (FName
, pType
, pField
), VFR_RETURN_SUCCESS
);
1128 pType
= pField
->mFieldType
;
1129 CHECK_ERROR_RETURN(GetFieldOffset (pField
, ArrayIdx
, Tmp
), VFR_RETURN_SUCCESS
);
1130 Offset
= (UINT16
) (Offset
+ Tmp
);
1131 Type
= GetFieldWidth (pField
);
1132 Size
= GetFieldSize (pField
, ArrayIdx
);
1134 return VFR_RETURN_SUCCESS
;
1138 CVfrVarDataTypeDB::GetUserDefinedTypeNameList (
1139 OUT CHAR8
***NameList
,
1140 OUT UINT32
*ListSize
1144 SVfrDataType
*pType
;
1146 if ((NameList
== NULL
) || (ListSize
== NULL
)) {
1147 return VFR_RETURN_FATAL_ERROR
;
1153 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1154 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1159 if (*ListSize
== 0) {
1160 return VFR_RETURN_SUCCESS
;
1163 if ((*NameList
= new CHAR8
*[*ListSize
]) == NULL
) {
1165 return VFR_RETURN_OUT_FOR_RESOURCES
;
1168 for (Index
= 0, pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
, Index
++) {
1169 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1170 (*NameList
)[Index
] = pType
->mTypeName
;
1173 return VFR_RETURN_SUCCESS
;
1177 CVfrVarDataTypeDB::IsTypeNameDefined (
1181 SVfrDataType
*pType
;
1183 if (TypeName
== NULL
) {
1187 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1188 if (strcmp (pType
->mTypeName
, TypeName
) == 0) {
1197 CVfrVarDataTypeDB::Dump (
1201 SVfrDataType
*pTNode
;
1202 SVfrDataField
*pFNode
;
1204 fprintf (File
, "\n\n***************************************************************\n");
1205 fprintf (File
, "\t\tmPackAlign = %x\n", mPackAlign
);
1206 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1207 fprintf (File
, "\t\tstruct %s : mAlign [%d] mTotalSize [0x%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1208 fprintf (File
, "\t\tstruct %s {\n", pTNode
->mTypeName
);
1209 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1210 if (pFNode
->mArrayNum
> 0) {
1211 fprintf (File
, "\t\t\t+%08d[%08x] %s[%d] <%s>\n", pFNode
->mOffset
, pFNode
->mOffset
,
1212 pFNode
->mFieldName
, pFNode
->mArrayNum
, pFNode
->mFieldType
->mTypeName
);
1214 fprintf (File
, "\t\t\t+%08d[%08x] %s <%s>\n", pFNode
->mOffset
, pFNode
->mOffset
,
1215 pFNode
->mFieldName
, pFNode
->mFieldType
->mTypeName
);
1218 fprintf (File
, "\t\t};\n");
1219 fprintf (File
, "---------------------------------------------------------------\n");
1221 fprintf (File
, "***************************************************************\n");
1224 #ifdef CVFR_VARDATATYPEDB_DEBUG
1226 CVfrVarDataTypeDB::ParserDB (
1230 SVfrDataType
*pTNode
;
1231 SVfrDataField
*pFNode
;
1233 printf ("***************************************************************\n");
1234 printf ("\t\tmPackAlign = %x\n", mPackAlign
);
1235 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1236 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1237 printf ("\t\tstruct %s {\n", pTNode
->mTypeName
);
1238 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1239 printf ("\t\t\t%s\t%s\n", pFNode
->mFieldType
->mTypeName
, pFNode
->mFieldName
);
1241 printf ("\t\t};\n");
1242 printf ("---------------------------------------------------------------\n");
1244 printf ("***************************************************************\n");
1248 SVfrVarStorageNode::SVfrVarStorageNode (
1250 IN CHAR8
*StoreName
,
1251 IN EFI_VARSTORE_ID VarStoreId
,
1252 IN EFI_STRING_ID VarName
,
1260 memset (&Guid
, 0, sizeof (EFI_GUID
));
1262 if (StoreName
!= NULL
) {
1263 mVarStoreName
= new CHAR8
[strlen(StoreName
) + 1];
1264 strcpy (mVarStoreName
, StoreName
);
1266 mVarStoreName
= NULL
;
1269 mVarStoreId
= VarStoreId
;
1270 mVarStoreType
= EFI_VFR_VARSTORE_EFI
;
1271 mStorageInfo
.mEfiVar
.mEfiVarName
= VarName
;
1272 mStorageInfo
.mEfiVar
.mEfiVarSize
= VarSize
;
1273 mAssignedFlag
= Flag
;
1276 SVfrVarStorageNode::SVfrVarStorageNode (
1278 IN CHAR8
*StoreName
,
1279 IN EFI_VARSTORE_ID VarStoreId
,
1280 IN SVfrDataType
*DataType
,
1287 memset (&Guid
, 0, sizeof (EFI_GUID
));
1289 if (StoreName
!= NULL
) {
1290 mVarStoreName
= new CHAR8
[strlen(StoreName
) + 1];
1291 strcpy (mVarStoreName
, StoreName
);
1293 mVarStoreName
= NULL
;
1296 mVarStoreId
= VarStoreId
;
1297 mVarStoreType
= EFI_VFR_VARSTORE_BUFFER
;
1298 mStorageInfo
.mDataType
= DataType
;
1299 mAssignedFlag
= Flag
;
1302 SVfrVarStorageNode::SVfrVarStorageNode (
1303 IN CHAR8
*StoreName
,
1304 IN EFI_VARSTORE_ID VarStoreId
1307 if (StoreName
!= NULL
) {
1308 mVarStoreName
= new CHAR8
[strlen(StoreName
) + 1];
1309 strcpy (mVarStoreName
, StoreName
);
1311 mVarStoreName
= NULL
;
1314 mVarStoreId
= VarStoreId
;
1315 mVarStoreType
= EFI_VFR_VARSTORE_NAME
;
1316 mStorageInfo
.mNameSpace
.mNameTable
= new EFI_VARSTORE_ID
[DEFAULT_NAME_TABLE_ITEMS
];
1317 mStorageInfo
.mNameSpace
.mTableSize
= 0;
1320 SVfrVarStorageNode::~SVfrVarStorageNode (
1324 if (mVarStoreName
!= NULL
) {
1325 delete mVarStoreName
;
1328 if (mVarStoreType
== EFI_VFR_VARSTORE_NAME
) {
1329 delete mStorageInfo
.mNameSpace
.mNameTable
;
1333 CVfrDataStorage::CVfrDataStorage (
1339 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1340 mFreeVarStoreIdBitMap
[Index
] = 0;
1343 // Question ID 0 is reserved.
1344 mFreeVarStoreIdBitMap
[0] = 0x80000000;
1346 mBufferVarStoreList
= NULL
;
1347 mEfiVarStoreList
= NULL
;
1348 mNameVarStoreList
= NULL
;
1349 mCurrVarStorageNode
= NULL
;
1350 mNewVarStorageNode
= NULL
;
1353 CVfrDataStorage::~CVfrDataStorage (
1357 SVfrVarStorageNode
*pNode
;
1359 while (mBufferVarStoreList
!= NULL
) {
1360 pNode
= mBufferVarStoreList
;
1361 mBufferVarStoreList
= mBufferVarStoreList
->mNext
;
1364 while (mEfiVarStoreList
!= NULL
) {
1365 pNode
= mEfiVarStoreList
;
1366 mEfiVarStoreList
= mEfiVarStoreList
->mNext
;
1369 while (mNameVarStoreList
!= NULL
) {
1370 pNode
= mNameVarStoreList
;
1371 mNameVarStoreList
= mNameVarStoreList
->mNext
;
1374 if (mNewVarStorageNode
!= NULL
) {
1375 delete mNewVarStorageNode
;
1380 CVfrDataStorage::GetFreeVarStoreId (
1381 EFI_VFR_VARSTORE_TYPE VarType
1384 UINT32 Index
, Mask
, Offset
;
1387 // Assign the different ID range for the different type VarStore to support Framework Vfr
1390 if ((!VfrCompatibleMode
) || (VarType
== EFI_VFR_VARSTORE_BUFFER
)) {
1392 } else if (VarType
== EFI_VFR_VARSTORE_EFI
) {
1394 } else if (VarType
== EFI_VFR_VARSTORE_NAME
) {
1398 for (; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1399 if (mFreeVarStoreIdBitMap
[Index
] != 0xFFFFFFFF) {
1404 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
1405 if ((mFreeVarStoreIdBitMap
[Index
] & Mask
) == 0) {
1406 mFreeVarStoreIdBitMap
[Index
] |= Mask
;
1407 return (EFI_VARSTORE_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
1411 return EFI_VARSTORE_ID_INVALID
;
1415 CVfrDataStorage::ChekVarStoreIdFree (
1416 IN EFI_VARSTORE_ID VarStoreId
1419 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1420 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1422 return (mFreeVarStoreIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
1426 CVfrDataStorage::MarkVarStoreIdUsed (
1427 IN EFI_VARSTORE_ID VarStoreId
1430 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1431 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1433 mFreeVarStoreIdBitMap
[Index
] |= (0x80000000 >> Offset
);
1437 CVfrDataStorage::MarkVarStoreIdUnused (
1438 IN EFI_VARSTORE_ID VarStoreId
1441 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1442 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1444 mFreeVarStoreIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
1448 CVfrDataStorage::DeclareNameVarStoreBegin (
1452 SVfrVarStorageNode
*pNode
= NULL
;
1453 EFI_VARSTORE_ID VarStoreId
;
1455 if (StoreName
== NULL
) {
1456 return VFR_RETURN_FATAL_ERROR
;
1459 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1460 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1461 return VFR_RETURN_REDEFINED
;
1465 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME
);
1466 if ((pNode
= new SVfrVarStorageNode (StoreName
, VarStoreId
)) == NULL
) {
1467 return VFR_RETURN_UNDEFINED
;
1470 mNewVarStorageNode
= pNode
;
1472 return VFR_RETURN_SUCCESS
;
1476 CVfrDataStorage::NameTableAddItem (
1477 IN EFI_STRING_ID Item
1480 EFI_VARSTORE_ID
*NewTable
, *OldTable
;
1483 OldTable
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
;
1484 TableSize
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
;
1486 if ((TableSize
!= 0) && ((TableSize
% DEFAULT_NAME_TABLE_ITEMS
) == 0)) {
1487 if ((NewTable
= new EFI_VARSTORE_ID
[TableSize
+ DEFAULT_NAME_TABLE_ITEMS
]) == NULL
) {
1488 return VFR_RETURN_OUT_FOR_RESOURCES
;
1490 memcpy (NewTable
, OldTable
, TableSize
);
1491 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
= NewTable
;
1494 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[TableSize
++] = Item
;
1495 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
= TableSize
;
1497 return VFR_RETURN_SUCCESS
;
1501 CVfrDataStorage::DeclareNameVarStoreEnd (
1505 mNewVarStorageNode
->mGuid
= *Guid
;
1506 mNewVarStorageNode
->mNext
= mNameVarStoreList
;
1507 mNameVarStoreList
= mNewVarStorageNode
;
1509 mNewVarStorageNode
= NULL
;
1511 return VFR_RETURN_SUCCESS
;
1515 CVfrDataStorage::DeclareEfiVarStore (
1516 IN CHAR8
*StoreName
,
1518 IN EFI_STRING_ID NameStrId
,
1523 SVfrVarStorageNode
*pNode
;
1524 EFI_VARSTORE_ID VarStoreId
;
1526 if ((StoreName
== NULL
) || (Guid
== NULL
)) {
1527 return VFR_RETURN_FATAL_ERROR
;
1530 if (VarSize
> sizeof (UINT64
)) {
1531 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR
;
1534 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1535 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1536 return VFR_RETURN_REDEFINED
;
1540 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_EFI
);
1541 if ((pNode
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, NameStrId
, VarSize
, Flag
)) == NULL
) {
1542 return VFR_RETURN_OUT_FOR_RESOURCES
;
1545 pNode
->mNext
= mEfiVarStoreList
;
1546 mEfiVarStoreList
= pNode
;
1548 return VFR_RETURN_SUCCESS
;
1552 CVfrDataStorage::DeclareBufferVarStore (
1553 IN CHAR8
*StoreName
,
1555 IN CVfrVarDataTypeDB
*DataTypeDB
,
1557 IN EFI_VARSTORE_ID VarStoreId
,
1561 SVfrVarStorageNode
*pNew
= NULL
;
1562 SVfrDataType
*pDataType
= NULL
;
1564 if ((StoreName
== NULL
) || (Guid
== NULL
) || (DataTypeDB
== NULL
)) {
1565 return VFR_RETURN_FATAL_ERROR
;
1568 CHECK_ERROR_RETURN(DataTypeDB
->GetDataType (TypeName
, &pDataType
), VFR_RETURN_SUCCESS
);
1570 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1571 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_BUFFER
);
1573 if (ChekVarStoreIdFree (VarStoreId
) == FALSE
) {
1574 return VFR_RETURN_VARSTOREID_REDEFINED
;
1576 MarkVarStoreIdUsed (VarStoreId
);
1579 if ((pNew
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, pDataType
, Flag
)) == NULL
) {
1580 return VFR_RETURN_OUT_FOR_RESOURCES
;
1583 pNew
->mNext
= mBufferVarStoreList
;
1584 mBufferVarStoreList
= pNew
;
1586 if (gCVfrBufferConfig
.Register(StoreName
) != 0) {
1587 return VFR_RETURN_FATAL_ERROR
;
1590 return VFR_RETURN_SUCCESS
;
1594 CVfrDataStorage::GetVarStoreId (
1595 IN CHAR8
*StoreName
,
1596 OUT EFI_VARSTORE_ID
*VarStoreId
1599 SVfrVarStorageNode
*pNode
;
1601 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1602 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1603 mCurrVarStorageNode
= pNode
;
1604 *VarStoreId
= pNode
->mVarStoreId
;
1605 return VFR_RETURN_SUCCESS
;
1609 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1610 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1611 mCurrVarStorageNode
= pNode
;
1612 *VarStoreId
= pNode
->mVarStoreId
;
1613 return VFR_RETURN_SUCCESS
;
1617 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1618 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1619 mCurrVarStorageNode
= pNode
;
1620 *VarStoreId
= pNode
->mVarStoreId
;
1621 return VFR_RETURN_SUCCESS
;
1625 mCurrVarStorageNode
= NULL
;
1626 *VarStoreId
= EFI_VARSTORE_ID_INVALID
;
1627 return VFR_RETURN_UNDEFINED
;
1631 CVfrDataStorage::GetBufferVarStoreDataTypeName (
1632 IN CHAR8
*StoreName
,
1633 OUT CHAR8
**DataTypeName
1636 SVfrVarStorageNode
*pNode
;
1638 if ((StoreName
== NULL
) || (DataTypeName
== NULL
)) {
1639 return VFR_RETURN_FATAL_ERROR
;
1642 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1643 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1648 if (pNode
== NULL
) {
1649 return VFR_RETURN_UNDEFINED
;
1652 if (pNode
->mStorageInfo
.mDataType
== NULL
) {
1653 return VFR_RETURN_FATAL_ERROR
;
1656 *DataTypeName
= pNode
->mStorageInfo
.mDataType
->mTypeName
;
1657 return VFR_RETURN_SUCCESS
;
1661 CVfrDataStorage::GetVarStoreType (
1662 IN CHAR8
*StoreName
,
1663 OUT EFI_VFR_VARSTORE_TYPE
&VarStoreType
1666 SVfrVarStorageNode
*pNode
;
1668 if (StoreName
== NULL
) {
1669 return VFR_RETURN_FATAL_ERROR
;
1672 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1673 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1674 VarStoreType
= pNode
->mVarStoreType
;
1675 return VFR_RETURN_SUCCESS
;
1679 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1680 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1681 VarStoreType
= pNode
->mVarStoreType
;
1682 return VFR_RETURN_SUCCESS
;
1686 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1687 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1688 VarStoreType
= pNode
->mVarStoreType
;
1689 return VFR_RETURN_SUCCESS
;
1693 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1694 return VFR_RETURN_UNDEFINED
;
1697 EFI_VFR_VARSTORE_TYPE
1698 CVfrDataStorage::GetVarStoreType (
1699 IN EFI_VARSTORE_ID VarStoreId
1702 SVfrVarStorageNode
*pNode
;
1703 EFI_VFR_VARSTORE_TYPE VarStoreType
;
1705 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1707 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1708 return VarStoreType
;
1711 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1712 if (pNode
->mVarStoreId
== VarStoreId
) {
1713 VarStoreType
= pNode
->mVarStoreType
;
1714 return VarStoreType
;
1718 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1719 if (pNode
->mVarStoreId
== VarStoreId
) {
1720 VarStoreType
= pNode
->mVarStoreType
;
1721 return VarStoreType
;
1725 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1726 if (pNode
->mVarStoreId
== VarStoreId
) {
1727 VarStoreType
= pNode
->mVarStoreType
;
1728 return VarStoreType
;
1732 return VarStoreType
;
1736 CVfrDataStorage::GetVarStoreName (
1737 IN EFI_VARSTORE_ID VarStoreId
,
1738 OUT CHAR8
**VarStoreName
1741 SVfrVarStorageNode
*pNode
;
1743 if (VarStoreName
== NULL
) {
1744 return VFR_RETURN_FATAL_ERROR
;
1747 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1748 if (pNode
->mVarStoreId
== VarStoreId
) {
1749 *VarStoreName
= pNode
->mVarStoreName
;
1750 return VFR_RETURN_SUCCESS
;
1754 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1755 if (pNode
->mVarStoreId
== VarStoreId
) {
1756 *VarStoreName
= pNode
->mVarStoreName
;
1757 return VFR_RETURN_SUCCESS
;
1761 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1762 if (pNode
->mVarStoreId
== VarStoreId
) {
1763 *VarStoreName
= pNode
->mVarStoreName
;
1764 return VFR_RETURN_SUCCESS
;
1768 *VarStoreName
= NULL
;
1769 return VFR_RETURN_UNDEFINED
;
1773 CVfrDataStorage::GetEfiVarStoreInfo (
1774 IN OUT EFI_VARSTORE_INFO
*Info
1778 return VFR_RETURN_FATAL_ERROR
;
1781 if (mCurrVarStorageNode
== NULL
) {
1782 return VFR_RETURN_GET_EFIVARSTORE_ERROR
;
1785 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarName
;
1786 Info
->mVarTotalSize
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarSize
;
1787 switch (Info
->mVarTotalSize
) {
1789 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_8
;
1792 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_16
;
1795 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_32
;
1798 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_64
;
1801 return VFR_RETURN_FATAL_ERROR
;
1804 return VFR_RETURN_SUCCESS
;
1808 CVfrDataStorage::GetNameVarStoreInfo (
1809 OUT EFI_VARSTORE_INFO
*Info
,
1814 return VFR_RETURN_FATAL_ERROR
;
1817 if (mCurrVarStorageNode
== NULL
) {
1818 return VFR_RETURN_GET_NVVARSTORE_ERROR
;
1822 // Framework Vfr file Index is from 1, but Uefi Vfr file Index is from 0.
1824 if (VfrCompatibleMode
) {
1826 return VFR_RETURN_ERROR_ARRARY_NUM
;
1831 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[Index
];
1833 return VFR_RETURN_SUCCESS
;
1837 CVfrDataStorage::BufferVarStoreRequestElementAdd (
1838 IN CHAR8
*StoreName
,
1839 IN EFI_VARSTORE_INFO
&Info
1842 SVfrVarStorageNode
*pNode
= NULL
;
1843 EFI_IFR_TYPE_VALUE Value
= gZeroEfiIfrTypeValue
;
1845 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1846 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1851 if (pNode
== NULL
) {
1852 return VFR_RETURN_UNDEFINED
;
1855 gCVfrBufferConfig
.Open ();
1857 if (gCVfrBufferConfig
.Write ('a', StoreName
, NULL
, EFI_IFR_TYPE_NUM_SIZE_8
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
1858 return VFR_RETURN_FATAL_ERROR
;
1860 gCVfrBufferConfig
.Close ();
1862 return VFR_RETURN_SUCCESS
;
1865 SVfrDefaultStoreNode::SVfrDefaultStoreNode (
1866 IN EFI_IFR_DEFAULTSTORE
*ObjBinAddr
,
1868 IN EFI_STRING_ID DefaultStoreNameId
,
1872 mObjBinAddr
= ObjBinAddr
;
1874 if (RefName
!= NULL
) {
1875 mRefName
= new CHAR8
[strlen (RefName
) + 1];
1876 strcpy (mRefName
, RefName
);
1882 mDefaultId
= DefaultId
;
1883 mDefaultStoreNameId
= DefaultStoreNameId
;
1886 SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
1890 if (mRefName
!= NULL
) {
1895 CVfrDefaultStore::CVfrDefaultStore (
1899 mDefaultStoreList
= NULL
;
1902 CVfrDefaultStore::~CVfrDefaultStore (
1906 SVfrDefaultStoreNode
*pTmp
= NULL
;
1908 while (mDefaultStoreList
!= NULL
) {
1909 pTmp
= mDefaultStoreList
;
1910 mDefaultStoreList
= mDefaultStoreList
->mNext
;
1916 CVfrDefaultStore::RegisterDefaultStore (
1917 IN CHAR8
*ObjBinAddr
,
1919 IN EFI_STRING_ID DefaultStoreNameId
,
1923 SVfrDefaultStoreNode
*pNode
= NULL
;
1925 if (RefName
== NULL
) {
1926 return VFR_RETURN_FATAL_ERROR
;
1929 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1930 if (strcmp (pNode
->mRefName
, RefName
) == 0) {
1931 return VFR_RETURN_REDEFINED
;
1935 if ((pNode
= new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE
*)ObjBinAddr
, RefName
, DefaultStoreNameId
, DefaultId
)) == NULL
) {
1936 return VFR_RETURN_OUT_FOR_RESOURCES
;
1939 pNode
->mNext
= mDefaultStoreList
;
1940 mDefaultStoreList
= pNode
;
1942 return VFR_RETURN_SUCCESS
;
1946 * assign new reference name or new default store name id only if
1947 * the original is invalid
1950 CVfrDefaultStore::ReRegisterDefaultStoreById (
1951 IN UINT16 DefaultId
,
1953 IN EFI_STRING_ID DefaultStoreNameId
1956 SVfrDefaultStoreNode
*pNode
= NULL
;
1958 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1959 if (pNode
->mDefaultId
== DefaultId
) {
1964 if (pNode
== NULL
) {
1965 return VFR_RETURN_UNDEFINED
;
1967 if (pNode
->mDefaultStoreNameId
== EFI_STRING_ID_INVALID
) {
1968 pNode
->mDefaultStoreNameId
= DefaultStoreNameId
;
1969 if (pNode
->mObjBinAddr
!= NULL
) {
1970 pNode
->mObjBinAddr
->DefaultName
= DefaultStoreNameId
;
1973 return VFR_RETURN_REDEFINED
;
1976 if (RefName
!= NULL
) {
1977 delete pNode
->mRefName
;
1978 pNode
->mRefName
= new CHAR8
[strlen (RefName
) + 1];
1979 if (pNode
->mRefName
!= NULL
) {
1980 strcpy (pNode
->mRefName
, RefName
);
1985 return VFR_RETURN_SUCCESS
;
1989 CVfrDefaultStore::DefaultIdRegistered (
1993 SVfrDefaultStoreNode
*pNode
= NULL
;
1995 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1996 if (pNode
->mDefaultId
== DefaultId
) {
2005 CVfrDefaultStore::GetDefaultId (
2007 OUT UINT16
*DefaultId
2010 SVfrDefaultStoreNode
*pTmp
= NULL
;
2012 if (DefaultId
== NULL
) {
2013 return VFR_RETURN_FATAL_ERROR
;
2016 for (pTmp
= mDefaultStoreList
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
2017 if (strcmp (pTmp
->mRefName
, RefName
) == 0) {
2018 *DefaultId
= pTmp
->mDefaultId
;
2019 return VFR_RETURN_SUCCESS
;
2023 return VFR_RETURN_UNDEFINED
;
2027 CVfrDefaultStore::BufferVarStoreAltConfigAdd (
2028 IN EFI_VARSTORE_ID DefaultId
,
2029 IN EFI_VARSTORE_INFO
&Info
,
2030 IN CHAR8
*VarStoreName
,
2032 IN EFI_IFR_TYPE_VALUE Value
2035 SVfrDefaultStoreNode
*pNode
= NULL
;
2036 CHAR8 NewAltCfg
[2 * 2 * sizeof (UINT16
) + 1] = {0,};
2037 INTN Returnvalue
= 0;
2039 if (VarStoreName
== NULL
) {
2040 return VFR_RETURN_FATAL_ERROR
;
2043 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2044 if (pNode
->mDefaultId
== DefaultId
) {
2049 if (pNode
== NULL
) {
2050 return VFR_RETURN_UNDEFINED
;
2053 gCVfrBufferConfig
.Open ();
2055 sprintf (NewAltCfg
, "%04x", pNode
->mDefaultId
);
2056 if ((Returnvalue
= gCVfrBufferConfig
.Select(VarStoreName
)) == 0) {
2057 if ((Returnvalue
= gCVfrBufferConfig
.Write ('a', VarStoreName
, NewAltCfg
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
)) != 0) {
2062 gCVfrBufferConfig
.Close ();
2064 return VFR_RETURN_SUCCESS
;
2067 gCVfrBufferConfig
.Close ();
2068 return (EFI_VFR_RETURN_CODE
)Returnvalue
;
2071 SVfrRuleNode::SVfrRuleNode (
2076 if (RuleName
!= NULL
) {
2077 mRuleName
= new CHAR8
[strlen (RuleName
) + 1];
2078 strcpy (mRuleName
, RuleName
);
2087 SVfrRuleNode::~SVfrRuleNode (
2091 if (mRuleName
!= NULL
) {
2096 CVfrRulesDB::CVfrRulesDB ()
2099 mFreeRuleId
= EFI_VARSTORE_ID_START
;
2102 CVfrRulesDB::~CVfrRulesDB ()
2104 SVfrRuleNode
*pNode
;
2106 while(mRuleList
!= NULL
) {
2108 mRuleList
= mRuleList
->mNext
;
2114 CVfrRulesDB::RegisterRule (
2120 if (RuleName
== NULL
) {
2124 if ((pNew
= new SVfrRuleNode (RuleName
, mFreeRuleId
)) == NULL
) {
2130 pNew
->mNext
= mRuleList
;
2135 CVfrRulesDB::GetRuleId (
2139 SVfrRuleNode
*pNode
;
2141 if (RuleName
== NULL
) {
2142 return EFI_RULE_ID_INVALID
;
2145 for (pNode
= mRuleList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2146 if (strcmp (pNode
->mRuleName
, RuleName
) == 0) {
2147 return pNode
->mRuleId
;
2151 return EFI_RULE_ID_INVALID
;
2154 CVfrRulesDB gCVfrRulesDB
;
2156 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2160 mVarStoreId
= EFI_VARSTORE_ID_INVALID
;
2161 mInfo
.mVarName
= EFI_STRING_ID_INVALID
;
2162 mInfo
.mVarOffset
= EFI_VAROFFSET_INVALID
;
2163 mVarType
= EFI_IFR_TYPE_OTHER
;
2167 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2168 IN EFI_VARSTORE_INFO
&Info
2171 mVarStoreId
= Info
.mVarStoreId
;
2172 mInfo
.mVarName
= Info
.mInfo
.mVarName
;
2173 mInfo
.mVarOffset
= Info
.mInfo
.mVarOffset
;
2174 mVarType
= Info
.mVarType
;
2175 mVarTotalSize
= Info
.mVarTotalSize
;
2179 EFI_VARSTORE_INFO::operator == (
2180 IN EFI_VARSTORE_INFO
*Info
2183 if ((mVarStoreId
== Info
->mVarStoreId
) &&
2184 (mInfo
.mVarName
== Info
->mInfo
.mVarName
) &&
2185 (mInfo
.mVarOffset
== Info
->mInfo
.mVarOffset
) &&
2186 (mVarType
== Info
->mVarType
) &&
2187 (mVarTotalSize
== Info
->mVarTotalSize
)) {
2194 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo
;
2197 CVfrQuestionDB::GetFreeQuestionId (
2201 UINT32 Index
, Mask
, Offset
;
2203 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2204 if (mFreeQIdBitMap
[Index
] != 0xFFFFFFFF) {
2209 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
2210 if ((mFreeQIdBitMap
[Index
] & Mask
) == 0) {
2211 mFreeQIdBitMap
[Index
] |= Mask
;
2212 return (EFI_QUESTION_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
2216 return EFI_QUESTION_ID_INVALID
;
2220 CVfrQuestionDB::ChekQuestionIdFree (
2221 IN EFI_QUESTION_ID QId
2224 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2225 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2227 return (mFreeQIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
2231 CVfrQuestionDB::MarkQuestionIdUsed (
2232 IN EFI_QUESTION_ID QId
2235 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2236 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2238 mFreeQIdBitMap
[Index
] |= (0x80000000 >> Offset
);
2242 CVfrQuestionDB::MarkQuestionIdUnused (
2243 IN EFI_QUESTION_ID QId
2246 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2247 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2249 mFreeQIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
2252 SVfrQuestionNode::SVfrQuestionNode (
2260 mQuestionId
= EFI_QUESTION_ID_INVALID
;
2263 mQtype
= QUESTION_NORMAL
;
2266 mName
= new CHAR8
[strlen ("$DEFAULT") + 1];
2267 strcpy (mName
, "$DEFAULT");
2269 mName
= new CHAR8
[strlen (Name
) + 1];
2270 strcpy (mName
, Name
);
2273 if (VarIdStr
!= NULL
) {
2274 mVarIdStr
= new CHAR8
[strlen (VarIdStr
) + 1];
2275 strcpy (mVarIdStr
, VarIdStr
);
2277 mVarIdStr
= new CHAR8
[strlen ("$") + 1];
2278 strcpy (mVarIdStr
, "$");
2282 SVfrQuestionNode::~SVfrQuestionNode (
2286 if (mName
!= NULL
) {
2290 if (mVarIdStr
!= NULL
) {
2295 CVfrQuestionDB::CVfrQuestionDB ()
2299 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2300 mFreeQIdBitMap
[Index
] = 0;
2303 // Question ID 0 is reserved.
2304 mFreeQIdBitMap
[0] = 0x80000000;
2305 mQuestionList
= NULL
;
2308 CVfrQuestionDB::~CVfrQuestionDB ()
2310 SVfrQuestionNode
*pNode
;
2312 while (mQuestionList
!= NULL
) {
2313 pNode
= mQuestionList
;
2314 mQuestionList
= mQuestionList
->mNext
;
2320 // Reset to init state
2323 CVfrQuestionDB::ResetInit(
2328 SVfrQuestionNode
*pNode
;
2330 while (mQuestionList
!= NULL
) {
2331 pNode
= mQuestionList
;
2332 mQuestionList
= mQuestionList
->mNext
;
2336 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2337 mFreeQIdBitMap
[Index
] = 0;
2340 // Question ID 0 is reserved.
2341 mFreeQIdBitMap
[0] = 0x80000000;
2342 mQuestionList
= NULL
;
2346 CVfrQuestionDB::PrintAllQuestion (
2350 SVfrQuestionNode
*pNode
= NULL
;
2352 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2353 printf ("Question VarId is %s and QuesitonId is 0x%x\n", pNode
->mVarIdStr
, pNode
->mQuestionId
);
2358 CVfrQuestionDB::RegisterQuestion (
2361 IN OUT EFI_QUESTION_ID
&QuestionId
2364 SVfrQuestionNode
*pNode
= NULL
;
2366 if ((Name
!= NULL
) && (FindQuestion(Name
) == VFR_RETURN_SUCCESS
)) {
2367 return VFR_RETURN_REDEFINED
;
2370 if ((pNode
= new SVfrQuestionNode (Name
, VarIdStr
)) == NULL
) {
2371 return VFR_RETURN_OUT_FOR_RESOURCES
;
2374 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2375 QuestionId
= GetFreeQuestionId ();
2378 // For Framework Vfr, don't check question ID conflict.
2380 if (!VfrCompatibleMode
&& ChekQuestionIdFree (QuestionId
) == FALSE
) {
2382 return VFR_RETURN_QUESTIONID_REDEFINED
;
2384 MarkQuestionIdUsed (QuestionId
);
2386 pNode
->mQuestionId
= QuestionId
;
2388 pNode
->mNext
= mQuestionList
;
2389 mQuestionList
= pNode
;
2391 gCFormPkg
.DoPendingAssign (VarIdStr
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2393 return VFR_RETURN_SUCCESS
;
2397 CVfrQuestionDB::RegisterOldDateQuestion (
2398 IN CHAR8
*YearVarId
,
2399 IN CHAR8
*MonthVarId
,
2401 IN OUT EFI_QUESTION_ID
&QuestionId
2404 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2407 if ((YearVarId
== NULL
) || (MonthVarId
== NULL
) || (DayVarId
== NULL
)) {
2411 if ((pNode
[0] = new SVfrQuestionNode (NULL
, YearVarId
, DATE_YEAR_BITMASK
)) == NULL
) {
2414 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MonthVarId
, DATE_MONTH_BITMASK
)) == NULL
) {
2417 if ((pNode
[2] = new SVfrQuestionNode (NULL
, DayVarId
, DATE_DAY_BITMASK
)) == NULL
) {
2421 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2422 QuestionId
= GetFreeQuestionId ();
2424 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2427 MarkQuestionIdUsed (QuestionId
);
2430 pNode
[0]->mQuestionId
= QuestionId
;
2431 pNode
[1]->mQuestionId
= QuestionId
;
2432 pNode
[2]->mQuestionId
= QuestionId
;
2433 pNode
[0]->mQtype
= QUESTION_DATE
;
2434 pNode
[1]->mQtype
= QUESTION_DATE
;
2435 pNode
[2]->mQtype
= QUESTION_DATE
;
2436 pNode
[0]->mNext
= pNode
[1];
2437 pNode
[1]->mNext
= pNode
[2];
2438 pNode
[2]->mNext
= mQuestionList
;
2439 mQuestionList
= pNode
[0];
2441 gCFormPkg
.DoPendingAssign (YearVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2442 gCFormPkg
.DoPendingAssign (MonthVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2443 gCFormPkg
.DoPendingAssign (DayVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2448 for (Index
= 0; Index
< 3; Index
++) {
2449 if (pNode
[Index
] != NULL
) {
2450 delete pNode
[Index
];
2453 QuestionId
= EFI_QUESTION_ID_INVALID
;
2457 CVfrQuestionDB::RegisterNewDateQuestion (
2459 IN CHAR8
*BaseVarId
,
2460 IN OUT EFI_QUESTION_ID
&QuestionId
2463 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2465 CHAR8
*VarIdStr
[3] = {NULL
, };
2468 if (BaseVarId
== NULL
) {
2472 Len
= strlen (BaseVarId
);
2474 VarIdStr
[0] = new CHAR8
[Len
+ strlen (".Year") + 1];
2475 if (VarIdStr
[0] != NULL
) {
2476 strcpy (VarIdStr
[0], BaseVarId
);
2477 strcat (VarIdStr
[0], ".Year");
2479 VarIdStr
[1] = new CHAR8
[Len
+ strlen (".Month") + 1];
2480 if (VarIdStr
[1] != NULL
) {
2481 strcpy (VarIdStr
[1], BaseVarId
);
2482 strcat (VarIdStr
[1], ".Month");
2484 VarIdStr
[2] = new CHAR8
[Len
+ strlen (".Day") + 1];
2485 if (VarIdStr
[2] != NULL
) {
2486 strcpy (VarIdStr
[2], BaseVarId
);
2487 strcat (VarIdStr
[2], ".Day");
2490 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], DATE_YEAR_BITMASK
)) == NULL
) {
2493 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], DATE_MONTH_BITMASK
)) == NULL
) {
2496 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], DATE_DAY_BITMASK
)) == NULL
) {
2500 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2501 QuestionId
= GetFreeQuestionId ();
2503 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2506 MarkQuestionIdUsed (QuestionId
);
2509 pNode
[0]->mQuestionId
= QuestionId
;
2510 pNode
[1]->mQuestionId
= QuestionId
;
2511 pNode
[2]->mQuestionId
= QuestionId
;
2512 pNode
[0]->mQtype
= QUESTION_DATE
;
2513 pNode
[1]->mQtype
= QUESTION_DATE
;
2514 pNode
[2]->mQtype
= QUESTION_DATE
;
2515 pNode
[0]->mNext
= pNode
[1];
2516 pNode
[1]->mNext
= pNode
[2];
2517 pNode
[2]->mNext
= mQuestionList
;
2518 mQuestionList
= pNode
[0];
2520 for (Index
= 0; Index
< 3; Index
++) {
2521 if (VarIdStr
[Index
] != NULL
) {
2522 delete VarIdStr
[Index
];
2526 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2527 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2528 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2533 for (Index
= 0; Index
< 3; Index
++) {
2534 if (pNode
[Index
] != NULL
) {
2535 delete pNode
[Index
];
2538 if (VarIdStr
[Index
] != NULL
) {
2539 delete VarIdStr
[Index
];
2545 CVfrQuestionDB::RegisterOldTimeQuestion (
2546 IN CHAR8
*HourVarId
,
2547 IN CHAR8
*MinuteVarId
,
2548 IN CHAR8
*SecondVarId
,
2549 IN OUT EFI_QUESTION_ID
&QuestionId
2552 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2555 if ((HourVarId
== NULL
) || (MinuteVarId
== NULL
) || (SecondVarId
== NULL
)) {
2559 if ((pNode
[0] = new SVfrQuestionNode (NULL
, HourVarId
, TIME_HOUR_BITMASK
)) == NULL
) {
2562 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MinuteVarId
, TIME_MINUTE_BITMASK
)) == NULL
) {
2565 if ((pNode
[2] = new SVfrQuestionNode (NULL
, SecondVarId
, TIME_SECOND_BITMASK
)) == NULL
) {
2569 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2570 QuestionId
= GetFreeQuestionId ();
2572 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2575 MarkQuestionIdUsed (QuestionId
);
2578 pNode
[0]->mQuestionId
= QuestionId
;
2579 pNode
[1]->mQuestionId
= QuestionId
;
2580 pNode
[2]->mQuestionId
= QuestionId
;
2581 pNode
[0]->mQtype
= QUESTION_TIME
;
2582 pNode
[1]->mQtype
= QUESTION_TIME
;
2583 pNode
[2]->mQtype
= QUESTION_TIME
;
2584 pNode
[0]->mNext
= pNode
[1];
2585 pNode
[1]->mNext
= pNode
[2];
2586 pNode
[2]->mNext
= mQuestionList
;
2587 mQuestionList
= pNode
[0];
2589 gCFormPkg
.DoPendingAssign (HourVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2590 gCFormPkg
.DoPendingAssign (MinuteVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2591 gCFormPkg
.DoPendingAssign (SecondVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2596 for (Index
= 0; Index
< 3; Index
++) {
2597 if (pNode
[Index
] != NULL
) {
2598 delete pNode
[Index
];
2601 QuestionId
= EFI_QUESTION_ID_INVALID
;
2605 CVfrQuestionDB::RegisterNewTimeQuestion (
2607 IN CHAR8
*BaseVarId
,
2608 IN OUT EFI_QUESTION_ID
&QuestionId
2611 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2613 CHAR8
*VarIdStr
[3] = {NULL
, };
2616 if (BaseVarId
== NULL
) {
2620 Len
= strlen (BaseVarId
);
2622 VarIdStr
[0] = new CHAR8
[Len
+ strlen (".Hour") + 1];
2623 if (VarIdStr
[0] != NULL
) {
2624 strcpy (VarIdStr
[0], BaseVarId
);
2625 strcat (VarIdStr
[0], ".Hour");
2627 VarIdStr
[1] = new CHAR8
[Len
+ strlen (".Minute") + 1];
2628 if (VarIdStr
[1] != NULL
) {
2629 strcpy (VarIdStr
[1], BaseVarId
);
2630 strcat (VarIdStr
[1], ".Minute");
2632 VarIdStr
[2] = new CHAR8
[Len
+ strlen (".Second") + 1];
2633 if (VarIdStr
[2] != NULL
) {
2634 strcpy (VarIdStr
[2], BaseVarId
);
2635 strcat (VarIdStr
[2], ".Second");
2638 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], TIME_HOUR_BITMASK
)) == NULL
) {
2641 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], TIME_MINUTE_BITMASK
)) == NULL
) {
2644 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], TIME_SECOND_BITMASK
)) == NULL
) {
2648 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2649 QuestionId
= GetFreeQuestionId ();
2651 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2654 MarkQuestionIdUsed (QuestionId
);
2657 pNode
[0]->mQuestionId
= QuestionId
;
2658 pNode
[1]->mQuestionId
= QuestionId
;
2659 pNode
[2]->mQuestionId
= QuestionId
;
2660 pNode
[0]->mQtype
= QUESTION_TIME
;
2661 pNode
[1]->mQtype
= QUESTION_TIME
;
2662 pNode
[2]->mQtype
= QUESTION_TIME
;
2663 pNode
[0]->mNext
= pNode
[1];
2664 pNode
[1]->mNext
= pNode
[2];
2665 pNode
[2]->mNext
= mQuestionList
;
2666 mQuestionList
= pNode
[0];
2668 for (Index
= 0; Index
< 3; Index
++) {
2669 if (VarIdStr
[Index
] != NULL
) {
2670 delete VarIdStr
[Index
];
2674 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2675 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2676 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2681 for (Index
= 0; Index
< 3; Index
++) {
2682 if (pNode
[Index
] != NULL
) {
2683 delete pNode
[Index
];
2686 if (VarIdStr
[Index
] != NULL
) {
2687 delete VarIdStr
[Index
];
2693 CVfrQuestionDB::UpdateQuestionId (
2694 IN EFI_QUESTION_ID QId
,
2695 IN EFI_QUESTION_ID NewQId
2698 SVfrQuestionNode
*pNode
= NULL
;
2700 if (QId
== NewQId
) {
2702 return VFR_RETURN_SUCCESS
;
2706 // For Framework Vfr, don't check question ID conflict.
2708 if (!VfrCompatibleMode
&& ChekQuestionIdFree (NewQId
) == FALSE
) {
2709 return VFR_RETURN_REDEFINED
;
2712 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2713 if (pNode
->mQuestionId
== QId
) {
2718 if (pNode
== NULL
) {
2719 return VFR_RETURN_UNDEFINED
;
2722 MarkQuestionIdUnused (QId
);
2723 pNode
->mQuestionId
= NewQId
;
2724 MarkQuestionIdUsed (NewQId
);
2726 gCFormPkg
.DoPendingAssign (pNode
->mVarIdStr
, (VOID
*)&NewQId
, sizeof(EFI_QUESTION_ID
));
2728 return VFR_RETURN_SUCCESS
;
2732 CVfrQuestionDB::GetQuestionId (
2735 OUT EFI_QUESTION_ID
&QuestionId
,
2736 OUT UINT32
&BitMask
,
2737 OUT EFI_QUESION_TYPE
*QType
2740 SVfrQuestionNode
*pNode
;
2742 QuestionId
= EFI_QUESTION_ID_INVALID
;
2743 BitMask
= 0x00000000;
2744 if (QType
!= NULL
) {
2745 *QType
= QUESTION_NORMAL
;
2748 if ((Name
== NULL
) && (VarIdStr
== NULL
)) {
2752 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2754 if (strcmp (pNode
->mName
, Name
) != 0) {
2759 if (VarIdStr
!= NULL
) {
2760 if (strcmp (pNode
->mVarIdStr
, VarIdStr
) != 0) {
2765 QuestionId
= pNode
->mQuestionId
;
2766 BitMask
= pNode
->mBitMask
;
2767 if (QType
!= NULL
) {
2768 *QType
= pNode
->mQtype
;
2777 CVfrQuestionDB::FindQuestion (
2778 IN EFI_QUESTION_ID QuestionId
2781 SVfrQuestionNode
*pNode
;
2783 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2784 return VFR_RETURN_INVALID_PARAMETER
;
2787 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2788 if (pNode
->mQuestionId
== QuestionId
) {
2789 return VFR_RETURN_SUCCESS
;
2793 return VFR_RETURN_UNDEFINED
;
2797 CVfrQuestionDB::FindQuestion (
2801 SVfrQuestionNode
*pNode
;
2804 return VFR_RETURN_FATAL_ERROR
;
2807 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2808 if (strcmp (pNode
->mName
, Name
) == 0) {
2809 return VFR_RETURN_SUCCESS
;
2813 return VFR_RETURN_UNDEFINED
;
2816 BOOLEAN VfrCompatibleMode
= FALSE
;
2818 CVfrVarDataTypeDB gCVfrVarDataTypeDB
;