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:
qwang12 2006-05-29 01:48:32 +00:00
parent eebf7983a9
commit 4c114006de
6 changed files with 341 additions and 111 deletions

View File

@ -51,8 +51,8 @@ PCD_PROTOCOL mPcdInstance = {
DxePcdSetPtrEx, DxePcdSetPtrEx,
DxePcdSetBoolEx, DxePcdSetBoolEx,
PcdRegisterCallBackOnSet, DxeRegisterCallBackOnSet,
PcdUnRegisterCallBackOnSet, DxeUnRegisterCallBackOnSet,
DxePcdGetNextToken DxePcdGetNextToken
}; };
@ -103,7 +103,7 @@ DxePcdSetSku (
IN SKU_ID SkuId IN SKU_ID SkuId
) )
{ {
gPcdDatabase->PeiDb.Init.SystemSkuId = SkuId; mPcdDatabase->PeiDb.Init.SystemSkuId = SkuId;
return; return;
} }
@ -113,7 +113,7 @@ DxePcdSetSku (
UINT8 UINT8
EFIAPI EFIAPI
DxePcdGet8 ( DxePcdGet8 (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber)); ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber));
@ -126,7 +126,7 @@ DxePcdGet8 (
UINT16 UINT16
EFIAPI EFIAPI
DxePcdGet16 ( DxePcdGet16 (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber)); ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber));
@ -139,7 +139,7 @@ DxePcdGet16 (
UINT32 UINT32
EFIAPI EFIAPI
DxePcdGet32 ( DxePcdGet32 (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber)); ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber));
@ -152,7 +152,7 @@ DxePcdGet32 (
UINT64 UINT64
EFIAPI EFIAPI
DxePcdGet64 ( DxePcdGet64 (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber)); ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber));
@ -165,7 +165,7 @@ DxePcdGet64 (
VOID * VOID *
EFIAPI EFIAPI
DxePcdGetPtr ( DxePcdGetPtr (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
return GetWorker (TokenNumber); return GetWorker (TokenNumber);
@ -176,7 +176,7 @@ DxePcdGetPtr (
BOOLEAN BOOLEAN
EFIAPI EFIAPI
DxePcdGetBool ( DxePcdGetBool (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber)); ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber));
@ -189,13 +189,13 @@ DxePcdGetBool (
UINTN UINTN
EFIAPI EFIAPI
DxePcdGetSize ( DxePcdGetSize (
IN UINTN TokenNumber IN PCD_TOKEN_NUMBER TokenNumber
) )
{ {
UINT16 * SizeTable; UINT16 * SizeTable;
SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? gPcdDatabase->PeiDb.Init.SizeTable : SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? mPcdDatabase->PeiDb.Init.SizeTable :
gPcdDatabase->DxeDb.Init.SizeTable; mPcdDatabase->DxeDb.Init.SizeTable;
TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER); TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);
@ -209,7 +209,7 @@ UINT8
EFIAPI EFIAPI
DxePcdGet8Ex ( DxePcdGet8Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8))); return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));
@ -221,7 +221,7 @@ UINT16
EFIAPI EFIAPI
DxePcdGet16Ex ( DxePcdGet16Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16))); return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));
@ -233,7 +233,7 @@ UINT32
EFIAPI EFIAPI
DxePcdGet32Ex ( DxePcdGet32Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32))); return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));
@ -245,7 +245,7 @@ UINT64
EFIAPI EFIAPI
DxePcdGet64Ex ( DxePcdGet64Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
// //
@ -260,7 +260,7 @@ VOID *
EFIAPI EFIAPI
DxePcdGetPtrEx ( DxePcdGetPtrEx (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
return ExGetWorker (Guid, ExTokenNumber, 0); return ExGetWorker (Guid, ExTokenNumber, 0);
@ -272,7 +272,7 @@ BOOLEAN
EFIAPI EFIAPI
DxePcdGetBoolEx ( DxePcdGetBoolEx (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN))); return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));
@ -284,7 +284,7 @@ UINTN
EFIAPI EFIAPI
DxePcdGetSizeEx ( DxePcdGetSizeEx (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber IN PCD_TOKEN_NUMBER ExTokenNumber
) )
{ {
EX_PCD_ENTRY_ATTRIBUTE Attr; EX_PCD_ENTRY_ATTRIBUTE Attr;
@ -299,7 +299,7 @@ DxePcdGetSizeEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet8 ( DxePcdSet8 (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN UINT8 Value IN UINT8 Value
) )
{ {
@ -311,7 +311,7 @@ DxePcdSet8 (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet16 ( DxePcdSet16 (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN UINT16 Value IN UINT16 Value
) )
{ {
@ -323,7 +323,7 @@ DxePcdSet16 (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet32 ( DxePcdSet32 (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN UINT32 Value IN UINT32 Value
) )
{ {
@ -335,7 +335,7 @@ DxePcdSet32 (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet64 ( DxePcdSet64 (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN UINT64 Value IN UINT64 Value
) )
{ {
@ -347,7 +347,7 @@ DxePcdSet64 (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSetPtr ( DxePcdSetPtr (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN UINTN SizeOfBuffer, IN UINTN SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
@ -360,7 +360,7 @@ DxePcdSetPtr (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSetBool ( DxePcdSetBool (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN BOOLEAN Value IN BOOLEAN Value
) )
{ {
@ -372,8 +372,8 @@ DxePcdSetBool (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet8Ex ( DxePcdSet8Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN UINT8 Value IN UINT8 Value
) )
{ {
@ -391,8 +391,8 @@ DxePcdSet8Ex (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet16Ex ( DxePcdSet16Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN UINT16 Value IN UINT16 Value
) )
{ {
@ -410,8 +410,8 @@ DxePcdSet16Ex (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet32Ex ( DxePcdSet32Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN UINT32 Value IN UINT32 Value
) )
{ {
@ -429,8 +429,8 @@ DxePcdSet32Ex (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSet64Ex ( DxePcdSet64Ex (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN UINT64 Value IN UINT64 Value
) )
{ {
@ -449,7 +449,7 @@ EFI_STATUS
EFIAPI EFIAPI
DxePcdSetPtrEx ( DxePcdSetPtrEx (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN UINTN SizeOfBuffer, IN UINTN SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
@ -468,8 +468,8 @@ DxePcdSetPtrEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSetBoolEx ( DxePcdSetBoolEx (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN BOOLEAN Value IN BOOLEAN Value
) )
{ {
@ -487,26 +487,30 @@ DxePcdSetBoolEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PcdRegisterCallBackOnSet ( DxeRegisterCallBackOnSet (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction IN PCD_PROTOCOL_CALLBACK CallBackFunction
) )
{ {
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE); ASSERT (CallBackFunction != NULL);
return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PcdUnRegisterCallBackOnSet ( DxeUnRegisterCallBackOnSet (
IN UINTN TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction 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 EFI_STATUS
EFIAPI EFIAPI
DxePcdGetNextToken ( DxePcdGetNextToken (
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN OUT UINTN *TokenNumber 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;
} }

View File

@ -22,13 +22,9 @@ Module Name: Service.c
// Compression Algorithm will take care of the size optimization. // Compression Algorithm will take care of the size optimization.
// //
/* PCD_DATABASE * mPcdDatabase;
DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {
DXE_PCD_DB_INIT_VALUE
};
*/
PCD_DATABASE * gPcdDatabase; LIST_ENTRY mCallbackFnTable[PCD_TOTAL_TOKEN_NUMBER];
VOID * VOID *
GetWorkerByLocalTokenNumber ( GetWorkerByLocalTokenNumber (
@ -54,9 +50,9 @@ GetWorkerByLocalTokenNumber (
LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb); LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);
} }
PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb); PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable : StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :
gPcdDatabase->DxeDb.Init.StringTable; mPcdDatabase->DxeDb.Init.StringTable;
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK; Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
@ -66,8 +62,8 @@ GetWorkerByLocalTokenNumber (
return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);
case PCD_TYPE_HII: case PCD_TYPE_HII:
GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable : GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :
gPcdDatabase->DxeDb.Init.GuidTable; mPcdDatabase->DxeDb.Init.GuidTable;
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset); VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
@ -112,11 +108,11 @@ GetWorker (
IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;
LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
gPcdDatabase->DxeDb.Init.LocalTokenNumberTable; mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
SizeTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable: SizeTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SizeTable:
gPcdDatabase->DxeDb.Init.SizeTable; mPcdDatabase->DxeDb.Init.SizeTable;
TokenNumber = IsPeiDb ? TokenNumber : TokenNumber = IsPeiDb ? TokenNumber :
TokenNumber - PEI_LOCAL_TOKEN_NUMBER; TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
@ -129,23 +125,150 @@ EFI_STATUS
DxeRegisterCallBackWorker ( DxeRegisterCallBackWorker (
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN CONST GUID *Guid, OPTIONAL IN CONST GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction, IN PCD_PROTOCOL_CALLBACK CallBackFunction
IN BOOLEAN Register
) )
{ {
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; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
DxeGetNextTokenWorker ( DxeUnRegisterCallBackWorker (
IN OUT UINTN *TokenNumber, IN UINTN TokenNumber,
IN CONST GUID *Guid OPTIONAL 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; PEI_PCD_DATABASE *PeiDatabase;
EFI_HOB_GUID_TYPE *GuidHob; EFI_HOB_GUID_TYPE *GuidHob;
UINTN Idx;
gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE)); mPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));
ASSERT (gPcdDatabase != NULL); ASSERT (mPcdDatabase != NULL);
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid); GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL); ASSERT (GuidHob != NULL);
@ -167,12 +291,20 @@ BuildPcdDxeDataBase (
// //
// Copy PCD Entries refereneced in PEI phase to PCD DATABASE // 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 // 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; return;
} }
@ -233,18 +365,18 @@ GetSkuEnabledTokenNumber (
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0); 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)); SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));
Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset);
PhaseSkuIdTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SkuIdTable : PhaseSkuIdTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SkuIdTable :
gPcdDatabase->DxeDb.Init.SkuIdTable; mPcdDatabase->DxeDb.Init.SkuIdTable;
SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset]; SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];
for (i = 0; i < SkuIdTable[0]; i++) { for (i = 0; i < SkuIdTable[0]; i++) {
if (gPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) { if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {
break; break;
} }
} }
@ -286,6 +418,24 @@ InvokeCallbackOnSet (
UINTN Size 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; return;
} }
@ -314,8 +464,8 @@ SetWorker (
IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;
LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
gPcdDatabase->DxeDb.Init.LocalTokenNumberTable; mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
TokenNumber = IsPeiDb ? TokenNumber TokenNumber = IsPeiDb ? TokenNumber
: TokenNumber - PEI_LOCAL_TOKEN_NUMBER; : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
@ -406,10 +556,10 @@ SetWorkerByLocalTokenNumber (
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK; 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 : StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :
gPcdDatabase->DxeDb.Init.StringTable; mPcdDatabase->DxeDb.Init.StringTable;
InternalData = PcdDb + Offset; InternalData = PcdDb + Offset;
@ -426,8 +576,8 @@ SetWorkerByLocalTokenNumber (
// //
// Bug Bug: Please implement this // Bug Bug: Please implement this
// //
GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable : GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :
gPcdDatabase->DxeDb.Init.GuidTable; mPcdDatabase->DxeDb.Init.GuidTable;
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset); VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
@ -542,9 +692,9 @@ GetExPcdTokenAttributes (
EFI_GUID *GuidTable; EFI_GUID *GuidTable;
UINT16 *SizeTable; UINT16 *SizeTable;
ExMap = gPcdDatabase->PeiDb.Init.ExMapTable; ExMap = mPcdDatabase->PeiDb.Init.ExMapTable;
GuidTable = gPcdDatabase->PeiDb.Init.GuidTable; GuidTable = mPcdDatabase->PeiDb.Init.GuidTable;
SizeTable = gPcdDatabase->PeiDb.Init.SizeTable; SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;
for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {
if ((ExTokenNumber == ExMap[i].ExTokenNumber) && if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&
@ -560,9 +710,9 @@ GetExPcdTokenAttributes (
} }
} }
ExMap = gPcdDatabase->DxeDb.Init.ExMapTable; ExMap = mPcdDatabase->DxeDb.Init.ExMapTable;
GuidTable = gPcdDatabase->DxeDb.Init.GuidTable; GuidTable = mPcdDatabase->DxeDb.Init.GuidTable;
SizeTable = gPcdDatabase->DxeDb.Init.SizeTable; SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;
for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) { for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) {
if ((ExTokenNumber == ExMap[i].ExTokenNumber) && if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&

View File

@ -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" #error "Please make sure the version of PCD Service DXE Driver and PCD DXE Database Generation Tool matches"
#endif #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 // Internal Functions
// //
@ -89,17 +97,17 @@ GetHiiVariable (
EFI_STATUS EFI_STATUS
DxeRegisterCallBackWorker ( DxeRegisterCallBackWorker (
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction, IN PCD_PROTOCOL_CALLBACK CallBackFunction
IN BOOLEAN Reigster
); );
EFI_STATUS EFI_STATUS
DxeGetNextTokenWorker ( DxeUnRegisterCallBackWorker (
IN OUT UINTN *Token, IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
); IN PCD_PROTOCOL_CALLBACK CallBackFunction
);
VOID VOID
BuildPcdDxeDataBase ( BuildPcdDxeDataBase (
@ -363,7 +371,7 @@ DxePcdSetPtrEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
DxePcdSetBoolEx ( DxePcdSetBoolEx (
IN CONST EFI_GUID *Guid, IN CONST EFI_GUID *Guid,
IN PCD_TOKEN_NUMBER TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN BOOLEAN Value IN BOOLEAN Value
) )
@ -373,9 +381,9 @@ DxePcdSetBoolEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PcdRegisterCallBackOnSet ( DxeRegisterCallBackOnSet (
IN PCD_TOKEN_NUMBER TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction IN PCD_PROTOCOL_CALLBACK CallBackFunction
) )
; ;
@ -383,7 +391,7 @@ PcdRegisterCallBackOnSet (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PcdUnRegisterCallBackOnSet ( DxeUnRegisterCallBackOnSet (
IN PCD_TOKEN_NUMBER TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PROTOCOL_CALLBACK CallBackFunction 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 EFI_GUID gPcdDataBaseHobGuid;
extern PCD_DATABASE * gPcdDatabase; extern PCD_DATABASE * mPcdDatabase;
extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit; extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;

View File

@ -50,7 +50,7 @@ PCD_PPI mPcdPpiInstance = {
PeiPcdSetPtrEx, PeiPcdSetPtrEx,
PeiPcdSetBoolEx, PeiPcdSetBoolEx,
PcdRegisterCallBackOnSet, PeiRegisterCallBackOnSet,
PcdUnRegisterCallBackOnSet, PcdUnRegisterCallBackOnSet,
PeiPcdGetNextToken PeiPcdGetNextToken
}; };
@ -454,12 +454,14 @@ PeiPcdSetBoolEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PcdRegisterCallBackOnSet ( PeiRegisterCallBackOnSet (
IN PCD_TOKEN_NUMBER ExTokenNumber, IN PCD_TOKEN_NUMBER ExTokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction IN PCD_PPI_CALLBACK CallBackFunction
) )
{ {
ASSERT (CallBackFunction != NULL);
return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE); return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);
} }
@ -473,6 +475,8 @@ PcdUnRegisterCallBackOnSet (
IN PCD_PPI_CALLBACK CallBackFunction IN PCD_PPI_CALLBACK CallBackFunction
) )
{ {
ASSERT (CallBackFunction != NULL);
return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE); return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);
} }
@ -482,7 +486,7 @@ EFI_STATUS
EFIAPI EFIAPI
PeiPcdGetNextToken ( PeiPcdGetNextToken (
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN OUT PCD_TOKEN_NUMBER *TokenNumber IN OUT PCD_TOKEN_NUMBER *TokenNumber
) )
{ {
UINTN GuidTableIdx; UINTN GuidTableIdx;

View File

@ -358,7 +358,7 @@ PeiPcdSetBoolEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PcdRegisterCallBackOnSet ( PeiRegisterCallBackOnSet (
IN PCD_TOKEN_NUMBER TokenNumber, IN PCD_TOKEN_NUMBER TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction IN PCD_PPI_CALLBACK CallBackFunction

View File

@ -711,7 +711,7 @@ class PcdDatabase {
private void getTwoGroupsOfTokens (ArrayList<Token> alTokens, List<Token> initTokens, List<Token> uninitTokens) { private void getTwoGroupsOfTokens (ArrayList<Token> alTokens, List<Token> initTokens, List<Token> uninitTokens) {
for (int i = 0; i < alTokens.size(); i++) { for (int i = 0; i < alTokens.size(); i++) {
Token t = (Token)alTokens.get(i); Token t = alTokens.get(i);
if (t.hasDefaultValue()) { if (t.hasDefaultValue()) {
initTokens.add(t); initTokens.add(t);
} else { } else {
@ -789,16 +789,14 @@ class PcdDatabase {
// PEI_PCD_DATABASE_INIT // PEI_PCD_DATABASE_INIT
// //
java.util.Comparator<Token> comparator = new AlignmentSizeComp(); java.util.Comparator<Token> comparator = new AlignmentSizeComp();
List<Token> list = initTokens; java.util.Collections.sort(initTokens, comparator);
java.util.Collections.sort(list, comparator);
initCode = processTokens(initTokens); initCode = processTokens(initTokens);
// //
// Generate Structure Declaration for PcdTokens without Default Value // Generate Structure Declaration for PcdTokens without Default Value
// PEI_PCD_DATABASE_UNINIT // PEI_PCD_DATABASE_UNINIT
// //
list = uninitTokens; java.util.Collections.sort(uninitTokens, comparator);
java.util.Collections.sort(list, comparator);
uninitCode = processTokens(uninitTokens); uninitCode = processTokens(uninitTokens);
// //