X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=4b86cd7795ca38eab1f7871d58e2955bc4a97916;hb=e65e8d103dbadc85c3fe3cce50cd98069a75e72f;hp=ebef59590f0377ee928ec07126990b56b8e79f3a;hpb=4c114006de95489973d33a5415bb451bcd6cd62a;p=mirror_edk2.git diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c index ebef59590f..4b86cd7795 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Service.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Service.c @@ -24,15 +24,18 @@ Module Name: Service.c PCD_DATABASE * mPcdDatabase; -LIST_ENTRY mCallbackFnTable[PCD_TOTAL_TOKEN_NUMBER]; +LIST_ENTRY *mCallbackFnTable; VOID * -GetWorkerByLocalTokenNumber ( - UINT32 LocalTokenNumber, - BOOLEAN IsPeiDb, - UINTN Size - ) +GetWorker ( + UINTN TokenNumber, + UINTN GetSize + ) { + UINT32 *LocalTokenNumberTable; + UINT16 *SizeTable; + BOOLEAN IsPeiDb; + UINTN Size; UINT32 Offset; EFI_GUID *GuidTable; UINT16 *StringTable; @@ -45,7 +48,28 @@ GetWorkerByLocalTokenNumber ( VPD_HEAD *VpdHead; UINT8 *PcdDb; UINT16 StringTableIdx; + UINT32 LocalTokenNumber; + + + ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); + + Size = DxePcdGetSize (TokenNumber); + ASSERT (GetSize == Size || GetSize == 0); + + + IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; + + LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : + mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; + + SizeTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SizeTable: + mPcdDatabase->DxeDb.Init.SizeTable; + + TokenNumber = IsPeiDb ? TokenNumber : + TokenNumber - PEI_LOCAL_TOKEN_NUMBER; + LocalTokenNumber = LocalTokenNumberTable[TokenNumber]; + if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) { LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb); } @@ -59,7 +83,7 @@ GetWorkerByLocalTokenNumber ( switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) { case PCD_TYPE_VPD: VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset); - return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); + return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); case PCD_TYPE_HII: GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable : @@ -93,30 +117,7 @@ GetWorkerByLocalTokenNumber ( ASSERT (FALSE); return NULL; -} - -VOID * -GetWorker ( - UINTN TokenNumber - ) -{ - UINT32 *LocalTokenNumberTable; - UINT16 *SizeTable; - BOOLEAN IsPeiDb; - - ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); - IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; - - LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : - mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; - - SizeTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SizeTable: - mPcdDatabase->DxeDb.Init.SizeTable; - - TokenNumber = IsPeiDb ? TokenNumber : - TokenNumber - PEI_LOCAL_TOKEN_NUMBER; - return GetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], IsPeiDb, SizeTable[TokenNumber]); } @@ -129,13 +130,11 @@ DxeRegisterCallBackWorker ( ) { CALLBACK_FN_ENTRY *FnTableEntry; - EX_PCD_ENTRY_ATTRIBUTE ExAttr; LIST_ENTRY *ListHead; LIST_ENTRY *ListNode; if (Guid != NULL) { - GetExPcdTokenAttributes (Guid, TokenNumber, &ExAttr); - TokenNumber = ExAttr.LocalTokenNumberAlias; + TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber); } ListHead = &mCallbackFnTable[TokenNumber]; @@ -174,13 +173,11 @@ DxeUnRegisterCallBackWorker ( ) { CALLBACK_FN_ENTRY *FnTableEntry; - EX_PCD_ENTRY_ATTRIBUTE ExAttr; LIST_ENTRY *ListHead; LIST_ENTRY *ListNode; if (Guid != NULL) { - GetExPcdTokenAttributes (Guid, TokenNumber, &ExAttr); - TokenNumber = ExAttr.LocalTokenNumberAlias; + TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber); } ListHead = &mCallbackFnTable[TokenNumber]; @@ -208,10 +205,10 @@ DxeUnRegisterCallBackWorker ( -PCD_TOKEN_NUMBER +UINTN ExGetNextTokeNumber ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN EFI_GUID *GuidTable, IN UINTN SizeOfGuidTable, IN DYNAMICEX_MAPPING *ExMapTable, @@ -275,7 +272,7 @@ ExGetNextTokeNumber ( VOID BuildPcdDxeDataBase ( VOID -) + ) { PEI_PCD_DATABASE *PeiDatabase; EFI_HOB_GUID_TYPE *GuidHob; @@ -285,13 +282,24 @@ BuildPcdDxeDataBase ( ASSERT (mPcdDatabase != NULL); GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid); - ASSERT (GuidHob != NULL); - PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob); - // - // Copy PCD Entries refereneced in PEI phase to PCD DATABASE - // - CopyMem (&mPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE)); + if (GuidHob != NULL) { + + // + // We will copy over the PEI phase's PCD Database. + // + // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM + // should not be included at all. So the GuidHob could + // be NULL. If it is NULL, we just copy over the DXE Default + // Value to PCD Database. + // + + PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob); + // + // Copy PCD Entries refereneced in PEI phase to PCD DATABASE + // + CopyMem (&mPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE)); + } // // Copy PCD Entries with default value to PCD DATABASE @@ -302,6 +310,11 @@ BuildPcdDxeDataBase ( // // Initialized the Callback Function Table // + + if (PCD_TOTAL_TOKEN_NUMBER != 0) { + mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY)); + } + for (Idx = 0; Idx < PCD_TOTAL_TOKEN_NUMBER; Idx++) { InitializeListHead (&mCallbackFnTable[Idx]); } @@ -385,15 +398,15 @@ GetSkuEnabledTokenNumber ( switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) { case PCD_TYPE_VPD: Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]); - return ((Value - PcdDb) | PCD_TYPE_VPD); + return (UINT32) ((Value - PcdDb) | PCD_TYPE_VPD); case PCD_TYPE_HII: Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]); - return ((Value - PcdDb) | PCD_TYPE_HII); + return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII); case PCD_TYPE_DATA: Value += Size * i; - return (Value - PcdDb); + return (UINT32) (Value - PcdDb); default: ASSERT (FALSE); @@ -444,14 +457,23 @@ InvokeCallbackOnSet ( EFI_STATUS SetWorker ( - UINTN TokenNumber, - VOID *Data, - UINTN Size, - BOOLEAN PtrType + UINTN TokenNumber, + VOID *Data, + UINTN Size, + BOOLEAN PtrType ) { UINT32 *LocalTokenNumberTable; BOOLEAN IsPeiDb; + UINT32 LocalTokenNumber; + EFI_GUID *GuidTable; + UINT16 *StringTable; + EFI_GUID *Guid; + UINT16 *Name; + VOID *InternalData; + VARIABLE_HEAD *VariableHead; + UINTN Offset; + UINT8 *PcdDb; ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); @@ -467,89 +489,16 @@ SetWorker ( LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; + if ((TokenNumber < PEI_NEX_TOKEN_NUMBER) || + (TokenNumber >= PEI_LOCAL_TOKEN_NUMBER || TokenNumber < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER))) { + InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size); + } + TokenNumber = IsPeiDb ? TokenNumber : TokenNumber - PEI_LOCAL_TOKEN_NUMBER; - - InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size); - - return SetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], Data, Size, PtrType, IsPeiDb); - -} - - - - - -VOID * -ExGetWorker ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN UINTN GetSize - ) -{ - EX_PCD_ENTRY_ATTRIBUTE Attr; - - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - - ASSERT ((GetSize == Attr.Size) || (GetSize == 0)); - - return GetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, - Attr.IsPeiDb, - Attr.Size - ); -} - - - - -EFI_STATUS -ExSetWorker ( - IN UINT32 ExTokenNumber, - IN CONST EFI_GUID *Guid, - VOID *Data, - UINTN SetSize, - BOOLEAN PtrType - ) -{ - EX_PCD_ENTRY_ATTRIBUTE Attr; - - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - - ASSERT (!PtrType && (SetSize == Attr.Size)); - - ASSERT (PtrType && (SetSize <= Attr.Size)); - - InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Attr.Size); - - SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Attr.Size, PtrType, Attr.IsPeiDb); - - return EFI_SUCCESS; + LocalTokenNumber = LocalTokenNumberTable[TokenNumber]; -} - - - - -EFI_STATUS -SetWorkerByLocalTokenNumber ( - UINT32 LocalTokenNumber, - VOID *Data, - UINTN Size, - BOOLEAN PtrType, - BOOLEAN IsPeiDb - ) -{ - EFI_GUID *GuidTable; - UINT16 *StringTable; - EFI_GUID *Guid; - UINT16 *Name; - VOID *InternalData; - VARIABLE_HEAD *VariableHead; - UINTN Offset; - UINT8 *PcdDb; - - if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) { LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb); } @@ -625,6 +574,46 @@ SetWorkerByLocalTokenNumber ( + + +VOID * +ExGetWorker ( + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINTN GetSize + ) +{ + return GetWorker(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber), GetSize); +} + + + + + +EFI_STATUS +ExSetWorker ( + IN UINTN ExTokenNumber, + IN CONST EFI_GUID *Guid, + VOID *Data, + UINTN SetSize, + BOOLEAN PtrType + ) +{ + UINTN TokenNumber; + + TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber); + + InvokeCallbackOnSet ((UINT32) ExTokenNumber, Guid, TokenNumber, Data, SetSize); + + SetWorker (TokenNumber, Data, SetSize, PtrType); + + return EFI_SUCCESS; + +} + + + + EFI_STATUS SetHiiVariable ( IN EFI_GUID *VariableGuid, @@ -680,56 +669,51 @@ SetHiiVariable ( -VOID -GetExPcdTokenAttributes ( +UINTN +GetExPcdTokenNumber ( IN CONST EFI_GUID *Guid, - IN UINT32 ExTokenNumber, - OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr + IN UINT32 ExTokenNumber ) { UINT32 i; DYNAMICEX_MAPPING *ExMap; EFI_GUID *GuidTable; - UINT16 *SizeTable; + EFI_GUID *MatchGuid; + UINTN MatchGuidIdx; ExMap = mPcdDatabase->PeiDb.Init.ExMapTable; GuidTable = mPcdDatabase->PeiDb.Init.GuidTable; - SizeTable = mPcdDatabase->PeiDb.Init.SizeTable; + + MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), Guid); + ASSERT (MatchGuid != NULL); + + MatchGuidIdx = MatchGuid - GuidTable; for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { if ((ExTokenNumber == ExMap[i].ExTokenNumber) && - CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex]) - ) { - - ExAttr->IsPeiDb = TRUE; - ExAttr->Size = SizeTable[i + PEI_NEX_TOKEN_NUMBER]; - ExAttr->TokenNumber = i + PEI_NEX_TOKEN_NUMBER; - ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber; - return; + (MatchGuidIdx == ExMap[i].ExGuidIndex)) { + return ExMap[i].LocalTokenNumber; } } ExMap = mPcdDatabase->DxeDb.Init.ExMapTable; GuidTable = mPcdDatabase->DxeDb.Init.GuidTable; - SizeTable = mPcdDatabase->DxeDb.Init.SizeTable; + + MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->DxeDb.Init.GuidTable), Guid); + ASSERT (MatchGuid != NULL); + + MatchGuidIdx = MatchGuid - GuidTable; for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) { if ((ExTokenNumber == ExMap[i].ExTokenNumber) && - CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex]) - ) { - - ExAttr->IsPeiDb = FALSE; - ExAttr->Size = SizeTable[i + DXE_NEX_TOKEN_NUMBER]; - ExAttr->TokenNumber = i + DXE_NEX_TOKEN_NUMBER; - ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber; - return; - + (MatchGuidIdx == ExMap[i].ExGuidIndex)) { + return ExMap[i].LocalTokenNumber + PEI_LOCAL_TOKEN_NUMBER; } } ASSERT (FALSE); - return; + return 0; }