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
| 837 | |
| 838 | **/ |
| 839 | VOID * |
| 840 | GetWorker ( |
| 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); |
no test coverage detected