/** Set value for a dynamic 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 entry registered callback function. Finally, invoken general SetWorker to set PCD value. @param ExTokenNumber Dynamic-ex PCD token number. @param Guid Token space guid for dynamic-ex PCD. @param Data PCD value want to be set @param SetSize Size of value. @param PtrType If TRUE, this PCD entry is pointer type. If FALSE, this PCD entry is not pointer type. @return status of SetWorker(). **/ EFI_STATUS ExSetWorker ( IN UINTN ExTokenNumber, IN CONST EFI_GUID *Guid, IN VOID *Data, IN OUT UINTN *Size, IN BOOLEAN PtrType ) { UINTN TokenNumber; if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) { return EFI_UNSUPPORTED; } TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) { return EFI_NOT_FOUND; } InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, *Size); return SetWorker (TokenNumber, Data, Size, PtrType); }
/** Set value for an PCD entry @param TokenNumber Pcd token number autogenerated by build tools. @param Data Value want to be set for PCD entry @param Size Size of value. @param PtrType If TRUE, the type of PCD entry's value is Pointer. If False, the type of PCD entry's value is not Pointer. @retval EFI_INVALID_PARAMETER If this PCD type is VPD, VPD PCD can not be set. @retval EFI_INVALID_PARAMETER If Size can not be set to size table. @retval EFI_INVALID_PARAMETER If Size of non-Ptr type PCD does not match the size information in PCD database. @retval EFI_NOT_FOUND If value type of PCD entry is intergrate, but not in range of UINT8, UINT16, UINT32, UINT64 @retval EFI_NOT_FOUND Can not find the PCD type according to token number. **/ EFI_STATUS SetWorker ( IN UINTN TokenNumber, IN VOID *Data, IN OUT UINTN *Size, IN BOOLEAN PtrType ) { UINT32 LocalTokenNumber; PEI_PCD_DATABASE *PeiPcdDb; UINT16 StringTableIdx; UINTN Offset; VOID *InternalData; UINTN MaxSize; if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) { return EFI_UNSUPPORTED; } // // 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--; // 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 (); LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber]; if ((!PtrType) && (PeiPcdGetSize(TokenNumber + 1) != *Size)) { return EFI_INVALID_PARAMETER; } // // We only invoke the callback function for Dynamic Type PCD Entry. // For Dynamic EX PCD entry, we have invoked the callback function for Dynamic EX // type PCD entry in ExSetWorker. // if (TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) { InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size); } if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) { if (PtrType) { MaxSize = GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb); } else { MaxSize = *Size; } LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize); } Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK; InternalData = (VOID *) ((UINT8 *) PeiPcdDb + Offset); switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: case PCD_TYPE_HII: case PCD_TYPE_HII|PCD_TYPE_STRING: { ASSERT (FALSE); return EFI_INVALID_PARAMETER; } case PCD_TYPE_STRING: if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) { StringTableIdx = *((UINT16 *)InternalData); CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, *Size); return EFI_SUCCESS; } else { return EFI_INVALID_PARAMETER; } case PCD_TYPE_DATA: { if (PtrType) { if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) { CopyMem (InternalData, Data, *Size); return EFI_SUCCESS; } else { return EFI_INVALID_PARAMETER; } } switch (*Size) { case sizeof(UINT8): *((UINT8 *) InternalData) = *((UINT8 *) Data); return EFI_SUCCESS; case sizeof(UINT16): *((UINT16 *) InternalData) = *((UINT16 *) Data); return EFI_SUCCESS; case sizeof(UINT32): *((UINT32 *) InternalData) = *((UINT32 *) Data); return EFI_SUCCESS; case sizeof(UINT64): *((UINT64 *) InternalData) = *((UINT64 *) Data); return EFI_SUCCESS; default: ASSERT (FALSE); return EFI_NOT_FOUND; } } } ASSERT (FALSE); return EFI_NOT_FOUND; }
/** Set value for an PCD entry @param TokenNumber Pcd token number autogenerated by build tools. @param Data Value want to be set for PCD entry @param Size Size of value. @param PtrType If TRUE, the type of PCD entry's value is Pointer. If False, the type of PCD entry's value is not Pointer. @retval EFI_INVALID_PARAMETER If this PCD type is VPD, VPD PCD can not be set. @retval EFI_INVALID_PARAMETER If Size can not be set to size table. @retval EFI_INVALID_PARAMETER If Size of non-Ptr type PCD does not match the size information in PCD database. @retval EFI_NOT_FOUND If value type of PCD entry is intergrate, but not in range of UINT8, UINT16, UINT32, UINT64 @retval EFI_NOT_FOUND Can not find the PCD type according to token number. **/ EFI_STATUS SetWorker ( IN UINTN TokenNumber, IN VOID *Data, IN OUT UINTN *Size, IN BOOLEAN PtrType ) { UINT32 LocalTokenNumber; UINTN PeiNexTokenNumber; PEI_PCD_DATABASE *PeiPcdDb; STRING_HEAD StringTableIdx; UINTN Offset; VOID *InternalData; UINTN MaxSize; UINT32 LocalTokenCount; if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) { return EFI_UNSUPPORTED; } // // 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--; PeiPcdDb = GetPcdDatabase (); LocalTokenCount = PeiPcdDb->LocalTokenCount; // 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 < (LocalTokenCount + 1)); if (PtrType) { // // Get MaxSize first, then check new size with max buffer size. // GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb); if (*Size > MaxSize) { *Size = MaxSize; return EFI_INVALID_PARAMETER; } } else { if (*Size != PeiPcdGetSize (TokenNumber + 1)) { return EFI_INVALID_PARAMETER; } } // // We only invoke the callback function for Dynamic Type PCD Entry. // For Dynamic EX PCD entry, we have invoked the callback function for Dynamic EX // type PCD entry in ExSetWorker. // PeiNexTokenNumber = PeiPcdDb->LocalTokenCount - PeiPcdDb->ExTokenCount; if (TokenNumber + 1 < PeiNexTokenNumber + 1) { InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size); } LocalTokenNumber = GetLocalTokenNumber (PeiPcdDb, TokenNumber + 1); Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK; InternalData = (VOID *) ((UINT8 *) PeiPcdDb + Offset); switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: case PCD_TYPE_HII: case PCD_TYPE_HII|PCD_TYPE_STRING: { ASSERT (FALSE); return EFI_INVALID_PARAMETER; } case PCD_TYPE_STRING: if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) { StringTableIdx = *((STRING_HEAD *)InternalData); CopyMem ((UINT8 *)PeiPcdDb + PeiPcdDb->StringTableOffset + StringTableIdx, Data, *Size); return EFI_SUCCESS; } else { return EFI_INVALID_PARAMETER; } case PCD_TYPE_DATA: { if (PtrType) { if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) { CopyMem (InternalData, Data, *Size); return EFI_SUCCESS; } else { return EFI_INVALID_PARAMETER; } } switch (*Size) { case sizeof(UINT8): *((UINT8 *) InternalData) = *((UINT8 *) Data); return EFI_SUCCESS; case sizeof(UINT16): *((UINT16 *) InternalData) = *((UINT16 *) Data); return EFI_SUCCESS; case sizeof(UINT32): *((UINT32 *) InternalData) = *((UINT32 *) Data); return EFI_SUCCESS; case sizeof(UINT64): *((UINT64 *) InternalData) = *((UINT64 *) Data); return EFI_SUCCESS; default: ASSERT (FALSE); return EFI_NOT_FOUND; } } } ASSERT (FALSE); return EFI_NOT_FOUND; }