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.
21 PCD_PROTOCOL mPcdInstance
= {
54 DxeRegisterCallBackOnSet
,
55 DxeUnRegisterCallBackOnSet
,
61 // Static global to reduce the code size
63 static EFI_HANDLE NewHandle
= NULL
;
68 IN EFI_HANDLE ImageHandle
,
69 IN EFI_SYSTEM_TABLE
*SystemTable
75 // Make sure the Pcd Protocol is not already installed in the system
78 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gPcdProtocolGuid
);
80 BuildPcdDxeDataBase ();
83 // BugBug Check if PcdDatabase is already installed.
86 Status
= gBS
->InstallProtocolInterface (
93 ASSERT_EFI_ERROR (Status
);
106 mPcdDatabase
->PeiDb
.Init
.SystemSkuId
= (SKU_ID
) SkuId
;
119 return *((UINT8
*) GetWorker (TokenNumber
, sizeof (UINT8
)));
130 return ReadUnaligned16 (GetWorker (TokenNumber
, sizeof (UINT16
)));
141 return ReadUnaligned32 (GetWorker (TokenNumber
, sizeof (UINT32
)));
152 return ReadUnaligned64(GetWorker (TokenNumber
, sizeof (UINT64
)));
163 return GetWorker (TokenNumber
, 0);
174 return *((BOOLEAN
*) GetWorker (TokenNumber
, sizeof (BOOLEAN
)));
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 SizeTable
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? mPcdDatabase
->PeiDb
.Init
.SizeTable
:
194 mPcdDatabase
->DxeDb
.Init
.SizeTable
;
197 TokenNumber
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? TokenNumber
: (TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
);
199 return SizeTable
[TokenNumber
];
207 IN CONST EFI_GUID
*Guid
,
208 IN UINTN ExTokenNumber
211 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT8
)));
219 IN CONST EFI_GUID
*Guid
,
220 IN UINTN ExTokenNumber
223 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT16
)));
231 IN CONST EFI_GUID
*Guid
,
232 IN UINTN ExTokenNumber
235 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT32
)));
243 IN CONST EFI_GUID
*Guid
,
244 IN UINTN ExTokenNumber
247 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT64
)));
255 IN CONST EFI_GUID
*Guid
,
256 IN UINTN ExTokenNumber
259 return ExGetWorker (Guid
, ExTokenNumber
, 0);
267 IN CONST EFI_GUID
*Guid
,
268 IN UINTN ExTokenNumber
271 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(BOOLEAN
)));
279 IN CONST EFI_GUID
*Guid
,
280 IN UINTN ExTokenNumber
283 return DxePcdGetSize(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
));
291 IN UINTN TokenNumber
,
295 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
303 IN UINTN TokenNumber
,
307 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
315 IN UINTN TokenNumber
,
319 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
327 IN UINTN TokenNumber
,
331 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
339 IN UINTN TokenNumber
,
340 IN UINTN SizeOfBuffer
,
344 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
352 IN UINTN TokenNumber
,
356 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
364 IN CONST EFI_GUID
*Guid
,
365 IN UINTN ExTokenNumber
,
383 IN CONST EFI_GUID
*Guid
,
384 IN UINTN ExTokenNumber
,
402 IN CONST EFI_GUID
*Guid
,
403 IN UINTN ExTokenNumber
,
421 IN CONST EFI_GUID
*Guid
,
422 IN UINTN ExTokenNumber
,
440 IN CONST EFI_GUID
*Guid
,
441 IN UINTN ExTokenNumber
,
442 IN UINTN SizeOfBuffer
,
460 IN CONST EFI_GUID
*Guid
,
461 IN UINTN ExTokenNumber
,
479 DxeRegisterCallBackOnSet (
480 IN UINTN TokenNumber
,
481 IN CONST EFI_GUID
*Guid
, OPTIONAL
482 IN PCD_PROTOCOL_CALLBACK CallBackFunction
485 ASSERT (CallBackFunction
!= NULL
);
487 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
494 DxeUnRegisterCallBackOnSet (
495 IN UINTN TokenNumber
,
496 IN CONST EFI_GUID
*Guid
, OPTIONAL
497 IN PCD_PROTOCOL_CALLBACK CallBackFunction
500 ASSERT (CallBackFunction
!= NULL
);
502 return DxeUnRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
510 IN CONST EFI_GUID
*Guid
, OPTIONAL
511 IN OUT UINTN
*TokenNumber
517 // Scan the local token space
521 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
524 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
&&
525 *TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) {
527 // The first Non-Ex type Token Number for DXE PCD
528 // database is PEI_LOCAL_TOKEN_NUMBER
530 *TokenNumber
= PEI_LOCAL_TOKEN_NUMBER
;
532 } else if (*TokenNumber
>= DXE_NEX_TOKEN_NUMBER
+ PEI_LOCAL_TOKEN_NUMBER
) {
533 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
539 if (PEI_EXMAP_TABLE_EMPTY
&& PEI_EXMAP_TABLE_EMPTY
) {
540 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
541 return EFI_NOT_FOUND
;
544 ExTokenNumber
= *TokenNumber
;
545 if (!PEI_EXMAP_TABLE_EMPTY
) {
546 ExTokenNumber
= ExGetNextTokeNumber (
549 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
550 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
551 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
552 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
556 if ((ExTokenNumber
== PCD_INVALID_TOKEN_NUMBER
) &&
557 !DXE_EXMAP_TABLE_EMPTY
559 ExTokenNumber
= ExGetNextTokeNumber (
562 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
563 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
564 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
565 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
569 *TokenNumber
= ExTokenNumber
;
576 GetDistinctTokenSpace (
577 IN OUT UINTN
*ExMapTableSize
,
578 IN DYNAMICEX_MAPPING
*ExMapTable
,
579 IN EFI_GUID
*GuidTable
582 EFI_GUID
**DistinctTokenSpace
;
588 DistinctTokenSpace
= AllocateZeroPool (*ExMapTableSize
* sizeof (EFI_GUID
*));
589 ASSERT (DistinctTokenSpace
!= NULL
);
592 OldGuidIndex
= ExMapTable
[0].ExGuidIndex
;
593 DistinctTokenSpace
[TsIdx
] = &GuidTable
[OldGuidIndex
];
594 for (Idx
= 1; Idx
< PEI_EXMAPPING_TABLE_SIZE
; Idx
++) {
595 if (ExMapTable
[Idx
].ExGuidIndex
!= OldGuidIndex
) {
596 OldGuidIndex
= ExMapTable
[Idx
].ExGuidIndex
;
597 DistinctTokenSpace
[++TsIdx
] = &GuidTable
[OldGuidIndex
];
601 *ExMapTableSize
= TsIdx
;
602 return DistinctTokenSpace
;
607 STATIC EFI_GUID
*TmpTokenSpaceBuffer
[PEI_EXMAPPING_TABLE_SIZE
+ DXE_EXMAPPING_TABLE_SIZE
] = { 0 };
611 DxePcdGetNextTokenSpace (
612 IN OUT CONST EFI_GUID
**Guid
618 UINTN PeiTokenSpaceTableSize
;
619 UINTN DxeTokenSpaceTableSize
;
620 EFI_GUID
**PeiTokenSpaceTable
;
621 EFI_GUID
**DxeTokenSpaceTable
;
624 ASSERT (Guid
!= NULL
);
626 if (PEI_EXMAP_TABLE_EMPTY
&& DXE_EXMAP_TABLE_EMPTY
) {
628 return EFI_NOT_FOUND
;
635 if (TmpTokenSpaceBuffer
[0] != NULL
) {
636 PeiTokenSpaceTableSize
= 0;
638 if (!PEI_EXMAP_TABLE_EMPTY
) {
639 PeiTokenSpaceTableSize
= PEI_EXMAPPING_TABLE_SIZE
;
640 PeiTokenSpaceTable
= GetDistinctTokenSpace (&PeiTokenSpaceTableSize
,
641 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
642 mPcdDatabase
->PeiDb
.Init
.GuidTable
644 CopyMem (TmpTokenSpaceBuffer
, PeiTokenSpaceTable
, sizeof (EFI_GUID
*) * PeiTokenSpaceTableSize
);
647 if (!DXE_EXMAP_TABLE_EMPTY
) {
648 DxeTokenSpaceTableSize
= DXE_EXMAPPING_TABLE_SIZE
;
649 DxeTokenSpaceTable
= GetDistinctTokenSpace (&DxeTokenSpaceTableSize
,
650 mPcdDatabase
->DxeDb
.Init
.ExMapTable
,
651 mPcdDatabase
->DxeDb
.Init
.GuidTable
655 // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable
657 for (Idx2
= 0, Idx3
= PeiTokenSpaceTableSize
; Idx2
< DxeTokenSpaceTableSize
; Idx2
++) {
659 for (Idx
= 0; Idx
< PeiTokenSpaceTableSize
; Idx
++) {
660 if (CompareGuid (TmpTokenSpaceBuffer
[Idx
], DxeTokenSpaceTable
[Idx2
])) {
666 TmpTokenSpaceBuffer
[Idx3
++] = DxeTokenSpaceTable
[Idx2
];
673 *Guid
= TmpTokenSpaceBuffer
[0];
677 for (Idx
= 0; Idx
< (PEI_EXMAPPING_TABLE_SIZE
+ DXE_EXMAPPING_TABLE_SIZE
); Idx
++) {
678 if(CompareGuid (*Guid
, TmpTokenSpaceBuffer
[Idx
])) {
680 *Guid
= TmpTokenSpaceBuffer
[Idx
];
685 return EFI_NOT_FOUND
;