3 Vfr common library functions.
5 Copyright (c) 2004 - 2011, 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 if (*VarStr
== '.') {
628 return VFR_RETURN_SUCCESS
;
630 return VFR_RETURN_DATA_STRING_ERROR
;
633 return VFR_RETURN_SUCCESS
;
637 CVfrVarDataTypeDB::GetTypeField (
639 IN SVfrDataType
*Type
,
640 OUT SVfrDataField
*&Field
643 SVfrDataField
*pField
= NULL
;
645 if ((FName
== NULL
) && (Type
== NULL
)) {
646 return VFR_RETURN_FATAL_ERROR
;
649 for (pField
= Type
->mMembers
; pField
!= NULL
; pField
= pField
->mNext
) {
650 if (strcmp (pField
->mFieldName
, FName
) == 0) {
652 return VFR_RETURN_SUCCESS
;
656 return VFR_RETURN_UNDEFINED
;
660 CVfrVarDataTypeDB::GetFieldOffset (
661 IN SVfrDataField
*Field
,
667 return VFR_RETURN_FATAL_ERROR
;
671 // Framework Vfr file Array Index is from 1.
672 // But Uefi Vfr file Array Index is from 0.
674 if (VfrCompatibleMode
&& ArrayIdx
!= INVALID_ARRAY_INDEX
) {
676 return VFR_RETURN_ERROR_ARRARY_NUM
;
678 ArrayIdx
= ArrayIdx
- 1;
681 if ((ArrayIdx
!= INVALID_ARRAY_INDEX
) && ((Field
->mArrayNum
== 0) || (Field
->mArrayNum
<= ArrayIdx
))) {
682 return VFR_RETURN_ERROR_ARRARY_NUM
;
686 // Be compatible with the current usage
687 // If ArraryIdx is not specified, the first one is used.
689 // if ArrayNum is larger than zero, ArraryIdx must be specified.
691 // if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum > 0)) {
692 // return VFR_RETURN_ERROR_ARRARY_NUM;
696 Offset
= Field
->mOffset
+ Field
->mFieldType
->mTotalSize
* ((ArrayIdx
== INVALID_ARRAY_INDEX
) ? 0 : ArrayIdx
);
697 return VFR_RETURN_SUCCESS
;
701 CVfrVarDataTypeDB::GetFieldWidth (
702 IN SVfrDataField
*Field
709 return Field
->mFieldType
->mType
;
713 CVfrVarDataTypeDB::GetFieldSize (
714 IN SVfrDataField
*Field
,
719 return VFR_RETURN_FATAL_ERROR
;
722 if ((ArrayIdx
== INVALID_ARRAY_INDEX
) && (Field
->mArrayNum
!= 0)) {
723 return Field
->mFieldType
->mTotalSize
* Field
->mArrayNum
;
725 return Field
->mFieldType
->mTotalSize
;
730 CVfrVarDataTypeDB::InternalTypesListInit (
734 SVfrDataType
*New
= NULL
;
737 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
738 New
= new SVfrDataType
;
740 strcpy (New
->mTypeName
, gInternalTypesTable
[Index
].mTypeName
);
741 New
->mType
= gInternalTypesTable
[Index
].mType
;
742 New
->mAlign
= gInternalTypesTable
[Index
].mAlign
;
743 New
->mTotalSize
= gInternalTypesTable
[Index
].mSize
;
744 if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_DATE") == 0) {
745 SVfrDataField
*pYearField
= new SVfrDataField
;
746 SVfrDataField
*pMonthField
= new SVfrDataField
;
747 SVfrDataField
*pDayField
= new SVfrDataField
;
749 strcpy (pYearField
->mFieldName
, "Year");
750 GetDataType ((CHAR8
*)"UINT16", &pYearField
->mFieldType
);
751 pYearField
->mOffset
= 0;
752 pYearField
->mNext
= pMonthField
;
753 pYearField
->mArrayNum
= 0;
755 strcpy (pMonthField
->mFieldName
, "Month");
756 GetDataType ((CHAR8
*)"UINT8", &pMonthField
->mFieldType
);
757 pMonthField
->mOffset
= 2;
758 pMonthField
->mNext
= pDayField
;
759 pMonthField
->mArrayNum
= 0;
761 strcpy (pDayField
->mFieldName
, "Day");
762 GetDataType ((CHAR8
*)"UINT8", &pDayField
->mFieldType
);
763 pDayField
->mOffset
= 3;
764 pDayField
->mNext
= NULL
;
765 pDayField
->mArrayNum
= 0;
767 New
->mMembers
= pYearField
;
768 } else if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_TIME") == 0) {
769 SVfrDataField
*pHoursField
= new SVfrDataField
;
770 SVfrDataField
*pMinutesField
= new SVfrDataField
;
771 SVfrDataField
*pSecondsField
= new SVfrDataField
;
773 strcpy (pHoursField
->mFieldName
, "Hours");
774 GetDataType ((CHAR8
*)"UINT8", &pHoursField
->mFieldType
);
775 pHoursField
->mOffset
= 0;
776 pHoursField
->mNext
= pMinutesField
;
777 pHoursField
->mArrayNum
= 0;
779 strcpy (pMinutesField
->mFieldName
, "Minutes");
780 GetDataType ((CHAR8
*)"UINT8", &pMinutesField
->mFieldType
);
781 pMinutesField
->mOffset
= 1;
782 pMinutesField
->mNext
= pSecondsField
;
783 pMinutesField
->mArrayNum
= 0;
785 strcpy (pSecondsField
->mFieldName
, "Seconds");
786 GetDataType ((CHAR8
*)"UINT8", &pSecondsField
->mFieldType
);
787 pSecondsField
->mOffset
= 2;
788 pSecondsField
->mNext
= NULL
;
789 pSecondsField
->mArrayNum
= 0;
791 New
->mMembers
= pHoursField
;
793 New
->mMembers
= NULL
;
796 RegisterNewType (New
);
802 CVfrVarDataTypeDB::CVfrVarDataTypeDB (
806 mDataTypeList
= NULL
;
808 mCurrDataField
= NULL
;
809 mPackAlign
= DEFAULT_PACK_ALIGN
;
811 mFirstNewDataTypeName
= NULL
;
813 InternalTypesListInit ();
816 CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
821 SVfrDataField
*pField
;
822 SVfrPackStackNode
*pPack
;
824 if (mNewDataType
!= NULL
) {
828 while (mDataTypeList
!= NULL
) {
829 pType
= mDataTypeList
;
830 mDataTypeList
= mDataTypeList
->mNext
;
831 while(pType
->mMembers
!= NULL
) {
832 pField
= pType
->mMembers
;
833 pType
->mMembers
= pType
->mMembers
->mNext
;
839 while (mPackStack
!= NULL
) {
841 mPackStack
= mPackStack
->mNext
;
847 CVfrVarDataTypeDB::Pack (
850 IN CHAR8
*Identifier
,
855 CHAR8 Msg
[MAX_STRING_LEN
] = {0, };
857 if (Action
& VFR_PACK_SHOW
) {
858 sprintf (Msg
, "value of pragma pack(show) == %d", mPackAlign
);
859 gCVfrErrorHandle
.PrintMsg (LineNum
, NULL
, "Warning", Msg
);
862 if (Action
& VFR_PACK_PUSH
) {
863 SVfrPackStackNode
*pNew
= NULL
;
865 if ((pNew
= new SVfrPackStackNode (Identifier
, mPackAlign
)) == NULL
) {
866 return VFR_RETURN_FATAL_ERROR
;
868 pNew
->mNext
= mPackStack
;
872 if (Action
& VFR_PACK_POP
) {
873 SVfrPackStackNode
*pNode
= NULL
;
875 if (mPackStack
== NULL
) {
876 gCVfrErrorHandle
.PrintMsg (LineNum
, NULL
, "Error", "#pragma pack(pop...) : more pops than pushes");
879 for (pNode
= mPackStack
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
880 if (pNode
->Match (Identifier
) == TRUE
) {
881 mPackAlign
= pNode
->mNumber
;
882 mPackStack
= pNode
->mNext
;
887 if (Action
& VFR_PACK_ASSIGN
) {
888 PackAlign
= (Number
> 1) ? Number
+ Number
% 2 : Number
;
889 if ((PackAlign
== 0) || (PackAlign
> 16)) {
890 gCVfrErrorHandle
.PrintMsg (LineNum
, NULL
, "Error", "expected pragma parameter to be '1', '2', '4', '8', or '16'");
892 mPackAlign
= PackAlign
;
896 return VFR_RETURN_SUCCESS
;
900 CVfrVarDataTypeDB::DeclareDataTypeBegin (
904 SVfrDataType
*pNewType
= NULL
;
906 pNewType
= new SVfrDataType
;
907 pNewType
->mTypeName
[0] = '\0';
908 pNewType
->mType
= EFI_IFR_TYPE_OTHER
;
909 pNewType
->mAlign
= DEFAULT_ALIGN
;
910 pNewType
->mTotalSize
= 0;
911 pNewType
->mMembers
= NULL
;
912 pNewType
->mNext
= NULL
;
914 mNewDataType
= pNewType
;
918 CVfrVarDataTypeDB::SetNewTypeName (
924 if (mNewDataType
== NULL
) {
925 return VFR_RETURN_ERROR_SKIPED
;
927 if (TypeName
== NULL
) {
928 return VFR_RETURN_FATAL_ERROR
;
930 if (strlen(TypeName
) >= MAX_NAME_LEN
) {
931 return VFR_RETURN_INVALID_PARAMETER
;
934 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
935 if (strcmp(pType
->mTypeName
, TypeName
) == 0) {
936 return VFR_RETURN_REDEFINED
;
940 strcpy(mNewDataType
->mTypeName
, TypeName
);
941 return VFR_RETURN_SUCCESS
;
945 CVfrVarDataTypeDB::DataTypeAddField (
951 SVfrDataField
*pNewField
= NULL
;
952 SVfrDataType
*pFieldType
= NULL
;
956 CHECK_ERROR_RETURN (GetDataType (TypeName
, &pFieldType
), VFR_RETURN_SUCCESS
);
958 if (strlen (FieldName
) >= MAX_NAME_LEN
) {
959 return VFR_RETURN_INVALID_PARAMETER
;
962 for (pTmp
= mNewDataType
->mMembers
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
963 if (strcmp (pTmp
->mFieldName
, FieldName
) == 0) {
964 return VFR_RETURN_REDEFINED
;
968 Align
= MIN (mPackAlign
, pFieldType
->mAlign
);
970 if ((pNewField
= new SVfrDataField
) == NULL
) {
971 return VFR_RETURN_OUT_FOR_RESOURCES
;
973 strcpy (pNewField
->mFieldName
, FieldName
);
974 pNewField
->mFieldType
= pFieldType
;
975 pNewField
->mArrayNum
= ArrayNum
;
976 if ((mNewDataType
->mTotalSize
% Align
) == 0) {
977 pNewField
->mOffset
= mNewDataType
->mTotalSize
;
979 pNewField
->mOffset
= mNewDataType
->mTotalSize
+ ALIGN_STUFF(mNewDataType
->mTotalSize
, Align
);
981 if (mNewDataType
->mMembers
== NULL
) {
982 mNewDataType
->mMembers
= pNewField
;
983 pNewField
->mNext
= NULL
;
985 for (pTmp
= mNewDataType
->mMembers
; pTmp
->mNext
!= NULL
; pTmp
= pTmp
->mNext
)
987 pTmp
->mNext
= pNewField
;
988 pNewField
->mNext
= NULL
;
991 mNewDataType
->mAlign
= MIN (mPackAlign
, MAX (pFieldType
->mAlign
, mNewDataType
->mAlign
));
992 mNewDataType
->mTotalSize
= pNewField
->mOffset
+ (pNewField
->mFieldType
->mTotalSize
) * ((ArrayNum
== 0) ? 1 : ArrayNum
);
994 return VFR_RETURN_SUCCESS
;
998 CVfrVarDataTypeDB::DeclareDataTypeEnd (
1002 if (mNewDataType
->mTypeName
[0] == '\0') {
1006 if ((mNewDataType
->mTotalSize
% mNewDataType
->mAlign
) !=0) {
1007 mNewDataType
->mTotalSize
+= ALIGN_STUFF (mNewDataType
->mTotalSize
, mNewDataType
->mAlign
);
1010 RegisterNewType (mNewDataType
);
1011 if (mFirstNewDataTypeName
== NULL
) {
1012 mFirstNewDataTypeName
= mNewDataType
->mTypeName
;
1015 mNewDataType
= NULL
;
1019 CVfrVarDataTypeDB::GetDataType (
1021 OUT SVfrDataType
**DataType
1024 SVfrDataType
*pDataType
= NULL
;
1026 if (TypeName
== NULL
) {
1027 return VFR_RETURN_ERROR_SKIPED
;
1030 if (DataType
== NULL
) {
1031 return VFR_RETURN_FATAL_ERROR
;
1036 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1037 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1038 *DataType
= pDataType
;
1039 return VFR_RETURN_SUCCESS
;
1043 return VFR_RETURN_UNDEFINED
;
1047 CVfrVarDataTypeDB::GetDataTypeSize (
1052 SVfrDataType
*pDataType
= NULL
;
1055 return VFR_RETURN_FATAL_ERROR
;
1059 DataType
= DataType
& 0x0F;
1062 // For user defined data type, the size can't be got by this function.
1064 if (DataType
== EFI_IFR_TYPE_OTHER
) {
1065 return VFR_RETURN_SUCCESS
;
1068 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1069 if (DataType
== pDataType
->mType
) {
1070 *Size
= pDataType
->mTotalSize
;
1071 return VFR_RETURN_SUCCESS
;
1075 return VFR_RETURN_UNDEFINED
;
1079 CVfrVarDataTypeDB::GetDataTypeSize (
1084 SVfrDataType
*pDataType
= NULL
;
1087 return VFR_RETURN_FATAL_ERROR
;
1092 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1093 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1094 *Size
= pDataType
->mTotalSize
;
1095 return VFR_RETURN_SUCCESS
;
1099 return VFR_RETURN_UNDEFINED
;
1103 CVfrVarDataTypeDB::GetDataFieldInfo (
1110 CHAR8 TName
[MAX_NAME_LEN
], FName
[MAX_NAME_LEN
];
1111 UINT32 ArrayIdx
, Tmp
;
1112 SVfrDataType
*pType
= NULL
;
1113 SVfrDataField
*pField
= NULL
;
1116 Type
= EFI_IFR_TYPE_OTHER
;
1119 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr
, TName
), VFR_RETURN_SUCCESS
);
1120 CHECK_ERROR_RETURN (GetDataType (TName
, &pType
), VFR_RETURN_SUCCESS
);
1123 // if it is not struct data type
1125 Type
= pType
->mType
;
1126 Size
= pType
->mTotalSize
;
1128 while (*VarStr
!= '\0') {
1129 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr
, FName
, ArrayIdx
), VFR_RETURN_SUCCESS
);
1130 CHECK_ERROR_RETURN(GetTypeField (FName
, pType
, pField
), VFR_RETURN_SUCCESS
);
1131 pType
= pField
->mFieldType
;
1132 CHECK_ERROR_RETURN(GetFieldOffset (pField
, ArrayIdx
, Tmp
), VFR_RETURN_SUCCESS
);
1133 Offset
= (UINT16
) (Offset
+ Tmp
);
1134 Type
= GetFieldWidth (pField
);
1135 Size
= GetFieldSize (pField
, ArrayIdx
);
1137 return VFR_RETURN_SUCCESS
;
1141 CVfrVarDataTypeDB::GetUserDefinedTypeNameList (
1142 OUT CHAR8
***NameList
,
1143 OUT UINT32
*ListSize
1147 SVfrDataType
*pType
;
1149 if ((NameList
== NULL
) || (ListSize
== NULL
)) {
1150 return VFR_RETURN_FATAL_ERROR
;
1156 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1157 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1162 if (*ListSize
== 0) {
1163 return VFR_RETURN_SUCCESS
;
1166 if ((*NameList
= new CHAR8
*[*ListSize
]) == NULL
) {
1168 return VFR_RETURN_OUT_FOR_RESOURCES
;
1171 for (Index
= 0, pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
, Index
++) {
1172 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1173 (*NameList
)[Index
] = pType
->mTypeName
;
1176 return VFR_RETURN_SUCCESS
;
1180 CVfrVarDataTypeDB::IsTypeNameDefined (
1184 SVfrDataType
*pType
;
1186 if (TypeName
== NULL
) {
1190 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1191 if (strcmp (pType
->mTypeName
, TypeName
) == 0) {
1200 CVfrVarDataTypeDB::Dump (
1204 SVfrDataType
*pTNode
;
1205 SVfrDataField
*pFNode
;
1207 fprintf (File
, "\n\n***************************************************************\n");
1208 fprintf (File
, "\t\tmPackAlign = %x\n", mPackAlign
);
1209 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1210 fprintf (File
, "\t\tstruct %s : mAlign [%d] mTotalSize [0x%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1211 fprintf (File
, "\t\tstruct %s {\n", pTNode
->mTypeName
);
1212 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1213 if (pFNode
->mArrayNum
> 0) {
1214 fprintf (File
, "\t\t\t+%08d[%08x] %s[%d] <%s>\n", pFNode
->mOffset
, pFNode
->mOffset
,
1215 pFNode
->mFieldName
, pFNode
->mArrayNum
, pFNode
->mFieldType
->mTypeName
);
1217 fprintf (File
, "\t\t\t+%08d[%08x] %s <%s>\n", pFNode
->mOffset
, pFNode
->mOffset
,
1218 pFNode
->mFieldName
, pFNode
->mFieldType
->mTypeName
);
1221 fprintf (File
, "\t\t};\n");
1222 fprintf (File
, "---------------------------------------------------------------\n");
1224 fprintf (File
, "***************************************************************\n");
1227 #ifdef CVFR_VARDATATYPEDB_DEBUG
1229 CVfrVarDataTypeDB::ParserDB (
1233 SVfrDataType
*pTNode
;
1234 SVfrDataField
*pFNode
;
1236 printf ("***************************************************************\n");
1237 printf ("\t\tmPackAlign = %x\n", mPackAlign
);
1238 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1239 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1240 printf ("\t\tstruct %s {\n", pTNode
->mTypeName
);
1241 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1242 printf ("\t\t\t%s\t%s\n", pFNode
->mFieldType
->mTypeName
, pFNode
->mFieldName
);
1244 printf ("\t\t};\n");
1245 printf ("---------------------------------------------------------------\n");
1247 printf ("***************************************************************\n");
1251 SVfrVarStorageNode::SVfrVarStorageNode (
1253 IN CHAR8
*StoreName
,
1254 IN EFI_VARSTORE_ID VarStoreId
,
1255 IN EFI_STRING_ID VarName
,
1263 memset (&Guid
, 0, sizeof (EFI_GUID
));
1265 if (StoreName
!= NULL
) {
1266 mVarStoreName
= new CHAR8
[strlen(StoreName
) + 1];
1267 strcpy (mVarStoreName
, StoreName
);
1269 mVarStoreName
= NULL
;
1272 mVarStoreId
= VarStoreId
;
1273 mVarStoreType
= EFI_VFR_VARSTORE_EFI
;
1274 mStorageInfo
.mEfiVar
.mEfiVarName
= VarName
;
1275 mStorageInfo
.mEfiVar
.mEfiVarSize
= VarSize
;
1276 mAssignedFlag
= Flag
;
1279 SVfrVarStorageNode::SVfrVarStorageNode (
1281 IN CHAR8
*StoreName
,
1282 IN EFI_VARSTORE_ID VarStoreId
,
1283 IN SVfrDataType
*DataType
,
1290 memset (&Guid
, 0, sizeof (EFI_GUID
));
1292 if (StoreName
!= NULL
) {
1293 mVarStoreName
= new CHAR8
[strlen(StoreName
) + 1];
1294 strcpy (mVarStoreName
, StoreName
);
1296 mVarStoreName
= NULL
;
1299 mVarStoreId
= VarStoreId
;
1300 mVarStoreType
= EFI_VFR_VARSTORE_BUFFER
;
1301 mStorageInfo
.mDataType
= DataType
;
1302 mAssignedFlag
= Flag
;
1305 SVfrVarStorageNode::SVfrVarStorageNode (
1306 IN CHAR8
*StoreName
,
1307 IN EFI_VARSTORE_ID VarStoreId
1310 if (StoreName
!= NULL
) {
1311 mVarStoreName
= new CHAR8
[strlen(StoreName
) + 1];
1312 strcpy (mVarStoreName
, StoreName
);
1314 mVarStoreName
= NULL
;
1317 mVarStoreId
= VarStoreId
;
1318 mVarStoreType
= EFI_VFR_VARSTORE_NAME
;
1319 mStorageInfo
.mNameSpace
.mNameTable
= new EFI_VARSTORE_ID
[DEFAULT_NAME_TABLE_ITEMS
];
1320 mStorageInfo
.mNameSpace
.mTableSize
= 0;
1323 SVfrVarStorageNode::~SVfrVarStorageNode (
1327 if (mVarStoreName
!= NULL
) {
1328 delete mVarStoreName
;
1331 if (mVarStoreType
== EFI_VFR_VARSTORE_NAME
) {
1332 delete mStorageInfo
.mNameSpace
.mNameTable
;
1336 CVfrDataStorage::CVfrDataStorage (
1342 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1343 mFreeVarStoreIdBitMap
[Index
] = 0;
1346 // Question ID 0 is reserved.
1347 mFreeVarStoreIdBitMap
[0] = 0x80000000;
1349 mBufferVarStoreList
= NULL
;
1350 mEfiVarStoreList
= NULL
;
1351 mNameVarStoreList
= NULL
;
1352 mCurrVarStorageNode
= NULL
;
1353 mNewVarStorageNode
= NULL
;
1356 CVfrDataStorage::~CVfrDataStorage (
1360 SVfrVarStorageNode
*pNode
;
1362 while (mBufferVarStoreList
!= NULL
) {
1363 pNode
= mBufferVarStoreList
;
1364 mBufferVarStoreList
= mBufferVarStoreList
->mNext
;
1367 while (mEfiVarStoreList
!= NULL
) {
1368 pNode
= mEfiVarStoreList
;
1369 mEfiVarStoreList
= mEfiVarStoreList
->mNext
;
1372 while (mNameVarStoreList
!= NULL
) {
1373 pNode
= mNameVarStoreList
;
1374 mNameVarStoreList
= mNameVarStoreList
->mNext
;
1377 if (mNewVarStorageNode
!= NULL
) {
1378 delete mNewVarStorageNode
;
1383 CVfrDataStorage::GetFreeVarStoreId (
1384 EFI_VFR_VARSTORE_TYPE VarType
1387 UINT32 Index
, Mask
, Offset
;
1390 // Assign the different ID range for the different type VarStore to support Framework Vfr
1393 if ((!VfrCompatibleMode
) || (VarType
== EFI_VFR_VARSTORE_BUFFER
)) {
1395 } else if (VarType
== EFI_VFR_VARSTORE_EFI
) {
1397 } else if (VarType
== EFI_VFR_VARSTORE_NAME
) {
1401 for (; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1402 if (mFreeVarStoreIdBitMap
[Index
] != 0xFFFFFFFF) {
1407 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
1408 if ((mFreeVarStoreIdBitMap
[Index
] & Mask
) == 0) {
1409 mFreeVarStoreIdBitMap
[Index
] |= Mask
;
1410 return (EFI_VARSTORE_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
1414 return EFI_VARSTORE_ID_INVALID
;
1418 CVfrDataStorage::ChekVarStoreIdFree (
1419 IN EFI_VARSTORE_ID VarStoreId
1422 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1423 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1425 return (mFreeVarStoreIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
1429 CVfrDataStorage::MarkVarStoreIdUsed (
1430 IN EFI_VARSTORE_ID VarStoreId
1433 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1434 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1436 mFreeVarStoreIdBitMap
[Index
] |= (0x80000000 >> Offset
);
1440 CVfrDataStorage::MarkVarStoreIdUnused (
1441 IN EFI_VARSTORE_ID VarStoreId
1444 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1445 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1447 mFreeVarStoreIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
1451 CVfrDataStorage::DeclareNameVarStoreBegin (
1455 SVfrVarStorageNode
*pNode
= NULL
;
1456 EFI_VARSTORE_ID VarStoreId
;
1458 if (StoreName
== NULL
) {
1459 return VFR_RETURN_FATAL_ERROR
;
1462 if (GetVarStoreId (StoreName
, &VarStoreId
) == VFR_RETURN_SUCCESS
) {
1463 return VFR_RETURN_REDEFINED
;
1466 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME
);
1467 if ((pNode
= new SVfrVarStorageNode (StoreName
, VarStoreId
)) == NULL
) {
1468 return VFR_RETURN_UNDEFINED
;
1471 mNewVarStorageNode
= pNode
;
1473 return VFR_RETURN_SUCCESS
;
1477 CVfrDataStorage::NameTableAddItem (
1478 IN EFI_STRING_ID Item
1481 EFI_VARSTORE_ID
*NewTable
, *OldTable
;
1484 OldTable
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
;
1485 TableSize
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
;
1487 if ((TableSize
!= 0) && ((TableSize
% DEFAULT_NAME_TABLE_ITEMS
) == 0)) {
1488 if ((NewTable
= new EFI_VARSTORE_ID
[TableSize
+ DEFAULT_NAME_TABLE_ITEMS
]) == NULL
) {
1489 return VFR_RETURN_OUT_FOR_RESOURCES
;
1491 memcpy (NewTable
, OldTable
, TableSize
);
1492 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
= NewTable
;
1495 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[TableSize
++] = Item
;
1496 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
= TableSize
;
1498 return VFR_RETURN_SUCCESS
;
1502 CVfrDataStorage::DeclareNameVarStoreEnd (
1506 mNewVarStorageNode
->mGuid
= *Guid
;
1507 mNewVarStorageNode
->mNext
= mNameVarStoreList
;
1508 mNameVarStoreList
= mNewVarStorageNode
;
1510 mNewVarStorageNode
= NULL
;
1512 return VFR_RETURN_SUCCESS
;
1516 CVfrDataStorage::DeclareEfiVarStore (
1517 IN CHAR8
*StoreName
,
1519 IN EFI_STRING_ID NameStrId
,
1524 SVfrVarStorageNode
*pNode
;
1525 EFI_VARSTORE_ID VarStoreId
;
1527 if ((StoreName
== NULL
) || (Guid
== NULL
)) {
1528 return VFR_RETURN_FATAL_ERROR
;
1531 if (VarSize
> sizeof (UINT64
)) {
1532 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR
;
1535 if (GetVarStoreId (StoreName
, &VarStoreId
) == VFR_RETURN_SUCCESS
) {
1536 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
;
1562 EFI_VARSTORE_ID TempVarStoreId
;
1564 if ((StoreName
== NULL
) || (Guid
== NULL
) || (DataTypeDB
== NULL
)) {
1565 return VFR_RETURN_FATAL_ERROR
;
1568 if (GetVarStoreId (StoreName
, &TempVarStoreId
) == VFR_RETURN_SUCCESS
) {
1569 return VFR_RETURN_REDEFINED
;
1572 CHECK_ERROR_RETURN(DataTypeDB
->GetDataType (TypeName
, &pDataType
), VFR_RETURN_SUCCESS
);
1574 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1575 VarStoreId
= GetFreeVarStoreId (EFI_VFR_VARSTORE_BUFFER
);
1577 if (ChekVarStoreIdFree (VarStoreId
) == FALSE
) {
1578 return VFR_RETURN_VARSTOREID_REDEFINED
;
1580 MarkVarStoreIdUsed (VarStoreId
);
1583 if ((pNew
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, pDataType
, Flag
)) == NULL
) {
1584 return VFR_RETURN_OUT_FOR_RESOURCES
;
1587 pNew
->mNext
= mBufferVarStoreList
;
1588 mBufferVarStoreList
= pNew
;
1590 if (gCVfrBufferConfig
.Register(StoreName
) != 0) {
1591 return VFR_RETURN_FATAL_ERROR
;
1594 return VFR_RETURN_SUCCESS
;
1598 CVfrDataStorage::GetVarStoreByDataType (
1599 IN CHAR8
*DataTypeName
,
1600 OUT SVfrVarStorageNode
**VarNode
1603 SVfrVarStorageNode
*pNode
;
1604 SVfrVarStorageNode
*MatchNode
;
1607 // Framework VFR uses Data type name as varstore name, so don't need check again.
1609 if (VfrCompatibleMode
) {
1610 return VFR_RETURN_UNDEFINED
;
1614 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1615 if (strcmp (pNode
->mStorageInfo
.mDataType
->mTypeName
, DataTypeName
) == 0) {
1616 if (MatchNode
== NULL
) {
1620 // More than one varstores referred the same data structures.
1622 return VFR_RETURN_VARSTORE_DATATYPE_REDEFINED_ERROR
;
1627 if (MatchNode
== NULL
) {
1628 return VFR_RETURN_UNDEFINED
;
1631 *VarNode
= MatchNode
;
1632 return VFR_RETURN_SUCCESS
;
1636 CVfrDataStorage::GetVarStoreId (
1637 IN CHAR8
*StoreName
,
1638 OUT EFI_VARSTORE_ID
*VarStoreId
1641 EFI_VFR_RETURN_CODE ReturnCode
;
1642 SVfrVarStorageNode
*pNode
;
1644 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1645 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1646 mCurrVarStorageNode
= pNode
;
1647 *VarStoreId
= pNode
->mVarStoreId
;
1648 return VFR_RETURN_SUCCESS
;
1652 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1653 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1654 mCurrVarStorageNode
= pNode
;
1655 *VarStoreId
= pNode
->mVarStoreId
;
1656 return VFR_RETURN_SUCCESS
;
1660 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1661 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1662 mCurrVarStorageNode
= pNode
;
1663 *VarStoreId
= pNode
->mVarStoreId
;
1664 return VFR_RETURN_SUCCESS
;
1668 mCurrVarStorageNode
= NULL
;
1669 *VarStoreId
= EFI_VARSTORE_ID_INVALID
;
1672 // Assume that Data strucutre name is used as StoreName, and check again.
1674 ReturnCode
= GetVarStoreByDataType (StoreName
, &pNode
);
1675 if (pNode
!= NULL
) {
1676 mCurrVarStorageNode
= pNode
;
1677 *VarStoreId
= pNode
->mVarStoreId
;
1684 CVfrDataStorage::GetBufferVarStoreDataTypeName (
1685 IN CHAR8
*StoreName
,
1686 OUT CHAR8
**DataTypeName
1689 SVfrVarStorageNode
*pNode
;
1690 EFI_VFR_RETURN_CODE ReturnCode
;
1692 if ((StoreName
== NULL
) || (DataTypeName
== NULL
)) {
1693 return VFR_RETURN_FATAL_ERROR
;
1696 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1697 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1702 ReturnCode
= VFR_RETURN_UNDEFINED
;
1704 // Assume that Data strucutre name is used as StoreName, and check again.
1706 if (pNode
== NULL
) {
1707 ReturnCode
= GetVarStoreByDataType (StoreName
, &pNode
);
1710 if (pNode
== NULL
) {
1714 if (pNode
->mStorageInfo
.mDataType
== NULL
) {
1715 return VFR_RETURN_FATAL_ERROR
;
1718 *DataTypeName
= pNode
->mStorageInfo
.mDataType
->mTypeName
;
1719 return VFR_RETURN_SUCCESS
;
1723 CVfrDataStorage::GetVarStoreType (
1724 IN CHAR8
*StoreName
,
1725 OUT EFI_VFR_VARSTORE_TYPE
&VarStoreType
1728 SVfrVarStorageNode
*pNode
;
1729 EFI_VFR_RETURN_CODE ReturnCode
;
1731 if (StoreName
== NULL
) {
1732 return VFR_RETURN_FATAL_ERROR
;
1735 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1736 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1737 VarStoreType
= pNode
->mVarStoreType
;
1738 return VFR_RETURN_SUCCESS
;
1742 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1743 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1744 VarStoreType
= pNode
->mVarStoreType
;
1745 return VFR_RETURN_SUCCESS
;
1749 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1750 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1751 VarStoreType
= pNode
->mVarStoreType
;
1752 return VFR_RETURN_SUCCESS
;
1756 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1759 // Assume that Data strucutre name is used as StoreName, and check again.
1761 ReturnCode
= GetVarStoreByDataType (StoreName
, &pNode
);
1762 if (pNode
!= NULL
) {
1763 VarStoreType
= pNode
->mVarStoreType
;
1769 EFI_VFR_VARSTORE_TYPE
1770 CVfrDataStorage::GetVarStoreType (
1771 IN EFI_VARSTORE_ID VarStoreId
1774 SVfrVarStorageNode
*pNode
;
1775 EFI_VFR_VARSTORE_TYPE VarStoreType
;
1777 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1779 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1780 return VarStoreType
;
1783 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1784 if (pNode
->mVarStoreId
== VarStoreId
) {
1785 VarStoreType
= pNode
->mVarStoreType
;
1786 return VarStoreType
;
1790 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1791 if (pNode
->mVarStoreId
== VarStoreId
) {
1792 VarStoreType
= pNode
->mVarStoreType
;
1793 return VarStoreType
;
1797 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1798 if (pNode
->mVarStoreId
== VarStoreId
) {
1799 VarStoreType
= pNode
->mVarStoreType
;
1800 return VarStoreType
;
1804 return VarStoreType
;
1808 CVfrDataStorage::GetVarStoreName (
1809 IN EFI_VARSTORE_ID VarStoreId
,
1810 OUT CHAR8
**VarStoreName
1813 SVfrVarStorageNode
*pNode
;
1815 if (VarStoreName
== NULL
) {
1816 return VFR_RETURN_FATAL_ERROR
;
1819 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1820 if (pNode
->mVarStoreId
== VarStoreId
) {
1821 *VarStoreName
= pNode
->mVarStoreName
;
1822 return VFR_RETURN_SUCCESS
;
1826 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1827 if (pNode
->mVarStoreId
== VarStoreId
) {
1828 *VarStoreName
= pNode
->mVarStoreName
;
1829 return VFR_RETURN_SUCCESS
;
1833 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1834 if (pNode
->mVarStoreId
== VarStoreId
) {
1835 *VarStoreName
= pNode
->mVarStoreName
;
1836 return VFR_RETURN_SUCCESS
;
1840 *VarStoreName
= NULL
;
1841 return VFR_RETURN_UNDEFINED
;
1845 CVfrDataStorage::GetEfiVarStoreInfo (
1846 IN OUT EFI_VARSTORE_INFO
*Info
1850 return VFR_RETURN_FATAL_ERROR
;
1853 if (mCurrVarStorageNode
== NULL
) {
1854 return VFR_RETURN_GET_EFIVARSTORE_ERROR
;
1857 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarName
;
1858 Info
->mVarTotalSize
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarSize
;
1859 switch (Info
->mVarTotalSize
) {
1861 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_8
;
1864 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_16
;
1867 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_32
;
1870 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_64
;
1873 return VFR_RETURN_FATAL_ERROR
;
1876 return VFR_RETURN_SUCCESS
;
1880 CVfrDataStorage::GetNameVarStoreInfo (
1881 OUT EFI_VARSTORE_INFO
*Info
,
1886 return VFR_RETURN_FATAL_ERROR
;
1889 if (mCurrVarStorageNode
== NULL
) {
1890 return VFR_RETURN_GET_NVVARSTORE_ERROR
;
1894 // Framework Vfr file Index is from 1, but Uefi Vfr file Index is from 0.
1896 if (VfrCompatibleMode
) {
1898 return VFR_RETURN_ERROR_ARRARY_NUM
;
1903 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[Index
];
1905 return VFR_RETURN_SUCCESS
;
1909 CVfrDataStorage::BufferVarStoreRequestElementAdd (
1910 IN CHAR8
*StoreName
,
1911 IN EFI_VARSTORE_INFO
&Info
1914 SVfrVarStorageNode
*pNode
= NULL
;
1915 EFI_IFR_TYPE_VALUE Value
= gZeroEfiIfrTypeValue
;
1916 EFI_VFR_RETURN_CODE ReturnCode
;
1918 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1919 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1924 ReturnCode
= VFR_RETURN_UNDEFINED
;
1926 // Assume that Data strucutre name is used as StoreName, and check again.
1928 if (pNode
== NULL
) {
1929 ReturnCode
= GetVarStoreByDataType (StoreName
, &pNode
);
1932 if (pNode
== NULL
) {
1936 gCVfrBufferConfig
.Open ();
1938 if (gCVfrBufferConfig
.Write ('a', StoreName
, NULL
, EFI_IFR_TYPE_NUM_SIZE_8
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
1939 return VFR_RETURN_FATAL_ERROR
;
1941 gCVfrBufferConfig
.Close ();
1943 return VFR_RETURN_SUCCESS
;
1946 SVfrDefaultStoreNode::SVfrDefaultStoreNode (
1947 IN EFI_IFR_DEFAULTSTORE
*ObjBinAddr
,
1949 IN EFI_STRING_ID DefaultStoreNameId
,
1953 mObjBinAddr
= ObjBinAddr
;
1955 if (RefName
!= NULL
) {
1956 mRefName
= new CHAR8
[strlen (RefName
) + 1];
1957 strcpy (mRefName
, RefName
);
1963 mDefaultId
= DefaultId
;
1964 mDefaultStoreNameId
= DefaultStoreNameId
;
1967 SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
1971 if (mRefName
!= NULL
) {
1976 CVfrDefaultStore::CVfrDefaultStore (
1980 mDefaultStoreList
= NULL
;
1983 CVfrDefaultStore::~CVfrDefaultStore (
1987 SVfrDefaultStoreNode
*pTmp
= NULL
;
1989 while (mDefaultStoreList
!= NULL
) {
1990 pTmp
= mDefaultStoreList
;
1991 mDefaultStoreList
= mDefaultStoreList
->mNext
;
1997 CVfrDefaultStore::RegisterDefaultStore (
1998 IN CHAR8
*ObjBinAddr
,
2000 IN EFI_STRING_ID DefaultStoreNameId
,
2004 SVfrDefaultStoreNode
*pNode
= NULL
;
2006 if (RefName
== NULL
) {
2007 return VFR_RETURN_FATAL_ERROR
;
2010 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2011 if (strcmp (pNode
->mRefName
, RefName
) == 0) {
2012 return VFR_RETURN_REDEFINED
;
2016 if ((pNode
= new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE
*)ObjBinAddr
, RefName
, DefaultStoreNameId
, DefaultId
)) == NULL
) {
2017 return VFR_RETURN_OUT_FOR_RESOURCES
;
2020 pNode
->mNext
= mDefaultStoreList
;
2021 mDefaultStoreList
= pNode
;
2023 return VFR_RETURN_SUCCESS
;
2027 * assign new reference name or new default store name id only if
2028 * the original is invalid
2031 CVfrDefaultStore::ReRegisterDefaultStoreById (
2032 IN UINT16 DefaultId
,
2034 IN EFI_STRING_ID DefaultStoreNameId
2037 SVfrDefaultStoreNode
*pNode
= NULL
;
2039 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2040 if (pNode
->mDefaultId
== DefaultId
) {
2045 if (pNode
== NULL
) {
2046 return VFR_RETURN_UNDEFINED
;
2048 if (pNode
->mDefaultStoreNameId
== EFI_STRING_ID_INVALID
) {
2049 pNode
->mDefaultStoreNameId
= DefaultStoreNameId
;
2050 if (pNode
->mObjBinAddr
!= NULL
) {
2051 pNode
->mObjBinAddr
->DefaultName
= DefaultStoreNameId
;
2054 return VFR_RETURN_REDEFINED
;
2057 if (RefName
!= NULL
) {
2058 delete pNode
->mRefName
;
2059 pNode
->mRefName
= new CHAR8
[strlen (RefName
) + 1];
2060 if (pNode
->mRefName
!= NULL
) {
2061 strcpy (pNode
->mRefName
, RefName
);
2066 return VFR_RETURN_SUCCESS
;
2070 CVfrDefaultStore::DefaultIdRegistered (
2074 SVfrDefaultStoreNode
*pNode
= NULL
;
2076 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2077 if (pNode
->mDefaultId
== DefaultId
) {
2086 CVfrDefaultStore::GetDefaultId (
2088 OUT UINT16
*DefaultId
2091 SVfrDefaultStoreNode
*pTmp
= NULL
;
2093 if (DefaultId
== NULL
) {
2094 return VFR_RETURN_FATAL_ERROR
;
2097 for (pTmp
= mDefaultStoreList
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
2098 if (strcmp (pTmp
->mRefName
, RefName
) == 0) {
2099 *DefaultId
= pTmp
->mDefaultId
;
2100 return VFR_RETURN_SUCCESS
;
2104 return VFR_RETURN_UNDEFINED
;
2108 CVfrDefaultStore::BufferVarStoreAltConfigAdd (
2109 IN EFI_VARSTORE_ID DefaultId
,
2110 IN EFI_VARSTORE_INFO
&Info
,
2111 IN CHAR8
*VarStoreName
,
2113 IN EFI_IFR_TYPE_VALUE Value
2116 SVfrDefaultStoreNode
*pNode
= NULL
;
2117 CHAR8 NewAltCfg
[2 * 2 * sizeof (UINT16
) + 1] = {0,};
2118 INTN Returnvalue
= 0;
2120 if (VarStoreName
== NULL
) {
2121 return VFR_RETURN_FATAL_ERROR
;
2124 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2125 if (pNode
->mDefaultId
== DefaultId
) {
2130 if (pNode
== NULL
) {
2131 return VFR_RETURN_UNDEFINED
;
2134 gCVfrBufferConfig
.Open ();
2136 sprintf (NewAltCfg
, "%04x", pNode
->mDefaultId
);
2137 if ((Returnvalue
= gCVfrBufferConfig
.Select(VarStoreName
)) == 0) {
2138 if ((Returnvalue
= gCVfrBufferConfig
.Write ('a', VarStoreName
, NewAltCfg
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
)) != 0) {
2143 gCVfrBufferConfig
.Close ();
2145 return VFR_RETURN_SUCCESS
;
2148 gCVfrBufferConfig
.Close ();
2149 return (EFI_VFR_RETURN_CODE
)Returnvalue
;
2152 SVfrRuleNode::SVfrRuleNode (
2157 if (RuleName
!= NULL
) {
2158 mRuleName
= new CHAR8
[strlen (RuleName
) + 1];
2159 strcpy (mRuleName
, RuleName
);
2168 SVfrRuleNode::~SVfrRuleNode (
2172 if (mRuleName
!= NULL
) {
2177 CVfrRulesDB::CVfrRulesDB ()
2180 mFreeRuleId
= EFI_VARSTORE_ID_START
;
2183 CVfrRulesDB::~CVfrRulesDB ()
2185 SVfrRuleNode
*pNode
;
2187 while(mRuleList
!= NULL
) {
2189 mRuleList
= mRuleList
->mNext
;
2195 CVfrRulesDB::RegisterRule (
2201 if (RuleName
== NULL
) {
2205 if ((pNew
= new SVfrRuleNode (RuleName
, mFreeRuleId
)) == NULL
) {
2211 pNew
->mNext
= mRuleList
;
2216 CVfrRulesDB::GetRuleId (
2220 SVfrRuleNode
*pNode
;
2222 if (RuleName
== NULL
) {
2223 return EFI_RULE_ID_INVALID
;
2226 for (pNode
= mRuleList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2227 if (strcmp (pNode
->mRuleName
, RuleName
) == 0) {
2228 return pNode
->mRuleId
;
2232 return EFI_RULE_ID_INVALID
;
2235 CVfrRulesDB gCVfrRulesDB
;
2237 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2241 mVarStoreId
= EFI_VARSTORE_ID_INVALID
;
2242 mInfo
.mVarName
= EFI_STRING_ID_INVALID
;
2243 mInfo
.mVarOffset
= EFI_VAROFFSET_INVALID
;
2244 mVarType
= EFI_IFR_TYPE_OTHER
;
2248 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2249 IN EFI_VARSTORE_INFO
&Info
2252 mVarStoreId
= Info
.mVarStoreId
;
2253 mInfo
.mVarName
= Info
.mInfo
.mVarName
;
2254 mInfo
.mVarOffset
= Info
.mInfo
.mVarOffset
;
2255 mVarType
= Info
.mVarType
;
2256 mVarTotalSize
= Info
.mVarTotalSize
;
2260 EFI_VARSTORE_INFO::operator == (
2261 IN EFI_VARSTORE_INFO
*Info
2264 if ((mVarStoreId
== Info
->mVarStoreId
) &&
2265 (mInfo
.mVarName
== Info
->mInfo
.mVarName
) &&
2266 (mInfo
.mVarOffset
== Info
->mInfo
.mVarOffset
) &&
2267 (mVarType
== Info
->mVarType
) &&
2268 (mVarTotalSize
== Info
->mVarTotalSize
)) {
2275 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo
;
2278 CVfrQuestionDB::GetFreeQuestionId (
2282 UINT32 Index
, Mask
, Offset
;
2284 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2285 if (mFreeQIdBitMap
[Index
] != 0xFFFFFFFF) {
2290 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
2291 if ((mFreeQIdBitMap
[Index
] & Mask
) == 0) {
2292 mFreeQIdBitMap
[Index
] |= Mask
;
2293 return (EFI_QUESTION_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
2297 return EFI_QUESTION_ID_INVALID
;
2301 CVfrQuestionDB::ChekQuestionIdFree (
2302 IN EFI_QUESTION_ID QId
2305 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2306 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2308 return (mFreeQIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
2312 CVfrQuestionDB::MarkQuestionIdUsed (
2313 IN EFI_QUESTION_ID QId
2316 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2317 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2319 mFreeQIdBitMap
[Index
] |= (0x80000000 >> Offset
);
2323 CVfrQuestionDB::MarkQuestionIdUnused (
2324 IN EFI_QUESTION_ID QId
2327 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2328 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2330 mFreeQIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
2333 SVfrQuestionNode::SVfrQuestionNode (
2341 mQuestionId
= EFI_QUESTION_ID_INVALID
;
2344 mQtype
= QUESTION_NORMAL
;
2347 mName
= new CHAR8
[strlen ("$DEFAULT") + 1];
2348 strcpy (mName
, "$DEFAULT");
2350 mName
= new CHAR8
[strlen (Name
) + 1];
2351 strcpy (mName
, Name
);
2354 if (VarIdStr
!= NULL
) {
2355 mVarIdStr
= new CHAR8
[strlen (VarIdStr
) + 1];
2356 strcpy (mVarIdStr
, VarIdStr
);
2358 mVarIdStr
= new CHAR8
[strlen ("$") + 1];
2359 strcpy (mVarIdStr
, "$");
2363 SVfrQuestionNode::~SVfrQuestionNode (
2367 if (mName
!= NULL
) {
2371 if (mVarIdStr
!= NULL
) {
2376 CVfrQuestionDB::CVfrQuestionDB ()
2380 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2381 mFreeQIdBitMap
[Index
] = 0;
2384 // Question ID 0 is reserved.
2385 mFreeQIdBitMap
[0] = 0x80000000;
2386 mQuestionList
= NULL
;
2389 CVfrQuestionDB::~CVfrQuestionDB ()
2391 SVfrQuestionNode
*pNode
;
2393 while (mQuestionList
!= NULL
) {
2394 pNode
= mQuestionList
;
2395 mQuestionList
= mQuestionList
->mNext
;
2401 // Reset to init state
2404 CVfrQuestionDB::ResetInit(
2409 SVfrQuestionNode
*pNode
;
2411 while (mQuestionList
!= NULL
) {
2412 pNode
= mQuestionList
;
2413 mQuestionList
= mQuestionList
->mNext
;
2417 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2418 mFreeQIdBitMap
[Index
] = 0;
2421 // Question ID 0 is reserved.
2422 mFreeQIdBitMap
[0] = 0x80000000;
2423 mQuestionList
= NULL
;
2427 CVfrQuestionDB::PrintAllQuestion (
2431 SVfrQuestionNode
*pNode
= NULL
;
2433 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2434 printf ("Question VarId is %s and QuesitonId is 0x%x\n", pNode
->mVarIdStr
, pNode
->mQuestionId
);
2439 CVfrQuestionDB::RegisterQuestion (
2442 IN OUT EFI_QUESTION_ID
&QuestionId
2445 SVfrQuestionNode
*pNode
= NULL
;
2447 if ((Name
!= NULL
) && (FindQuestion(Name
) == VFR_RETURN_SUCCESS
)) {
2448 return VFR_RETURN_REDEFINED
;
2451 if ((pNode
= new SVfrQuestionNode (Name
, VarIdStr
)) == NULL
) {
2452 return VFR_RETURN_OUT_FOR_RESOURCES
;
2455 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2456 QuestionId
= GetFreeQuestionId ();
2459 // For Framework Vfr, don't check question ID conflict.
2461 if (!VfrCompatibleMode
&& ChekQuestionIdFree (QuestionId
) == FALSE
) {
2463 return VFR_RETURN_QUESTIONID_REDEFINED
;
2465 MarkQuestionIdUsed (QuestionId
);
2467 pNode
->mQuestionId
= QuestionId
;
2469 pNode
->mNext
= mQuestionList
;
2470 mQuestionList
= pNode
;
2472 gCFormPkg
.DoPendingAssign (VarIdStr
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2474 return VFR_RETURN_SUCCESS
;
2478 CVfrQuestionDB::RegisterOldDateQuestion (
2479 IN CHAR8
*YearVarId
,
2480 IN CHAR8
*MonthVarId
,
2482 IN OUT EFI_QUESTION_ID
&QuestionId
2485 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2488 if ((YearVarId
== NULL
) || (MonthVarId
== NULL
) || (DayVarId
== NULL
)) {
2492 if ((pNode
[0] = new SVfrQuestionNode (NULL
, YearVarId
, DATE_YEAR_BITMASK
)) == NULL
) {
2495 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MonthVarId
, DATE_MONTH_BITMASK
)) == NULL
) {
2498 if ((pNode
[2] = new SVfrQuestionNode (NULL
, DayVarId
, DATE_DAY_BITMASK
)) == NULL
) {
2502 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2503 QuestionId
= GetFreeQuestionId ();
2505 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2508 MarkQuestionIdUsed (QuestionId
);
2511 pNode
[0]->mQuestionId
= QuestionId
;
2512 pNode
[1]->mQuestionId
= QuestionId
;
2513 pNode
[2]->mQuestionId
= QuestionId
;
2514 pNode
[0]->mQtype
= QUESTION_DATE
;
2515 pNode
[1]->mQtype
= QUESTION_DATE
;
2516 pNode
[2]->mQtype
= QUESTION_DATE
;
2517 pNode
[0]->mNext
= pNode
[1];
2518 pNode
[1]->mNext
= pNode
[2];
2519 pNode
[2]->mNext
= mQuestionList
;
2520 mQuestionList
= pNode
[0];
2522 gCFormPkg
.DoPendingAssign (YearVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2523 gCFormPkg
.DoPendingAssign (MonthVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2524 gCFormPkg
.DoPendingAssign (DayVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2529 for (Index
= 0; Index
< 3; Index
++) {
2530 if (pNode
[Index
] != NULL
) {
2531 delete pNode
[Index
];
2534 QuestionId
= EFI_QUESTION_ID_INVALID
;
2538 CVfrQuestionDB::RegisterNewDateQuestion (
2540 IN CHAR8
*BaseVarId
,
2541 IN OUT EFI_QUESTION_ID
&QuestionId
2544 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2546 CHAR8
*VarIdStr
[3] = {NULL
, };
2549 if (BaseVarId
== NULL
) {
2553 Len
= strlen (BaseVarId
);
2555 VarIdStr
[0] = new CHAR8
[Len
+ strlen (".Year") + 1];
2556 if (VarIdStr
[0] != NULL
) {
2557 strcpy (VarIdStr
[0], BaseVarId
);
2558 strcat (VarIdStr
[0], ".Year");
2560 VarIdStr
[1] = new CHAR8
[Len
+ strlen (".Month") + 1];
2561 if (VarIdStr
[1] != NULL
) {
2562 strcpy (VarIdStr
[1], BaseVarId
);
2563 strcat (VarIdStr
[1], ".Month");
2565 VarIdStr
[2] = new CHAR8
[Len
+ strlen (".Day") + 1];
2566 if (VarIdStr
[2] != NULL
) {
2567 strcpy (VarIdStr
[2], BaseVarId
);
2568 strcat (VarIdStr
[2], ".Day");
2571 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], DATE_YEAR_BITMASK
)) == NULL
) {
2574 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], DATE_MONTH_BITMASK
)) == NULL
) {
2577 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], DATE_DAY_BITMASK
)) == NULL
) {
2581 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2582 QuestionId
= GetFreeQuestionId ();
2584 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2587 MarkQuestionIdUsed (QuestionId
);
2590 pNode
[0]->mQuestionId
= QuestionId
;
2591 pNode
[1]->mQuestionId
= QuestionId
;
2592 pNode
[2]->mQuestionId
= QuestionId
;
2593 pNode
[0]->mQtype
= QUESTION_DATE
;
2594 pNode
[1]->mQtype
= QUESTION_DATE
;
2595 pNode
[2]->mQtype
= QUESTION_DATE
;
2596 pNode
[0]->mNext
= pNode
[1];
2597 pNode
[1]->mNext
= pNode
[2];
2598 pNode
[2]->mNext
= mQuestionList
;
2599 mQuestionList
= pNode
[0];
2601 for (Index
= 0; Index
< 3; Index
++) {
2602 if (VarIdStr
[Index
] != NULL
) {
2603 delete VarIdStr
[Index
];
2607 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2608 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2609 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2614 for (Index
= 0; Index
< 3; Index
++) {
2615 if (pNode
[Index
] != NULL
) {
2616 delete pNode
[Index
];
2619 if (VarIdStr
[Index
] != NULL
) {
2620 delete VarIdStr
[Index
];
2626 CVfrQuestionDB::RegisterOldTimeQuestion (
2627 IN CHAR8
*HourVarId
,
2628 IN CHAR8
*MinuteVarId
,
2629 IN CHAR8
*SecondVarId
,
2630 IN OUT EFI_QUESTION_ID
&QuestionId
2633 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2636 if ((HourVarId
== NULL
) || (MinuteVarId
== NULL
) || (SecondVarId
== NULL
)) {
2640 if ((pNode
[0] = new SVfrQuestionNode (NULL
, HourVarId
, TIME_HOUR_BITMASK
)) == NULL
) {
2643 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MinuteVarId
, TIME_MINUTE_BITMASK
)) == NULL
) {
2646 if ((pNode
[2] = new SVfrQuestionNode (NULL
, SecondVarId
, TIME_SECOND_BITMASK
)) == NULL
) {
2650 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2651 QuestionId
= GetFreeQuestionId ();
2653 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2656 MarkQuestionIdUsed (QuestionId
);
2659 pNode
[0]->mQuestionId
= QuestionId
;
2660 pNode
[1]->mQuestionId
= QuestionId
;
2661 pNode
[2]->mQuestionId
= QuestionId
;
2662 pNode
[0]->mQtype
= QUESTION_TIME
;
2663 pNode
[1]->mQtype
= QUESTION_TIME
;
2664 pNode
[2]->mQtype
= QUESTION_TIME
;
2665 pNode
[0]->mNext
= pNode
[1];
2666 pNode
[1]->mNext
= pNode
[2];
2667 pNode
[2]->mNext
= mQuestionList
;
2668 mQuestionList
= pNode
[0];
2670 gCFormPkg
.DoPendingAssign (HourVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2671 gCFormPkg
.DoPendingAssign (MinuteVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2672 gCFormPkg
.DoPendingAssign (SecondVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2677 for (Index
= 0; Index
< 3; Index
++) {
2678 if (pNode
[Index
] != NULL
) {
2679 delete pNode
[Index
];
2682 QuestionId
= EFI_QUESTION_ID_INVALID
;
2686 CVfrQuestionDB::RegisterNewTimeQuestion (
2688 IN CHAR8
*BaseVarId
,
2689 IN OUT EFI_QUESTION_ID
&QuestionId
2692 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2694 CHAR8
*VarIdStr
[3] = {NULL
, };
2697 if (BaseVarId
== NULL
) {
2701 Len
= strlen (BaseVarId
);
2703 VarIdStr
[0] = new CHAR8
[Len
+ strlen (".Hour") + 1];
2704 if (VarIdStr
[0] != NULL
) {
2705 strcpy (VarIdStr
[0], BaseVarId
);
2706 strcat (VarIdStr
[0], ".Hour");
2708 VarIdStr
[1] = new CHAR8
[Len
+ strlen (".Minute") + 1];
2709 if (VarIdStr
[1] != NULL
) {
2710 strcpy (VarIdStr
[1], BaseVarId
);
2711 strcat (VarIdStr
[1], ".Minute");
2713 VarIdStr
[2] = new CHAR8
[Len
+ strlen (".Second") + 1];
2714 if (VarIdStr
[2] != NULL
) {
2715 strcpy (VarIdStr
[2], BaseVarId
);
2716 strcat (VarIdStr
[2], ".Second");
2719 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], TIME_HOUR_BITMASK
)) == NULL
) {
2722 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], TIME_MINUTE_BITMASK
)) == NULL
) {
2725 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], TIME_SECOND_BITMASK
)) == NULL
) {
2729 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2730 QuestionId
= GetFreeQuestionId ();
2732 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2735 MarkQuestionIdUsed (QuestionId
);
2738 pNode
[0]->mQuestionId
= QuestionId
;
2739 pNode
[1]->mQuestionId
= QuestionId
;
2740 pNode
[2]->mQuestionId
= QuestionId
;
2741 pNode
[0]->mQtype
= QUESTION_TIME
;
2742 pNode
[1]->mQtype
= QUESTION_TIME
;
2743 pNode
[2]->mQtype
= QUESTION_TIME
;
2744 pNode
[0]->mNext
= pNode
[1];
2745 pNode
[1]->mNext
= pNode
[2];
2746 pNode
[2]->mNext
= mQuestionList
;
2747 mQuestionList
= pNode
[0];
2749 for (Index
= 0; Index
< 3; Index
++) {
2750 if (VarIdStr
[Index
] != NULL
) {
2751 delete VarIdStr
[Index
];
2755 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2756 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2757 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2762 for (Index
= 0; Index
< 3; Index
++) {
2763 if (pNode
[Index
] != NULL
) {
2764 delete pNode
[Index
];
2767 if (VarIdStr
[Index
] != NULL
) {
2768 delete VarIdStr
[Index
];
2774 CVfrQuestionDB::UpdateQuestionId (
2775 IN EFI_QUESTION_ID QId
,
2776 IN EFI_QUESTION_ID NewQId
2779 SVfrQuestionNode
*pNode
= NULL
;
2781 if (QId
== NewQId
) {
2783 return VFR_RETURN_SUCCESS
;
2787 // For Framework Vfr, don't check question ID conflict.
2789 if (!VfrCompatibleMode
&& ChekQuestionIdFree (NewQId
) == FALSE
) {
2790 return VFR_RETURN_REDEFINED
;
2793 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2794 if (pNode
->mQuestionId
== QId
) {
2799 if (pNode
== NULL
) {
2800 return VFR_RETURN_UNDEFINED
;
2803 MarkQuestionIdUnused (QId
);
2804 pNode
->mQuestionId
= NewQId
;
2805 MarkQuestionIdUsed (NewQId
);
2807 gCFormPkg
.DoPendingAssign (pNode
->mVarIdStr
, (VOID
*)&NewQId
, sizeof(EFI_QUESTION_ID
));
2809 return VFR_RETURN_SUCCESS
;
2813 CVfrQuestionDB::GetQuestionId (
2816 OUT EFI_QUESTION_ID
&QuestionId
,
2817 OUT UINT32
&BitMask
,
2818 OUT EFI_QUESION_TYPE
*QType
2821 SVfrQuestionNode
*pNode
;
2823 QuestionId
= EFI_QUESTION_ID_INVALID
;
2824 BitMask
= 0x00000000;
2825 if (QType
!= NULL
) {
2826 *QType
= QUESTION_NORMAL
;
2829 if ((Name
== NULL
) && (VarIdStr
== NULL
)) {
2833 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2835 if (strcmp (pNode
->mName
, Name
) != 0) {
2840 if (VarIdStr
!= NULL
) {
2841 if (strcmp (pNode
->mVarIdStr
, VarIdStr
) != 0) {
2846 QuestionId
= pNode
->mQuestionId
;
2847 BitMask
= pNode
->mBitMask
;
2848 if (QType
!= NULL
) {
2849 *QType
= pNode
->mQtype
;
2858 CVfrQuestionDB::FindQuestion (
2859 IN EFI_QUESTION_ID QuestionId
2862 SVfrQuestionNode
*pNode
;
2864 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2865 return VFR_RETURN_INVALID_PARAMETER
;
2868 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2869 if (pNode
->mQuestionId
== QuestionId
) {
2870 return VFR_RETURN_SUCCESS
;
2874 return VFR_RETURN_UNDEFINED
;
2878 CVfrQuestionDB::FindQuestion (
2882 SVfrQuestionNode
*pNode
;
2885 return VFR_RETURN_FATAL_ERROR
;
2888 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2889 if (strcmp (pNode
->mName
, Name
) == 0) {
2890 return VFR_RETURN_SUCCESS
;
2894 return VFR_RETURN_UNDEFINED
;
2897 BOOLEAN VfrCompatibleMode
= FALSE
;
2899 CVfrVarDataTypeDB gCVfrVarDataTypeDB
;