mirror of https://github.com/acidanthera/audk.git
Add in GetNextToken and Register Callback Function funtionality for DXE Driver.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@309 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
eebf7983a9
commit
4c114006de
|
@ -51,8 +51,8 @@ PCD_PROTOCOL mPcdInstance = {
|
|||
DxePcdSetPtrEx,
|
||||
DxePcdSetBoolEx,
|
||||
|
||||
PcdRegisterCallBackOnSet,
|
||||
PcdUnRegisterCallBackOnSet,
|
||||
DxeRegisterCallBackOnSet,
|
||||
DxeUnRegisterCallBackOnSet,
|
||||
DxePcdGetNextToken
|
||||
};
|
||||
|
||||
|
@ -103,7 +103,7 @@ DxePcdSetSku (
|
|||
IN SKU_ID SkuId
|
||||
)
|
||||
{
|
||||
gPcdDatabase->PeiDb.Init.SystemSkuId = SkuId;
|
||||
mPcdDatabase->PeiDb.Init.SystemSkuId = SkuId;
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -113,7 +113,7 @@ DxePcdSetSku (
|
|||
UINT8
|
||||
EFIAPI
|
||||
DxePcdGet8 (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber));
|
||||
|
@ -126,7 +126,7 @@ DxePcdGet8 (
|
|||
UINT16
|
||||
EFIAPI
|
||||
DxePcdGet16 (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber));
|
||||
|
@ -139,7 +139,7 @@ DxePcdGet16 (
|
|||
UINT32
|
||||
EFIAPI
|
||||
DxePcdGet32 (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber));
|
||||
|
@ -152,7 +152,7 @@ DxePcdGet32 (
|
|||
UINT64
|
||||
EFIAPI
|
||||
DxePcdGet64 (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber));
|
||||
|
@ -165,7 +165,7 @@ DxePcdGet64 (
|
|||
VOID *
|
||||
EFIAPI
|
||||
DxePcdGetPtr (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
return GetWorker (TokenNumber);
|
||||
|
@ -176,7 +176,7 @@ DxePcdGetPtr (
|
|||
BOOLEAN
|
||||
EFIAPI
|
||||
DxePcdGetBool (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber));
|
||||
|
@ -189,13 +189,13 @@ DxePcdGetBool (
|
|||
UINTN
|
||||
EFIAPI
|
||||
DxePcdGetSize (
|
||||
IN UINTN TokenNumber
|
||||
IN PCD_TOKEN_NUMBER TokenNumber
|
||||
)
|
||||
{
|
||||
UINT16 * SizeTable;
|
||||
|
||||
SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? gPcdDatabase->PeiDb.Init.SizeTable :
|
||||
gPcdDatabase->DxeDb.Init.SizeTable;
|
||||
SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? mPcdDatabase->PeiDb.Init.SizeTable :
|
||||
mPcdDatabase->DxeDb.Init.SizeTable;
|
||||
|
||||
|
||||
TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);
|
||||
|
@ -209,7 +209,7 @@ UINT8
|
|||
EFIAPI
|
||||
DxePcdGet8Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));
|
||||
|
@ -221,7 +221,7 @@ UINT16
|
|||
EFIAPI
|
||||
DxePcdGet16Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));
|
||||
|
@ -233,7 +233,7 @@ UINT32
|
|||
EFIAPI
|
||||
DxePcdGet32Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));
|
||||
|
@ -245,7 +245,7 @@ UINT64
|
|||
EFIAPI
|
||||
DxePcdGet64Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
//
|
||||
|
@ -260,7 +260,7 @@ VOID *
|
|||
EFIAPI
|
||||
DxePcdGetPtrEx (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
return ExGetWorker (Guid, ExTokenNumber, 0);
|
||||
|
@ -272,7 +272,7 @@ BOOLEAN
|
|||
EFIAPI
|
||||
DxePcdGetBoolEx (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));
|
||||
|
@ -284,7 +284,7 @@ UINTN
|
|||
EFIAPI
|
||||
DxePcdGetSizeEx (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber
|
||||
)
|
||||
{
|
||||
EX_PCD_ENTRY_ATTRIBUTE Attr;
|
||||
|
@ -299,7 +299,7 @@ DxePcdGetSizeEx (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet8 (
|
||||
IN UINTN TokenNumber,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN UINT8 Value
|
||||
)
|
||||
{
|
||||
|
@ -311,7 +311,7 @@ DxePcdSet8 (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet16 (
|
||||
IN UINTN TokenNumber,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN UINT16 Value
|
||||
)
|
||||
{
|
||||
|
@ -323,7 +323,7 @@ DxePcdSet16 (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet32 (
|
||||
IN UINTN TokenNumber,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN UINT32 Value
|
||||
)
|
||||
{
|
||||
|
@ -335,7 +335,7 @@ DxePcdSet32 (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet64 (
|
||||
IN UINTN TokenNumber,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN UINT64 Value
|
||||
)
|
||||
{
|
||||
|
@ -347,7 +347,7 @@ DxePcdSet64 (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSetPtr (
|
||||
IN UINTN TokenNumber,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN UINTN SizeOfBuffer,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
|
@ -360,7 +360,7 @@ DxePcdSetPtr (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSetBool (
|
||||
IN UINTN TokenNumber,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN BOOLEAN Value
|
||||
)
|
||||
{
|
||||
|
@ -372,8 +372,8 @@ DxePcdSetBool (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet8Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber,
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN UINT8 Value
|
||||
)
|
||||
{
|
||||
|
@ -391,8 +391,8 @@ DxePcdSet8Ex (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet16Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber,
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN UINT16 Value
|
||||
)
|
||||
{
|
||||
|
@ -410,8 +410,8 @@ DxePcdSet16Ex (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet32Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber,
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN UINT32 Value
|
||||
)
|
||||
{
|
||||
|
@ -429,8 +429,8 @@ DxePcdSet32Ex (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSet64Ex (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber,
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN UINT64 Value
|
||||
)
|
||||
{
|
||||
|
@ -449,7 +449,7 @@ EFI_STATUS
|
|||
EFIAPI
|
||||
DxePcdSetPtrEx (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber,
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN UINTN SizeOfBuffer,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
|
@ -468,8 +468,8 @@ DxePcdSetPtrEx (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSetBoolEx (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN UINTN ExTokenNumber,
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN BOOLEAN Value
|
||||
)
|
||||
{
|
||||
|
@ -487,26 +487,30 @@ DxePcdSetBoolEx (
|
|||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PcdRegisterCallBackOnSet (
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
DxeRegisterCallBackOnSet (
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
)
|
||||
{
|
||||
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE);
|
||||
ASSERT (CallBackFunction != NULL);
|
||||
|
||||
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PcdUnRegisterCallBackOnSet (
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
DxeUnRegisterCallBackOnSet (
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
)
|
||||
{
|
||||
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE);
|
||||
ASSERT (CallBackFunction != NULL);
|
||||
|
||||
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
|
||||
}
|
||||
|
||||
|
||||
|
@ -514,10 +518,65 @@ PcdUnRegisterCallBackOnSet (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdGetNextToken (
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN OUT UINTN *TokenNumber
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN OUT PCD_TOKEN_NUMBER *TokenNumber
|
||||
)
|
||||
{
|
||||
return DxeGetNextTokenWorker (TokenNumber, Guid);
|
||||
PCD_TOKEN_NUMBER ExTokenNumber;
|
||||
|
||||
//
|
||||
// Scan the local token space
|
||||
//
|
||||
if (Guid == NULL) {
|
||||
*TokenNumber++;
|
||||
if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER &&
|
||||
*TokenNumber < PEI_LOCAL_TOKEN_NUMBER) {
|
||||
//
|
||||
// The first Non-Ex type Token Number for DXE PCD
|
||||
// database is PEI_LOCAL_TOKEN_NUMBER
|
||||
//
|
||||
*TokenNumber = PEI_LOCAL_TOKEN_NUMBER;
|
||||
return EFI_SUCCESS;
|
||||
} else if (*TokenNumber >= DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER) {
|
||||
*TokenNumber = PCD_INVALID_TOKEN_NUMBER;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (PEI_EXMAP_TABLE_EMPTY && PEI_EXMAP_TABLE_EMPTY) {
|
||||
*TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
ExTokenNumber = *TokenNumber;
|
||||
if (!PEI_EXMAP_TABLE_EMPTY) {
|
||||
ExTokenNumber = ExGetNextTokeNumber (
|
||||
Guid,
|
||||
ExTokenNumber,
|
||||
mPcdDatabase->PeiDb.Init.GuidTable,
|
||||
sizeof(mPcdDatabase->PeiDb.Init.GuidTable),
|
||||
mPcdDatabase->PeiDb.Init.ExMapTable,
|
||||
sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)
|
||||
);
|
||||
}
|
||||
|
||||
if (!DXE_EXMAP_TABLE_EMPTY) {
|
||||
ExTokenNumber = ExGetNextTokeNumber (
|
||||
Guid,
|
||||
ExTokenNumber,
|
||||
mPcdDatabase->PeiDb.Init.GuidTable,
|
||||
sizeof(mPcdDatabase->PeiDb.Init.GuidTable),
|
||||
mPcdDatabase->PeiDb.Init.ExMapTable,
|
||||
sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)
|
||||
);
|
||||
}
|
||||
|
||||
*TokenNumber = ExTokenNumber;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,13 +22,9 @@ Module Name: Service.c
|
|||
// Compression Algorithm will take care of the size optimization.
|
||||
//
|
||||
|
||||
/*
|
||||
DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {
|
||||
DXE_PCD_DB_INIT_VALUE
|
||||
};
|
||||
*/
|
||||
PCD_DATABASE * mPcdDatabase;
|
||||
|
||||
PCD_DATABASE * gPcdDatabase;
|
||||
LIST_ENTRY mCallbackFnTable[PCD_TOTAL_TOKEN_NUMBER];
|
||||
|
||||
VOID *
|
||||
GetWorkerByLocalTokenNumber (
|
||||
|
@ -54,9 +50,9 @@ GetWorkerByLocalTokenNumber (
|
|||
LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);
|
||||
}
|
||||
|
||||
PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);
|
||||
StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :
|
||||
gPcdDatabase->DxeDb.Init.StringTable;
|
||||
PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
|
||||
StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :
|
||||
mPcdDatabase->DxeDb.Init.StringTable;
|
||||
|
||||
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
|
||||
|
||||
|
@ -66,8 +62,8 @@ GetWorkerByLocalTokenNumber (
|
|||
return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);
|
||||
|
||||
case PCD_TYPE_HII:
|
||||
GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :
|
||||
gPcdDatabase->DxeDb.Init.GuidTable;
|
||||
GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :
|
||||
mPcdDatabase->DxeDb.Init.GuidTable;
|
||||
|
||||
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
|
||||
|
||||
|
@ -112,11 +108,11 @@ GetWorker (
|
|||
|
||||
IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;
|
||||
|
||||
LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
|
||||
gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
|
||||
LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
|
||||
mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
|
||||
|
||||
SizeTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable:
|
||||
gPcdDatabase->DxeDb.Init.SizeTable;
|
||||
SizeTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SizeTable:
|
||||
mPcdDatabase->DxeDb.Init.SizeTable;
|
||||
|
||||
TokenNumber = IsPeiDb ? TokenNumber :
|
||||
TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
|
||||
|
@ -129,23 +125,150 @@ EFI_STATUS
|
|||
DxeRegisterCallBackWorker (
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction,
|
||||
IN BOOLEAN Register
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
)
|
||||
{
|
||||
CALLBACK_FN_ENTRY *FnTableEntry;
|
||||
EX_PCD_ENTRY_ATTRIBUTE ExAttr;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *ListNode;
|
||||
|
||||
if (Guid != NULL) {
|
||||
GetExPcdTokenAttributes (Guid, TokenNumber, &ExAttr);
|
||||
TokenNumber = ExAttr.LocalTokenNumberAlias;
|
||||
}
|
||||
|
||||
ListHead = &mCallbackFnTable[TokenNumber];
|
||||
ListNode = GetFirstNode (ListHead);
|
||||
|
||||
while (ListNode != ListHead) {
|
||||
FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);
|
||||
|
||||
if (FnTableEntry->CallbackFn == CallBackFunction) {
|
||||
//
|
||||
// We only allow a Callback function to be register once
|
||||
// for a TokenNumber. So just return EFI_SUCCESS
|
||||
//
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
ListNode = GetNextNode (ListHead, ListNode);
|
||||
}
|
||||
|
||||
FnTableEntry = AllocatePool (sizeof(CALLBACK_FN_ENTRY));
|
||||
ASSERT (FnTableEntry != NULL);
|
||||
|
||||
FnTableEntry->CallbackFn = CallBackFunction;
|
||||
InsertTailList (ListHead, &FnTableEntry->Node);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
DxeGetNextTokenWorker (
|
||||
IN OUT UINTN *TokenNumber,
|
||||
IN CONST GUID *Guid OPTIONAL
|
||||
DxeUnRegisterCallBackWorker (
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
)
|
||||
{
|
||||
CALLBACK_FN_ENTRY *FnTableEntry;
|
||||
EX_PCD_ENTRY_ATTRIBUTE ExAttr;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *ListNode;
|
||||
|
||||
if (Guid != NULL) {
|
||||
GetExPcdTokenAttributes (Guid, TokenNumber, &ExAttr);
|
||||
TokenNumber = ExAttr.LocalTokenNumberAlias;
|
||||
}
|
||||
|
||||
ListHead = &mCallbackFnTable[TokenNumber];
|
||||
ListNode = GetFirstNode (ListHead);
|
||||
|
||||
while (ListNode != ListHead) {
|
||||
FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);
|
||||
|
||||
if (FnTableEntry->CallbackFn == CallBackFunction) {
|
||||
//
|
||||
// We only allow a Callback function to be register once
|
||||
// for a TokenNumber. So we can safely remove the Node from
|
||||
// the Link List and return EFI_SUCCESS.
|
||||
//
|
||||
RemoveEntryList (ListNode);
|
||||
FreePool (FnTableEntry);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
ListNode = GetNextNode (ListHead, ListNode);
|
||||
}
|
||||
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
|
||||
PCD_TOKEN_NUMBER
|
||||
ExGetNextTokeNumber (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN EFI_GUID *GuidTable,
|
||||
IN UINTN SizeOfGuidTable,
|
||||
IN DYNAMICEX_MAPPING *ExMapTable,
|
||||
IN UINTN SizeOfExMapTable
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
EFI_GUID *MatchGuid;
|
||||
UINTN Idx;
|
||||
UINTN GuidTableIdx;
|
||||
BOOLEAN Found;
|
||||
|
||||
MatchGuid = ScanGuid (GuidTable, SizeOfGuidTable, Guid);
|
||||
if (MatchGuid == NULL) {
|
||||
return PCD_INVALID_TOKEN_NUMBER;
|
||||
}
|
||||
|
||||
Found = FALSE;
|
||||
GuidTableIdx = MatchGuid - GuidTable;
|
||||
for (Idx = 0; Idx < SizeOfExMapTable; Idx++) {
|
||||
if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) {
|
||||
return ExMapTable[Idx].ExTokenNumber;
|
||||
}
|
||||
|
||||
for ( ; Idx < SizeOfExMapTable; Idx++) {
|
||||
if (ExMapTable[Idx].ExTokenNumber == TokenNumber) {
|
||||
Idx++;
|
||||
if (Idx == SizeOfExMapTable) {
|
||||
//
|
||||
// Exceed the length of ExMap Table
|
||||
//
|
||||
return PCD_INVALID_TOKEN_NUMBER;
|
||||
} else if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) {
|
||||
//
|
||||
// Found the next match
|
||||
//
|
||||
return ExMapTable[Idx].ExTokenNumber;
|
||||
} else {
|
||||
//
|
||||
// Guid has been changed. It is the next Token Space Guid.
|
||||
// We should flag no more TokenNumber.
|
||||
//
|
||||
return PCD_INVALID_TOKEN_NUMBER;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return PCD_INVALID_TOKEN_NUMBER;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -156,9 +279,10 @@ BuildPcdDxeDataBase (
|
|||
{
|
||||
PEI_PCD_DATABASE *PeiDatabase;
|
||||
EFI_HOB_GUID_TYPE *GuidHob;
|
||||
UINTN Idx;
|
||||
|
||||
gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));
|
||||
ASSERT (gPcdDatabase != NULL);
|
||||
mPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));
|
||||
ASSERT (mPcdDatabase != NULL);
|
||||
|
||||
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
|
||||
ASSERT (GuidHob != NULL);
|
||||
|
@ -167,12 +291,20 @@ BuildPcdDxeDataBase (
|
|||
//
|
||||
// Copy PCD Entries refereneced in PEI phase to PCD DATABASE
|
||||
//
|
||||
CopyMem (&gPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));
|
||||
CopyMem (&mPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));
|
||||
|
||||
//
|
||||
// Copy PCD Entries with default value to PCD DATABASE
|
||||
//
|
||||
CopyMem (&gPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));
|
||||
CopyMem (&mPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));
|
||||
|
||||
|
||||
//
|
||||
// Initialized the Callback Function Table
|
||||
//
|
||||
for (Idx = 0; Idx < PCD_TOTAL_TOKEN_NUMBER; Idx++) {
|
||||
InitializeListHead (&mCallbackFnTable[Idx]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -233,18 +365,18 @@ GetSkuEnabledTokenNumber (
|
|||
|
||||
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);
|
||||
|
||||
PcdDb = IsPeiDb ? (UINT8 *) &gPcdDatabase->PeiDb : (UINT8 *) &gPcdDatabase->DxeDb;
|
||||
PcdDb = IsPeiDb ? (UINT8 *) &mPcdDatabase->PeiDb : (UINT8 *) &mPcdDatabase->DxeDb;
|
||||
|
||||
SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));
|
||||
Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset);
|
||||
|
||||
PhaseSkuIdTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SkuIdTable :
|
||||
gPcdDatabase->DxeDb.Init.SkuIdTable;
|
||||
PhaseSkuIdTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SkuIdTable :
|
||||
mPcdDatabase->DxeDb.Init.SkuIdTable;
|
||||
|
||||
SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];
|
||||
|
||||
for (i = 0; i < SkuIdTable[0]; i++) {
|
||||
if (gPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {
|
||||
if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -286,6 +418,24 @@ InvokeCallbackOnSet (
|
|||
UINTN Size
|
||||
)
|
||||
{
|
||||
CALLBACK_FN_ENTRY *FnTableEntry;
|
||||
LIST_ENTRY *ListHead;
|
||||
LIST_ENTRY *ListNode;
|
||||
|
||||
ListHead = &mCallbackFnTable[TokenNumber];
|
||||
ListNode = GetFirstNode (ListHead);
|
||||
|
||||
while (ListNode != ListHead) {
|
||||
FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);
|
||||
|
||||
FnTableEntry->CallbackFn(Guid,
|
||||
(Guid == NULL) ? TokenNumber : ExTokenNumber,
|
||||
Data,
|
||||
Size);
|
||||
|
||||
ListNode = GetNextNode (ListHead, ListNode);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -314,8 +464,8 @@ SetWorker (
|
|||
|
||||
IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;
|
||||
|
||||
LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
|
||||
gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
|
||||
LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
|
||||
mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
|
||||
|
||||
TokenNumber = IsPeiDb ? TokenNumber
|
||||
: TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
|
||||
|
@ -406,10 +556,10 @@ SetWorkerByLocalTokenNumber (
|
|||
|
||||
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
|
||||
|
||||
PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);
|
||||
PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
|
||||
|
||||
StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :
|
||||
gPcdDatabase->DxeDb.Init.StringTable;
|
||||
StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :
|
||||
mPcdDatabase->DxeDb.Init.StringTable;
|
||||
|
||||
InternalData = PcdDb + Offset;
|
||||
|
||||
|
@ -426,8 +576,8 @@ SetWorkerByLocalTokenNumber (
|
|||
//
|
||||
// Bug Bug: Please implement this
|
||||
//
|
||||
GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :
|
||||
gPcdDatabase->DxeDb.Init.GuidTable;
|
||||
GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :
|
||||
mPcdDatabase->DxeDb.Init.GuidTable;
|
||||
|
||||
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
|
||||
|
||||
|
@ -542,9 +692,9 @@ GetExPcdTokenAttributes (
|
|||
EFI_GUID *GuidTable;
|
||||
UINT16 *SizeTable;
|
||||
|
||||
ExMap = gPcdDatabase->PeiDb.Init.ExMapTable;
|
||||
GuidTable = gPcdDatabase->PeiDb.Init.GuidTable;
|
||||
SizeTable = gPcdDatabase->PeiDb.Init.SizeTable;
|
||||
ExMap = mPcdDatabase->PeiDb.Init.ExMapTable;
|
||||
GuidTable = mPcdDatabase->PeiDb.Init.GuidTable;
|
||||
SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;
|
||||
|
||||
for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {
|
||||
if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&
|
||||
|
@ -560,9 +710,9 @@ GetExPcdTokenAttributes (
|
|||
}
|
||||
}
|
||||
|
||||
ExMap = gPcdDatabase->DxeDb.Init.ExMapTable;
|
||||
GuidTable = gPcdDatabase->DxeDb.Init.GuidTable;
|
||||
SizeTable = gPcdDatabase->DxeDb.Init.SizeTable;
|
||||
ExMap = mPcdDatabase->DxeDb.Init.ExMapTable;
|
||||
GuidTable = mPcdDatabase->DxeDb.Init.GuidTable;
|
||||
SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;
|
||||
|
||||
for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) {
|
||||
if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&
|
||||
|
|
|
@ -32,6 +32,14 @@ Module Name: Service.h
|
|||
#error "Please make sure the version of PCD Service DXE Driver and PCD DXE Database Generation Tool matches"
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
LIST_ENTRY Node;
|
||||
PCD_PROTOCOL_CALLBACK CallbackFn;
|
||||
} CALLBACK_FN_ENTRY;
|
||||
|
||||
#define CR_FNENTRY_FROM_LISTNODE(Record, Type, Field) _CR(Record, Type, Field)
|
||||
|
||||
//
|
||||
// Internal Functions
|
||||
//
|
||||
|
@ -89,17 +97,17 @@ GetHiiVariable (
|
|||
|
||||
EFI_STATUS
|
||||
DxeRegisterCallBackWorker (
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction,
|
||||
IN BOOLEAN Reigster
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
DxeGetNextTokenWorker (
|
||||
IN OUT UINTN *Token,
|
||||
IN CONST EFI_GUID *Guid OPTIONAL
|
||||
);
|
||||
DxeUnRegisterCallBackWorker (
|
||||
IN UINTN TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
);
|
||||
|
||||
VOID
|
||||
BuildPcdDxeDataBase (
|
||||
|
@ -363,7 +371,7 @@ DxePcdSetPtrEx (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxePcdSetBoolEx (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN BOOLEAN Value
|
||||
)
|
||||
|
@ -373,9 +381,9 @@ DxePcdSetBoolEx (
|
|||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PcdRegisterCallBackOnSet (
|
||||
DxeRegisterCallBackOnSet (
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
)
|
||||
;
|
||||
|
@ -383,7 +391,7 @@ PcdRegisterCallBackOnSet (
|
|||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PcdUnRegisterCallBackOnSet (
|
||||
DxeUnRegisterCallBackOnSet (
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PROTOCOL_CALLBACK CallBackFunction
|
||||
|
@ -409,9 +417,20 @@ SetWorkerByLocalTokenNumber (
|
|||
)
|
||||
;
|
||||
|
||||
PCD_TOKEN_NUMBER
|
||||
ExGetNextTokeNumber (
|
||||
IN CONST EFI_GUID *Guid,
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN EFI_GUID *GuidTable,
|
||||
IN UINTN SizeOfGuidTable,
|
||||
IN DYNAMICEX_MAPPING *ExMapTable,
|
||||
IN UINTN SizeOfExMapTable
|
||||
)
|
||||
;
|
||||
|
||||
extern EFI_GUID gPcdDataBaseHobGuid;
|
||||
|
||||
extern PCD_DATABASE * gPcdDatabase;
|
||||
extern PCD_DATABASE * mPcdDatabase;
|
||||
|
||||
extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ PCD_PPI mPcdPpiInstance = {
|
|||
PeiPcdSetPtrEx,
|
||||
PeiPcdSetBoolEx,
|
||||
|
||||
PcdRegisterCallBackOnSet,
|
||||
PeiRegisterCallBackOnSet,
|
||||
PcdUnRegisterCallBackOnSet,
|
||||
PeiPcdGetNextToken
|
||||
};
|
||||
|
@ -454,12 +454,14 @@ PeiPcdSetBoolEx (
|
|||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PcdRegisterCallBackOnSet (
|
||||
PeiRegisterCallBackOnSet (
|
||||
IN PCD_TOKEN_NUMBER ExTokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PPI_CALLBACK CallBackFunction
|
||||
)
|
||||
{
|
||||
ASSERT (CallBackFunction != NULL);
|
||||
|
||||
return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);
|
||||
}
|
||||
|
||||
|
@ -473,6 +475,8 @@ PcdUnRegisterCallBackOnSet (
|
|||
IN PCD_PPI_CALLBACK CallBackFunction
|
||||
)
|
||||
{
|
||||
ASSERT (CallBackFunction != NULL);
|
||||
|
||||
return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);
|
||||
}
|
||||
|
||||
|
@ -482,7 +486,7 @@ EFI_STATUS
|
|||
EFIAPI
|
||||
PeiPcdGetNextToken (
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN OUT PCD_TOKEN_NUMBER *TokenNumber
|
||||
IN OUT PCD_TOKEN_NUMBER *TokenNumber
|
||||
)
|
||||
{
|
||||
UINTN GuidTableIdx;
|
||||
|
|
|
@ -358,7 +358,7 @@ PeiPcdSetBoolEx (
|
|||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PcdRegisterCallBackOnSet (
|
||||
PeiRegisterCallBackOnSet (
|
||||
IN PCD_TOKEN_NUMBER TokenNumber,
|
||||
IN CONST EFI_GUID *Guid, OPTIONAL
|
||||
IN PCD_PPI_CALLBACK CallBackFunction
|
||||
|
|
|
@ -711,7 +711,7 @@ class PcdDatabase {
|
|||
|
||||
private void getTwoGroupsOfTokens (ArrayList<Token> alTokens, List<Token> initTokens, List<Token> uninitTokens) {
|
||||
for (int i = 0; i < alTokens.size(); i++) {
|
||||
Token t = (Token)alTokens.get(i);
|
||||
Token t = alTokens.get(i);
|
||||
if (t.hasDefaultValue()) {
|
||||
initTokens.add(t);
|
||||
} else {
|
||||
|
@ -789,16 +789,14 @@ class PcdDatabase {
|
|||
// PEI_PCD_DATABASE_INIT
|
||||
//
|
||||
java.util.Comparator<Token> comparator = new AlignmentSizeComp();
|
||||
List<Token> list = initTokens;
|
||||
java.util.Collections.sort(list, comparator);
|
||||
java.util.Collections.sort(initTokens, comparator);
|
||||
initCode = processTokens(initTokens);
|
||||
|
||||
//
|
||||
// Generate Structure Declaration for PcdTokens without Default Value
|
||||
// PEI_PCD_DATABASE_UNINIT
|
||||
//
|
||||
list = uninitTokens;
|
||||
java.util.Collections.sort(list, comparator);
|
||||
java.util.Collections.sort(uninitTokens, comparator);
|
||||
uninitCode = processTokens(uninitTokens);
|
||||
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue