3 Vfr common library functions.
5 Copyright (c) 2004 - 2008, Intel Corporation
6 All rights reserved. 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 (
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 (
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
, 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
;
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 ("UINT8", &pYearField
->mFieldType
);
748 pYearField
->mOffset
= 0;
749 pYearField
->mNext
= pMonthField
;
750 pYearField
->mArrayNum
= 0;
752 strcpy (pMonthField
->mFieldName
, "Month");
753 GetDataType ("UINT8", &pMonthField
->mFieldType
);
754 pMonthField
->mOffset
= 1;
755 pMonthField
->mNext
= pDayField
;
756 pMonthField
->mArrayNum
= 0;
758 strcpy (pDayField
->mFieldName
, "Day");
759 GetDataType ("UINT8", &pDayField
->mFieldType
);
760 pDayField
->mOffset
= 2;
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 ("UINT8", &pHoursField
->mFieldType
);
772 pHoursField
->mOffset
= 0;
773 pHoursField
->mNext
= pMinutesField
;
774 pHoursField
->mArrayNum
= 0;
776 strcpy (pMinutesField
->mFieldName
, "Minutes");
777 GetDataType ("UINT8", &pMinutesField
->mFieldType
);
778 pMinutesField
->mOffset
= 1;
779 pMinutesField
->mNext
= pSecondsField
;
780 pMinutesField
->mArrayNum
= 0;
782 strcpy (pSecondsField
->mFieldName
, "Seconds");
783 GetDataType ("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
, "", "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
, "", "Warning", "#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
, "", "Warning", "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
);
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
1389 if ((!VfrCompatibleMode
) || (VarType
== EFI_VFR_VARSTORE_BUFFER
)) {
1391 } else if (VarType
== EFI_VFR_VARSTORE_EFI
) {
1393 } else if (VarType
== EFI_VFR_VARSTORE_NAME
) {
1397 for (; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1398 if (mFreeVarStoreIdBitMap
[Index
] != 0xFFFFFFFF) {
1403 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
1404 if ((mFreeVarStoreIdBitMap
[Index
] & Mask
) == 0) {
1405 mFreeVarStoreIdBitMap
[Index
] |= Mask
;
1406 return (EFI_VARSTORE_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
1410 return EFI_VARSTORE_ID_INVALID
;
1414 CVfrDataStorage::ChekVarStoreIdFree (
1415 IN EFI_VARSTORE_ID VarStoreId
1418 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1419 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1421 return (mFreeVarStoreIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
1425 CVfrDataStorage::MarkVarStoreIdUsed (
1426 IN EFI_VARSTORE_ID VarStoreId
1429 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1430 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1432 mFreeVarStoreIdBitMap
[Index
] |= (0x80000000 >> Offset
);
1436 CVfrDataStorage::MarkVarStoreIdUnused (
1437 IN EFI_VARSTORE_ID VarStoreId
1440 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1441 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1443 mFreeVarStoreIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
1447 CVfrDataStorage::DeclareNameVarStoreBegin (
1451 SVfrVarStorageNode
*pNode
= NULL
;
1452 EFI_VARSTORE_ID VarStoreId
;
1454 if (StoreName
== NULL
) {
1455 return VFR_RETURN_FATAL_ERROR
;
1458 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1459 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1460 return VFR_RETURN_REDEFINED
;
1464 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME
);
1465 if ((pNode
= new SVfrVarStorageNode (StoreName
, VarStoreId
)) == NULL
) {
1466 return VFR_RETURN_UNDEFINED
;
1469 mNewVarStorageNode
= pNode
;
1471 return VFR_RETURN_SUCCESS
;
1475 CVfrDataStorage::NameTableAddItem (
1476 IN EFI_STRING_ID Item
1479 EFI_VARSTORE_ID
*NewTable
, *OldTable
;
1482 OldTable
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
;
1483 TableSize
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
;
1485 if ((TableSize
!= 0) && ((TableSize
% DEFAULT_NAME_TABLE_ITEMS
) == 0)) {
1486 if ((NewTable
= new EFI_VARSTORE_ID
[TableSize
+ DEFAULT_NAME_TABLE_ITEMS
]) == NULL
) {
1487 return VFR_RETURN_OUT_FOR_RESOURCES
;
1489 memcpy (NewTable
, OldTable
, TableSize
);
1490 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
= NewTable
;
1493 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[TableSize
++] = Item
;
1494 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
= TableSize
;
1496 return VFR_RETURN_SUCCESS
;
1500 CVfrDataStorage::DeclareNameVarStoreEnd (
1504 mNewVarStorageNode
->mGuid
= *Guid
;
1505 mNewVarStorageNode
->mNext
= mNameVarStoreList
;
1506 mNameVarStoreList
= mNewVarStorageNode
;
1508 mNewVarStorageNode
= NULL
;
1510 return VFR_RETURN_SUCCESS
;
1514 CVfrDataStorage::DeclareEfiVarStore (
1515 IN CHAR8
*StoreName
,
1517 IN EFI_STRING_ID NameStrId
,
1522 SVfrVarStorageNode
*pNode
;
1523 EFI_VARSTORE_ID VarStoreId
;
1525 if ((StoreName
== NULL
) || (Guid
== NULL
)) {
1526 return VFR_RETURN_FATAL_ERROR
;
1529 if (VarSize
> sizeof (UINT64
)) {
1530 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR
;
1533 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1534 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1535 return VFR_RETURN_REDEFINED
;
1539 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_EFI
);
1540 if ((pNode
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, NameStrId
, VarSize
, Flag
)) == NULL
) {
1541 return VFR_RETURN_OUT_FOR_RESOURCES
;
1544 pNode
->mNext
= mEfiVarStoreList
;
1545 mEfiVarStoreList
= pNode
;
1547 return VFR_RETURN_SUCCESS
;
1551 CVfrDataStorage::DeclareBufferVarStore (
1552 IN CHAR8
*StoreName
,
1554 IN CVfrVarDataTypeDB
*DataTypeDB
,
1556 IN EFI_VARSTORE_ID VarStoreId
,
1560 SVfrVarStorageNode
*pNew
= NULL
;
1561 SVfrDataType
*pDataType
= NULL
;
1563 if ((StoreName
== NULL
) || (Guid
== NULL
) || (DataTypeDB
== NULL
)) {
1564 return VFR_RETURN_FATAL_ERROR
;
1567 CHECK_ERROR_RETURN(DataTypeDB
->GetDataType (TypeName
, &pDataType
), VFR_RETURN_SUCCESS
);
1569 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1570 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_BUFFER
);
1572 if (ChekVarStoreIdFree (VarStoreId
) == FALSE
) {
1573 return VFR_RETURN_VARSTOREID_REDEFINED
;
1575 MarkVarStoreIdUsed (VarStoreId
);
1578 if ((pNew
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, pDataType
, Flag
)) == NULL
) {
1579 return VFR_RETURN_OUT_FOR_RESOURCES
;
1582 pNew
->mNext
= mBufferVarStoreList
;
1583 mBufferVarStoreList
= pNew
;
1585 if (gCVfrBufferConfig
.Register(StoreName
) != 0) {
1586 return VFR_RETURN_FATAL_ERROR
;
1589 return VFR_RETURN_SUCCESS
;
1593 CVfrDataStorage::GetVarStoreId (
1594 IN CHAR8
*StoreName
,
1595 OUT EFI_VARSTORE_ID
*VarStoreId
1598 SVfrVarStorageNode
*pNode
;
1600 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1601 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1602 mCurrVarStorageNode
= pNode
;
1603 *VarStoreId
= pNode
->mVarStoreId
;
1604 return VFR_RETURN_SUCCESS
;
1608 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1609 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1610 mCurrVarStorageNode
= pNode
;
1611 *VarStoreId
= pNode
->mVarStoreId
;
1612 return VFR_RETURN_SUCCESS
;
1616 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1617 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1618 mCurrVarStorageNode
= pNode
;
1619 *VarStoreId
= pNode
->mVarStoreId
;
1620 return VFR_RETURN_SUCCESS
;
1624 mCurrVarStorageNode
= NULL
;
1625 *VarStoreId
= EFI_VARSTORE_ID_INVALID
;
1626 return VFR_RETURN_UNDEFINED
;
1630 CVfrDataStorage::GetBufferVarStoreDataTypeName (
1631 IN CHAR8
*StoreName
,
1632 OUT CHAR8
**DataTypeName
1635 SVfrVarStorageNode
*pNode
;
1637 if ((StoreName
== NULL
) || (DataTypeName
== NULL
)) {
1638 return VFR_RETURN_FATAL_ERROR
;
1641 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1642 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1647 if (pNode
== NULL
) {
1648 return VFR_RETURN_UNDEFINED
;
1651 if (pNode
->mStorageInfo
.mDataType
== NULL
) {
1652 return VFR_RETURN_FATAL_ERROR
;
1655 *DataTypeName
= pNode
->mStorageInfo
.mDataType
->mTypeName
;
1656 return VFR_RETURN_SUCCESS
;
1660 CVfrDataStorage::GetVarStoreType (
1661 IN CHAR8
*StoreName
,
1662 OUT EFI_VFR_VARSTORE_TYPE
&VarStoreType
1665 SVfrVarStorageNode
*pNode
;
1667 if (StoreName
== NULL
) {
1668 return VFR_RETURN_FATAL_ERROR
;
1671 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1672 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1673 VarStoreType
= pNode
->mVarStoreType
;
1674 return VFR_RETURN_SUCCESS
;
1678 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1679 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1680 VarStoreType
= pNode
->mVarStoreType
;
1681 return VFR_RETURN_SUCCESS
;
1685 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1686 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1687 VarStoreType
= pNode
->mVarStoreType
;
1688 return VFR_RETURN_SUCCESS
;
1692 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1693 return VFR_RETURN_UNDEFINED
;
1696 EFI_VFR_VARSTORE_TYPE
1697 CVfrDataStorage::GetVarStoreType (
1698 IN EFI_VARSTORE_ID VarStoreId
1701 SVfrVarStorageNode
*pNode
;
1702 EFI_VFR_VARSTORE_TYPE VarStoreType
;
1704 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1706 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1707 return VarStoreType
;
1710 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1711 if (pNode
->mVarStoreId
== VarStoreId
) {
1712 VarStoreType
= pNode
->mVarStoreType
;
1713 return VarStoreType
;
1717 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1718 if (pNode
->mVarStoreId
== VarStoreId
) {
1719 VarStoreType
= pNode
->mVarStoreType
;
1720 return VarStoreType
;
1724 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1725 if (pNode
->mVarStoreId
== VarStoreId
) {
1726 VarStoreType
= pNode
->mVarStoreType
;
1727 return VarStoreType
;
1731 return VarStoreType
;
1735 CVfrDataStorage::GetVarStoreName (
1736 IN EFI_VARSTORE_ID VarStoreId
,
1737 OUT CHAR8
**VarStoreName
1740 SVfrVarStorageNode
*pNode
;
1742 if (VarStoreName
== NULL
) {
1743 return VFR_RETURN_FATAL_ERROR
;
1746 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1747 if (pNode
->mVarStoreId
== VarStoreId
) {
1748 *VarStoreName
= pNode
->mVarStoreName
;
1749 return VFR_RETURN_SUCCESS
;
1753 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1754 if (pNode
->mVarStoreId
== VarStoreId
) {
1755 *VarStoreName
= pNode
->mVarStoreName
;
1756 return VFR_RETURN_SUCCESS
;
1760 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1761 if (pNode
->mVarStoreId
== VarStoreId
) {
1762 *VarStoreName
= pNode
->mVarStoreName
;
1763 return VFR_RETURN_SUCCESS
;
1767 *VarStoreName
= NULL
;
1768 return VFR_RETURN_UNDEFINED
;
1772 CVfrDataStorage::GetEfiVarStoreInfo (
1773 IN OUT EFI_VARSTORE_INFO
*Info
1777 return VFR_RETURN_FATAL_ERROR
;
1780 if (mCurrVarStorageNode
== NULL
) {
1781 return VFR_RETURN_GET_EFIVARSTORE_ERROR
;
1784 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarName
;
1785 Info
->mVarTotalSize
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarSize
;
1786 switch (Info
->mVarTotalSize
) {
1788 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_8
;
1791 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_16
;
1794 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_32
;
1797 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_64
;
1800 return VFR_RETURN_FATAL_ERROR
;
1803 return VFR_RETURN_SUCCESS
;
1807 CVfrDataStorage::GetNameVarStoreInfo (
1808 OUT EFI_VARSTORE_INFO
*Info
,
1813 return VFR_RETURN_FATAL_ERROR
;
1816 if (mCurrVarStorageNode
== NULL
) {
1817 return VFR_RETURN_GET_NVVARSTORE_ERROR
;
1821 // Framework Vfr file Index is from 1, but Uefi Vfr file Index is from 0.
1823 if (VfrCompatibleMode
) {
1825 return VFR_RETURN_ERROR_ARRARY_NUM
;
1830 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[Index
];
1832 return VFR_RETURN_SUCCESS
;
1836 CVfrDataStorage::BufferVarStoreRequestElementAdd (
1837 IN CHAR8
*StoreName
,
1838 IN EFI_VARSTORE_INFO
&Info
1841 CHAR8 NewReqElt
[128] = {'\0',};
1842 CHAR8
*OldReqElt
= NULL
;
1843 SVfrVarStorageNode
*pNode
= NULL
;
1844 EFI_IFR_TYPE_VALUE Value
= gZeroEfiIfrTypeValue
;
1846 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1847 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1852 if (pNode
== NULL
) {
1853 return VFR_RETURN_UNDEFINED
;
1856 gCVfrBufferConfig
.Open ();
1858 if (gCVfrBufferConfig
.Write ('a', StoreName
, NULL
, EFI_IFR_TYPE_NUM_SIZE_8
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
1859 return VFR_RETURN_FATAL_ERROR
;
1861 gCVfrBufferConfig
.Close ();
1863 return VFR_RETURN_SUCCESS
;
1866 SVfrDefaultStoreNode::SVfrDefaultStoreNode (
1867 IN EFI_IFR_DEFAULTSTORE
*ObjBinAddr
,
1869 IN EFI_STRING_ID DefaultStoreNameId
,
1873 mObjBinAddr
= ObjBinAddr
;
1875 if (RefName
!= NULL
) {
1876 mRefName
= new CHAR8
[strlen (RefName
) + 1];
1877 strcpy (mRefName
, RefName
);
1883 mDefaultId
= DefaultId
;
1884 mDefaultStoreNameId
= DefaultStoreNameId
;
1887 SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
1891 if (mRefName
!= NULL
) {
1896 CVfrDefaultStore::CVfrDefaultStore (
1900 mDefaultStoreList
= NULL
;
1903 CVfrDefaultStore::~CVfrDefaultStore (
1907 SVfrDefaultStoreNode
*pTmp
= NULL
;
1909 while (mDefaultStoreList
!= NULL
) {
1910 pTmp
= mDefaultStoreList
;
1911 mDefaultStoreList
= mDefaultStoreList
->mNext
;
1917 CVfrDefaultStore::RegisterDefaultStore (
1918 IN CHAR8
*ObjBinAddr
,
1920 IN EFI_STRING_ID DefaultStoreNameId
,
1924 SVfrDefaultStoreNode
*pNode
= NULL
;
1926 if (RefName
== NULL
) {
1927 return VFR_RETURN_FATAL_ERROR
;
1930 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1931 if (strcmp (pNode
->mRefName
, RefName
) == 0) {
1932 return VFR_RETURN_REDEFINED
;
1936 if ((pNode
= new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE
*)ObjBinAddr
, RefName
, DefaultStoreNameId
, DefaultId
)) == NULL
) {
1937 return VFR_RETURN_OUT_FOR_RESOURCES
;
1940 pNode
->mNext
= mDefaultStoreList
;
1941 mDefaultStoreList
= pNode
;
1943 return VFR_RETURN_SUCCESS
;
1947 * assign new reference name or new default store name id only if
1948 * the original is invalid
1951 CVfrDefaultStore::ReRegisterDefaultStoreById (
1952 IN UINT16 DefaultId
,
1954 IN EFI_STRING_ID DefaultStoreNameId
1957 SVfrDefaultStoreNode
*pNode
= NULL
;
1959 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1960 if (pNode
->mDefaultId
== DefaultId
) {
1965 if (pNode
== NULL
) {
1966 return VFR_RETURN_UNDEFINED
;
1968 if (pNode
->mDefaultStoreNameId
== EFI_STRING_ID_INVALID
) {
1969 pNode
->mDefaultStoreNameId
= DefaultStoreNameId
;
1970 if (pNode
->mObjBinAddr
!= NULL
) {
1971 pNode
->mObjBinAddr
->DefaultName
= DefaultStoreNameId
;
1974 return VFR_RETURN_REDEFINED
;
1977 if (RefName
!= NULL
) {
1978 delete pNode
->mRefName
;
1979 pNode
->mRefName
= new CHAR8
[strlen (RefName
) + 1];
1980 if (pNode
->mRefName
!= NULL
) {
1981 strcpy (pNode
->mRefName
, RefName
);
1986 return VFR_RETURN_SUCCESS
;
1990 CVfrDefaultStore::DefaultIdRegistered (
1994 SVfrDefaultStoreNode
*pNode
= NULL
;
1996 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1997 if (pNode
->mDefaultId
== DefaultId
) {
2006 CVfrDefaultStore::GetDefaultId (
2008 OUT UINT16
*DefaultId
2011 SVfrDefaultStoreNode
*pTmp
= NULL
;
2013 if (DefaultId
== NULL
) {
2014 return VFR_RETURN_FATAL_ERROR
;
2017 for (pTmp
= mDefaultStoreList
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
2018 if (strcmp (pTmp
->mRefName
, RefName
) == 0) {
2019 *DefaultId
= pTmp
->mDefaultId
;
2020 return VFR_RETURN_SUCCESS
;
2024 return VFR_RETURN_UNDEFINED
;
2029 AltCfgItemPrintToBuffer (
2030 IN CHAR8
*NewAltCfg
,
2031 IN EFI_VARSTORE_INFO Info
,
2033 IN EFI_IFR_TYPE_VALUE Value
2037 UINT8
*BufChar
= NULL
;
2040 if (NewAltCfg
!= NULL
) {
2043 "&OFFSET=%x&WIDTH=%x&VALUE=",
2044 Info
.mInfo
.mVarOffset
,
2050 case EFI_IFR_TYPE_NUM_SIZE_8
:
2051 Count
= sprintf (NewAltCfg
, "%x", Value
.u8
);
2054 case EFI_IFR_TYPE_NUM_SIZE_16
:
2055 Count
= sprintf (NewAltCfg
, "%x", Value
.u16
);
2058 case EFI_IFR_TYPE_NUM_SIZE_32
:
2059 Count
= sprintf (NewAltCfg
, "%x", Value
.u32
);
2062 case EFI_IFR_TYPE_NUM_SIZE_64
:
2063 Count
= sprintf (NewAltCfg
, "%x", Value
.u64
);
2066 case EFI_IFR_TYPE_BOOLEAN
:
2067 Count
= sprintf (NewAltCfg
, "%x", Value
.b
);
2070 case EFI_IFR_TYPE_TIME
:
2072 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.time
)));
2075 BufChar
= (UINT8
*)&Value
.time
;
2076 for (Index
= 0; Index
< sizeof(EFI_HII_TIME
); Index
++) {
2077 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
2082 case EFI_IFR_TYPE_DATE
:
2084 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.date
)));
2087 BufChar
= (UINT8
*)&Value
.date
;
2088 for (Index
= 0; Index
< sizeof(EFI_HII_DATE
); Index
++) {
2089 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
2094 case EFI_IFR_TYPE_STRING
:
2095 Count
= sprintf (NewAltCfg
, "%x", Value
.string
);
2098 case EFI_IFR_TYPE_OTHER
:
2099 return VFR_RETURN_UNSUPPORTED
;
2103 return VFR_RETURN_FATAL_ERROR
;
2107 CVfrDefaultStore::BufferVarStoreAltConfigAdd (
2108 IN EFI_VARSTORE_ID DefaultId
,
2109 IN EFI_VARSTORE_INFO
&Info
,
2110 IN CHAR8
*VarStoreName
,
2112 IN EFI_IFR_TYPE_VALUE Value
2115 SVfrDefaultStoreNode
*pNode
= NULL
;
2116 CHAR8 NewAltCfg
[2 * 2 * sizeof (UINT16
) + 1] = {0,};
2117 INTN Returnvalue
= 0;
2119 if (VarStoreName
== NULL
) {
2120 return VFR_RETURN_FATAL_ERROR
;
2123 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2124 if (pNode
->mDefaultId
== DefaultId
) {
2129 if (pNode
== NULL
) {
2130 return VFR_RETURN_UNDEFINED
;
2133 gCVfrBufferConfig
.Open ();
2135 sprintf (NewAltCfg
, "%04x", pNode
->mDefaultId
);
2136 if ((Returnvalue
= gCVfrBufferConfig
.Select(VarStoreName
)) == 0) {
2137 if ((Returnvalue
= gCVfrBufferConfig
.Write ('a', VarStoreName
, NewAltCfg
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
)) != 0) {
2142 gCVfrBufferConfig
.Close ();
2144 return VFR_RETURN_SUCCESS
;
2147 gCVfrBufferConfig
.Close ();
2148 return (EFI_VFR_RETURN_CODE
)Returnvalue
;
2151 SVfrRuleNode::SVfrRuleNode (
2156 if (RuleName
!= NULL
) {
2157 mRuleName
= new CHAR8
[strlen (RuleName
) + 1];
2158 strcpy (mRuleName
, RuleName
);
2167 SVfrRuleNode::~SVfrRuleNode (
2171 if (mRuleName
!= NULL
) {
2176 CVfrRulesDB::CVfrRulesDB ()
2179 mFreeRuleId
= EFI_VARSTORE_ID_START
;
2182 CVfrRulesDB::~CVfrRulesDB ()
2184 SVfrRuleNode
*pNode
;
2186 while(mRuleList
!= NULL
) {
2188 mRuleList
= mRuleList
->mNext
;
2194 CVfrRulesDB::RegisterRule (
2200 if (RuleName
== NULL
) {
2204 if ((pNew
= new SVfrRuleNode (RuleName
, mFreeRuleId
)) == NULL
) {
2210 pNew
->mNext
= mRuleList
;
2215 CVfrRulesDB::GetRuleId (
2219 SVfrRuleNode
*pNode
;
2221 if (RuleName
== NULL
) {
2222 return EFI_RULE_ID_INVALID
;
2225 for (pNode
= mRuleList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2226 if (strcmp (pNode
->mRuleName
, RuleName
) == 0) {
2227 return pNode
->mRuleId
;
2231 return EFI_RULE_ID_INVALID
;
2234 CVfrRulesDB gCVfrRulesDB
;
2236 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2240 mVarStoreId
= EFI_VARSTORE_ID_INVALID
;
2241 mInfo
.mVarName
= EFI_STRING_ID_INVALID
;
2242 mInfo
.mVarOffset
= EFI_VAROFFSET_INVALID
;
2243 mVarType
= EFI_IFR_TYPE_OTHER
;
2247 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2248 IN EFI_VARSTORE_INFO
&Info
2251 mVarStoreId
= Info
.mVarStoreId
;
2252 mInfo
.mVarName
= Info
.mInfo
.mVarName
;
2253 mInfo
.mVarOffset
= Info
.mInfo
.mVarOffset
;
2254 mVarType
= Info
.mVarType
;
2255 mVarTotalSize
= Info
.mVarTotalSize
;
2259 EFI_VARSTORE_INFO::operator == (
2260 IN EFI_VARSTORE_INFO
*Info
2263 if ((mVarStoreId
== Info
->mVarStoreId
) &&
2264 (mInfo
.mVarName
== Info
->mInfo
.mVarName
) &&
2265 (mInfo
.mVarOffset
== Info
->mInfo
.mVarOffset
) &&
2266 (mVarType
== Info
->mVarType
) &&
2267 (mVarTotalSize
== Info
->mVarTotalSize
)) {
2274 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo
;
2277 CVfrQuestionDB::GetFreeQuestionId (
2281 UINT32 Index
, Mask
, Offset
;
2283 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2284 if (mFreeQIdBitMap
[Index
] != 0xFFFFFFFF) {
2289 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
2290 if ((mFreeQIdBitMap
[Index
] & Mask
) == 0) {
2291 mFreeQIdBitMap
[Index
] |= Mask
;
2292 return (EFI_QUESTION_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
2296 return EFI_QUESTION_ID_INVALID
;
2300 CVfrQuestionDB::ChekQuestionIdFree (
2301 IN EFI_QUESTION_ID QId
2304 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2305 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2307 return (mFreeQIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
2311 CVfrQuestionDB::MarkQuestionIdUsed (
2312 IN EFI_QUESTION_ID QId
2315 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2316 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2318 mFreeQIdBitMap
[Index
] |= (0x80000000 >> Offset
);
2322 CVfrQuestionDB::MarkQuestionIdUnused (
2323 IN EFI_QUESTION_ID QId
2326 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2327 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2329 mFreeQIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
2332 SVfrQuestionNode::SVfrQuestionNode (
2340 mQuestionId
= EFI_QUESTION_ID_INVALID
;
2345 mName
= new CHAR8
[strlen ("$DEFAULT") + 1];
2346 strcpy (mName
, "$DEFAULT");
2348 mName
= new CHAR8
[strlen (Name
) + 1];
2349 strcpy (mName
, Name
);
2352 if (VarIdStr
!= NULL
) {
2353 mVarIdStr
= new CHAR8
[strlen (VarIdStr
) + 1];
2354 strcpy (mVarIdStr
, VarIdStr
);
2356 mVarIdStr
= new CHAR8
[strlen ("$") + 1];
2357 strcpy (mVarIdStr
, "$");
2361 SVfrQuestionNode::~SVfrQuestionNode (
2365 if (mName
!= NULL
) {
2369 if (mVarIdStr
!= NULL
) {
2374 CVfrQuestionDB::CVfrQuestionDB ()
2378 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2379 mFreeQIdBitMap
[Index
] = 0;
2382 // Question ID 0 is reserved.
2383 mFreeQIdBitMap
[0] = 0x80000000;
2384 mQuestionList
= NULL
;
2387 CVfrQuestionDB::~CVfrQuestionDB ()
2389 SVfrQuestionNode
*pNode
;
2391 while (mQuestionList
!= NULL
) {
2392 pNode
= mQuestionList
;
2393 mQuestionList
= mQuestionList
->mNext
;
2399 // Reset to init state
2402 CVfrQuestionDB::ResetInit(
2407 SVfrQuestionNode
*pNode
;
2409 while (mQuestionList
!= NULL
) {
2410 pNode
= mQuestionList
;
2411 mQuestionList
= mQuestionList
->mNext
;
2415 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2416 mFreeQIdBitMap
[Index
] = 0;
2419 // Question ID 0 is reserved.
2420 mFreeQIdBitMap
[0] = 0x80000000;
2421 mQuestionList
= NULL
;
2425 CVfrQuestionDB::PrintAllQuestion (
2429 SVfrQuestionNode
*pNode
= NULL
;
2431 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2432 printf ("Question VarId is %s and QuesitonId is 0x%x\n", pNode
->mVarIdStr
, pNode
->mQuestionId
);
2437 CVfrQuestionDB::RegisterQuestion (
2440 IN OUT EFI_QUESTION_ID
&QuestionId
2443 SVfrQuestionNode
*pNode
= NULL
;
2445 if ((Name
!= NULL
) && (FindQuestion(Name
) == VFR_RETURN_SUCCESS
)) {
2446 return VFR_RETURN_REDEFINED
;
2449 if ((pNode
= new SVfrQuestionNode (Name
, VarIdStr
)) == NULL
) {
2450 return VFR_RETURN_OUT_FOR_RESOURCES
;
2453 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2454 QuestionId
= GetFreeQuestionId ();
2457 // For Framework Vfr, don't check question ID conflict.
2459 if (!VfrCompatibleMode
&& ChekQuestionIdFree (QuestionId
) == FALSE
) {
2461 return VFR_RETURN_QUESTIONID_REDEFINED
;
2463 MarkQuestionIdUsed (QuestionId
);
2465 pNode
->mQuestionId
= QuestionId
;
2467 pNode
->mNext
= mQuestionList
;
2468 mQuestionList
= pNode
;
2470 gCFormPkg
.DoPendingAssign (VarIdStr
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2472 return VFR_RETURN_SUCCESS
;
2476 CVfrQuestionDB::RegisterOldDateQuestion (
2477 IN CHAR8
*YearVarId
,
2478 IN CHAR8
*MonthVarId
,
2480 IN OUT EFI_QUESTION_ID
&QuestionId
2483 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2486 if ((YearVarId
== NULL
) || (MonthVarId
== NULL
) || (DayVarId
== NULL
)) {
2490 if ((pNode
[0] = new SVfrQuestionNode (NULL
, YearVarId
, DATE_YEAR_BITMASK
)) == NULL
) {
2493 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MonthVarId
, DATE_MONTH_BITMASK
)) == NULL
) {
2496 if ((pNode
[2] = new SVfrQuestionNode (NULL
, DayVarId
, 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]->mNext
= pNode
[1];
2513 pNode
[1]->mNext
= pNode
[2];
2514 pNode
[2]->mNext
= mQuestionList
;
2515 mQuestionList
= pNode
[0];
2517 gCFormPkg
.DoPendingAssign (YearVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2518 gCFormPkg
.DoPendingAssign (MonthVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2519 gCFormPkg
.DoPendingAssign (DayVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2524 for (Index
= 0; Index
< 3; Index
++) {
2525 if (pNode
[Index
] != NULL
) {
2526 delete pNode
[Index
];
2529 QuestionId
= EFI_QUESTION_ID_INVALID
;
2533 CVfrQuestionDB::RegisterNewDateQuestion (
2535 IN CHAR8
*BaseVarId
,
2536 IN OUT EFI_QUESTION_ID
&QuestionId
2539 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2541 CHAR8
*VarIdStr
[3] = {NULL
, };
2544 if (BaseVarId
== NULL
) {
2548 Len
= strlen (BaseVarId
);
2550 VarIdStr
[0] = new CHAR8
[Len
+ strlen (".Year") + 1];
2551 if (VarIdStr
[0] != NULL
) {
2552 strcpy (VarIdStr
[0], BaseVarId
);
2553 strcat (VarIdStr
[0], ".Year");
2555 VarIdStr
[1] = new CHAR8
[Len
+ strlen (".Month") + 1];
2556 if (VarIdStr
[1] != NULL
) {
2557 strcpy (VarIdStr
[1], BaseVarId
);
2558 strcat (VarIdStr
[1], ".Month");
2560 VarIdStr
[2] = new CHAR8
[Len
+ strlen (".Day") + 1];
2561 if (VarIdStr
[2] != NULL
) {
2562 strcpy (VarIdStr
[2], BaseVarId
);
2563 strcat (VarIdStr
[2], ".Day");
2566 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], DATE_YEAR_BITMASK
)) == NULL
) {
2569 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], DATE_MONTH_BITMASK
)) == NULL
) {
2572 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], DATE_DAY_BITMASK
)) == NULL
) {
2576 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2577 QuestionId
= GetFreeQuestionId ();
2579 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2582 MarkQuestionIdUsed (QuestionId
);
2585 pNode
[0]->mQuestionId
= QuestionId
;
2586 pNode
[1]->mQuestionId
= QuestionId
;
2587 pNode
[2]->mQuestionId
= QuestionId
;
2588 pNode
[0]->mNext
= pNode
[1];
2589 pNode
[1]->mNext
= pNode
[2];
2590 pNode
[2]->mNext
= mQuestionList
;
2591 mQuestionList
= pNode
[0];
2593 for (Index
= 0; Index
< 3; Index
++) {
2594 if (VarIdStr
[Index
] != NULL
) {
2595 delete VarIdStr
[Index
];
2599 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2600 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2601 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2606 for (Index
= 0; Index
< 3; Index
++) {
2607 if (pNode
[Index
] != NULL
) {
2608 delete pNode
[Index
];
2611 if (VarIdStr
[Index
] != NULL
) {
2612 delete VarIdStr
[Index
];
2618 CVfrQuestionDB::RegisterOldTimeQuestion (
2619 IN CHAR8
*HourVarId
,
2620 IN CHAR8
*MinuteVarId
,
2621 IN CHAR8
*SecondVarId
,
2622 IN OUT EFI_QUESTION_ID
&QuestionId
2625 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2628 if ((HourVarId
== NULL
) || (MinuteVarId
== NULL
) || (SecondVarId
== NULL
)) {
2632 if ((pNode
[0] = new SVfrQuestionNode (NULL
, HourVarId
, TIME_HOUR_BITMASK
)) == NULL
) {
2635 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MinuteVarId
, TIME_MINUTE_BITMASK
)) == NULL
) {
2638 if ((pNode
[2] = new SVfrQuestionNode (NULL
, SecondVarId
, TIME_SECOND_BITMASK
)) == NULL
) {
2642 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2643 QuestionId
= GetFreeQuestionId ();
2645 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2648 MarkQuestionIdUsed (QuestionId
);
2651 pNode
[0]->mQuestionId
= QuestionId
;
2652 pNode
[1]->mQuestionId
= QuestionId
;
2653 pNode
[2]->mQuestionId
= QuestionId
;
2654 pNode
[0]->mNext
= pNode
[1];
2655 pNode
[1]->mNext
= pNode
[2];
2656 pNode
[2]->mNext
= mQuestionList
;
2657 mQuestionList
= pNode
[0];
2659 gCFormPkg
.DoPendingAssign (HourVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2660 gCFormPkg
.DoPendingAssign (MinuteVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2661 gCFormPkg
.DoPendingAssign (SecondVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2666 for (Index
= 0; Index
< 3; Index
++) {
2667 if (pNode
[Index
] != NULL
) {
2668 delete pNode
[Index
];
2671 QuestionId
= EFI_QUESTION_ID_INVALID
;
2675 CVfrQuestionDB::RegisterNewTimeQuestion (
2677 IN CHAR8
*BaseVarId
,
2678 IN OUT EFI_QUESTION_ID
&QuestionId
2681 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2683 CHAR8
*VarIdStr
[3] = {NULL
, };
2686 if (BaseVarId
== NULL
) {
2690 Len
= strlen (BaseVarId
);
2692 VarIdStr
[0] = new CHAR8
[Len
+ strlen (".Hour") + 1];
2693 if (VarIdStr
[0] != NULL
) {
2694 strcpy (VarIdStr
[0], BaseVarId
);
2695 strcat (VarIdStr
[0], ".Hour");
2697 VarIdStr
[1] = new CHAR8
[Len
+ strlen (".Minute") + 1];
2698 if (VarIdStr
[1] != NULL
) {
2699 strcpy (VarIdStr
[1], BaseVarId
);
2700 strcat (VarIdStr
[1], ".Minute");
2702 VarIdStr
[2] = new CHAR8
[Len
+ strlen (".Second") + 1];
2703 if (VarIdStr
[2] != NULL
) {
2704 strcpy (VarIdStr
[2], BaseVarId
);
2705 strcat (VarIdStr
[2], ".Second");
2708 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], TIME_HOUR_BITMASK
)) == NULL
) {
2711 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], TIME_MINUTE_BITMASK
)) == NULL
) {
2714 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], TIME_SECOND_BITMASK
)) == NULL
) {
2718 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2719 QuestionId
= GetFreeQuestionId ();
2721 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2724 MarkQuestionIdUsed (QuestionId
);
2727 pNode
[0]->mQuestionId
= QuestionId
;
2728 pNode
[1]->mQuestionId
= QuestionId
;
2729 pNode
[2]->mQuestionId
= QuestionId
;
2730 pNode
[0]->mNext
= pNode
[1];
2731 pNode
[1]->mNext
= pNode
[2];
2732 pNode
[2]->mNext
= mQuestionList
;
2733 mQuestionList
= pNode
[0];
2735 for (Index
= 0; Index
< 3; Index
++) {
2736 if (VarIdStr
[Index
] != NULL
) {
2737 delete VarIdStr
[Index
];
2741 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2742 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2743 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2748 for (Index
= 0; Index
< 3; Index
++) {
2749 if (pNode
[Index
] != NULL
) {
2750 delete pNode
[Index
];
2753 if (VarIdStr
[Index
] != NULL
) {
2754 delete VarIdStr
[Index
];
2760 CVfrQuestionDB::UpdateQuestionId (
2761 IN EFI_QUESTION_ID QId
,
2762 IN EFI_QUESTION_ID NewQId
2765 SVfrQuestionNode
*pNode
= NULL
;
2767 if (QId
== NewQId
) {
2769 return VFR_RETURN_SUCCESS
;
2773 // For Framework Vfr, don't check question ID conflict.
2775 if (!VfrCompatibleMode
&& ChekQuestionIdFree (NewQId
) == FALSE
) {
2776 return VFR_RETURN_REDEFINED
;
2779 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2780 if (pNode
->mQuestionId
== QId
) {
2785 if (pNode
== NULL
) {
2786 return VFR_RETURN_UNDEFINED
;
2789 MarkQuestionIdUnused (QId
);
2790 pNode
->mQuestionId
= NewQId
;
2791 MarkQuestionIdUsed (NewQId
);
2793 gCFormPkg
.DoPendingAssign (pNode
->mVarIdStr
, (VOID
*)&NewQId
, sizeof(EFI_QUESTION_ID
));
2795 return VFR_RETURN_SUCCESS
;
2799 CVfrQuestionDB::GetQuestionId (
2802 OUT EFI_QUESTION_ID
&QuestionId
,
2806 SVfrQuestionNode
*pNode
;
2808 QuestionId
= EFI_QUESTION_ID_INVALID
;
2809 BitMask
= 0x00000000;
2811 if ((Name
== NULL
) && (VarIdStr
== NULL
)) {
2815 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2817 if (strcmp (pNode
->mName
, Name
) != 0) {
2822 if (VarIdStr
!= NULL
) {
2823 if (strcmp (pNode
->mVarIdStr
, VarIdStr
) != 0) {
2828 QuestionId
= pNode
->mQuestionId
;
2829 BitMask
= pNode
->mBitMask
;
2837 CVfrQuestionDB::FindQuestion (
2838 IN EFI_QUESTION_ID QuestionId
2841 SVfrQuestionNode
*pNode
;
2843 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2844 return VFR_RETURN_INVALID_PARAMETER
;
2847 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2848 if (pNode
->mQuestionId
== QuestionId
) {
2849 return VFR_RETURN_SUCCESS
;
2853 return VFR_RETURN_UNDEFINED
;
2857 CVfrQuestionDB::FindQuestion (
2861 SVfrQuestionNode
*pNode
;
2864 return VFR_RETURN_FATAL_ERROR
;
2867 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2868 if (strcmp (pNode
->mName
, Name
) == 0) {
2869 return VFR_RETURN_SUCCESS
;
2873 return VFR_RETURN_UNDEFINED
;
2876 BOOLEAN VfrCompatibleMode
= FALSE
;
2878 CVfrVarDataTypeDB gCVfrVarDataTypeDB
;