2 Private functions used by PCD DXE driver.
4 Copyright (c) 2006 - 2007, 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
21 PCD_DATABASE
* mPcdDatabase
;
23 LIST_ENTRY
*mCallbackFnTable
;
31 UINT32
*LocalTokenNumberTable
;
36 VARIABLE_HEAD
*VariableHead
;
37 UINT8
*VaraiableDefaultBuffer
;
46 UINT32 LocalTokenNumber
;
48 UINT16 StringTableIdx
;
52 // Aquire lock to prevent reentrance from TPL_CALLBACK level
54 EfiAcquireLock (&mPcdDatabaseLock
);
58 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
59 // We have to decrement TokenNumber by 1 to make it usable
60 // as the array index.
64 TmpTokenNumber
= TokenNumber
;
67 // PCD_TOTAL_TOKEN_NUMBER is a auto-generated constant.
68 // It could be zero. EBC compiler is very choosy. It may
69 // report warning. So we add 1 in each size of the
72 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
74 ASSERT ((GetSize
== DxePcdGetSize (TokenNumber
+ 1)) || (GetSize
== 0));
76 // EBC compiler is very choosy. It may report warning about comparison
77 // between UINTN and 0 . So we add 1 in each size of the
79 IsPeiDb
= (BOOLEAN
) ((TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
);
81 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
82 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
84 TokenNumber
= IsPeiDb
? TokenNumber
:
85 TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
87 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
89 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
91 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
95 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
98 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
99 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
100 mPcdDatabase
->DxeDb
.Init
.StringTable
;
102 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
104 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
106 VpdHead
= (VPD_HEAD
*) ((UINT8
*) PcdDb
+ Offset
);
107 RetPtr
= (VOID
*) (UINTN
) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
111 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
112 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
114 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
116 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
117 Name
= &(StringTable
[VariableHead
->StringIndex
]);
118 VaraiableDefaultBuffer
= (UINT8
*) PcdDb
+ VariableHead
->DefaultValueOffset
;
120 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
121 if (Status
== EFI_SUCCESS
) {
124 // It is a pointer type. So get the MaxSize reserved for
127 GetPtrTypeSize (TmpTokenNumber
, &GetSize
);
129 CopyMem (VaraiableDefaultBuffer
, Data
+ VariableHead
->Offset
, GetSize
);
133 // If the operation is successful, we copy the data
134 // to the default value buffer in the PCD Database.
135 // So that we can free the Data allocated in GetHiiVariable.
138 // If the operation is not successful,
139 // Return 1) either the default value specified by Platform Integrator
140 // 2) Or the value Set by a PCD set operation.
142 RetPtr
= (VOID
*) VaraiableDefaultBuffer
;
145 case PCD_TYPE_STRING
:
146 StringTableIdx
= (UINT16
) *((UINT8
*) PcdDb
+ Offset
);
147 RetPtr
= (VOID
*) &StringTable
[StringTableIdx
];
151 RetPtr
= (VOID
*) ((UINT8
*) PcdDb
+ Offset
);
160 EfiReleaseLock (&mPcdDatabaseLock
);
169 DxeRegisterCallBackWorker (
170 IN UINTN TokenNumber
,
171 IN CONST GUID
*Guid
, OPTIONAL
172 IN PCD_PROTOCOL_CALLBACK CallBackFunction
175 CALLBACK_FN_ENTRY
*FnTableEntry
;
176 LIST_ENTRY
*ListHead
;
177 LIST_ENTRY
*ListNode
;
180 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
184 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
185 // We have to decrement TokenNumber by 1 to make it usable
186 // as the array index.
190 ListHead
= &mCallbackFnTable
[TokenNumber
];
191 ListNode
= GetFirstNode (ListHead
);
193 while (ListNode
!= ListHead
) {
194 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
196 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
198 // We only allow a Callback function to be register once
199 // for a TokenNumber. So just return EFI_SUCCESS
203 ListNode
= GetNextNode (ListHead
, ListNode
);
206 FnTableEntry
= AllocatePool (sizeof(CALLBACK_FN_ENTRY
));
207 ASSERT (FnTableEntry
!= NULL
);
209 FnTableEntry
->CallbackFn
= CallBackFunction
;
210 InsertTailList (ListHead
, &FnTableEntry
->Node
);
219 DxeUnRegisterCallBackWorker (
220 IN UINTN TokenNumber
,
221 IN CONST GUID
*Guid
, OPTIONAL
222 IN PCD_PROTOCOL_CALLBACK CallBackFunction
225 CALLBACK_FN_ENTRY
*FnTableEntry
;
226 LIST_ENTRY
*ListHead
;
227 LIST_ENTRY
*ListNode
;
230 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
234 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
235 // We have to decrement TokenNumber by 1 to make it usable
236 // as the array index.
240 ListHead
= &mCallbackFnTable
[TokenNumber
];
241 ListNode
= GetFirstNode (ListHead
);
243 while (ListNode
!= ListHead
) {
244 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
246 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
248 // We only allow a Callback function to be register once
249 // for a TokenNumber. So we can safely remove the Node from
250 // the Link List and return EFI_SUCCESS.
252 RemoveEntryList (ListNode
);
253 FreePool (FnTableEntry
);
257 ListNode
= GetNextNode (ListHead
, ListNode
);
260 return EFI_INVALID_PARAMETER
;
266 ExGetNextTokeNumber (
267 IN CONST EFI_GUID
*Guid
,
268 IN OUT UINTN
*TokenNumber
,
269 IN EFI_GUID
*GuidTable
,
270 IN UINTN SizeOfGuidTable
,
271 IN DYNAMICEX_MAPPING
*ExMapTable
,
272 IN UINTN SizeOfExMapTable
280 MatchGuid
= ScanGuid (GuidTable
, SizeOfGuidTable
, Guid
);
281 if (MatchGuid
== NULL
) {
282 return EFI_NOT_FOUND
;
286 GuidTableIdx
= MatchGuid
- GuidTable
;
287 for (Idx
= 0; Idx
< SizeOfExMapTable
; Idx
++) {
288 if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
295 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
296 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
300 for ( ; Idx
< SizeOfExMapTable
; Idx
++) {
301 if (ExMapTable
[Idx
].ExTokenNumber
== *TokenNumber
) {
303 if (Idx
== SizeOfExMapTable
) {
305 // Exceed the length of ExMap Table
307 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
309 } else if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
311 // Found the next match
313 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
317 // Guid has been changed. It is the next Token Space Guid.
318 // We should flag no more TokenNumber.
320 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
327 return EFI_NOT_FOUND
;
334 BuildPcdDxeDataBase (
338 PEI_PCD_DATABASE
*PeiDatabase
;
339 EFI_HOB_GUID_TYPE
*GuidHob
;
342 mPcdDatabase
= AllocateZeroPool (sizeof(PCD_DATABASE
));
343 ASSERT (mPcdDatabase
!= NULL
);
345 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
346 if (GuidHob
!= NULL
) {
349 // We will copy over the PEI phase's PCD Database.
351 // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM
352 // should not be included at all. So the GuidHob could
353 // be NULL. If it is NULL, we just copy over the DXE Default
354 // Value to PCD Database.
357 PeiDatabase
= (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
359 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE
361 CopyMem (&mPcdDatabase
->PeiDb
, PeiDatabase
, sizeof (PEI_PCD_DATABASE
));
365 // Copy PCD Entries with default value to PCD DATABASE
367 CopyMem (&mPcdDatabase
->DxeDb
.Init
, &gDXEPcdDbInit
, sizeof(DXE_PCD_DATABASE_INIT
));
371 // Initialized the Callback Function Table
374 mCallbackFnTable
= AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER
* sizeof (LIST_ENTRY
));
376 // EBC compiler is very choosy. It may report warning about comparison
377 // between UINTN and 0 . So we add 1 in each size of the
379 for (Idx
= 0; Idx
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1; Idx
++) {
380 InitializeListHead (&mCallbackFnTable
[Idx
]);
390 IN EFI_GUID
*VariableGuid
,
391 IN UINT16
*VariableName
,
392 OUT UINT8
**VariableData
,
393 OUT UINTN
*VariableSize
403 Status
= gRT
->GetVariable (
404 (UINT16
*)VariableName
,
411 if (Status
== EFI_BUFFER_TOO_SMALL
) {
412 Buffer
= (UINT8
*) AllocatePool (Size
);
414 ASSERT (Buffer
!= NULL
);
416 Status
= gRT
->GetVariable (
424 ASSERT (Status
== EFI_SUCCESS
);
425 *VariableData
= Buffer
;
426 *VariableSize
= Size
;
434 GetSkuEnabledTokenNumber (
435 UINT32 LocalTokenNumber
,
444 SKU_ID
*PhaseSkuIdTable
;
447 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
449 PcdDb
= IsPeiDb
? (UINT8
*) &mPcdDatabase
->PeiDb
: (UINT8
*) &mPcdDatabase
->DxeDb
;
451 SkuHead
= (SKU_HEAD
*) (PcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
452 Value
= (UINT8
*) (PcdDb
+ SkuHead
->SkuDataStartOffset
);
454 PhaseSkuIdTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SkuIdTable
:
455 mPcdDatabase
->DxeDb
.Init
.SkuIdTable
;
457 SkuIdTable
= &PhaseSkuIdTable
[SkuHead
->SkuIdTableOffset
];
459 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
460 if (mPcdDatabase
->PeiDb
.Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
464 ASSERT (i
< SkuIdTable
[0]);
466 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
468 Value
= (UINT8
*) &(((VPD_HEAD
*) Value
)[i
]);
469 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_VPD
);
472 Value
= (UINT8
*) &(((VARIABLE_HEAD
*) Value
)[i
]);
473 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_HII
);
475 case PCD_TYPE_STRING
:
476 Value
= (UINT8
*) &(((STRING_HEAD
*) Value
)[i
]);
477 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_STRING
);
481 return (UINT32
) (Value
- PcdDb
);
498 InvokeCallbackOnSet (
499 UINT32 ExTokenNumber
,
500 CONST EFI_GUID
*Guid
, OPTIONAL
506 CALLBACK_FN_ENTRY
*FnTableEntry
;
507 LIST_ENTRY
*ListHead
;
508 LIST_ENTRY
*ListNode
;
511 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
512 // We have to decrement TokenNumber by 1 to make it usable
513 // as the array index.
517 ListHead
= &mCallbackFnTable
[TokenNumber
];
518 ListNode
= GetFirstNode (ListHead
);
520 while (ListNode
!= ListHead
) {
521 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
523 FnTableEntry
->CallbackFn(Guid
,
524 (Guid
== NULL
) ? TokenNumber
: ExTokenNumber
,
528 ListNode
= GetNextNode (ListHead
, ListNode
);
537 IN UINTN TokenNumber
,
542 return SetWorker (TokenNumber
, Data
, &Size
, FALSE
);
548 IN UINTN TokenNumber
,
554 UINT32
*LocalTokenNumberTable
;
556 UINT32 LocalTokenNumber
;
561 UINTN VariableOffset
;
563 VARIABLE_HEAD
*VariableHead
;
568 UINTN TmpTokenNumber
;
571 // Aquire lock to prevent reentrance from TPL_CALLBACK level
573 EfiAcquireLock (&mPcdDatabaseLock
);
576 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
577 // We have to decrement TokenNumber by 1 to make it usable
578 // as the array index.
582 TmpTokenNumber
= TokenNumber
;
584 // EBC compiler is very choosy. It may report warning about comparison
585 // between UINTN and 0 . So we add 1 in each size of the
588 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
591 ASSERT (*Size
== DxePcdGetSize (TokenNumber
+ 1));
594 // EBC compiler is very choosy. It may report warning about comparison
595 // between UINTN and 0 . So we add 1 in each size of the
597 IsPeiDb
= (BOOLEAN
) ((TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
);
599 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
600 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
602 // EBC compiler is very choosy. It may report warning about comparison
603 // between UINTN and 0 . So we add 1 in each size of the
605 if ((TokenNumber
+ 1 < PEI_NEX_TOKEN_NUMBER
+ 1) ||
606 (TokenNumber
+ 1 >= PEI_LOCAL_TOKEN_NUMBER
+ 1 || TokenNumber
+ 1 < (PEI_LOCAL_TOKEN_NUMBER
+ DXE_NEX_TOKEN_NUMBER
+ 1))) {
607 InvokeCallbackOnSet (0, NULL
, TokenNumber
+ 1, Data
, *Size
);
610 TokenNumber
= IsPeiDb
? TokenNumber
611 : TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
613 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
615 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
617 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
621 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
624 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
626 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
628 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
629 mPcdDatabase
->DxeDb
.Init
.StringTable
;
631 InternalData
= PcdDb
+ Offset
;
633 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
636 Status
= EFI_INVALID_PARAMETER
;
639 case PCD_TYPE_STRING
:
640 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
641 CopyMem (&StringTable
[*((UINT16
*)InternalData
)], Data
, *Size
);
642 Status
= EFI_SUCCESS
;
644 Status
= EFI_INVALID_PARAMETER
;
650 if (!SetPtrTypeSize (TmpTokenNumber
, Size
)) {
651 Status
= EFI_INVALID_PARAMETER
;
656 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
657 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
659 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
661 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
662 Name
= &(StringTable
[VariableHead
->StringIndex
]);
663 VariableOffset
= VariableHead
->Offset
;
665 Status
= SetHiiVariable (Guid
, Name
, Data
, *Size
, VariableOffset
);
667 if (EFI_NOT_FOUND
== Status
) {
668 CopyMem (PcdDb
+ VariableHead
->DefaultValueOffset
, Data
, *Size
);
669 Status
= EFI_SUCCESS
;
675 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
676 CopyMem (InternalData
, Data
, *Size
);
677 Status
= EFI_SUCCESS
;
679 Status
= EFI_INVALID_PARAMETER
;
684 Status
= EFI_SUCCESS
;
687 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
691 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
695 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
699 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
704 Status
= EFI_NOT_FOUND
;
711 Status
= EFI_NOT_FOUND
;
715 EfiReleaseLock (&mPcdDatabaseLock
);
726 IN CONST EFI_GUID
*Guid
,
727 IN UINTN ExTokenNumber
,
731 return GetWorker(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
), GetSize
);
739 IN UINTN ExTokenNumber
,
740 IN CONST EFI_GUID
*Guid
,
745 return ExSetWorker (ExTokenNumber
, Guid
, Data
, &SetSize
, FALSE
);
751 IN UINTN ExTokenNumber
,
752 IN CONST EFI_GUID
*Guid
,
754 IN OUT UINTN
*SetSize
,
760 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
);
762 InvokeCallbackOnSet ((UINT32
) ExTokenNumber
, Guid
, TokenNumber
, Data
, *SetSize
);
764 return SetWorker (TokenNumber
, Data
, SetSize
, PtrType
);
773 IN EFI_GUID
*VariableGuid
,
774 IN UINT16
*VariableName
,
787 Status
= gRT
->GetVariable (
788 (UINT16
*)VariableName
,
795 if (Status
== EFI_BUFFER_TOO_SMALL
) {
797 Buffer
= AllocatePool (Size
);
799 ASSERT (Buffer
!= NULL
);
801 Status
= gRT
->GetVariable (
809 ASSERT_EFI_ERROR (Status
);
811 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
813 Status
= gRT
->SetVariable (
827 // If we drop to here, we don't have a Variable entry in
828 // the variable service yet. So, we will save the data
829 // in the PCD Database's volatile area.
839 GetExPcdTokenNumber (
840 IN CONST EFI_GUID
*Guid
,
841 IN UINT32 ExTokenNumber
845 DYNAMICEX_MAPPING
*ExMap
;
850 if (!PEI_DATABASE_EMPTY
) {
851 ExMap
= mPcdDatabase
->PeiDb
.Init
.ExMapTable
;
852 GuidTable
= mPcdDatabase
->PeiDb
.Init
.GuidTable
;
854 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
), Guid
);
856 if (MatchGuid
!= NULL
) {
858 MatchGuidIdx
= MatchGuid
- GuidTable
;
860 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
861 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
862 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
863 return ExMap
[i
].LocalTokenNumber
;
870 ExMap
= mPcdDatabase
->DxeDb
.Init
.ExMapTable
;
871 GuidTable
= mPcdDatabase
->DxeDb
.Init
.GuidTable
;
873 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->DxeDb
.Init
.GuidTable
), Guid
);
875 // We need to ASSERT here. If GUID can't be found in GuidTable, this is a
876 // error in the BUILD system.
878 ASSERT (MatchGuid
!= NULL
);
880 MatchGuidIdx
= MatchGuid
- GuidTable
;
882 for (i
= 0; i
< DXE_EXMAPPING_TABLE_SIZE
; i
++) {
883 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
884 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
885 return ExMap
[i
].LocalTokenNumber
;
898 IN UINTN LocalTokenNumberTableIdx
,
903 UINTN LocalTokenNumber
;
907 LocalTokenNumber
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
908 Database
= (UINT8
*) &mPcdDatabase
->PeiDb
;
910 LocalTokenNumber
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
- PEI_LOCAL_TOKEN_NUMBER
];
911 Database
= (UINT8
*) &mPcdDatabase
->DxeDb
;
914 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) != 0);
916 SkuHead
= (SKU_HEAD
*) ((UINT8
*)Database
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
918 return (SKU_ID
*) (Database
+ SkuHead
->SkuIdTableOffset
);
926 IN UINTN LocalTokenNumberTableIdx
,
927 IN UINT32
*LocalTokenNumberTable
,
933 UINTN LocalTokenNumber
;
938 for (i
=0; i
<LocalTokenNumberTableIdx
; i
++) {
939 LocalTokenNumber
= LocalTokenNumberTable
[i
];
941 if ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
) {
943 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
946 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
948 // We have only one entry for VPD enabled PCD entry:
950 // We consider current size is equal to MAX size.
954 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
956 // We have only two entry for Non-Sku enabled PCD entry:
963 // We have these entry for SKU enabled PCD entry
965 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
967 SkuIdTable
= GetSkuIdArray (i
, IsPeiDb
);
968 SizeTableIdx
+= (UINTN
)*SkuIdTable
+ 1;
983 IN UINTN LocalTokenNumberTableIdx
,
987 UINT32
*LocalTokenNumberTable
;
990 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
992 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
994 return GetSizeTableIndexA (LocalTokenNumberTableIdx
,
995 LocalTokenNumberTable
,
1003 IN UINTN LocalTokenNumberTableIdx
,
1008 UINTN LocalTokenNumber
;
1010 SIZE_INFO
*SizeTable
;
1013 UINT32
*LocalTokenNumberTable
;
1015 // EBC compiler is very choosy. It may report warning about comparison
1016 // between UINTN and 0 . So we add 1 in each size of the
1018 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1022 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1023 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1025 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1026 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1027 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1030 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1032 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1034 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1036 *MaxSize
= SizeTable
[SizeTableIdx
];
1038 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1041 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1043 // We have only one entry for VPD enabled PCD entry:
1045 // We consider current size is equal to MAX size.
1049 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1051 // We have only two entry for Non-Sku enabled PCD entry:
1055 return SizeTable
[SizeTableIdx
+ 1];
1058 // We have these entry for SKU enabled PCD entry
1060 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1062 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1063 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1064 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1065 return SizeTable
[SizeTableIdx
+ 1 + i
];
1068 return SizeTable
[SizeTableIdx
+ 1];
1077 IN UINTN LocalTokenNumberTableIdx
,
1078 IN OUT UINTN
*CurrentSize
1082 UINTN LocalTokenNumber
;
1084 SIZE_INFO
*SizeTable
;
1088 UINT32
*LocalTokenNumberTable
;
1090 // EBC compiler is very choosy. It may report warning about comparison
1091 // between UINTN and 0 . So we add 1 in each size of the
1093 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1096 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1097 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1099 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1100 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1101 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1104 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1106 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1108 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1110 MaxSize
= SizeTable
[SizeTableIdx
];
1112 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1115 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1117 // We shouldn't come here as we don't support SET for VPD
1122 if ((*CurrentSize
> MaxSize
) ||
1123 (*CurrentSize
== MAX_ADDRESS
)) {
1124 *CurrentSize
= MaxSize
;
1128 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1130 // We have only two entry for Non-Sku enabled PCD entry:
1134 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;
1138 // We have these entry for SKU enabled PCD entry
1140 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1142 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1143 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1144 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1145 SizeTable
[SizeTableIdx
+ 1 + i
] = (SIZE_INFO
) *CurrentSize
;
1149 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;