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
;
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
= (TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
;
81 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
82 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
84 SizeTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SizeTable
:
85 mPcdDatabase
->DxeDb
.Init
.SizeTable
;
87 TokenNumber
= IsPeiDb
? TokenNumber
:
88 TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
90 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
92 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
94 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
98 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
101 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
102 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
103 mPcdDatabase
->DxeDb
.Init
.StringTable
;
105 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
107 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
109 VpdHead
= (VPD_HEAD
*) ((UINT8
*) PcdDb
+ Offset
);
110 RetPtr
= (VOID
*) (UINTN
) (FixedPcdGet32(PcdVpdBaseAddress
) + VpdHead
->Offset
);
114 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
115 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
117 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
119 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
120 Name
= &(StringTable
[VariableHead
->StringIndex
]);
121 VaraiableDefaultBuffer
= (UINT8
*) PcdDb
+ VariableHead
->DefaultValueOffset
;
123 Status
= GetHiiVariable (Guid
, Name
, &Data
, &DataSize
);
124 if (Status
== EFI_SUCCESS
) {
127 // It is a pointer type. So get the MaxSize reserved for
130 GetPtrTypeSize (TmpTokenNumber
, &GetSize
);
132 CopyMem (VaraiableDefaultBuffer
, Data
+ VariableHead
->Offset
, GetSize
);
136 // If the operation is successful, we copy the data
137 // to the default value buffer in the PCD Database.
138 // So that we can free the Data allocated in GetHiiVariable.
141 // If the operation is not successful,
142 // Return 1) either the default value specified by Platform Integrator
143 // 2) Or the value Set by a PCD set operation.
145 RetPtr
= (VOID
*) VaraiableDefaultBuffer
;
148 case PCD_TYPE_STRING
:
149 StringTableIdx
= (UINT16
) *((UINT8
*) PcdDb
+ Offset
);
150 RetPtr
= (VOID
*) &StringTable
[StringTableIdx
];
154 RetPtr
= (VOID
*) ((UINT8
*) PcdDb
+ Offset
);
163 EfiReleaseLock (&mPcdDatabaseLock
);
172 DxeRegisterCallBackWorker (
173 IN UINTN TokenNumber
,
174 IN CONST GUID
*Guid
, OPTIONAL
175 IN PCD_PROTOCOL_CALLBACK CallBackFunction
178 CALLBACK_FN_ENTRY
*FnTableEntry
;
179 LIST_ENTRY
*ListHead
;
180 LIST_ENTRY
*ListNode
;
183 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
187 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
188 // We have to decrement TokenNumber by 1 to make it usable
189 // as the array index.
193 ListHead
= &mCallbackFnTable
[TokenNumber
];
194 ListNode
= GetFirstNode (ListHead
);
196 while (ListNode
!= ListHead
) {
197 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
199 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
201 // We only allow a Callback function to be register once
202 // for a TokenNumber. So just return EFI_SUCCESS
206 ListNode
= GetNextNode (ListHead
, ListNode
);
209 FnTableEntry
= AllocatePool (sizeof(CALLBACK_FN_ENTRY
));
210 ASSERT (FnTableEntry
!= NULL
);
212 FnTableEntry
->CallbackFn
= CallBackFunction
;
213 InsertTailList (ListHead
, &FnTableEntry
->Node
);
222 DxeUnRegisterCallBackWorker (
223 IN UINTN TokenNumber
,
224 IN CONST GUID
*Guid
, OPTIONAL
225 IN PCD_PROTOCOL_CALLBACK CallBackFunction
228 CALLBACK_FN_ENTRY
*FnTableEntry
;
229 LIST_ENTRY
*ListHead
;
230 LIST_ENTRY
*ListNode
;
233 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) TokenNumber
);
237 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
238 // We have to decrement TokenNumber by 1 to make it usable
239 // as the array index.
243 ListHead
= &mCallbackFnTable
[TokenNumber
];
244 ListNode
= GetFirstNode (ListHead
);
246 while (ListNode
!= ListHead
) {
247 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
249 if (FnTableEntry
->CallbackFn
== CallBackFunction
) {
251 // We only allow a Callback function to be register once
252 // for a TokenNumber. So we can safely remove the Node from
253 // the Link List and return EFI_SUCCESS.
255 RemoveEntryList (ListNode
);
256 FreePool (FnTableEntry
);
260 ListNode
= GetNextNode (ListHead
, ListNode
);
263 return EFI_INVALID_PARAMETER
;
269 ExGetNextTokeNumber (
270 IN CONST EFI_GUID
*Guid
,
271 IN OUT UINTN
*TokenNumber
,
272 IN EFI_GUID
*GuidTable
,
273 IN UINTN SizeOfGuidTable
,
274 IN DYNAMICEX_MAPPING
*ExMapTable
,
275 IN UINTN SizeOfExMapTable
283 MatchGuid
= ScanGuid (GuidTable
, SizeOfGuidTable
, Guid
);
284 if (MatchGuid
== NULL
) {
285 return EFI_NOT_FOUND
;
289 GuidTableIdx
= MatchGuid
- GuidTable
;
290 for (Idx
= 0; Idx
< SizeOfExMapTable
; Idx
++) {
291 if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
298 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
299 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
303 for ( ; Idx
< SizeOfExMapTable
; Idx
++) {
304 if (ExMapTable
[Idx
].ExTokenNumber
== *TokenNumber
) {
306 if (Idx
== SizeOfExMapTable
) {
308 // Exceed the length of ExMap Table
310 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
312 } else if (ExMapTable
[Idx
].ExGuidIndex
== GuidTableIdx
) {
314 // Found the next match
316 *TokenNumber
= ExMapTable
[Idx
].ExTokenNumber
;
320 // Guid has been changed. It is the next Token Space Guid.
321 // We should flag no more TokenNumber.
323 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
330 return EFI_NOT_FOUND
;
337 BuildPcdDxeDataBase (
341 PEI_PCD_DATABASE
*PeiDatabase
;
342 EFI_HOB_GUID_TYPE
*GuidHob
;
345 mPcdDatabase
= AllocateZeroPool (sizeof(PCD_DATABASE
));
346 ASSERT (mPcdDatabase
!= NULL
);
348 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
349 if (GuidHob
!= NULL
) {
352 // We will copy over the PEI phase's PCD Database.
354 // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM
355 // should not be included at all. So the GuidHob could
356 // be NULL. If it is NULL, we just copy over the DXE Default
357 // Value to PCD Database.
360 PeiDatabase
= (PEI_PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
362 // Copy PCD Entries refereneced in PEI phase to PCD DATABASE
364 CopyMem (&mPcdDatabase
->PeiDb
, PeiDatabase
, sizeof (PEI_PCD_DATABASE
));
368 // Copy PCD Entries with default value to PCD DATABASE
370 CopyMem (&mPcdDatabase
->DxeDb
.Init
, &gDXEPcdDbInit
, sizeof(DXE_PCD_DATABASE_INIT
));
374 // Initialized the Callback Function Table
377 mCallbackFnTable
= AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER
* sizeof (LIST_ENTRY
));
379 // EBC compiler is very choosy. It may report warning about comparison
380 // between UINTN and 0 . So we add 1 in each size of the
382 for (Idx
= 0; Idx
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1; Idx
++) {
383 InitializeListHead (&mCallbackFnTable
[Idx
]);
393 IN EFI_GUID
*VariableGuid
,
394 IN UINT16
*VariableName
,
395 OUT UINT8
**VariableData
,
396 OUT UINTN
*VariableSize
406 Status
= gRT
->GetVariable (
407 (UINT16
*)VariableName
,
414 if (Status
== EFI_BUFFER_TOO_SMALL
) {
415 Buffer
= (UINT8
*) AllocatePool (Size
);
417 ASSERT (Buffer
!= NULL
);
419 Status
= gRT
->GetVariable (
427 ASSERT (Status
== EFI_SUCCESS
);
428 *VariableData
= Buffer
;
429 *VariableSize
= Size
;
437 GetSkuEnabledTokenNumber (
438 UINT32 LocalTokenNumber
,
447 SKU_ID
*PhaseSkuIdTable
;
450 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0);
452 PcdDb
= IsPeiDb
? (UINT8
*) &mPcdDatabase
->PeiDb
: (UINT8
*) &mPcdDatabase
->DxeDb
;
454 SkuHead
= (SKU_HEAD
*) (PcdDb
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
455 Value
= (UINT8
*) (PcdDb
+ SkuHead
->SkuDataStartOffset
);
457 PhaseSkuIdTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.SkuIdTable
:
458 mPcdDatabase
->DxeDb
.Init
.SkuIdTable
;
460 SkuIdTable
= &PhaseSkuIdTable
[SkuHead
->SkuIdTableOffset
];
462 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
463 if (mPcdDatabase
->PeiDb
.Init
.SystemSkuId
== SkuIdTable
[i
+ 1]) {
467 ASSERT (i
< SkuIdTable
[0]);
469 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
471 Value
= (UINT8
*) &(((VPD_HEAD
*) Value
)[i
]);
472 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_VPD
);
475 Value
= (UINT8
*) &(((VARIABLE_HEAD
*) Value
)[i
]);
476 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_HII
);
478 case PCD_TYPE_STRING
:
479 Value
= (UINT8
*) &(((STRING_HEAD
*) Value
)[i
]);
480 return (UINT32
) ((Value
- PcdDb
) | PCD_TYPE_STRING
);
484 return (UINT32
) (Value
- PcdDb
);
501 InvokeCallbackOnSet (
502 UINT32 ExTokenNumber
,
503 CONST EFI_GUID
*Guid
, OPTIONAL
509 CALLBACK_FN_ENTRY
*FnTableEntry
;
510 LIST_ENTRY
*ListHead
;
511 LIST_ENTRY
*ListNode
;
514 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
515 // We have to decrement TokenNumber by 1 to make it usable
516 // as the array index.
520 ListHead
= &mCallbackFnTable
[TokenNumber
];
521 ListNode
= GetFirstNode (ListHead
);
523 while (ListNode
!= ListHead
) {
524 FnTableEntry
= CR_FNENTRY_FROM_LISTNODE(ListNode
, CALLBACK_FN_ENTRY
, Node
);
526 FnTableEntry
->CallbackFn(Guid
,
527 (Guid
== NULL
) ? TokenNumber
: ExTokenNumber
,
531 ListNode
= GetNextNode (ListHead
, ListNode
);
540 IN UINTN TokenNumber
,
545 return SetWorker (TokenNumber
, Data
, &Size
, FALSE
);
551 IN UINTN TokenNumber
,
557 UINT32
*LocalTokenNumberTable
;
559 UINT32 LocalTokenNumber
;
564 UINTN VariableOffset
;
566 VARIABLE_HEAD
*VariableHead
;
571 UINTN TmpTokenNumber
;
574 // Aquire lock to prevent reentrance from TPL_CALLBACK level
576 EfiAcquireLock (&mPcdDatabaseLock
);
579 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
580 // We have to decrement TokenNumber by 1 to make it usable
581 // as the array index.
585 TmpTokenNumber
= TokenNumber
;
587 // EBC compiler is very choosy. It may report warning about comparison
588 // between UINTN and 0 . So we add 1 in each size of the
591 ASSERT (TokenNumber
+ 1 < PCD_TOTAL_TOKEN_NUMBER
+ 1);
594 ASSERT (*Size
== DxePcdGetSize (TokenNumber
+ 1));
597 // EBC compiler is very choosy. It may report warning about comparison
598 // between UINTN and 0 . So we add 1 in each size of the
600 IsPeiDb
= (TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1) ? TRUE
: FALSE
;
602 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
:
603 mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
605 // EBC compiler is very choosy. It may report warning about comparison
606 // between UINTN and 0 . So we add 1 in each size of the
608 if ((TokenNumber
+ 1 < PEI_NEX_TOKEN_NUMBER
+ 1) ||
609 (TokenNumber
+ 1 >= PEI_LOCAL_TOKEN_NUMBER
+ 1 || TokenNumber
+ 1 < (PEI_LOCAL_TOKEN_NUMBER
+ DXE_NEX_TOKEN_NUMBER
+ 1))) {
610 InvokeCallbackOnSet (0, NULL
, TokenNumber
+ 1, Data
, *Size
);
613 TokenNumber
= IsPeiDb
? TokenNumber
614 : TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
;
616 LocalTokenNumber
= LocalTokenNumberTable
[TokenNumber
];
618 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == PCD_TYPE_SKU_ENABLED
) {
620 GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
624 LocalTokenNumber
= GetSkuEnabledTokenNumber (LocalTokenNumber
& ~PCD_TYPE_SKU_ENABLED
, MaxSize
, IsPeiDb
);
627 Offset
= LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
;
629 PcdDb
= IsPeiDb
? ((UINT8
*) &mPcdDatabase
->PeiDb
) : ((UINT8
*) &mPcdDatabase
->DxeDb
);
631 StringTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.StringTable
:
632 mPcdDatabase
->DxeDb
.Init
.StringTable
;
634 InternalData
= PcdDb
+ Offset
;
636 switch (LocalTokenNumber
& PCD_TYPE_ALL_SET
) {
639 Status
= EFI_INVALID_PARAMETER
;
642 case PCD_TYPE_STRING
:
643 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
644 CopyMem (&StringTable
[*((UINT16
*)InternalData
)], Data
, *Size
);
645 Status
= EFI_SUCCESS
;
647 Status
= EFI_INVALID_PARAMETER
;
653 if (!SetPtrTypeSize (TmpTokenNumber
, Size
)) {
654 Status
= EFI_INVALID_PARAMETER
;
659 GuidTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.GuidTable
:
660 mPcdDatabase
->DxeDb
.Init
.GuidTable
;
662 VariableHead
= (VARIABLE_HEAD
*) (PcdDb
+ Offset
);
664 Guid
= &(GuidTable
[VariableHead
->GuidTableIndex
]);
665 Name
= &(StringTable
[VariableHead
->StringIndex
]);
666 VariableOffset
= VariableHead
->Offset
;
668 Status
= SetHiiVariable (Guid
, Name
, Data
, *Size
, VariableOffset
);
670 if (EFI_NOT_FOUND
== Status
) {
671 CopyMem (PcdDb
+ VariableHead
->DefaultValueOffset
, Data
, *Size
);
672 Status
= EFI_SUCCESS
;
678 if (SetPtrTypeSize (TmpTokenNumber
, Size
)) {
679 CopyMem (InternalData
, Data
, *Size
);
680 Status
= EFI_SUCCESS
;
682 Status
= EFI_INVALID_PARAMETER
;
687 Status
= EFI_SUCCESS
;
690 *((UINT8
*) InternalData
) = *((UINT8
*) Data
);
694 *((UINT16
*) InternalData
) = *((UINT16
*) Data
);
698 *((UINT32
*) InternalData
) = *((UINT32
*) Data
);
702 *((UINT64
*) InternalData
) = *((UINT64
*) Data
);
707 Status
= EFI_NOT_FOUND
;
714 Status
= EFI_NOT_FOUND
;
718 EfiReleaseLock (&mPcdDatabaseLock
);
729 IN CONST EFI_GUID
*Guid
,
730 IN UINTN ExTokenNumber
,
734 return GetWorker(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
), GetSize
);
742 IN UINTN ExTokenNumber
,
743 IN CONST EFI_GUID
*Guid
,
748 return ExSetWorker (ExTokenNumber
, Guid
, Data
, &SetSize
, FALSE
);
754 IN UINTN ExTokenNumber
,
755 IN CONST EFI_GUID
*Guid
,
757 IN OUT UINTN
*SetSize
,
763 TokenNumber
= GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
);
765 InvokeCallbackOnSet ((UINT32
) ExTokenNumber
, Guid
, TokenNumber
, Data
, *SetSize
);
767 return SetWorker (TokenNumber
, Data
, SetSize
, PtrType
);
776 IN EFI_GUID
*VariableGuid
,
777 IN UINT16
*VariableName
,
790 Status
= gRT
->GetVariable (
791 (UINT16
*)VariableName
,
798 if (Status
== EFI_BUFFER_TOO_SMALL
) {
800 Buffer
= AllocatePool (Size
);
802 ASSERT (Buffer
!= NULL
);
804 Status
= gRT
->GetVariable (
812 ASSERT_EFI_ERROR (Status
);
814 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
816 Status
= gRT
->SetVariable (
830 // If we drop to here, we don't have a Variable entry in
831 // the variable service yet. So, we will save the data
832 // in the PCD Database's volatile area.
842 GetExPcdTokenNumber (
843 IN CONST EFI_GUID
*Guid
,
844 IN UINT32 ExTokenNumber
848 DYNAMICEX_MAPPING
*ExMap
;
853 if (!PEI_DATABASE_EMPTY
) {
854 ExMap
= mPcdDatabase
->PeiDb
.Init
.ExMapTable
;
855 GuidTable
= mPcdDatabase
->PeiDb
.Init
.GuidTable
;
857 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
), Guid
);
859 if (MatchGuid
!= NULL
) {
861 MatchGuidIdx
= MatchGuid
- GuidTable
;
863 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
864 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
865 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
866 return ExMap
[i
].LocalTokenNumber
;
873 ExMap
= mPcdDatabase
->DxeDb
.Init
.ExMapTable
;
874 GuidTable
= mPcdDatabase
->DxeDb
.Init
.GuidTable
;
876 MatchGuid
= ScanGuid (GuidTable
, sizeof(mPcdDatabase
->DxeDb
.Init
.GuidTable
), Guid
);
878 // We need to ASSERT here. If GUID can't be found in GuidTable, this is a
879 // error in the BUILD system.
881 ASSERT (MatchGuid
!= NULL
);
883 MatchGuidIdx
= MatchGuid
- GuidTable
;
885 for (i
= 0; i
< DXE_EXMAPPING_TABLE_SIZE
; i
++) {
886 if ((ExTokenNumber
== ExMap
[i
].ExTokenNumber
) &&
887 (MatchGuidIdx
== ExMap
[i
].ExGuidIndex
)) {
888 return ExMap
[i
].LocalTokenNumber
;
901 IN UINTN LocalTokenNumberTableIdx
,
906 UINTN LocalTokenNumber
;
910 LocalTokenNumber
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
911 Database
= (UINT8
*) &mPcdDatabase
->PeiDb
;
913 LocalTokenNumber
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
[LocalTokenNumberTableIdx
- PEI_LOCAL_TOKEN_NUMBER
];
914 Database
= (UINT8
*) &mPcdDatabase
->DxeDb
;
917 ASSERT ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) != 0);
919 SkuHead
= (SKU_HEAD
*) ((UINT8
*)Database
+ (LocalTokenNumber
& PCD_DATABASE_OFFSET_MASK
));
921 return (SKU_ID
*) (Database
+ SkuHead
->SkuIdTableOffset
);
929 IN UINTN LocalTokenNumberTableIdx
,
930 IN UINT32
*LocalTokenNumberTable
,
936 UINTN LocalTokenNumber
;
941 for (i
=0; i
<LocalTokenNumberTableIdx
; i
++) {
942 LocalTokenNumber
= LocalTokenNumberTable
[i
];
944 if ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
) {
946 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
949 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
951 // We have only one entry for VPD enabled PCD entry:
953 // We consider current size is equal to MAX size.
957 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
959 // We have only two entry for Non-Sku enabled PCD entry:
966 // We have these entry for SKU enabled PCD entry
968 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
970 SkuIdTable
= GetSkuIdArray (i
, IsPeiDb
);
971 SizeTableIdx
+= (UINTN
)*SkuIdTable
+ 1;
986 IN UINTN LocalTokenNumberTableIdx
,
990 UINT32
*LocalTokenNumberTable
;
993 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
995 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
997 return GetSizeTableIndexA (LocalTokenNumberTableIdx
,
998 LocalTokenNumberTable
,
1006 IN UINTN LocalTokenNumberTableIdx
,
1011 UINTN LocalTokenNumber
;
1013 SIZE_INFO
*SizeTable
;
1016 UINT32
*LocalTokenNumberTable
;
1018 // EBC compiler is very choosy. It may report warning about comparison
1019 // between UINTN and 0 . So we add 1 in each size of the
1021 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1025 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1026 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1028 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1029 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1030 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1033 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1035 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1037 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1039 *MaxSize
= SizeTable
[SizeTableIdx
];
1041 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1044 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1046 // We have only one entry for VPD enabled PCD entry:
1048 // We consider current size is equal to MAX size.
1052 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1054 // We have only two entry for Non-Sku enabled PCD entry:
1058 return SizeTable
[SizeTableIdx
+ 1];
1061 // We have these entry for SKU enabled PCD entry
1063 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1065 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1066 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1067 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1068 return SizeTable
[SizeTableIdx
+ 1 + i
];
1071 return SizeTable
[SizeTableIdx
+ 1];
1080 IN UINTN LocalTokenNumberTableIdx
,
1081 IN OUT UINTN
*CurrentSize
1085 UINTN LocalTokenNumber
;
1087 SIZE_INFO
*SizeTable
;
1091 UINT32
*LocalTokenNumberTable
;
1093 // EBC compiler is very choosy. It may report warning about comparison
1094 // between UINTN and 0 . So we add 1 in each size of the
1096 IsPeiDb
= (BOOLEAN
) (LocalTokenNumberTableIdx
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
1099 LocalTokenNumberTable
= mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
;
1100 SizeTable
= mPcdDatabase
->PeiDb
.Init
.SizeTable
;
1102 LocalTokenNumberTableIdx
-= PEI_LOCAL_TOKEN_NUMBER
;
1103 LocalTokenNumberTable
= mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
1104 SizeTable
= mPcdDatabase
->DxeDb
.Init
.SizeTable
;
1107 LocalTokenNumber
= LocalTokenNumberTable
[LocalTokenNumberTableIdx
];
1109 ASSERT ((LocalTokenNumber
& PCD_DATUM_TYPE_ALL_SET
) == PCD_DATUM_TYPE_POINTER
);
1111 SizeTableIdx
= GetSizeTableIndex (LocalTokenNumberTableIdx
, IsPeiDb
);
1113 MaxSize
= SizeTable
[SizeTableIdx
];
1115 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1118 if (LocalTokenNumber
& PCD_TYPE_VPD
) {
1120 // We shouldn't come here as we don't support SET for VPD
1125 if ((*CurrentSize
> MaxSize
) ||
1126 (*CurrentSize
== MAX_ADDRESS
)) {
1127 *CurrentSize
= MaxSize
;
1131 if ((LocalTokenNumber
& PCD_TYPE_SKU_ENABLED
) == 0) {
1133 // We have only two entry for Non-Sku enabled PCD entry:
1137 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;
1141 // We have these entry for SKU enabled PCD entry
1143 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1145 SkuIdTable
= GetSkuIdArray (LocalTokenNumberTableIdx
, IsPeiDb
);
1146 for (i
= 0; i
< SkuIdTable
[0]; i
++) {
1147 if (SkuIdTable
[1 + i
] == mPcdDatabase
->PeiDb
.Init
.SystemSkuId
) {
1148 SizeTable
[SizeTableIdx
+ 1 + i
] = (SIZE_INFO
) *CurrentSize
;
1152 SizeTable
[SizeTableIdx
+ 1] = (SIZE_INFO
) *CurrentSize
;