X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FService.c;h=011e3aa36ef4d9133988355ec18771184b2f4001;hp=01fe0151bf302591e9f5135c643a5ae7adbc261b;hb=bb5545b663e1d8ac4fd37003d5ba26fafdad5831;hpb=7c3e99c36eef533657b63e49f2272c1312409ae7 diff --git a/EdkModulePkg/Universal/PCD/Pei/Service.c b/EdkModulePkg/Universal/PCD/Pei/Service.c index 01fe0151bf..011e3aa36e 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Service.c +++ b/EdkModulePkg/Universal/PCD/Pei/Service.c @@ -46,12 +46,27 @@ PeiRegisterCallBackWorker ( if (Guid == NULL) { TokenNumber = ExTokenNumber; + + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; ASSERT (TokenNumber < PEI_NEX_TOKEN_NUMBER); } else { TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); + + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); } + LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber]; ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0); @@ -248,6 +263,13 @@ InvokeCallbackOnSet ( PCD_PPI_CALLBACK *CallbackTable; UINTN Idx; + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + if (Guid == NULL) ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); @@ -287,6 +309,13 @@ SetWorker ( UINTN Offset; VOID *InternalData; + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); PeiPcdDb = GetPcdDatabase (); @@ -305,7 +334,7 @@ SetWorker ( // type PCD entry in ExSetWorker. // if (TokenNumber < PEI_NEX_TOKEN_NUMBER) { - InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size); + InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size); } if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) { @@ -425,9 +454,16 @@ GetWorker ( UINT32 LocalTokenNumber; UINTN Size; + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); - Size = PeiPcdGetSize(TokenNumber); + Size = PeiPcdGetSize(TokenNumber + 1); ASSERT (GetSize == Size || GetSize == 0); @@ -464,16 +500,14 @@ GetWorker ( return (VOID *) ((UINT8 *) Data + VariableHead->Offset); } else { // - // BugBug: Need to support default value. The current implementation - // will return a memory buffer with ALL ZERO. - // - return AllocateZeroPool (Size); + // Return the default value specified by Platform Integrator + // + return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset); } } case PCD_TYPE_DATA: return (VOID *) ((UINT8 *)PeiPcdDb + Offset); - break; case PCD_TYPE_STRING: StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset); @@ -511,6 +545,10 @@ GetExPcdTokenNumber ( GuidTable = PeiPcdDb->Init.GuidTable; MatchGuid = ScanGuid (GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); + // + // We need to ASSERT here. If GUID can't be found in GuidTable, this is a + // error in the BUILD system. + // ASSERT (MatchGuid != NULL); MatchGuidIdx = MatchGuid - GuidTable;