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
,
57 DxePcdGetNextTokenSpace
62 // Static global to reduce the code size
64 static EFI_HANDLE NewHandle
= NULL
;
69 IN EFI_HANDLE ImageHandle
,
70 IN EFI_SYSTEM_TABLE
*SystemTable
76 // Make sure the Pcd Protocol is not already installed in the system
79 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gPcdProtocolGuid
);
81 BuildPcdDxeDataBase ();
84 // BugBug Check if PcdDatabase is already installed.
87 Status
= gBS
->InstallProtocolInterface (
94 ASSERT_EFI_ERROR (Status
);
107 mPcdDatabase
->PeiDb
.Init
.SystemSkuId
= (SKU_ID
) SkuId
;
120 return *((UINT8
*) GetWorker (TokenNumber
, sizeof (UINT8
)));
131 return ReadUnaligned16 (GetWorker (TokenNumber
, sizeof (UINT16
)));
142 return ReadUnaligned32 (GetWorker (TokenNumber
, sizeof (UINT32
)));
153 return ReadUnaligned64(GetWorker (TokenNumber
, sizeof (UINT64
)));
164 return GetWorker (TokenNumber
, 0);
175 return *((BOOLEAN
*) GetWorker (TokenNumber
, sizeof (BOOLEAN
)));
187 UINT32
*LocalTokenNumberTable
;
190 UINTN TmpTokenNumber
;
192 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
193 // We have to decrement TokenNumber by 1 to make it usable
194 // as the array index.
199 // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber
201 TmpTokenNumber
= TokenNumber
;
203 ASSERT (TokenNumber
< PCD_TOTAL_TOKEN_NUMBER
);
205 IsPeiDb
= (BOOLEAN
) (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
207 TokenNumber
= IsPeiDb
? TokenNumber
:
208 (TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
);
210 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
211 : mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
213 Size
= (LocalTokenNumberTable
[TokenNumber
] & PCD_DATUM_TYPE_ALL_SET
) >> PCD_DATUM_TYPE_SHIFT
;
217 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
219 return GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
231 IN CONST EFI_GUID
*Guid
,
232 IN UINTN ExTokenNumber
235 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT8
)));
243 IN CONST EFI_GUID
*Guid
,
244 IN UINTN ExTokenNumber
247 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT16
)));
255 IN CONST EFI_GUID
*Guid
,
256 IN UINTN ExTokenNumber
259 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT32
)));
267 IN CONST EFI_GUID
*Guid
,
268 IN UINTN ExTokenNumber
271 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT64
)));
279 IN CONST EFI_GUID
*Guid
,
280 IN UINTN ExTokenNumber
283 return ExGetWorker (Guid
, ExTokenNumber
, 0);
291 IN CONST EFI_GUID
*Guid
,
292 IN UINTN ExTokenNumber
295 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(BOOLEAN
)));
303 IN CONST EFI_GUID
*Guid
,
304 IN UINTN ExTokenNumber
307 return DxePcdGetSize(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
));
315 IN UINTN TokenNumber
,
319 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
327 IN UINTN TokenNumber
,
331 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
339 IN UINTN TokenNumber
,
343 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
351 IN UINTN TokenNumber
,
355 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
363 IN UINTN TokenNumber
,
364 IN OUT UINTN
*SizeOfBuffer
,
368 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
376 IN UINTN TokenNumber
,
380 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
388 IN CONST EFI_GUID
*Guid
,
389 IN UINTN ExTokenNumber
,
393 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
401 IN CONST EFI_GUID
*Guid
,
402 IN UINTN ExTokenNumber
,
406 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
414 IN CONST EFI_GUID
*Guid
,
415 IN UINTN ExTokenNumber
,
419 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
427 IN CONST EFI_GUID
*Guid
,
428 IN UINTN ExTokenNumber
,
432 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
440 IN CONST EFI_GUID
*Guid
,
441 IN UINTN ExTokenNumber
,
442 IN OUT UINTN
*SizeOfBuffer
,
446 return ExSetWorker(ExTokenNumber
, Guid
, Buffer
, SizeOfBuffer
, TRUE
);
454 IN CONST EFI_GUID
*Guid
,
455 IN UINTN ExTokenNumber
,
459 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
467 DxeRegisterCallBackOnSet (
468 IN UINTN TokenNumber
,
469 IN CONST EFI_GUID
*Guid
, OPTIONAL
470 IN PCD_PROTOCOL_CALLBACK CallBackFunction
473 ASSERT (CallBackFunction
!= NULL
);
475 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
482 DxeUnRegisterCallBackOnSet (
483 IN UINTN TokenNumber
,
484 IN CONST EFI_GUID
*Guid
, OPTIONAL
485 IN PCD_PROTOCOL_CALLBACK CallBackFunction
488 ASSERT (CallBackFunction
!= NULL
);
490 return DxeUnRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
498 IN CONST EFI_GUID
*Guid
, OPTIONAL
499 IN OUT UINTN
*TokenNumber
505 // Scan the local token space
509 if (*TokenNumber
> PEI_NEX_TOKEN_NUMBER
&&
510 *TokenNumber
<= PEI_LOCAL_TOKEN_NUMBER
) {
512 // The first Non-Ex type Token Number for DXE PCD
513 // database is PEI_LOCAL_TOKEN_NUMBER
515 *TokenNumber
= PEI_LOCAL_TOKEN_NUMBER
;
516 } else if (*TokenNumber
> DXE_NEX_TOKEN_NUMBER
+ PEI_LOCAL_TOKEN_NUMBER
) {
517 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
522 if (PEI_EXMAP_TABLE_EMPTY
&& DXE_EXMAP_TABLE_EMPTY
) {
523 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
524 return EFI_NOT_FOUND
;
527 if (!PEI_EXMAP_TABLE_EMPTY
) {
528 ExTokenNumber
= *TokenNumber
;
529 ExTokenNumber
= ExGetNextTokeNumber (
532 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
533 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
534 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
535 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
539 if ((ExTokenNumber
== PCD_INVALID_TOKEN_NUMBER
) &&
540 !DXE_EXMAP_TABLE_EMPTY
542 ExTokenNumber
= *TokenNumber
;
543 ExTokenNumber
= ExGetNextTokeNumber (
546 mPcdDatabase
->DxeDb
.Init
.GuidTable
,
547 sizeof(mPcdDatabase
->DxeDb
.Init
.GuidTable
),
548 mPcdDatabase
->DxeDb
.Init
.ExMapTable
,
549 sizeof(mPcdDatabase
->DxeDb
.Init
.ExMapTable
)
553 *TokenNumber
= ExTokenNumber
;
560 GetDistinctTokenSpace (
561 IN OUT UINTN
*ExMapTableSize
,
562 IN DYNAMICEX_MAPPING
*ExMapTable
,
563 IN EFI_GUID
*GuidTable
566 EFI_GUID
**DistinctTokenSpace
;
572 DistinctTokenSpace
= AllocateZeroPool (*ExMapTableSize
* sizeof (EFI_GUID
*));
573 ASSERT (DistinctTokenSpace
!= NULL
);
576 OldGuidIndex
= ExMapTable
[0].ExGuidIndex
;
577 DistinctTokenSpace
[TsIdx
] = &GuidTable
[OldGuidIndex
];
578 for (Idx
= 1; Idx
< *ExMapTableSize
; Idx
++) {
579 if (ExMapTable
[Idx
].ExGuidIndex
!= OldGuidIndex
) {
580 OldGuidIndex
= ExMapTable
[Idx
].ExGuidIndex
;
581 DistinctTokenSpace
[++TsIdx
] = &GuidTable
[OldGuidIndex
];
586 // The total number of Distinct Token Space
587 // is TsIdx + 1 because we use TsIdx as a index
588 // to the DistinctTokenSpace[]
590 *ExMapTableSize
= TsIdx
+ 1;
591 return DistinctTokenSpace
;
596 // Just pre-allocate a memory buffer that is big enough to
597 // host all distinct TokenSpace guid in both
598 // PEI ExMap and DXE ExMap.
600 STATIC EFI_GUID
*TmpTokenSpaceBuffer
[PEI_EXMAPPING_TABLE_SIZE
+ DXE_EXMAPPING_TABLE_SIZE
] = { 0 };
604 DxePcdGetNextTokenSpace (
605 IN OUT CONST EFI_GUID
**Guid
611 UINTN PeiTokenSpaceTableSize
;
612 UINTN DxeTokenSpaceTableSize
;
613 EFI_GUID
**PeiTokenSpaceTable
;
614 EFI_GUID
**DxeTokenSpaceTable
;
617 ASSERT (Guid
!= NULL
);
619 if (PEI_EXMAP_TABLE_EMPTY
&& DXE_EXMAP_TABLE_EMPTY
) {
621 return EFI_NOT_FOUND
;
628 if (TmpTokenSpaceBuffer
[0] == NULL
) {
629 PeiTokenSpaceTableSize
= 0;
631 if (!PEI_EXMAP_TABLE_EMPTY
) {
632 PeiTokenSpaceTableSize
= PEI_EXMAPPING_TABLE_SIZE
;
633 PeiTokenSpaceTable
= GetDistinctTokenSpace (&PeiTokenSpaceTableSize
,
634 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
635 mPcdDatabase
->PeiDb
.Init
.GuidTable
637 CopyMem (TmpTokenSpaceBuffer
, PeiTokenSpaceTable
, sizeof (EFI_GUID
*) * PeiTokenSpaceTableSize
);
640 if (!DXE_EXMAP_TABLE_EMPTY
) {
641 DxeTokenSpaceTableSize
= DXE_EXMAPPING_TABLE_SIZE
;
642 DxeTokenSpaceTable
= GetDistinctTokenSpace (&DxeTokenSpaceTableSize
,
643 mPcdDatabase
->DxeDb
.Init
.ExMapTable
,
644 mPcdDatabase
->DxeDb
.Init
.GuidTable
648 // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable
650 for (Idx2
= 0, Idx3
= PeiTokenSpaceTableSize
; Idx2
< DxeTokenSpaceTableSize
; Idx2
++) {
652 for (Idx
= 0; Idx
< PeiTokenSpaceTableSize
; Idx
++) {
653 if (CompareGuid (TmpTokenSpaceBuffer
[Idx
], DxeTokenSpaceTable
[Idx2
])) {
659 TmpTokenSpaceBuffer
[Idx3
++] = DxeTokenSpaceTable
[Idx2
];
666 *Guid
= TmpTokenSpaceBuffer
[0];
670 for (Idx
= 0; Idx
< (PEI_EXMAPPING_TABLE_SIZE
+ DXE_EXMAPPING_TABLE_SIZE
); Idx
++) {
671 if(CompareGuid (*Guid
, TmpTokenSpaceBuffer
[Idx
])) {
673 *Guid
= TmpTokenSpaceBuffer
[Idx
];
678 return EFI_NOT_FOUND
;