MCPcopy Create free account
hub / github.com/CloverHackyColor/CloverBootloader / GetWorker

Function GetWorker

MdeModulePkg/Universal/PCD/Pei/Service.c:839–960  ·  view source on GitHub ↗

Get the PCD entry pointer in PCD database. This routine will visit PCD database to find the PCD entry according to given token number. The given token number is autogened by build tools and it will be translated to local token number. Local token number contains PCD's type and offset of PCD entry in PCD database. @param TokenNumber Token's number, it is autogened by build to

Source from the content-addressed store, hash-verified

837
838**/
839VOID *
840GetWorker (
841 IN UINTN TokenNumber,
842 IN UINTN GetSize
843 )
844{
845 UINT32 Offset;
846 EFI_GUID *Guid;
847 UINT16 *Name;
848 VARIABLE_HEAD *VariableHead;
849 EFI_STATUS Status;
850 UINTN DataSize;
851 VOID *Data;
852 UINT8 *StringTable;
853 STRING_HEAD StringTableIdx;
854 PEI_PCD_DATABASE *PeiPcdDb;
855 UINT32 LocalTokenNumber;
856 UINT32 LocalTokenCount;
857 UINT8 *VaraiableDefaultBuffer;
858 UINTN VpdBaseAddress;
859
860 //
861 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
862 // We have to decrement TokenNumber by 1 to make it usable
863 // as the array index.
864 //
865 TokenNumber--;
866
867 PeiPcdDb = GetPcdDatabase ();
868 LocalTokenCount = PeiPcdDb->LocalTokenCount;
869
870 // EBC compiler is very choosy. It may report warning about comparison
871 // between UINTN and 0 . So we add 1 in each size of the
872 // comparison.
873 ASSERT (TokenNumber + 1 < (LocalTokenCount + 1));
874
875 ASSERT ((GetSize == PeiPcdGetSize(TokenNumber + 1)) || (GetSize == 0));
876
877 LocalTokenNumber = GetLocalTokenNumber (PeiPcdDb, TokenNumber + 1);
878
879 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
880 StringTable = (UINT8 *)PeiPcdDb + PeiPcdDb->StringTableOffset;
881
882 switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {
883 case PCD_TYPE_VPD:
884 {
885 VPD_HEAD *VpdHead;
886 VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);
887
888 //
889 // PcdVpdBaseAddress64 is DynamicEx PCD only. So, PeiPcdGet64Ex() is used to get its value.
890 //
891 VpdBaseAddress = (UINTN) PeiPcdGet64Ex (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64));
892 if (VpdBaseAddress == 0) {
893 //
894 // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress.
895 //
896 VpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress);

Callers 7

ExGetWorkerFunction · 0.70
PeiPcdGet8Function · 0.70
PeiPcdGet16Function · 0.70
PeiPcdGet32Function · 0.70
PeiPcdGet64Function · 0.70
Pcd.cFile · 0.70
PeiPcdGetBoolFunction · 0.70

Calls 7

GetPcdDatabaseFunction · 0.85
PeiPcdGetSizeFunction · 0.85
PeiPcdGet64ExFunction · 0.85
GetLocalTokenNumberFunction · 0.70
GetHiiVariableFunction · 0.70
GetPtrTypeSizeFunction · 0.70
CopyMemFunction · 0.50

Tested by

no test coverage detected