MdePkg and MdeModulePkg Pcd: Implement PCD Driver for External PCD Database and SKU enable Feature.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Bob C Feng <bob.c.feng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14857 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Bob C Feng
2013-11-18 07:45:49 +00:00
committed by lzeng14
parent e8a47801a1
commit 419db80bef
16 changed files with 879 additions and 529 deletions

View File

@@ -13,10 +13,28 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "Service.h"
#include <Library/DxeServicesLib.h>
PCD_DATABASE *mPcdDatabase;
PCD_DATABASE mPcdDatabase;
UINT32 mPcdTotalTokenCount;
UINT32 mPeiLocalTokenCount;
UINT32 mDxeLocalTokenCount;
UINT32 mPeiNexTokenCount;
UINT32 mDxeNexTokenCount;
UINT32 mPeiExMapppingTableSize;
UINT32 mDxeExMapppingTableSize;
UINT32 mPeiGuidTableSize;
UINT32 mDxeGuidTableSize;
BOOLEAN mPeiExMapTableEmpty;
BOOLEAN mDxeExMapTableEmpty;
BOOLEAN mPeiDatabaseEmpty;
LIST_ENTRY *mCallbackFnTable;
EFI_GUID **TmpTokenSpaceBuffer;
UINTN TmpTokenSpaceBufferCount;
/**
Get the PCD entry pointer in PCD database.
@@ -64,6 +82,8 @@ GetWorker (
EfiAcquireLock (&mPcdDatabaseLock);
RetPtr = NULL;
ASSERT (TokenNumber > 0);
//
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
// We have to decrement TokenNumber by 1 to make it usable
@@ -72,27 +92,26 @@ GetWorker (
TokenNumber--;
TmpTokenNumber = TokenNumber;
//
// PCD_TOTAL_TOKEN_NUMBER is a auto-generated constant.
// It could be zero. EBC compiler is very choosy. It may
// report warning. So we add 1 in each size of the
// EBC compiler is very choosy. It may report warning about comparison
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
//
ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1);
ASSERT (TokenNumber + 1 < mPcdTotalTokenCount + 1);
ASSERT ((GetSize == DxePcdGetSize (TokenNumber + 1)) || (GetSize == 0));
// EBC compiler is very choosy. It may report warning about comparison
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);
IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);
LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
LocalTokenNumberTable = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) :
(UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);
TokenNumber = IsPeiDb ? TokenNumber :
TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
TokenNumber - mPeiLocalTokenCount;
LocalTokenNumber = LocalTokenNumberTable[TokenNumber];
@@ -105,82 +124,64 @@ GetWorker (
LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize, IsPeiDb);
}
PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
PcdDb = IsPeiDb ? ((UINT8 *) mPcdDatabase.PeiDb) : ((UINT8 *) mPcdDatabase.DxeDb);
if (IsPeiDb) {
StringTable = (UINT8 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);
StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->StringTableOffset);
} else {
StringTable = (UINT8 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);
StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->StringTableOffset);
}
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {
case PCD_TYPE_VPD:
VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);
RetPtr = (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);
break;
case PCD_TYPE_HII|PCD_TYPE_STRING:
case PCD_TYPE_HII:
if (IsPeiDb) {
GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);
GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset);
} else {
GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);
GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset);
}
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
Guid = GuidTable + VariableHead->GuidTableIndex;
Name = (UINT16*)(StringTable + VariableHead->StringIndex);
if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {
//
// If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of
// string array in string table.
//
//
// If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of
// string array in string table.
//
StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);
VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx);
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
if (Status == EFI_SUCCESS) {
if (GetSize == 0) {
//
// It is a pointer type. So get the MaxSize reserved for
// this PCD entry.
//
GetPtrTypeSize (TmpTokenNumber, &GetSize);
}
//
// If the operation is successful, we copy the data
// to the default value buffer in the PCD Database.
// So that we can free the Data allocated in GetHiiVariable.
//
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);
FreePool (Data);
}
RetPtr = (VOID *) VaraiableDefaultBuffer;
} else {
VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
if (Status == EFI_SUCCESS) {
if (GetSize == 0) {
//
// It is a pointer type. So get the MaxSize reserved for
// this PCD entry.
//
GetPtrTypeSize (TmpTokenNumber, &GetSize);
}
//
// If the operation is successful, we copy the data
// to the default value buffer in the PCD Database.
// So that we can free the Data allocated in GetHiiVariable.
//
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);
FreePool (Data);
}
RetPtr = (VOID *) VaraiableDefaultBuffer;
}
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
if (Status == EFI_SUCCESS) {
if (GetSize == 0) {
//
// It is a pointer type. So get the MaxSize reserved for
// this PCD entry.
//
GetPtrTypeSize (TmpTokenNumber, &GetSize);
}
//
// If the operation is successful, we copy the data
// to the default value buffer in the PCD Database.
// So that we can free the Data allocated in GetHiiVariable.
//
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);
FreePool (Data);
}
RetPtr = (VOID *) VaraiableDefaultBuffer;
break;
case PCD_TYPE_STRING:
@@ -199,9 +200,9 @@ GetWorker (
}
EfiReleaseLock (&mPcdDatabaseLock);
return RetPtr;
}
/**
@@ -359,6 +360,7 @@ ExGetNextTokeNumber (
UINTN Index;
UINTN GuidTableIdx;
BOOLEAN Found;
UINTN ExMapTableCount;
//
// Scan token space guid
@@ -373,7 +375,8 @@ ExGetNextTokeNumber (
//
Found = FALSE;
GuidTableIdx = MatchGuid - GuidTable;
for (Index = 0; Index < SizeOfExMapTable; Index++) {
ExMapTableCount = SizeOfExMapTable / sizeof(ExMapTable[0]);
for (Index = 0; Index < ExMapTableCount; Index++) {
if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {
Found = TRUE;
break;
@@ -390,36 +393,71 @@ ExGetNextTokeNumber (
return EFI_SUCCESS;
}
for ( ; Index < SizeOfExMapTable; Index++) {
for ( ; Index < ExMapTableCount; Index++) {
if (ExMapTable[Index].ExTokenNumber == *TokenNumber) {
Index ++;
if (Index == SizeOfExMapTable) {
//
// Exceed the length of ExMap Table
//
*TokenNumber = PCD_INVALID_TOKEN_NUMBER;
return EFI_SUCCESS;
} else if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {
//
// Found the next match
//
*TokenNumber = ExMapTable[Index].ExTokenNumber;
return EFI_SUCCESS;
} else {
//
// Guid has been changed. It is the next Token Space Guid.
// We should flag no more TokenNumber.
//
*TokenNumber = PCD_INVALID_TOKEN_NUMBER;
return EFI_SUCCESS;
}
break;
}
}
while (Index < ExMapTableCount) {
Index++;
if (Index == ExMapTableCount) {
//
// Exceed the length of ExMap Table
//
*TokenNumber = PCD_INVALID_TOKEN_NUMBER;
return EFI_NOT_FOUND;
} else if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {
//
// Found the next match
//
*TokenNumber = ExMapTable[Index].ExTokenNumber;
return EFI_SUCCESS;
}
}
}
return EFI_NOT_FOUND;
}
/**
Find the PCD database.
@retval The base address of external PCD database binary.
@retval NULL Return NULL if not find.
**/
DXE_PCD_DATABASE *
LocateExPcdBinary (
VOID
)
{
DXE_PCD_DATABASE *DxePcdDbBinary;
UINTN DxePcdDbSize;
EFI_STATUS Status;
DxePcdDbBinary = NULL;
//
// Search the External Pcd database from one section of current FFS,
// and read it to memory
//
Status = GetSectionFromFfs (
EFI_SECTION_RAW,
0,
(VOID **) &DxePcdDbBinary,
&DxePcdDbSize
);
ASSERT_EFI_ERROR (Status);
//
// Check the first bytes (Header Signature Guid) and build version.
//
if (!CompareGuid ((VOID *)DxePcdDbBinary, &gPcdDataBaseSignatureGuid) ||
(DxePcdDbBinary->BuildVersion != PCD_SERVICE_DXE_VERSION)) {
ASSERT (FALSE);
}
return DxePcdDbBinary;
}
/**
Initialize the PCD database in DXE phase.
@@ -436,15 +474,12 @@ BuildPcdDxeDataBase (
PEI_PCD_DATABASE *PeiDatabase;
EFI_HOB_GUID_TYPE *GuidHob;
UINTN Index;
mPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));
ASSERT (mPcdDatabase != NULL);
UINT32 PcdDxeDbLen;
VOID *PcdDxeDb;
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
if (GuidHob != NULL) {
//
// We will copy over the PEI phase's PCD Database.
//
// If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM
// should not be included at all. So the GuidHob could
@@ -454,28 +489,56 @@ BuildPcdDxeDataBase (
PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);
//
// Copy PCD Entries refereneced in PEI phase to PCD DATABASE
// Assign PCD Entries refereneced in PEI phase to PCD DATABASE
//
CopyMem (&mPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));
mPcdDatabase.PeiDb = PeiDatabase;
}
//
// Copy PCD Entries with default value to PCD DATABASE
// Assign PCD Entries with default value to PCD DATABASE
//
CopyMem (&mPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));
mPcdDatabase.DxeDb = LocateExPcdBinary ();
ASSERT(mPcdDatabase.DxeDb != NULL);
PcdDxeDbLen = mPcdDatabase.DxeDb->Length + mPcdDatabase.DxeDb->UninitDataBaseSize;
PcdDxeDb = AllocateZeroPool (PcdDxeDbLen);
CopyMem (PcdDxeDb, mPcdDatabase.DxeDb, mPcdDatabase.DxeDb->Length);
FreePool (mPcdDatabase.DxeDb);
mPcdDatabase.DxeDb = PcdDxeDb;
//
// Initialized the external PCD database local variables
//
mPeiLocalTokenCount = mPcdDatabase.PeiDb->LocalTokenCount;
mDxeLocalTokenCount = mPcdDatabase.DxeDb->LocalTokenCount;
mPeiExMapppingTableSize = mPcdDatabase.PeiDb->ExTokenCount * sizeof (DYNAMICEX_MAPPING);
mDxeExMapppingTableSize = mPcdDatabase.DxeDb->ExTokenCount * sizeof (DYNAMICEX_MAPPING);
mPeiGuidTableSize = mPcdDatabase.PeiDb->GuidTableCount * sizeof(GUID);
mDxeGuidTableSize = mPcdDatabase.DxeDb->GuidTableCount * sizeof (GUID);
mPcdTotalTokenCount = mPeiLocalTokenCount + mDxeLocalTokenCount;
mPeiNexTokenCount = mPeiLocalTokenCount - mPcdDatabase.PeiDb->ExTokenCount;
mDxeNexTokenCount = mDxeLocalTokenCount - mPcdDatabase.DxeDb->ExTokenCount;
mPeiExMapTableEmpty = (mPcdDatabase.PeiDb->ExTokenCount == 0) ? TRUE : FALSE;
mDxeExMapTableEmpty = (mPcdDatabase.DxeDb->ExTokenCount == 0) ? TRUE : FALSE;
mPeiDatabaseEmpty = (mPeiLocalTokenCount == 0) ? TRUE : FALSE;
TmpTokenSpaceBufferCount = mPcdDatabase.PeiDb->ExTokenCount + mPcdDatabase.DxeDb->ExTokenCount;
TmpTokenSpaceBuffer = (EFI_GUID **)AllocateZeroPool(TmpTokenSpaceBufferCount * sizeof (EFI_GUID *));
//
// Initialized the Callback Function Table
//
mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY));
mCallbackFnTable = AllocateZeroPool (mPcdTotalTokenCount * sizeof (LIST_ENTRY));
ASSERT(mCallbackFnTable != NULL);
//
// EBC compiler is very choosy. It may report warning about comparison
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
for (Index = 0; Index + 1 < PCD_TOTAL_TOKEN_NUMBER + 1; Index++) {
//
for (Index = 0; Index + 1 < mPcdTotalTokenCount + 1; Index++) {
InitializeListHead (&mCallbackFnTable[Index]);
}
}
@@ -568,29 +631,39 @@ GetSkuEnabledTokenNumber (
SKU_ID *SkuIdTable;
INTN Index;
UINT8 *Value;
SKU_ID *PhaseSkuIdTable;
UINT8 *PcdDb;
BOOLEAN FoundSku;
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);
PcdDb = IsPeiDb ? (UINT8 *) &mPcdDatabase->PeiDb : (UINT8 *) &mPcdDatabase->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 ? mPcdDatabase->PeiDb.Init.SkuIdTable :
mPcdDatabase->DxeDb.Init.SkuIdTable;
SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];
SkuIdTable = (SKU_ID *)(PcdDb + SkuHead->SkuIdTableOffset);
//
// Find the current system's SKU ID entry in SKU ID table.
//
FoundSku = FALSE;
for (Index = 0; Index < SkuIdTable[0]; Index++) {
if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[Index + 1]) {
if (mPcdDatabase.PeiDb->SystemSkuId == SkuIdTable[Index + 1]) {
FoundSku = TRUE;
break;
}
}
//
// Find the default SKU ID entry in SKU ID table.
//
if(!FoundSku) {
for (Index = 0; Index < SkuIdTable[0]; Index++) {
if (0 == SkuIdTable[Index + 1]) {
break;
}
}
}
ASSERT (Index < SkuIdTable[0]);
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {
@@ -602,13 +675,17 @@ GetSkuEnabledTokenNumber (
Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);
return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII);
case PCD_TYPE_HII|PCD_TYPE_STRING:
Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);
return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);
case PCD_TYPE_STRING:
Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);
return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING);
case PCD_TYPE_DATA:
Value += Size * Index;
return (UINT32) (Value - PcdDb);
return (UINT32) ((Value - PcdDb) | PCD_TYPE_DATA);
default:
ASSERT (FALSE);
@@ -744,7 +821,7 @@ SetWorker (
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
//
ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1);
ASSERT (TokenNumber + 1 < mPcdTotalTokenCount + 1);
if (PtrType) {
//
@@ -766,8 +843,8 @@ SetWorker (
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
//
if ((TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) ||
(TokenNumber + 1 >= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) {
if ((TokenNumber + 1 < mPeiNexTokenCount + 1) ||
(TokenNumber + 1 >= mPeiLocalTokenCount + 1 && TokenNumber + 1 < (mPeiLocalTokenCount + mDxeNexTokenCount + 1))) {
InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);
}
@@ -781,13 +858,13 @@ SetWorker (
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
//
IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);
IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);
LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
LocalTokenNumberTable = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) :
(UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset) ;
TokenNumber = IsPeiDb ? TokenNumber
: TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
: TokenNumber - mPeiLocalTokenCount;
LocalTokenNumber = LocalTokenNumberTable[TokenNumber];
@@ -802,12 +879,12 @@ SetWorker (
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
PcdDb = IsPeiDb ? ((UINT8 *) mPcdDatabase.PeiDb) : ((UINT8 *) mPcdDatabase.DxeDb);
if (IsPeiDb) {
StringTable = (UINT8 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);
StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->StringTableOffset);
} else {
StringTable = (UINT8 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);
StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->StringTableOffset);
}
@@ -836,20 +913,20 @@ SetWorker (
break;
}
}
if (IsPeiDb) {
GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);
GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset);
} else {
GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);
GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset);
}
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
Guid = GuidTable + VariableHead->GuidTableIndex;
Name = (UINT16*) (StringTable + VariableHead->StringIndex);
VariableOffset = VariableHead->Offset;
Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);
if (EFI_NOT_FOUND == Status) {
if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {
CopyMem (
@@ -954,7 +1031,7 @@ ExSetValueWorker (
}
/**
Set value for a dynamic PCD entry.
Set value for a dynamic-ex PCD entry.
This routine find the local token number according to dynamic-ex PCD's token
space guid and token number firstly, and invoke callback function if this PCD
@@ -1100,16 +1177,16 @@ SetHiiVariable (
}
/**
Get local token number according to dynamic-ex PCD's {token space guid:token number}
Get Token Number according to dynamic-ex PCD's {token space guid:token number}
A dynamic-ex type PCD, developer must provide pair of token space guid: token number
in DEC file. PCD database maintain a mapping table that translate pair of {token
space guid: token number} to local token number.
space guid: token number} to Token Number.
@param Guid Token space guid for dynamic-ex PCD entry.
@param ExTokenNumber Dynamic-ex PCD token number.
@return local token number for dynamic-ex PCD.
@return Token Number for dynamic-ex PCD.
**/
UINTN
@@ -1124,29 +1201,29 @@ GetExPcdTokenNumber (
EFI_GUID *MatchGuid;
UINTN MatchGuidIdx;
if (!PEI_DATABASE_EMPTY) {
ExMap = mPcdDatabase->PeiDb.Init.ExMapTable;
GuidTable = mPcdDatabase->PeiDb.Init.GuidTable;
MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), Guid);
if (!mPeiDatabaseEmpty) {
ExMap = (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->ExMapTableOffset);
GuidTable = (EFI_GUID *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset);
MatchGuid = ScanGuid (GuidTable, mPeiGuidTableSize, Guid);
if (MatchGuid != NULL) {
MatchGuidIdx = MatchGuid - GuidTable;
for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) {
for (Index = 0; Index < mPeiExMapppingTableSize; Index++) {
if ((ExTokenNumber == ExMap[Index].ExTokenNumber) &&
(MatchGuidIdx == ExMap[Index].ExGuidIndex)) {
return ExMap[Index].LocalTokenNumber;
return ExMap[Index].TokenNumber;
}
}
}
}
ExMap = mPcdDatabase->DxeDb.Init.ExMapTable;
GuidTable = mPcdDatabase->DxeDb.Init.GuidTable;
MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->DxeDb.Init.GuidTable), Guid);
ExMap = (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->ExMapTableOffset);
GuidTable = (EFI_GUID *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset);
MatchGuid = ScanGuid (GuidTable, mDxeGuidTableSize, Guid);
//
// We need to ASSERT here. If GUID can't be found in GuidTable, this is a
// error in the BUILD system.
@@ -1154,11 +1231,11 @@ GetExPcdTokenNumber (
ASSERT (MatchGuid != NULL);
MatchGuidIdx = MatchGuid - GuidTable;
for (Index = 0; Index < DXE_EXMAPPING_TABLE_SIZE; Index++) {
for (Index = 0; Index < mDxeExMapppingTableSize; Index++) {
if ((ExTokenNumber == ExMap[Index].ExTokenNumber) &&
(MatchGuidIdx == ExMap[Index].ExGuidIndex)) {
return ExMap[Index].LocalTokenNumber;
return ExMap[Index].TokenNumber;
}
}
@@ -1171,27 +1248,27 @@ GetExPcdTokenNumber (
Get SKU ID table from PCD database.
@param LocalTokenNumberTableIdx Index of local token number in token number table.
@param IsPeiPcd If TRUE,
@param IsPeiDb If TRUE, the pcd entry is initialized in PEI phase,
If FALSE, the pcd entry is initialized in DXE phase.
@return Pointer to SKU ID array table
**/
SKU_ID *
GetSkuIdArray (
IN UINTN LocalTokenNumberTableIdx,
IN BOOLEAN IsPeiPcd
IN BOOLEAN IsPeiDb
)
{
SKU_HEAD *SkuHead;
UINTN LocalTokenNumber;
UINT8 *Database;
if (IsPeiPcd) {
LocalTokenNumber = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];
Database = (UINT8 *) &mPcdDatabase->PeiDb;
if (IsPeiDb) {
LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);
Database = (UINT8 *) mPcdDatabase.PeiDb;
} else {
LocalTokenNumber = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable[LocalTokenNumberTableIdx - PEI_LOCAL_TOKEN_NUMBER];
Database = (UINT8 *) &mPcdDatabase->DxeDb;
LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);
Database = (UINT8 *) mPcdDatabase.DxeDb;
}
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);
@@ -1224,9 +1301,9 @@ GetSizeTableIndex (
SKU_ID *SkuIdTable;
if (IsPeiDb) {
LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;
LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);
} else {
LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);
}
SizeTableIdx = 0;
@@ -1241,11 +1318,12 @@ GetSizeTableIndex (
//
if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {
//
// We have only one entry for VPD enabled PCD entry:
// We have only two entry for VPD enabled PCD entry:
// 1) MAX Size.
// We consider current size is equal to MAX size.
// 2) Current Size
// Current size is equal to MAX size.
//
SizeTableIdx++;
SizeTableIdx += 2;
} else {
if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {
//
@@ -1297,16 +1375,16 @@ GetPtrTypeSize (
// EBC compiler is very choosy. It may report warning about comparison
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);
IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < mPeiLocalTokenCount + 1);
if (IsPeiDb) {
LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;
SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;
LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);
SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->SizeTableOffset);
} else {
LocalTokenNumberTableIdx -= PEI_LOCAL_TOKEN_NUMBER;
LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;
LocalTokenNumberTableIdx -= mPeiLocalTokenCount;
LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);
SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SizeTableOffset);
}
LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];
@@ -1322,8 +1400,9 @@ GetPtrTypeSize (
//
if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {
//
// We have only one entry for VPD enabled PCD entry:
// We have only two entry for VPD enabled PCD entry:
// 1) MAX Size.
// 2) Current Size
// We consider current size is equal to MAX size.
//
return *MaxSize;
@@ -1343,7 +1422,7 @@ GetPtrTypeSize (
//
SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);
for (Index = 0; Index < SkuIdTable[0]; Index++) {
if (SkuIdTable[1 + Index] == mPcdDatabase->PeiDb.Init.SystemSkuId) {
if (SkuIdTable[1 + Index] == mPcdDatabase.PeiDb->SystemSkuId) {
return SizeTable[SizeTableIdx + 1 + Index];
}
}
@@ -1382,15 +1461,15 @@ SetPtrTypeSize (
// between UINTN and 0 . So we add 1 in each size of the
// comparison.
//
IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);
IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < mPeiLocalTokenCount + 1);
if (IsPeiDb) {
LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;
SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;
LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);
SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->SizeTableOffset);
} else {
LocalTokenNumberTableIdx -= PEI_LOCAL_TOKEN_NUMBER;
LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;
LocalTokenNumberTableIdx -= mPeiLocalTokenCount;
LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);
SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SizeTableOffset);
}
LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];
@@ -1433,7 +1512,7 @@ SetPtrTypeSize (
//
SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);
for (Index = 0; Index < SkuIdTable[0]; Index++) {
if (SkuIdTable[1 + Index] == mPcdDatabase->PeiDb.Init.SystemSkuId) {
if (SkuIdTable[1 + Index] == mPcdDatabase.PeiDb->SystemSkuId) {
SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;
return TRUE;
}