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
)));
186 UINT32
*LocalTokenNumberTable
;
189 UINTN TmpTokenNumber
;
191 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
192 // We have to decrement TokenNumber by 1 to make it usable
193 // as the array index.
198 // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber
200 TmpTokenNumber
= TokenNumber
;
202 ASSERT (TokenNumber
< PCD_TOTAL_TOKEN_NUMBER
);
204 IsPeiDb
= (BOOLEAN
) (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
206 TokenNumber
= IsPeiDb
? TokenNumber
:
207 (TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
);
209 LocalTokenNumberTable
= IsPeiDb
? mPcdDatabase
->PeiDb
.Init
.LocalTokenNumberTable
210 : mPcdDatabase
->DxeDb
.Init
.LocalTokenNumberTable
;
212 Size
= (LocalTokenNumberTable
[TokenNumber
] & PCD_DATUM_TYPE_ALL_SET
) >> PCD_DATUM_TYPE_SHIFT
;
216 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
218 return GetPtrTypeSize (TmpTokenNumber
, &MaxSize
);
230 IN CONST EFI_GUID
*Guid
,
231 IN UINTN ExTokenNumber
234 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT8
)));
242 IN CONST EFI_GUID
*Guid
,
243 IN UINTN ExTokenNumber
246 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT16
)));
254 IN CONST EFI_GUID
*Guid
,
255 IN UINTN ExTokenNumber
258 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT32
)));
266 IN CONST EFI_GUID
*Guid
,
267 IN UINTN ExTokenNumber
270 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT64
)));
278 IN CONST EFI_GUID
*Guid
,
279 IN UINTN ExTokenNumber
282 return ExGetWorker (Guid
, ExTokenNumber
, 0);
290 IN CONST EFI_GUID
*Guid
,
291 IN UINTN ExTokenNumber
294 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(BOOLEAN
)));
302 IN CONST EFI_GUID
*Guid
,
303 IN UINTN ExTokenNumber
306 return DxePcdGetSize(GetExPcdTokenNumber (Guid
, (UINT32
) ExTokenNumber
));
314 IN UINTN TokenNumber
,
318 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
326 IN UINTN TokenNumber
,
330 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
338 IN UINTN TokenNumber
,
342 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
350 IN UINTN TokenNumber
,
354 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
362 IN UINTN TokenNumber
,
363 IN OUT UINTN
*SizeOfBuffer
,
367 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
375 IN UINTN TokenNumber
,
379 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
387 IN CONST EFI_GUID
*Guid
,
388 IN UINTN ExTokenNumber
,
392 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
400 IN CONST EFI_GUID
*Guid
,
401 IN UINTN ExTokenNumber
,
405 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
413 IN CONST EFI_GUID
*Guid
,
414 IN UINTN ExTokenNumber
,
418 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
426 IN CONST EFI_GUID
*Guid
,
427 IN UINTN ExTokenNumber
,
431 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
439 IN CONST EFI_GUID
*Guid
,
440 IN UINTN ExTokenNumber
,
441 IN OUT UINTN
*SizeOfBuffer
,
445 return ExSetWorker(ExTokenNumber
, Guid
, Buffer
, SizeOfBuffer
, TRUE
);
453 IN CONST EFI_GUID
*Guid
,
454 IN UINTN ExTokenNumber
,
458 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
466 DxeRegisterCallBackOnSet (
467 IN UINTN TokenNumber
,
468 IN CONST EFI_GUID
*Guid
, OPTIONAL
469 IN PCD_PROTOCOL_CALLBACK CallBackFunction
472 ASSERT (CallBackFunction
!= NULL
);
474 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
481 DxeUnRegisterCallBackOnSet (
482 IN UINTN TokenNumber
,
483 IN CONST EFI_GUID
*Guid
, OPTIONAL
484 IN PCD_PROTOCOL_CALLBACK CallBackFunction
487 ASSERT (CallBackFunction
!= NULL
);
489 return DxeUnRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
497 IN CONST EFI_GUID
*Guid
, OPTIONAL
498 IN OUT UINTN
*TokenNumber
504 // Scan the local token space
508 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
511 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
&&
512 *TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) {
514 // The first Non-Ex type Token Number for DXE PCD
515 // database is PEI_LOCAL_TOKEN_NUMBER
517 *TokenNumber
= PEI_LOCAL_TOKEN_NUMBER
;
519 } else if (*TokenNumber
>= DXE_NEX_TOKEN_NUMBER
+ PEI_LOCAL_TOKEN_NUMBER
) {
520 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
526 if (PEI_EXMAP_TABLE_EMPTY
&& PEI_EXMAP_TABLE_EMPTY
) {
527 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
528 return EFI_NOT_FOUND
;
531 ExTokenNumber
= *TokenNumber
;
532 if (!PEI_EXMAP_TABLE_EMPTY
) {
533 ExTokenNumber
= ExGetNextTokeNumber (
536 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
537 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
538 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
539 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
543 if ((ExTokenNumber
== PCD_INVALID_TOKEN_NUMBER
) &&
544 !DXE_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 *TokenNumber
= ExTokenNumber
;
563 GetDistinctTokenSpace (
564 IN OUT UINTN
*ExMapTableSize
,
565 IN DYNAMICEX_MAPPING
*ExMapTable
,
566 IN EFI_GUID
*GuidTable
569 EFI_GUID
**DistinctTokenSpace
;
575 DistinctTokenSpace
= AllocateZeroPool (*ExMapTableSize
* sizeof (EFI_GUID
*));
576 ASSERT (DistinctTokenSpace
!= NULL
);
579 OldGuidIndex
= ExMapTable
[0].ExGuidIndex
;
580 DistinctTokenSpace
[TsIdx
] = &GuidTable
[OldGuidIndex
];
581 for (Idx
= 1; Idx
< PEI_EXMAPPING_TABLE_SIZE
; Idx
++) {
582 if (ExMapTable
[Idx
].ExGuidIndex
!= OldGuidIndex
) {
583 OldGuidIndex
= ExMapTable
[Idx
].ExGuidIndex
;
584 DistinctTokenSpace
[++TsIdx
] = &GuidTable
[OldGuidIndex
];
588 *ExMapTableSize
= TsIdx
;
589 return DistinctTokenSpace
;
594 STATIC EFI_GUID
*TmpTokenSpaceBuffer
[PEI_EXMAPPING_TABLE_SIZE
+ DXE_EXMAPPING_TABLE_SIZE
] = { 0 };
598 DxePcdGetNextTokenSpace (
599 IN OUT CONST EFI_GUID
**Guid
605 UINTN PeiTokenSpaceTableSize
;
606 UINTN DxeTokenSpaceTableSize
;
607 EFI_GUID
**PeiTokenSpaceTable
;
608 EFI_GUID
**DxeTokenSpaceTable
;
611 ASSERT (Guid
!= NULL
);
613 if (PEI_EXMAP_TABLE_EMPTY
&& DXE_EXMAP_TABLE_EMPTY
) {
615 return EFI_NOT_FOUND
;
622 if (TmpTokenSpaceBuffer
[0] != NULL
) {
623 PeiTokenSpaceTableSize
= 0;
625 if (!PEI_EXMAP_TABLE_EMPTY
) {
626 PeiTokenSpaceTableSize
= PEI_EXMAPPING_TABLE_SIZE
;
627 PeiTokenSpaceTable
= GetDistinctTokenSpace (&PeiTokenSpaceTableSize
,
628 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
629 mPcdDatabase
->PeiDb
.Init
.GuidTable
631 CopyMem (TmpTokenSpaceBuffer
, PeiTokenSpaceTable
, sizeof (EFI_GUID
*) * PeiTokenSpaceTableSize
);
634 if (!DXE_EXMAP_TABLE_EMPTY
) {
635 DxeTokenSpaceTableSize
= DXE_EXMAPPING_TABLE_SIZE
;
636 DxeTokenSpaceTable
= GetDistinctTokenSpace (&DxeTokenSpaceTableSize
,
637 mPcdDatabase
->DxeDb
.Init
.ExMapTable
,
638 mPcdDatabase
->DxeDb
.Init
.GuidTable
642 // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable
644 for (Idx2
= 0, Idx3
= PeiTokenSpaceTableSize
; Idx2
< DxeTokenSpaceTableSize
; Idx2
++) {
646 for (Idx
= 0; Idx
< PeiTokenSpaceTableSize
; Idx
++) {
647 if (CompareGuid (TmpTokenSpaceBuffer
[Idx
], DxeTokenSpaceTable
[Idx2
])) {
653 TmpTokenSpaceBuffer
[Idx3
++] = DxeTokenSpaceTable
[Idx2
];
660 *Guid
= TmpTokenSpaceBuffer
[0];
664 for (Idx
= 0; Idx
< (PEI_EXMAPPING_TABLE_SIZE
+ DXE_EXMAPPING_TABLE_SIZE
); Idx
++) {
665 if(CompareGuid (*Guid
, TmpTokenSpaceBuffer
[Idx
])) {
667 *Guid
= TmpTokenSpaceBuffer
[Idx
];
672 return EFI_NOT_FOUND
;