**/\r
\r
#include "Service.h"\r
+#include <Library/DxeServicesLib.h>\r
\r
-PCD_DATABASE *mPcdDatabase;\r
+PCD_DATABASE mPcdDatabase;\r
+\r
+UINT32 mPcdTotalTokenCount; \r
+UINT32 mPeiLocalTokenCount; \r
+UINT32 mDxeLocalTokenCount; \r
+UINT32 mPeiNexTokenCount; \r
+UINT32 mDxeNexTokenCount; \r
+UINT32 mPeiExMapppingTableSize;\r
+UINT32 mDxeExMapppingTableSize;\r
+UINT32 mPeiGuidTableSize;\r
+UINT32 mDxeGuidTableSize;\r
+\r
+BOOLEAN mPeiExMapTableEmpty; \r
+BOOLEAN mDxeExMapTableEmpty; \r
+BOOLEAN mPeiDatabaseEmpty;\r
\r
LIST_ENTRY *mCallbackFnTable;\r
+EFI_GUID **TmpTokenSpaceBuffer;\r
+UINTN TmpTokenSpaceBufferCount; \r
+\r
\r
/**\r
Get the PCD entry pointer in PCD database.\r
EfiAcquireLock (&mPcdDatabaseLock);\r
\r
RetPtr = NULL;\r
+\r
+ ASSERT (TokenNumber > 0);\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
// We have to decrement TokenNumber by 1 to make it usable\r
TokenNumber--;\r
\r
TmpTokenNumber = TokenNumber;\r
- \r
+\r
//\r
- // PCD_TOTAL_TOKEN_NUMBER is a auto-generated constant.\r
- // It could be zero. EBC compiler is very choosy. It may\r
- // report warning. So we add 1 in each size of the \r
+ // EBC compiler is very choosy. It may report warning about comparison\r
+ // between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
//\r
- ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1);\r
+ ASSERT (TokenNumber + 1 < mPcdTotalTokenCount + 1);\r
\r
ASSERT ((GetSize == DxePcdGetSize (TokenNumber + 1)) || (GetSize == 0));\r
\r
// EBC compiler is very choosy. It may report warning about comparison\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
- IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);\r
+ IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);\r
\r
- LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
- mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+ LocalTokenNumberTable = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) : \r
+ (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
\r
TokenNumber = IsPeiDb ? TokenNumber :\r
- TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
+ TokenNumber - mPeiLocalTokenCount;\r
\r
LocalTokenNumber = LocalTokenNumberTable[TokenNumber];\r
\r
LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize, IsPeiDb);\r
}\r
\r
- PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
+ PcdDb = IsPeiDb ? ((UINT8 *) mPcdDatabase.PeiDb) : ((UINT8 *) mPcdDatabase.DxeDb);\r
\r
if (IsPeiDb) {\r
- StringTable = (UINT8 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);\r
+ StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->StringTableOffset);\r
} else {\r
- StringTable = (UINT8 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);\r
+ StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->StringTableOffset);\r
}\r
- \r
- \r
+\r
+\r
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
- \r
+\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
RetPtr = (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
+\r
break;\r
- \r
+\r
case PCD_TYPE_HII|PCD_TYPE_STRING:\r
case PCD_TYPE_HII:\r
if (IsPeiDb) {\r
- GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
+ GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset);\r
} else {\r
- GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);\r
+ GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset);\r
}\r
- \r
+\r
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
Guid = GuidTable + VariableHead->GuidTableIndex;\r
Name = (UINT16*)(StringTable + VariableHead->StringIndex);\r
- \r
+\r
if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
- //\r
- // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of \r
- // string array in string table.\r
- //\r
+ //\r
+ // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of \r
+ // string array in string table.\r
+ //\r
StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset); \r
VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx); \r
- Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
- if (Status == EFI_SUCCESS) {\r
- if (GetSize == 0) {\r
- //\r
- // It is a pointer type. So get the MaxSize reserved for\r
- // this PCD entry.\r
- //\r
- GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
- }\r
- //\r
- // If the operation is successful, we copy the data\r
- // to the default value buffer in the PCD Database.\r
- // So that we can free the Data allocated in GetHiiVariable.\r
- //\r
- CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
- FreePool (Data);\r
- }\r
- RetPtr = (VOID *) VaraiableDefaultBuffer; \r
} else {\r
VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
- \r
- Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
- if (Status == EFI_SUCCESS) {\r
- if (GetSize == 0) {\r
- //\r
- // It is a pointer type. So get the MaxSize reserved for\r
- // this PCD entry.\r
- //\r
- GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
- }\r
+ }\r
+ Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+ if (Status == EFI_SUCCESS) {\r
+ if (GetSize == 0) {\r
//\r
- // If the operation is successful, we copy the data\r
- // to the default value buffer in the PCD Database.\r
- // So that we can free the Data allocated in GetHiiVariable.\r
+ // It is a pointer type. So get the MaxSize reserved for\r
+ // this PCD entry.\r
//\r
- CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
- FreePool (Data);\r
+ GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
}\r
- RetPtr = (VOID *) VaraiableDefaultBuffer;\r
+ //\r
+ // If the operation is successful, we copy the data\r
+ // to the default value buffer in the PCD Database.\r
+ // So that we can free the Data allocated in GetHiiVariable.\r
+ //\r
+ CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
+ FreePool (Data);\r
}\r
+ RetPtr = (VOID *) VaraiableDefaultBuffer;\r
break;\r
\r
case PCD_TYPE_STRING:\r
}\r
\r
EfiReleaseLock (&mPcdDatabaseLock);\r
- \r
+\r
return RetPtr;\r
- \r
+\r
}\r
\r
/**\r
UINTN Index;\r
UINTN GuidTableIdx;\r
BOOLEAN Found;\r
+ UINTN ExMapTableCount;\r
\r
//\r
// Scan token space guid \r
//\r
Found = FALSE;\r
GuidTableIdx = MatchGuid - GuidTable;\r
- for (Index = 0; Index < SizeOfExMapTable; Index++) {\r
+ ExMapTableCount = SizeOfExMapTable / sizeof(ExMapTable[0]);\r
+ for (Index = 0; Index < ExMapTableCount; Index++) {\r
if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {\r
Found = TRUE;\r
break;\r
return EFI_SUCCESS;\r
}\r
\r
- for ( ; Index < SizeOfExMapTable; Index++) {\r
+ for ( ; Index < ExMapTableCount; Index++) {\r
if (ExMapTable[Index].ExTokenNumber == *TokenNumber) {\r
- Index ++;\r
- if (Index == SizeOfExMapTable) {\r
- //\r
- // Exceed the length of ExMap Table\r
- //\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_SUCCESS;\r
- } else if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {\r
- //\r
- // Found the next match\r
- //\r
- *TokenNumber = ExMapTable[Index].ExTokenNumber;\r
- return EFI_SUCCESS;\r
- } else {\r
- //\r
- // Guid has been changed. It is the next Token Space Guid.\r
- // We should flag no more TokenNumber.\r
- //\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_SUCCESS;\r
- }\r
+ break;\r
+ }\r
+ }\r
+\r
+ while (Index < ExMapTableCount) {\r
+ Index++;\r
+ if (Index == ExMapTableCount) {\r
+ //\r
+ // Exceed the length of ExMap Table\r
+ //\r
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+ return EFI_NOT_FOUND;\r
+ } else if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {\r
+ //\r
+ // Found the next match\r
+ //\r
+ *TokenNumber = ExMapTable[Index].ExTokenNumber;\r
+ return EFI_SUCCESS;\r
}\r
}\r
}\r
- \r
+\r
return EFI_NOT_FOUND;\r
}\r
\r
+/**\r
+ Find the PCD database.\r
+\r
+ @retval The base address of external PCD database binary.\r
+ @retval NULL Return NULL if not find.\r
+**/\r
+DXE_PCD_DATABASE *\r
+LocateExPcdBinary (\r
+ VOID\r
+) \r
+{\r
+ DXE_PCD_DATABASE *DxePcdDbBinary;\r
+ UINTN DxePcdDbSize;\r
+ EFI_STATUS Status;\r
+ \r
+ DxePcdDbBinary = NULL;\r
+ //\r
+ // Search the External Pcd database from one section of current FFS, \r
+ // and read it to memory\r
+ //\r
+ Status = GetSectionFromFfs (\r
+ EFI_SECTION_RAW,\r
+ 0,\r
+ (VOID **) &DxePcdDbBinary,\r
+ &DxePcdDbSize\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Check the first bytes (Header Signature Guid) and build version.\r
+ //\r
+ if (!CompareGuid ((VOID *)DxePcdDbBinary, &gPcdDataBaseSignatureGuid) ||\r
+ (DxePcdDbBinary->BuildVersion != PCD_SERVICE_DXE_VERSION)) {\r
+ ASSERT (FALSE);\r
+ }\r
+\r
+ return DxePcdDbBinary;\r
+}\r
\r
/**\r
Initialize the PCD database in DXE phase.\r
PEI_PCD_DATABASE *PeiDatabase;\r
EFI_HOB_GUID_TYPE *GuidHob;\r
UINTN Index;\r
-\r
- mPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));\r
- ASSERT (mPcdDatabase != NULL);\r
+ UINT32 PcdDxeDbLen;\r
+ VOID *PcdDxeDb;\r
\r
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
if (GuidHob != NULL) {\r
\r
- //\r
- // We will copy over the PEI phase's PCD Database.\r
// \r
// If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM\r
// should not be included at all. So the GuidHob could\r
\r
PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
//\r
- // Copy PCD Entries refereneced in PEI phase to PCD DATABASE\r
+ // Assign PCD Entries refereneced in PEI phase to PCD DATABASE\r
//\r
- CopyMem (&mPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));\r
+ mPcdDatabase.PeiDb = PeiDatabase;\r
}\r
\r
//\r
- // Copy PCD Entries with default value to PCD DATABASE\r
+ // Assign PCD Entries with default value to PCD DATABASE\r
//\r
- CopyMem (&mPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));\r
+ mPcdDatabase.DxeDb = LocateExPcdBinary ();\r
+ ASSERT(mPcdDatabase.DxeDb != NULL);\r
+ PcdDxeDbLen = mPcdDatabase.DxeDb->Length + mPcdDatabase.DxeDb->UninitDataBaseSize;\r
+ PcdDxeDb = AllocateZeroPool (PcdDxeDbLen);\r
+ CopyMem (PcdDxeDb, mPcdDatabase.DxeDb, mPcdDatabase.DxeDb->Length);\r
+ FreePool (mPcdDatabase.DxeDb);\r
+ mPcdDatabase.DxeDb = PcdDxeDb;\r
\r
+ //\r
+ // Initialized the external PCD database local variables\r
+ //\r
+ mPeiLocalTokenCount = mPcdDatabase.PeiDb->LocalTokenCount;\r
+ mDxeLocalTokenCount = mPcdDatabase.DxeDb->LocalTokenCount;\r
+\r
+ mPeiExMapppingTableSize = mPcdDatabase.PeiDb->ExTokenCount * sizeof (DYNAMICEX_MAPPING);\r
+ mDxeExMapppingTableSize = mPcdDatabase.DxeDb->ExTokenCount * sizeof (DYNAMICEX_MAPPING);\r
+ mPeiGuidTableSize = mPcdDatabase.PeiDb->GuidTableCount * sizeof(GUID);\r
+ mDxeGuidTableSize = mPcdDatabase.DxeDb->GuidTableCount * sizeof (GUID);\r
+\r
+ mPcdTotalTokenCount = mPeiLocalTokenCount + mDxeLocalTokenCount;\r
+ mPeiNexTokenCount = mPeiLocalTokenCount - mPcdDatabase.PeiDb->ExTokenCount;\r
+ mDxeNexTokenCount = mDxeLocalTokenCount - mPcdDatabase.DxeDb->ExTokenCount; \r
+\r
+ mPeiExMapTableEmpty = (mPcdDatabase.PeiDb->ExTokenCount == 0) ? TRUE : FALSE;\r
+ mDxeExMapTableEmpty = (mPcdDatabase.DxeDb->ExTokenCount == 0) ? TRUE : FALSE;\r
+ mPeiDatabaseEmpty = (mPeiLocalTokenCount == 0) ? TRUE : FALSE;\r
+\r
+ TmpTokenSpaceBufferCount = mPcdDatabase.PeiDb->ExTokenCount + mPcdDatabase.DxeDb->ExTokenCount;\r
+ TmpTokenSpaceBuffer = (EFI_GUID **)AllocateZeroPool(TmpTokenSpaceBufferCount * sizeof (EFI_GUID *));\r
\r
//\r
// Initialized the Callback Function Table\r
//\r
-\r
- mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY));\r
+ mCallbackFnTable = AllocateZeroPool (mPcdTotalTokenCount * sizeof (LIST_ENTRY));\r
ASSERT(mCallbackFnTable != NULL);\r
- \r
+\r
+ //\r
// EBC compiler is very choosy. It may report warning about comparison\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
- for (Index = 0; Index + 1 < PCD_TOTAL_TOKEN_NUMBER + 1; Index++) {\r
+ //\r
+ for (Index = 0; Index + 1 < mPcdTotalTokenCount + 1; Index++) {\r
InitializeListHead (&mCallbackFnTable[Index]);\r
}\r
}\r
SKU_ID *SkuIdTable;\r
INTN Index;\r
UINT8 *Value;\r
- SKU_ID *PhaseSkuIdTable;\r
UINT8 *PcdDb;\r
+ BOOLEAN FoundSku;\r
\r
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
\r
- PcdDb = IsPeiDb ? (UINT8 *) &mPcdDatabase->PeiDb : (UINT8 *) &mPcdDatabase->DxeDb;\r
+ PcdDb = IsPeiDb ? (UINT8 *) mPcdDatabase.PeiDb : (UINT8 *) mPcdDatabase.DxeDb;\r
\r
SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
\r
- PhaseSkuIdTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SkuIdTable :\r
- mPcdDatabase->DxeDb.Init.SkuIdTable;\r
- \r
- SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];\r
- \r
+ SkuIdTable = (SKU_ID *)(PcdDb + SkuHead->SkuIdTableOffset);\r
//\r
// Find the current system's SKU ID entry in SKU ID table.\r
//\r
+ FoundSku = FALSE;\r
for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
- if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[Index + 1]) {\r
+ if (mPcdDatabase.PeiDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
+ FoundSku = TRUE;\r
break;\r
}\r
}\r
+ \r
+ //\r
+ // Find the default SKU ID entry in SKU ID table.\r
+ //\r
+ \r
+ if(!FoundSku) {\r
+ for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
+ if (0 == SkuIdTable[Index + 1]) {\r
+ break;\r
+ }\r
+ }\r
+ }\r
ASSERT (Index < SkuIdTable[0]);\r
\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII);\r
\r
+ case PCD_TYPE_HII|PCD_TYPE_STRING:\r
+ Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
+ return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);\r
+\r
case PCD_TYPE_STRING:\r
Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);\r
return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING);\r
\r
case PCD_TYPE_DATA:\r
Value += Size * Index;\r
- return (UINT32) (Value - PcdDb);\r
+ return (UINT32) ((Value - PcdDb) | PCD_TYPE_DATA);\r
\r
default:\r
ASSERT (FALSE);\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
//\r
- ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1);\r
+ ASSERT (TokenNumber + 1 < mPcdTotalTokenCount + 1);\r
\r
if (PtrType) {\r
//\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
//\r
- if ((TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) ||\r
- (TokenNumber + 1 >= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) {\r
+ if ((TokenNumber + 1 < mPeiNexTokenCount + 1) ||\r
+ (TokenNumber + 1 >= mPeiLocalTokenCount + 1 && TokenNumber + 1 < (mPeiLocalTokenCount + mDxeNexTokenCount + 1))) {\r
InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);\r
}\r
\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
//\r
- IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);\r
+ IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);\r
\r
- LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
- mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+ LocalTokenNumberTable = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) : \r
+ (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset) ;\r
\r
TokenNumber = IsPeiDb ? TokenNumber\r
- : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
+ : TokenNumber - mPeiLocalTokenCount;\r
\r
LocalTokenNumber = LocalTokenNumberTable[TokenNumber];\r
\r
\r
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
\r
- PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
+ PcdDb = IsPeiDb ? ((UINT8 *) mPcdDatabase.PeiDb) : ((UINT8 *) mPcdDatabase.DxeDb);\r
\r
if (IsPeiDb) {\r
- StringTable = (UINT8 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);\r
+ StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->StringTableOffset);\r
} else {\r
- StringTable = (UINT8 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);\r
+ StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->StringTableOffset);\r
}\r
\r
\r
break;\r
}\r
}\r
- \r
+\r
if (IsPeiDb) {\r
- GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
+ GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset);\r
} else {\r
- GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);\r
+ GuidTable = (EFI_GUID *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset);\r
}\r
- \r
+\r
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
- \r
+\r
Guid = GuidTable + VariableHead->GuidTableIndex;\r
Name = (UINT16*) (StringTable + VariableHead->StringIndex);\r
VariableOffset = VariableHead->Offset;\r
Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);\r
- \r
+\r
if (EFI_NOT_FOUND == Status) {\r
if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
CopyMem (\r
}\r
\r
/**\r
- Set value for a dynamic PCD entry.\r
+ Set value for a dynamic-ex PCD entry.\r
\r
This routine find the local token number according to dynamic-ex PCD's token \r
space guid and token number firstly, and invoke callback function if this PCD\r
}\r
\r
/**\r
- Get local token number according to dynamic-ex PCD's {token space guid:token number}\r
+ Get Token Number according to dynamic-ex PCD's {token space guid:token number}\r
\r
A dynamic-ex type PCD, developer must provide pair of token space guid: token number\r
in DEC file. PCD database maintain a mapping table that translate pair of {token\r
- space guid: token number} to local token number.\r
+ space guid: token number} to Token Number.\r
\r
@param Guid Token space guid for dynamic-ex PCD entry.\r
@param ExTokenNumber Dynamic-ex PCD token number.\r
\r
- @return local token number for dynamic-ex PCD.\r
+ @return Token Number for dynamic-ex PCD.\r
\r
**/\r
UINTN \r
EFI_GUID *MatchGuid;\r
UINTN MatchGuidIdx;\r
\r
- if (!PEI_DATABASE_EMPTY) {\r
- ExMap = mPcdDatabase->PeiDb.Init.ExMapTable;\r
- GuidTable = mPcdDatabase->PeiDb.Init.GuidTable;\r
- \r
- MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), Guid);\r
- \r
+ if (!mPeiDatabaseEmpty) {\r
+ ExMap = (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->ExMapTableOffset);\r
+ GuidTable = (EFI_GUID *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset);\r
+\r
+ MatchGuid = ScanGuid (GuidTable, mPeiGuidTableSize, Guid);\r
+\r
if (MatchGuid != NULL) {\r
\r
MatchGuidIdx = MatchGuid - GuidTable;\r
- \r
- for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) {\r
+\r
+ for (Index = 0; Index < mPeiExMapppingTableSize; Index++) {\r
if ((ExTokenNumber == ExMap[Index].ExTokenNumber) &&\r
(MatchGuidIdx == ExMap[Index].ExGuidIndex)) {\r
- return ExMap[Index].LocalTokenNumber;\r
+ return ExMap[Index].TokenNumber;\r
}\r
}\r
}\r
}\r
- \r
- ExMap = mPcdDatabase->DxeDb.Init.ExMapTable;\r
- GuidTable = mPcdDatabase->DxeDb.Init.GuidTable;\r
\r
- MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->DxeDb.Init.GuidTable), Guid);\r
+ ExMap = (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->ExMapTableOffset);\r
+ GuidTable = (EFI_GUID *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset);\r
+\r
+ MatchGuid = ScanGuid (GuidTable, mDxeGuidTableSize, Guid);\r
//\r
// We need to ASSERT here. If GUID can't be found in GuidTable, this is a\r
// error in the BUILD system.\r
ASSERT (MatchGuid != NULL);\r
\r
MatchGuidIdx = MatchGuid - GuidTable;\r
- \r
- for (Index = 0; Index < DXE_EXMAPPING_TABLE_SIZE; Index++) {\r
+\r
+ for (Index = 0; Index < mDxeExMapppingTableSize; Index++) {\r
if ((ExTokenNumber == ExMap[Index].ExTokenNumber) &&\r
(MatchGuidIdx == ExMap[Index].ExGuidIndex)) {\r
- return ExMap[Index].LocalTokenNumber;\r
+ return ExMap[Index].TokenNumber;\r
}\r
}\r
\r
Get SKU ID table from PCD database.\r
\r
@param LocalTokenNumberTableIdx Index of local token number in token number table.\r
- @param IsPeiPcd If TRUE, \r
-\r
+ @param IsPeiDb If TRUE, the pcd entry is initialized in PEI phase,\r
+ If FALSE, the pcd entry is initialized in DXE phase.\r
@return Pointer to SKU ID array table\r
\r
**/\r
SKU_ID *\r
GetSkuIdArray (\r
IN UINTN LocalTokenNumberTableIdx,\r
- IN BOOLEAN IsPeiPcd\r
+ IN BOOLEAN IsPeiDb\r
)\r
{\r
SKU_HEAD *SkuHead;\r
UINTN LocalTokenNumber;\r
UINT8 *Database;\r
\r
- if (IsPeiPcd) {\r
- LocalTokenNumber = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
- Database = (UINT8 *) &mPcdDatabase->PeiDb;\r
+ if (IsPeiDb) {\r
+ LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
+ Database = (UINT8 *) mPcdDatabase.PeiDb;\r
} else {\r
- LocalTokenNumber = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable[LocalTokenNumberTableIdx - PEI_LOCAL_TOKEN_NUMBER];\r
- Database = (UINT8 *) &mPcdDatabase->DxeDb;\r
+ LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
+ Database = (UINT8 *) mPcdDatabase.DxeDb;\r
}\r
\r
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
SKU_ID *SkuIdTable;\r
\r
if (IsPeiDb) {\r
- LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
+ LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);\r
} else {\r
- LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+ LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
}\r
\r
SizeTableIdx = 0;\r
//\r
if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r
//\r
- // We have only one entry for VPD enabled PCD entry:\r
+ // We have only two entry for VPD enabled PCD entry:\r
// 1) MAX Size.\r
- // We consider current size is equal to MAX size.\r
+ // 2) Current Size\r
+ // Current size is equal to MAX size.\r
//\r
- SizeTableIdx++;\r
+ SizeTableIdx += 2;\r
} else {\r
if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
//\r
// EBC compiler is very choosy. It may report warning about comparison\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
- IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
+ IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < mPeiLocalTokenCount + 1);\r
\r
\r
if (IsPeiDb) {\r
- LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
- SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;\r
+ LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);\r
+ SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->SizeTableOffset);\r
} else {\r
- LocalTokenNumberTableIdx -= PEI_LOCAL_TOKEN_NUMBER;\r
- LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
- SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;\r
+ LocalTokenNumberTableIdx -= mPeiLocalTokenCount;\r
+ LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
+ SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SizeTableOffset);\r
}\r
\r
LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
//\r
if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r
//\r
- // We have only one entry for VPD enabled PCD entry:\r
+ // We have only two entry for VPD enabled PCD entry:\r
// 1) MAX Size.\r
+ // 2) Current Size\r
// We consider current size is equal to MAX size.\r
//\r
return *MaxSize;\r
//\r
SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
- if (SkuIdTable[1 + Index] == mPcdDatabase->PeiDb.Init.SystemSkuId) {\r
+ if (SkuIdTable[1 + Index] == mPcdDatabase.PeiDb->SystemSkuId) {\r
return SizeTable[SizeTableIdx + 1 + Index];\r
}\r
}\r
// between UINTN and 0 . So we add 1 in each size of the \r
// comparison.\r
//\r
- IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
+ IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < mPeiLocalTokenCount + 1);\r
\r
if (IsPeiDb) {\r
- LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
- SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;\r
+ LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);\r
+ SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->SizeTableOffset);\r
} else {\r
- LocalTokenNumberTableIdx -= PEI_LOCAL_TOKEN_NUMBER;\r
- LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
- SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;\r
+ LocalTokenNumberTableIdx -= mPeiLocalTokenCount;\r
+ LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
+ SizeTable = (SIZE_INFO *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SizeTableOffset);\r
}\r
\r
LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
//\r
SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
- if (SkuIdTable[1 + Index] == mPcdDatabase->PeiDb.Init.SystemSkuId) {\r
+ if (SkuIdTable[1 + Index] == mPcdDatabase.PeiDb->SystemSkuId) {\r
SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;\r
return TRUE;\r
}\r