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
20 PCD_DATABASE
* mPcdDatabase
;
22 LIST_ENTRY
*mCallbackFnTable
;
30 UINT32
*LocalTokenNumberTable
;
35 VARIABLE_HEAD
*VariableHead
;
36 UINT8
*VaraiableDefaultBuffer
;
45 UINT32 LocalTokenNumber
;
47 UINT16 StringTableIdx
;
51 // Aquire lock to prevent reentrance from TPL_CALLBACK level
53 EfiAcquireLock (&mPcdDatabaseLock
);
57 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
58 // We have to decrement TokenNumber by 1 to make it usable
59 // as the array index.
63 TmpTokenNumber
= TokenNumber
;
66 // PCD_TOTAL_TOKEN_NUMBER is a auto-generated constant.
67 // It could be zero. EBC compiler is very choosy. It may
68 // report warning. So we add 1 in each size of the
71 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
73 ASSERT ((GetSize
== DxePcdGetSize (TokenNumber
+ 1)) || (GetSize
== 0));
75 // EBC compiler is very choosy. It may report warning about comparison
76 // between UINTN and 0 . So we add 1 in each size of the
78 IsPeiDb
= (BOOLEAN
) ((TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
);
80 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
81 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
83 TokenNumber
= IsPeiDb
? TokenNumber
:
84 TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
86 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
88 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
90 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
94 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
97 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
98 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
99 mPcdDatabase
->DxeDb
.Init
.StringTable
;
101 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
103 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
105 VpdHead
= (VPD_HEAD
*) ((UINT8
*) PcdDb
+ Offset
);
106 RetPtr
= (VOID
*) (UINTN
) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
110 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
111 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
113 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
115 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
116 Name
= &(StringTable
[VariableHead
->StringIndex
]);
117 VaraiableDefaultBuffer
= (UINT8
*) PcdDb
+ VariableHead
->DefaultValueOffset
;
119 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
120 if (Status
== EFI_SUCCESS
) {
123 // It is a pointer type. So get the MaxSize reserved for
126 GetPtrTypeSize (TmpTokenNumber
, &GetSize
);
128 CopyMem (VaraiableDefaultBuffer
, Data
+ VariableHead
->Offset
, GetSize
);
132 // If the operation is successful, we copy the data
133 // to the default value buffer in the PCD Database.
134 // So that we can free the Data allocated in GetHiiVariable.
137 // If the operation is not successful,
138 // Return 1) either the default value specified by Platform Integrator
139 // 2) Or the value Set by a PCD set operation.
141 RetPtr
= (VOID
*) VaraiableDefaultBuffer
;
144 case PCD_TYPE_STRING
:
145 StringTableIdx
= (UINT16
) *((UINT8
*) PcdDb
+ Offset
);
146 RetPtr
= (VOID
*) &StringTable
[StringTableIdx
];
150 RetPtr
= (VOID
*) ((UINT8
*) PcdDb
+ Offset
);
159 EfiReleaseLock (&mPcdDatabaseLock
);
168 DxeRegisterCallBackWorker (
169 IN UINTN TokenNumber
,
170 IN CONST GUID
*Guid
, OPTIONAL
171 IN PCD_PROTOCOL_CALLBACK CallBackFunction
174 CALLBACK_FN_ENTRY
*FnTableEntry
;
175 LIST_ENTRY
*ListHead
;
176 LIST_ENTRY
*ListNode
;
179 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
183 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
184 // We have to decrement TokenNumber by 1 to make it usable
185 // as the array index.
189 ListHead
= &mCallbackFnTable
[TokenNumber
];
190 ListNode
= GetFirstNode (ListHead
);
192 while (ListNode
!= ListHead
) {
193 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
195 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
197 // We only allow a Callback function to be register once
198 // for a TokenNumber. So just return EFI_SUCCESS
202 ListNode
= GetNextNode (ListHead
, ListNode
);
205 FnTableEntry
= AllocatePool (sizeof(CALLBACK_FN_ENTRY
));
206 ASSERT (FnTableEntry
!= NULL
);
208 FnTableEntry
->CallbackFn
= CallBackFunction
;
209 InsertTailList (ListHead
, &FnTableEntry
->Node
);
218 DxeUnRegisterCallBackWorker (
219 IN UINTN TokenNumber
,
220 IN CONST GUID
*Guid
, OPTIONAL
221 IN PCD_PROTOCOL_CALLBACK CallBackFunction
224 CALLBACK_FN_ENTRY
*FnTableEntry
;
225 LIST_ENTRY
*ListHead
;
226 LIST_ENTRY
*ListNode
;
229 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
233 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
234 // We have to decrement TokenNumber by 1 to make it usable
235 // as the array index.
239 ListHead
= &mCallbackFnTable
[TokenNumber
];
240 ListNode
= GetFirstNode (ListHead
);
242 while (ListNode
!= ListHead
) {
243 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
245 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
247 // We only allow a Callback function to be register once
248 // for a TokenNumber. So we can safely remove the Node from
249 // the Link List and return EFI_SUCCESS.
251 RemoveEntryList (ListNode
);
252 FreePool (FnTableEntry
);
256 ListNode
= GetNextNode (ListHead
, ListNode
);
259 return EFI_INVALID_PARAMETER
;
265 ExGetNextTokeNumber (
266 IN CONST EFI_GUID
*Guid
,
267 IN OUT UINTN
*TokenNumber
,
268 IN EFI_GUID
*GuidTable
,
269 IN UINTN SizeOfGuidTable
,
270 IN DYNAMICEX_MAPPING
*ExMapTable
,
271 IN UINTN SizeOfExMapTable
279 MatchGuid
= ScanGuid (GuidTable
, SizeOfGuidTable
, Guid
);
280 if (MatchGuid
== NULL
) {
281 return EFI_NOT_FOUND
;
285 GuidTableIdx
= MatchGuid
- GuidTable
;
286 for (Idx
= 0; Idx
< SizeOfExMapTable
; Idx
++) {
287 if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
294 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
295 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
299 for ( ; Idx
< SizeOfExMapTable
; Idx
++) {
300 if (ExMapTable
[Idx
].ExTokenNumber
== *TokenNumber
) {
302 if (Idx
== SizeOfExMapTable
) {
304 // Exceed the length of ExMap Table
306 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
308 } else if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
310 // Found the next match
312 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
316 // Guid has been changed. It is the next Token Space Guid.
317 // We should flag no more TokenNumber.
319 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
326 return EFI_NOT_FOUND
;
333 BuildPcdDxeDataBase (
337 PEI_PCD_DATABASE
*PeiDatabase
;
338 EFI_HOB_GUID_TYPE
*GuidHob
;
341 mPcdDatabase
= AllocateZeroPool (sizeof(PCD_DATABASE
));
342 ASSERT (mPcdDatabase
!= NULL
);
344 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
345 if (GuidHob
!= NULL
) {
348 // We will copy over the PEI phase's PCD Database.
350 // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM
351 // should not be included at all. So the GuidHob could
352 // be NULL. If it is NULL, we just copy over the DXE Default
353 // Value to PCD Database.
356 PeiDatabase
= (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
358 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE
360 CopyMem (&mPcdDatabase
->PeiDb
, PeiDatabase
, sizeof (PEI_PCD_DATABASE
));
364 // Copy PCD Entries with default value to PCD DATABASE
366 CopyMem (&mPcdDatabase
->DxeDb
.Init
, &gDXEPcdDbInit
, sizeof(DXE_PCD_DATABASE_INIT
));
370 // Initialized the Callback Function Table
373 mCallbackFnTable
= AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER
* sizeof (LIST_ENTRY
));
375 // EBC compiler is very choosy. It may report warning about comparison
376 // between UINTN and 0 . So we add 1 in each size of the
378 for (Idx
= 0; Idx
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1; Idx
++) {
379 InitializeListHead (&mCallbackFnTable
[Idx
]);
389 IN EFI_GUID
*VariableGuid
,
390 IN UINT16
*VariableName
,
391 OUT UINT8
**VariableData
,
392 OUT UINTN
*VariableSize
402 Status
= gRT
->GetVariable (
403 (UINT16
*)VariableName
,
410 if (Status
== EFI_BUFFER_TOO_SMALL
) {
411 Buffer
= (UINT8
*) AllocatePool (Size
);
413 ASSERT (Buffer
!= NULL
);
415 Status
= gRT
->GetVariable (
423 ASSERT (Status
== EFI_SUCCESS
);
424 *VariableData
= Buffer
;
425 *VariableSize
= Size
;
433 GetSkuEnabledTokenNumber (
434 UINT32 LocalTokenNumber
,
443 SKU_ID
*PhaseSkuIdTable
;
446 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
448 PcdDb
= IsPeiDb
? (UINT8
*) &mPcdDatabase
->PeiDb
: (UINT8
*) &mPcdDatabase
->DxeDb
;
450 SkuHead
= (SKU_HEAD
*) (PcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
451 Value
= (UINT8
*) (PcdDb
+ SkuHead
->SkuDataStartOffset
);
453 PhaseSkuIdTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SkuIdTable
:
454 mPcdDatabase
->DxeDb
.Init
.SkuIdTable
;
456 SkuIdTable
= &PhaseSkuIdTable
[SkuHead
->SkuIdTableOffset
];
458 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
459 if (mPcdDatabase
->PeiDb
.Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
463 ASSERT (i
< SkuIdTable
[0]);
465 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
467 Value
= (UINT8
*) &(((VPD_HEAD
*) Value
)[i
]);
468 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_VPD
);
471 Value
= (UINT8
*) &(((VARIABLE_HEAD
*) Value
)[i
]);
472 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_HII
);
474 case PCD_TYPE_STRING
:
475 Value
= (UINT8
*) &(((STRING_HEAD
*) Value
)[i
]);
476 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_STRING
);
480 return (UINT32
) (Value
- PcdDb
);
497 InvokeCallbackOnSet (
498 UINT32 ExTokenNumber
,
499 CONST EFI_GUID
*Guid
, OPTIONAL
505 CALLBACK_FN_ENTRY
*FnTableEntry
;
506 LIST_ENTRY
*ListHead
;
507 LIST_ENTRY
*ListNode
;
510 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
511 // We have to decrement TokenNumber by 1 to make it usable
512 // as the array index.
516 ListHead
= &mCallbackFnTable
[TokenNumber
];
517 ListNode
= GetFirstNode (ListHead
);
519 while (ListNode
!= ListHead
) {
520 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
522 FnTableEntry
->CallbackFn(Guid
,
523 (Guid
== NULL
) ? TokenNumber
: ExTokenNumber
,
527 ListNode
= GetNextNode (ListHead
, ListNode
);
536 IN UINTN TokenNumber
,
541 return SetWorker (TokenNumber
, Data
, &Size
, FALSE
);
547 IN UINTN TokenNumber
,
553 UINT32
*LocalTokenNumberTable
;
555 UINT32 LocalTokenNumber
;
560 UINTN VariableOffset
;
562 VARIABLE_HEAD
*VariableHead
;
567 UINTN TmpTokenNumber
;
570 // Aquire lock to prevent reentrance from TPL_CALLBACK level
572 EfiAcquireLock (&mPcdDatabaseLock
);
575 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
576 // We have to decrement TokenNumber by 1 to make it usable
577 // as the array index.
581 TmpTokenNumber
= TokenNumber
;
583 // EBC compiler is very choosy. It may report warning about comparison
584 // between UINTN and 0 . So we add 1 in each size of the
587 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
590 ASSERT (*Size
== DxePcdGetSize (TokenNumber
+ 1));
593 // EBC compiler is very choosy. It may report warning about comparison
594 // between UINTN and 0 . So we add 1 in each size of the
596 IsPeiDb
= (BOOLEAN
) ((TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
);
598 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
599 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
601 // EBC compiler is very choosy. It may report warning about comparison
602 // between UINTN and 0 . So we add 1 in each size of the
604 if ((TokenNumber
+ 1 < PEI_NEX_TOKEN_NUMBER
+ 1) ||
605 (TokenNumber
+ 1 >= PEI_LOCAL_TOKEN_NUMBER
+ 1 || TokenNumber
+ 1 < (PEI_LOCAL_TOKEN_NUMBER
+ DXE_NEX_TOKEN_NUMBER
+ 1))) {
606 InvokeCallbackOnSet (0, NULL
, TokenNumber
+ 1, Data
, *Size
);
609 TokenNumber
= IsPeiDb
? TokenNumber
610 : TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
612 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
614 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
616 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
620 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
623 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
625 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
627 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
628 mPcdDatabase
->DxeDb
.Init
.StringTable
;
630 InternalData
= PcdDb
+ Offset
;
632 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
635 Status
= EFI_INVALID_PARAMETER
;
638 case PCD_TYPE_STRING
:
639 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
640 CopyMem (&StringTable
[*((UINT16
*)InternalData
)], Data
, *Size
);
641 Status
= EFI_SUCCESS
;
643 Status
= EFI_INVALID_PARAMETER
;
649 if (!SetPtrTypeSize (TmpTokenNumber
, Size
)) {
650 Status
= EFI_INVALID_PARAMETER
;
655 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
656 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
658 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
660 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
661 Name
= &(StringTable
[VariableHead
->StringIndex
]);
662 VariableOffset
= VariableHead
->Offset
;
664 Status
= SetHiiVariable (Guid
, Name
, Data
, *Size
, VariableOffset
);
666 if (EFI_NOT_FOUND
== Status
) {
667 CopyMem (PcdDb
+ VariableHead
->DefaultValueOffset
, Data
, *Size
);
668 Status
= EFI_SUCCESS
;
674 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
675 CopyMem (InternalData
, Data
, *Size
);
676 Status
= EFI_SUCCESS
;
678 Status
= EFI_INVALID_PARAMETER
;
683 Status
= EFI_SUCCESS
;
686 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
690 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
694 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
698 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
703 Status
= EFI_NOT_FOUND
;
710 Status
= EFI_NOT_FOUND
;
714 EfiReleaseLock (&mPcdDatabaseLock
);
725 IN CONST EFI_GUID
*Guid
,
726 IN UINTN ExTokenNumber
,
730 return GetWorker(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
), GetSize
);
738 IN UINTN ExTokenNumber
,
739 IN CONST EFI_GUID
*Guid
,
744 return ExSetWorker (ExTokenNumber
, Guid
, Data
, &SetSize
, FALSE
);
750 IN UINTN ExTokenNumber
,
751 IN CONST EFI_GUID
*Guid
,
753 IN OUT UINTN
*SetSize
,
759 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
);
761 InvokeCallbackOnSet ((UINT32
) ExTokenNumber
, Guid
, TokenNumber
, Data
, *SetSize
);
763 return SetWorker (TokenNumber
, Data
, SetSize
, PtrType
);
772 IN EFI_GUID
*VariableGuid
,
773 IN UINT16
*VariableName
,
786 Status
= gRT
->GetVariable (
787 (UINT16
*)VariableName
,
794 if (Status
== EFI_BUFFER_TOO_SMALL
) {
796 Buffer
= AllocatePool (Size
);
798 ASSERT (Buffer
!= NULL
);
800 Status
= gRT
->GetVariable (
808 ASSERT_EFI_ERROR (Status
);
810 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
812 Status
= gRT
->SetVariable (
826 // If we drop to here, we don't have a Variable entry in
827 // the variable service yet. So, we will save the data
828 // in the PCD Database's volatile area.
838 GetExPcdTokenNumber (
839 IN CONST EFI_GUID
*Guid
,
840 IN UINT32 ExTokenNumber
844 DYNAMICEX_MAPPING
*ExMap
;
849 if (!PEI_DATABASE_EMPTY
) {
850 ExMap
= mPcdDatabase
->PeiDb
.Init
.ExMapTable
;
851 GuidTable
= mPcdDatabase
->PeiDb
.Init
.GuidTable
;
853 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
), Guid
);
855 if (MatchGuid
!= NULL
) {
857 MatchGuidIdx
= MatchGuid
- GuidTable
;
859 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
860 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
861 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
862 return ExMap
[i
].LocalTokenNumber
;
869 ExMap
= mPcdDatabase
->DxeDb
.Init
.ExMapTable
;
870 GuidTable
= mPcdDatabase
->DxeDb
.Init
.GuidTable
;
872 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->DxeDb
.Init
.GuidTable
), Guid
);
874 // We need to ASSERT here. If GUID can't be found in GuidTable, this is a
875 // error in the BUILD system.
877 ASSERT (MatchGuid
!= NULL
);
879 MatchGuidIdx
= MatchGuid
- GuidTable
;
881 for (i
= 0; i
< DXE_EXMAPPING_TABLE_SIZE
; i
++) {
882 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
883 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
884 return ExMap
[i
].LocalTokenNumber
;
897 IN UINTN LocalTokenNumberTableIdx
,
902 UINTN LocalTokenNumber
;
906 LocalTokenNumber
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
907 Database
= (UINT8
*) &mPcdDatabase
->PeiDb
;
909 LocalTokenNumber
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
- PEI_LOCAL_TOKEN_NUMBER
];
910 Database
= (UINT8
*) &mPcdDatabase
->DxeDb
;
913 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) != 0);
915 SkuHead
= (SKU_HEAD
*) ((UINT8
*)Database
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
917 return (SKU_ID
*) (Database
+ SkuHead
->SkuIdTableOffset
);
925 IN UINTN LocalTokenNumberTableIdx
,
926 IN UINT32
*LocalTokenNumberTable
,
932 UINTN LocalTokenNumber
;
937 for (i
=0; i
<LocalTokenNumberTableIdx
; i
++) {
938 LocalTokenNumber
= LocalTokenNumberTable
[i
];
940 if ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
) {
942 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
945 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
947 // We have only one entry for VPD enabled PCD entry:
949 // We consider current size is equal to MAX size.
953 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
955 // We have only two entry for Non-Sku enabled PCD entry:
962 // We have these entry for SKU enabled PCD entry
964 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
966 SkuIdTable
= GetSkuIdArray (i
, IsPeiDb
);
967 SizeTableIdx
+= (UINTN
)*SkuIdTable
+ 1;
982 IN UINTN LocalTokenNumberTableIdx
,
986 UINT32
*LocalTokenNumberTable
;
989 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
991 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
993 return GetSizeTableIndexA (LocalTokenNumberTableIdx
,
994 LocalTokenNumberTable
,
1002 IN UINTN LocalTokenNumberTableIdx
,
1007 UINTN LocalTokenNumber
;
1009 SIZE_INFO
*SizeTable
;
1012 UINT32
*LocalTokenNumberTable
;
1014 // EBC compiler is very choosy. It may report warning about comparison
1015 // between UINTN and 0 . So we add 1 in each size of the
1017 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1021 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1022 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1024 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1025 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1026 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1029 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1031 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1033 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1035 *MaxSize
= SizeTable
[SizeTableIdx
];
1037 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1040 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1042 // We have only one entry for VPD enabled PCD entry:
1044 // We consider current size is equal to MAX size.
1048 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1050 // We have only two entry for Non-Sku enabled PCD entry:
1054 return SizeTable
[SizeTableIdx
+ 1];
1057 // We have these entry for SKU enabled PCD entry
1059 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1061 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1062 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1063 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1064 return SizeTable
[SizeTableIdx
+ 1 + i
];
1067 return SizeTable
[SizeTableIdx
+ 1];
1076 IN UINTN LocalTokenNumberTableIdx
,
1077 IN OUT UINTN
*CurrentSize
1081 UINTN LocalTokenNumber
;
1083 SIZE_INFO
*SizeTable
;
1087 UINT32
*LocalTokenNumberTable
;
1089 // EBC compiler is very choosy. It may report warning about comparison
1090 // between UINTN and 0 . So we add 1 in each size of the
1092 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1095 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1096 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1098 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1099 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1100 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1103 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1105 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1107 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1109 MaxSize
= SizeTable
[SizeTableIdx
];
1111 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1114 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1116 // We shouldn't come here as we don't support SET for VPD
1121 if ((*CurrentSize
> MaxSize
) ||
1122 (*CurrentSize
== MAX_ADDRESS
)) {
1123 *CurrentSize
= MaxSize
;
1127 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1129 // We have only two entry for Non-Sku enabled PCD entry:
1133 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;
1137 // We have these entry for SKU enabled PCD entry
1139 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1141 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1142 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1143 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1144 SizeTable
[SizeTableIdx
+ 1 + i
] = (SIZE_INFO
) *CurrentSize
;
1148 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;