2 Private functions used by PCD DXE driver.
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 Module Name: Service.c
20 PCD_DATABASE
* mPcdDatabase
;
22 LIST_ENTRY
*mCallbackFnTable
;
30 UINT32
*LocalTokenNumberTable
;
38 VARIABLE_HEAD
*VariableHead
;
39 UINT8
*VaraiableDefaultBuffer
;
45 UINT16 StringTableIdx
;
46 UINT32 LocalTokenNumber
;
51 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
52 // We have to decrement TokenNumber by 1 to make it usable
53 // as the array index.
57 TmpTokenNumber
= TokenNumber
;
60 // PCD_TOTAL_TOKEN_NUMBER is a auto-generated constant.
61 // It could be zero. EBC compiler is very choosy. It may
62 // report warning. So we add 1 in each size of the
65 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
67 ASSERT ((GetSize
== DxePcdGetSize (TokenNumber
+ 1)) || (GetSize
== 0));
69 // EBC compiler is very choosy. It may report warning about comparison
70 // between UINTN and 0 . So we add 1 in each size of the
72 IsPeiDb
= (TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
;
74 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
75 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
77 SizeTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SizeTable
:
78 mPcdDatabase
->DxeDb
.Init
.SizeTable
;
80 TokenNumber
= IsPeiDb
? TokenNumber
:
81 TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
83 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
85 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
87 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
91 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
94 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
95 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
96 mPcdDatabase
->DxeDb
.Init
.StringTable
;
98 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
100 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
102 VpdHead
= (VPD_HEAD
*) ((UINT8
*) PcdDb
+ Offset
);
103 return (VOID
*) (UINTN
) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
106 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
107 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
109 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
111 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
112 Name
= &(StringTable
[VariableHead
->StringIndex
]);
113 VaraiableDefaultBuffer
= (UINT8
*) PcdDb
+ VariableHead
->DefaultValueOffset
;
115 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
116 if (Status
== EFI_SUCCESS
) {
119 // It is a pointer type. So get the MaxSize reserved for
122 GetPtrTypeSize (TmpTokenNumber
, &GetSize
);
124 CopyMem (VaraiableDefaultBuffer
, Data
+ VariableHead
->Offset
, GetSize
);
128 // If the operation is successful, we copy the data
129 // to the default value buffer in the PCD Database.
130 // So that we can free the Data allocated in GetHiiVariable.
133 // If the operation is not successful,
134 // Return 1) either the default value specified by Platform Integrator
135 // 2) Or the value Set by a PCD set operation.
137 return (VOID
*) VaraiableDefaultBuffer
;
139 case PCD_TYPE_STRING
:
140 StringTableIdx
= (UINT16
) *((UINT8
*) PcdDb
+ Offset
);
141 return (VOID
*) &StringTable
[StringTableIdx
];
144 return (VOID
*) ((UINT8
*) PcdDb
+ Offset
);
162 DxeRegisterCallBackWorker (
163 IN UINTN TokenNumber
,
164 IN CONST GUID
*Guid
, OPTIONAL
165 IN PCD_PROTOCOL_CALLBACK CallBackFunction
168 CALLBACK_FN_ENTRY
*FnTableEntry
;
169 LIST_ENTRY
*ListHead
;
170 LIST_ENTRY
*ListNode
;
173 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
177 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
178 // We have to decrement TokenNumber by 1 to make it usable
179 // as the array index.
183 ListHead
= &mCallbackFnTable
[TokenNumber
];
184 ListNode
= GetFirstNode (ListHead
);
186 while (ListNode
!= ListHead
) {
187 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
189 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
191 // We only allow a Callback function to be register once
192 // for a TokenNumber. So just return EFI_SUCCESS
196 ListNode
= GetNextNode (ListHead
, ListNode
);
199 FnTableEntry
= AllocatePool (sizeof(CALLBACK_FN_ENTRY
));
200 ASSERT (FnTableEntry
!= NULL
);
202 FnTableEntry
->CallbackFn
= CallBackFunction
;
203 InsertTailList (ListHead
, &FnTableEntry
->Node
);
212 DxeUnRegisterCallBackWorker (
213 IN UINTN TokenNumber
,
214 IN CONST GUID
*Guid
, OPTIONAL
215 IN PCD_PROTOCOL_CALLBACK CallBackFunction
218 CALLBACK_FN_ENTRY
*FnTableEntry
;
219 LIST_ENTRY
*ListHead
;
220 LIST_ENTRY
*ListNode
;
223 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
227 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
228 // We have to decrement TokenNumber by 1 to make it usable
229 // as the array index.
233 ListHead
= &mCallbackFnTable
[TokenNumber
];
234 ListNode
= GetFirstNode (ListHead
);
236 while (ListNode
!= ListHead
) {
237 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
239 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
241 // We only allow a Callback function to be register once
242 // for a TokenNumber. So we can safely remove the Node from
243 // the Link List and return EFI_SUCCESS.
245 RemoveEntryList (ListNode
);
246 FreePool (FnTableEntry
);
250 ListNode
= GetNextNode (ListHead
, ListNode
);
253 return EFI_INVALID_PARAMETER
;
259 ExGetNextTokeNumber (
260 IN CONST EFI_GUID
*Guid
,
261 IN OUT UINTN
*TokenNumber
,
262 IN EFI_GUID
*GuidTable
,
263 IN UINTN SizeOfGuidTable
,
264 IN DYNAMICEX_MAPPING
*ExMapTable
,
265 IN UINTN SizeOfExMapTable
273 MatchGuid
= ScanGuid (GuidTable
, SizeOfGuidTable
, Guid
);
274 if (MatchGuid
== NULL
) {
275 return EFI_NOT_FOUND
;
279 GuidTableIdx
= MatchGuid
- GuidTable
;
280 for (Idx
= 0; Idx
< SizeOfExMapTable
; Idx
++) {
281 if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
288 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
289 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
293 for ( ; Idx
< SizeOfExMapTable
; Idx
++) {
294 if (ExMapTable
[Idx
].ExTokenNumber
== *TokenNumber
) {
296 if (Idx
== SizeOfExMapTable
) {
298 // Exceed the length of ExMap Table
300 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
302 } else if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
304 // Found the next match
306 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
310 // Guid has been changed. It is the next Token Space Guid.
311 // We should flag no more TokenNumber.
313 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
320 return EFI_NOT_FOUND
;
327 BuildPcdDxeDataBase (
331 PEI_PCD_DATABASE
*PeiDatabase
;
332 EFI_HOB_GUID_TYPE
*GuidHob
;
335 mPcdDatabase
= AllocateZeroPool (sizeof(PCD_DATABASE
));
336 ASSERT (mPcdDatabase
!= NULL
);
338 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
339 if (GuidHob
!= NULL
) {
342 // We will copy over the PEI phase's PCD Database.
344 // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM
345 // should not be included at all. So the GuidHob could
346 // be NULL. If it is NULL, we just copy over the DXE Default
347 // Value to PCD Database.
350 PeiDatabase
= (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
352 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE
354 CopyMem (&mPcdDatabase
->PeiDb
, PeiDatabase
, sizeof (PEI_PCD_DATABASE
));
358 // Copy PCD Entries with default value to PCD DATABASE
360 CopyMem (&mPcdDatabase
->DxeDb
.Init
, &gDXEPcdDbInit
, sizeof(DXE_PCD_DATABASE_INIT
));
364 // Initialized the Callback Function Table
367 mCallbackFnTable
= AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER
* sizeof (LIST_ENTRY
));
369 // EBC compiler is very choosy. It may report warning about comparison
370 // between UINTN and 0 . So we add 1 in each size of the
372 for (Idx
= 0; Idx
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1; Idx
++) {
373 InitializeListHead (&mCallbackFnTable
[Idx
]);
383 IN EFI_GUID
*VariableGuid
,
384 IN UINT16
*VariableName
,
385 OUT UINT8
**VariableData
,
386 OUT UINTN
*VariableSize
396 Status
= gRT
->GetVariable (
397 (UINT16
*)VariableName
,
404 if (Status
== EFI_BUFFER_TOO_SMALL
) {
405 Buffer
= (UINT8
*) AllocatePool (Size
);
407 ASSERT (Buffer
!= NULL
);
409 Status
= gRT
->GetVariable (
417 ASSERT (Status
== EFI_SUCCESS
);
418 *VariableData
= Buffer
;
419 *VariableSize
= Size
;
427 GetSkuEnabledTokenNumber (
428 UINT32 LocalTokenNumber
,
437 SKU_ID
*PhaseSkuIdTable
;
440 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
442 PcdDb
= IsPeiDb
? (UINT8
*) &mPcdDatabase
->PeiDb
: (UINT8
*) &mPcdDatabase
->DxeDb
;
444 SkuHead
= (SKU_HEAD
*) (PcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
445 Value
= (UINT8
*) (PcdDb
+ SkuHead
->SkuDataStartOffset
);
447 PhaseSkuIdTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SkuIdTable
:
448 mPcdDatabase
->DxeDb
.Init
.SkuIdTable
;
450 SkuIdTable
= &PhaseSkuIdTable
[SkuHead
->SkuIdTableOffset
];
452 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
453 if (mPcdDatabase
->PeiDb
.Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
457 ASSERT (i
< SkuIdTable
[0]);
459 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
461 Value
= (UINT8
*) &(((VPD_HEAD
*) Value
)[i
]);
462 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_VPD
);
465 Value
= (UINT8
*) &(((VARIABLE_HEAD
*) Value
)[i
]);
466 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_HII
);
468 case PCD_TYPE_STRING
:
469 Value
= (UINT8
*) &(((STRING_HEAD
*) Value
)[i
]);
470 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_STRING
);
474 return (UINT32
) (Value
- PcdDb
);
491 InvokeCallbackOnSet (
492 UINT32 ExTokenNumber
,
493 CONST EFI_GUID
*Guid
, OPTIONAL
499 CALLBACK_FN_ENTRY
*FnTableEntry
;
500 LIST_ENTRY
*ListHead
;
501 LIST_ENTRY
*ListNode
;
504 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
505 // We have to decrement TokenNumber by 1 to make it usable
506 // as the array index.
510 ListHead
= &mCallbackFnTable
[TokenNumber
];
511 ListNode
= GetFirstNode (ListHead
);
513 while (ListNode
!= ListHead
) {
514 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
516 FnTableEntry
->CallbackFn(Guid
,
517 (Guid
== NULL
) ? TokenNumber
: ExTokenNumber
,
521 ListNode
= GetNextNode (ListHead
, ListNode
);
530 IN UINTN TokenNumber
,
535 return SetWorker (TokenNumber
, Data
, &Size
, FALSE
);
541 IN UINTN TokenNumber
,
547 UINT32
*LocalTokenNumberTable
;
549 UINT32 LocalTokenNumber
;
554 UINTN VariableOffset
;
556 VARIABLE_HEAD
*VariableHead
;
561 UINTN TmpTokenNumber
;
564 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
565 // We have to decrement TokenNumber by 1 to make it usable
566 // as the array index.
570 TmpTokenNumber
= TokenNumber
;
572 // EBC compiler is very choosy. It may report warning about comparison
573 // between UINTN and 0 . So we add 1 in each size of the
576 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
579 ASSERT (*Size
== DxePcdGetSize (TokenNumber
+ 1));
582 // EBC compiler is very choosy. It may report warning about comparison
583 // between UINTN and 0 . So we add 1 in each size of the
585 IsPeiDb
= (TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
;
587 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
588 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
590 // EBC compiler is very choosy. It may report warning about comparison
591 // between UINTN and 0 . So we add 1 in each size of the
593 if ((TokenNumber
+ 1 < PEI_NEX_TOKEN_NUMBER
+ 1) ||
594 (TokenNumber
+ 1 >= PEI_LOCAL_TOKEN_NUMBER
+ 1 || TokenNumber
+ 1 < (PEI_LOCAL_TOKEN_NUMBER
+ DXE_NEX_TOKEN_NUMBER
+ 1))) {
595 InvokeCallbackOnSet (0, NULL
, TokenNumber
+ 1, Data
, *Size
);
598 TokenNumber
= IsPeiDb
? TokenNumber
599 : TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
601 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
603 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
605 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
609 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
612 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
614 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
616 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
617 mPcdDatabase
->DxeDb
.Init
.StringTable
;
619 InternalData
= PcdDb
+ Offset
;
621 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
624 return EFI_INVALID_PARAMETER
;
626 case PCD_TYPE_STRING
:
627 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
628 CopyMem (&StringTable
[*((UINT16
*)InternalData
)], Data
, *Size
);
631 return EFI_INVALID_PARAMETER
;
636 if (!SetPtrTypeSize (TmpTokenNumber
, Size
)) {
637 return EFI_INVALID_PARAMETER
;
641 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
642 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
644 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
646 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
647 Name
= &(StringTable
[VariableHead
->StringIndex
]);
648 VariableOffset
= VariableHead
->Offset
;
650 Status
= SetHiiVariable (Guid
, Name
, Data
, *Size
, VariableOffset
);
652 if (EFI_NOT_FOUND
== Status
) {
653 CopyMem (PcdDb
+ VariableHead
->DefaultValueOffset
, Data
, *Size
);
661 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
662 CopyMem (InternalData
, Data
, *Size
);
665 return EFI_INVALID_PARAMETER
;
671 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
675 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
679 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
683 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
688 return EFI_NOT_FOUND
;
697 return EFI_NOT_FOUND
;
706 IN CONST EFI_GUID
*Guid
,
707 IN UINTN ExTokenNumber
,
711 return GetWorker(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
), GetSize
);
719 IN UINTN ExTokenNumber
,
720 IN CONST EFI_GUID
*Guid
,
725 return ExSetWorker (ExTokenNumber
, Guid
, Data
, &SetSize
, FALSE
);
731 IN UINTN ExTokenNumber
,
732 IN CONST EFI_GUID
*Guid
,
734 IN OUT UINTN
*SetSize
,
740 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
);
742 InvokeCallbackOnSet ((UINT32
) ExTokenNumber
, Guid
, TokenNumber
, Data
, *SetSize
);
744 return SetWorker (TokenNumber
, Data
, SetSize
, PtrType
);
753 IN EFI_GUID
*VariableGuid
,
754 IN UINT16
*VariableName
,
767 Status
= gRT
->GetVariable (
768 (UINT16
*)VariableName
,
775 if (Status
== EFI_BUFFER_TOO_SMALL
) {
777 Buffer
= AllocatePool (Size
);
779 ASSERT (Buffer
!= NULL
);
781 Status
= gRT
->GetVariable (
789 ASSERT_EFI_ERROR (Status
);
791 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
793 Status
= gRT
->SetVariable (
807 // If we drop to here, we don't have a Variable entry in
808 // the variable service yet. So, we will save the data
809 // in the PCD Database's volatile area.
819 GetExPcdTokenNumber (
820 IN CONST EFI_GUID
*Guid
,
821 IN UINT32 ExTokenNumber
825 DYNAMICEX_MAPPING
*ExMap
;
830 if (!PEI_DATABASE_EMPTY
) {
831 ExMap
= mPcdDatabase
->PeiDb
.Init
.ExMapTable
;
832 GuidTable
= mPcdDatabase
->PeiDb
.Init
.GuidTable
;
834 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
), Guid
);
836 if (MatchGuid
!= NULL
) {
838 MatchGuidIdx
= MatchGuid
- GuidTable
;
840 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
841 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
842 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
843 return ExMap
[i
].LocalTokenNumber
;
850 ExMap
= mPcdDatabase
->DxeDb
.Init
.ExMapTable
;
851 GuidTable
= mPcdDatabase
->DxeDb
.Init
.GuidTable
;
853 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->DxeDb
.Init
.GuidTable
), Guid
);
855 // We need to ASSERT here. If GUID can't be found in GuidTable, this is a
856 // error in the BUILD system.
858 ASSERT (MatchGuid
!= NULL
);
860 MatchGuidIdx
= MatchGuid
- GuidTable
;
862 for (i
= 0; i
< DXE_EXMAPPING_TABLE_SIZE
; i
++) {
863 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
864 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
865 return ExMap
[i
].LocalTokenNumber
;
878 IN UINTN LocalTokenNumberTableIdx
,
883 UINTN LocalTokenNumber
;
887 LocalTokenNumber
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
888 Database
= (UINT8
*) &mPcdDatabase
->PeiDb
;
890 LocalTokenNumber
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
- PEI_LOCAL_TOKEN_NUMBER
];
891 Database
= (UINT8
*) &mPcdDatabase
->DxeDb
;
894 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) != 0);
896 SkuHead
= (SKU_HEAD
*) ((UINT8
*)Database
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
898 return (SKU_ID
*) (Database
+ SkuHead
->SkuIdTableOffset
);
906 IN UINTN LocalTokenNumberTableIdx
,
907 IN UINT32
*LocalTokenNumberTable
,
913 UINTN LocalTokenNumber
;
918 for (i
=0; i
<LocalTokenNumberTableIdx
; i
++) {
919 LocalTokenNumber
= LocalTokenNumberTable
[i
];
921 if ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
) {
923 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
926 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
928 // We have only one entry for VPD enabled PCD entry:
930 // We consider current size is equal to MAX size.
934 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
936 // We have only two entry for Non-Sku enabled PCD entry:
943 // We have these entry for SKU enabled PCD entry
945 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
947 SkuIdTable
= GetSkuIdArray (i
, IsPeiDb
);
948 SizeTableIdx
+= (UINTN
)*SkuIdTable
+ 1;
963 IN UINTN LocalTokenNumberTableIdx
,
967 UINT32
*LocalTokenNumberTable
;
970 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
972 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
974 return GetSizeTableIndexA (LocalTokenNumberTableIdx
,
975 LocalTokenNumberTable
,
983 IN UINTN LocalTokenNumberTableIdx
,
988 UINTN LocalTokenNumber
;
990 SIZE_INFO
*SizeTable
;
993 UINT32
*LocalTokenNumberTable
;
995 // EBC compiler is very choosy. It may report warning about comparison
996 // between UINTN and 0 . So we add 1 in each size of the
998 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1002 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1003 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1005 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1006 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1007 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1010 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1012 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1014 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1016 *MaxSize
= SizeTable
[SizeTableIdx
];
1018 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1021 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1023 // We have only one entry for VPD enabled PCD entry:
1025 // We consider current size is equal to MAX size.
1029 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1031 // We have only two entry for Non-Sku enabled PCD entry:
1035 return SizeTable
[SizeTableIdx
+ 1];
1038 // We have these entry for SKU enabled PCD entry
1040 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1042 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1043 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1044 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1045 return SizeTable
[SizeTableIdx
+ 1 + i
];
1048 return SizeTable
[SizeTableIdx
+ 1];
1057 IN UINTN LocalTokenNumberTableIdx
,
1058 IN OUT UINTN
*CurrentSize
1062 UINTN LocalTokenNumber
;
1064 SIZE_INFO
*SizeTable
;
1068 UINT32
*LocalTokenNumberTable
;
1070 // EBC compiler is very choosy. It may report warning about comparison
1071 // between UINTN and 0 . So we add 1 in each size of the
1073 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1076 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1077 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1079 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1080 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1081 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1084 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1086 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1088 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1090 MaxSize
= SizeTable
[SizeTableIdx
];
1092 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1095 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1097 // We shouldn't come here as we don't support SET for VPD
1102 if ((*CurrentSize
> MaxSize
) ||
1103 (*CurrentSize
== MAX_ADDRESS
)) {
1104 *CurrentSize
= MaxSize
;
1108 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1110 // We have only two entry for Non-Sku enabled PCD entry:
1114 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;
1118 // We have these entry for SKU enabled PCD entry
1120 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1122 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1123 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1124 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1125 SizeTable
[SizeTableIdx
+ 1 + i
] = (SIZE_INFO
) *CurrentSize
;
1129 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;