X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FService.c;h=e705c283cb8be05db457c158abd2cd2edd823400;hp=0004bc6c76a1ffca81e8c52fe45b6d7af48f369e;hb=3401c092e4e98b97bcf86d9aa2500d5ee7b3b8cf;hpb=1de04b4f83050f9a8f6c3eedce27f841591972f3 diff --git a/EdkModulePkg/Universal/PCD/Pei/Service.c b/EdkModulePkg/Universal/PCD/Pei/Service.c index 0004bc6c76..e705c283cb 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Service.c +++ b/EdkModulePkg/Universal/PCD/Pei/Service.c @@ -20,12 +20,15 @@ Module Name: Service.c The function registers the CallBackOnSet fucntion according to TokenNumber and EFI_GUID space. - @param[in] TokenNumber The token number. - @param[in] Guid The GUID space. - @param[in] CallBackFunction The Callback function to be registered. + @param TokenNumber The token number. + @param Guid The GUID space. + @param CallBackFunction The Callback function to be registered. + @param Register To register or unregister the callback function. @retval EFI_SUCCESS If the Callback function is registered. @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space. + @retval EFI_OUT_OF_RESOURCES If the callback function can't be registered because there is not free + slot left in the CallbackFnTable. --*/ EFI_STATUS PeiRegisterCallBackWorker ( @@ -52,7 +55,7 @@ PeiRegisterCallBackWorker ( // as the array index. // TokenNumber--; - ASSERT (TokenNumber < PEI_NEX_TOKEN_NUMBER); + ASSERT (TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1); } else { TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); @@ -62,7 +65,10 @@ PeiRegisterCallBackWorker ( // as the array index. // TokenNumber--; - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + // 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 < PEI_LOCAL_TOKEN_NUMBER + 1); } @@ -100,10 +106,9 @@ PeiRegisterCallBackWorker ( /** - The function builds the PCD database based on the - PCD_IMAGE on the flash. + The function builds the PCD database. - @param[in] PcdImageOnFlash The PCD image on flash. + @param VOID @retval VOID --*/ @@ -141,14 +146,15 @@ BuildPcdDatabase ( The function is provided by PCD PEIM and PCD DXE driver to do the work of reading a HII variable from variable service. - @param[in] VariableGuid The Variable GUID. - @param[in] VariableName The Variable Name. - @param[out] VariableData The output data. - @param[out] VariableSize The size of the variable. + @param VariableGuid The Variable GUID. + @param VariableName The Variable Name. + @param VariableData The output data. + @param VariableSize The size of the variable. @retval EFI_SUCCESS Operation successful. - @retval EFI_SUCCESS Variablel not found. + @retval EFI_NOT_FOUND Variablel not found. --*/ +STATIC EFI_STATUS GetHiiVariable ( IN CONST EFI_GUID *VariableGuid, @@ -200,7 +206,7 @@ GetHiiVariable ( } - +STATIC UINT32 GetSkuEnabledTokenNumber ( UINT32 LocalTokenNumber, @@ -230,19 +236,19 @@ GetSkuEnabledTokenNumber ( switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]); - return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD); + return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD); case PCD_TYPE_HII: Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]); - return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII); + return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII); case PCD_TYPE_STRING: Value = (UINT8 *) &(((STRING_HEAD *) Value)[i]); - return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_STRING); + return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_STRING); case PCD_TYPE_DATA: Value += Size * i; - return (Value - (UINT8 *) PeiPcdDb); + return (UINT32) (Value - (UINT8 *) PeiPcdDb); default: ASSERT (FALSE); @@ -256,10 +262,10 @@ GetSkuEnabledTokenNumber ( - +STATIC VOID InvokeCallbackOnSet ( - UINT32 ExTokenNumber, + UINTN ExTokenNumber, CONST EFI_GUID *Guid, OPTIONAL UINTN TokenNumber, VOID *Data, @@ -277,8 +283,12 @@ InvokeCallbackOnSet ( // TokenNumber--; - if (Guid == NULL) - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + if (Guid == 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. + ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); + } GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid); ASSERT (GuidHob != NULL); @@ -328,6 +338,10 @@ SetWorker ( VOID *InternalData; UINTN MaxSize; + if (!FeaturePcdGet(PcdPeiPcdDatabaseSetEnabled)) { + return EFI_UNSUPPORTED; + } + // // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. // We have to decrement TokenNumber by 1 to make it usable @@ -335,7 +349,10 @@ SetWorker ( // TokenNumber--; - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + // 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 < PEI_LOCAL_TOKEN_NUMBER + 1); PeiPcdDb = GetPcdDatabase (); @@ -350,7 +367,7 @@ SetWorker ( // For Dynamic EX PCD entry, we have invoked the callback function for Dynamic EX // type PCD entry in ExSetWorker. // - if (TokenNumber < PEI_NEX_TOKEN_NUMBER) { + if (TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) { InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size); } @@ -450,6 +467,10 @@ ExSetWorker ( { UINTN TokenNumber; + if (!FeaturePcdGet(PcdPeiPcdDatabaseSetEnabled)) { + return EFI_UNSUPPORTED; + } + TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, *Size); @@ -468,6 +489,11 @@ ExGetWorker ( IN UINTN GetSize ) { + if (!FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) { + ASSERT (FALSE); + return 0; + } + return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize); } @@ -500,7 +526,10 @@ GetWorker ( // TokenNumber--; - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + // 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 < PEI_LOCAL_TOKEN_NUMBER + 1); ASSERT ((GetSize == PeiPcdGetSize(TokenNumber + 1)) || (GetSize == 0)); @@ -525,7 +554,7 @@ GetWorker ( { VPD_HEAD *VpdHead; VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset); - return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); + return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); } case PCD_TYPE_HII: @@ -567,10 +596,11 @@ GetWorker ( } + UINTN GetExPcdTokenNumber ( IN CONST EFI_GUID *Guid, - IN UINT32 ExTokenNumber + IN UINTN ExTokenNumber ) { UINT32 i; @@ -622,6 +652,7 @@ GetPcdDatabase ( } + SKU_ID * GetSkuIdArray ( IN UINTN LocalTokenNumberTableIdx, @@ -695,134 +726,3 @@ GetSizeTableIndex ( return SizeTableIdx; } - - - - -UINTN -GetPtrTypeSize ( - IN UINTN LocalTokenNumberTableIdx, - OUT UINTN *MaxSize, - IN PEI_PCD_DATABASE *Database - ) -{ - INTN SizeTableIdx; - UINTN LocalTokenNumber; - SKU_ID *SkuIdTable; - SIZE_INFO *SizeTable; - UINTN i; - - SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database); - - LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx]; - - ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER); - - SizeTable = Database->Init.SizeTable; - - *MaxSize = SizeTable[SizeTableIdx]; - // - // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type - // PCD entry. - // - if (LocalTokenNumber & PCD_TYPE_VPD) { - // - // We have only one entry for VPD enabled PCD entry: - // 1) MAX Size. - // We consider current size is equal to MAX size. - // - return *MaxSize; - } else { - if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) { - // - // We have only two entry for Non-Sku enabled PCD entry: - // 1) MAX SIZE - // 2) Current Size - // - return SizeTable[SizeTableIdx + 1]; - } else { - // - // We have these entry for SKU enabled PCD entry - // 1) MAX SIZE - // 2) Current Size for each SKU_ID (It is equal to MaxSku). - // - SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database); - for (i = 0; i < SkuIdTable[0]; i++) { - if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) { - return SizeTable[SizeTableIdx + 1 + i]; - } - } - return SizeTable[SizeTableIdx + 1]; - } - } -} - - - -BOOLEAN -SetPtrTypeSize ( - IN UINTN LocalTokenNumberTableIdx, - IN OUT UINTN *CurrentSize, - IN PEI_PCD_DATABASE *Database - ) -{ - INTN SizeTableIdx; - UINTN LocalTokenNumber; - SKU_ID *SkuIdTable; - SIZE_INFO *SizeTable; - UINTN i; - UINTN MaxSize; - - SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database); - - LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx]; - - ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER); - - SizeTable = Database->Init.SizeTable; - - MaxSize = SizeTable[SizeTableIdx]; - // - // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type - // PCD entry. - // - if (LocalTokenNumber & PCD_TYPE_VPD) { - // - // We shouldn't come here as we don't support SET for VPD - // - ASSERT (FALSE); - return FALSE; - } else { - if ((*CurrentSize > MaxSize) || - (*CurrentSize == MAX_ADDRESS)) { - *CurrentSize = MaxSize; - return FALSE; - } - - if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) { - // - // We have only two entry for Non-Sku enabled PCD entry: - // 1) MAX SIZE - // 2) Current Size - // - SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize; - return TRUE; - } else { - // - // We have these entry for SKU enabled PCD entry - // 1) MAX SIZE - // 2) Current Size for each SKU_ID (It is equal to MaxSku). - // - SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database); - for (i = 0; i < SkuIdTable[0]; i++) { - if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) { - SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize; - return TRUE; - } - } - SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize; - return TRUE; - } - } - -}