X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FService.c;h=011e3aa36ef4d9133988355ec18771184b2f4001;hp=e280dd6715558a39b82c33175db5892bcd0145f2;hb=bb5545b663e1d8ac4fd37003d5ba26fafdad5831;hpb=0653eb895dfb8d059c114120a0779b561c5578ef diff --git a/EdkModulePkg/Universal/PCD/Pei/Service.c b/EdkModulePkg/Universal/PCD/Pei/Service.c index e280dd6715..011e3aa36e 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Service.c +++ b/EdkModulePkg/Universal/PCD/Pei/Service.c @@ -43,18 +43,32 @@ PeiRegisterCallBackWorker ( UINT32 LocalTokenNumber; UINTN TokenNumber; UINTN Idx; - EX_PCD_ENTRY_ATTRIBUTE Attr; if (Guid == NULL) { TokenNumber = ExTokenNumber; + + // + // 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--; ASSERT (TokenNumber < PEI_NEX_TOKEN_NUMBER); - LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber]; } else { - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - TokenNumber = Attr.TokenNumber; - LocalTokenNumber = Attr.LocalTokenNumberAlias; + TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); + + // + // 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--; + ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); } + + LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber]; + ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0); ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0); @@ -145,11 +159,10 @@ GetHiiVariable ( VOID *Buffer; EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi; - Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, (VOID **) &VariablePpi); + Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, (VOID **) &VariablePpi); ASSERT_EFI_ERROR (Status); Size = 0; - Status = VariablePpi->PeiGetVariable ( GetPeiServicesTablePointer (), VariableName, @@ -158,25 +171,30 @@ GetHiiVariable ( &Size, NULL ); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); + if (Status == EFI_BUFFER_TOO_SMALL) { - Status = PeiCoreAllocatePool (Size, &Buffer); - ASSERT_EFI_ERROR (Status); - Status = VariablePpi->PeiGetVariable ( - GetPeiServicesTablePointer (), - (UINT16 *) VariableName, - (EFI_GUID *) VariableGuid, - NULL, - &Size, - Buffer - ); - ASSERT_EFI_ERROR (Status); + Status = PeiServicesAllocatePool (Size, &Buffer); + ASSERT_EFI_ERROR (Status); - *VariableSize = Size; - *VariableData = Buffer; + Status = VariablePpi->PeiGetVariable ( + GetPeiServicesTablePointer (), + (UINT16 *) VariableName, + (EFI_GUID *) VariableGuid, + NULL, + &Size, + Buffer + ); + ASSERT_EFI_ERROR (Status); + + *VariableSize = Size; + *VariableData = Buffer; + + return EFI_SUCCESS; + } else { + return EFI_NOT_FOUND; + } - return EFI_SUCCESS; } @@ -245,6 +263,13 @@ InvokeCallbackOnSet ( PCD_PPI_CALLBACK *CallbackTable; UINTN Idx; + // + // 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--; + if (Guid == NULL) ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); @@ -267,16 +292,29 @@ InvokeCallbackOnSet ( } + + + EFI_STATUS SetWorker ( - UINTN TokenNumber, - VOID *Data, - UINTN Size, - BOOLEAN PtrType + UINTN TokenNumber, + VOID *Data, + UINTN Size, + BOOLEAN PtrType ) { UINT32 LocalTokenNumber; PEI_PCD_DATABASE *PeiPcdDb; + UINT16 StringTableIdx; + UINTN Offset; + VOID *InternalData; + + // + // 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--; ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); @@ -290,71 +328,21 @@ SetWorker ( ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size); } - InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size); - - return SetWorkerByLocalTokenNumber (LocalTokenNumber, Data, Size, PtrType); - -} - - - - -EFI_STATUS -ExSetWorker ( - IN UINT32 ExTokenNumber, - IN CONST EFI_GUID *Guid, - VOID *Data, - UINTN Size, - BOOLEAN PtrType - ) -{ - PEI_PCD_DATABASE *PeiPcdDb; - EX_PCD_ENTRY_ATTRIBUTE Attr; - - - PeiPcdDb = GetPcdDatabase (); - - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - - ASSERT (!PtrType && Attr.Size); - - ASSERT (PtrType && Attr.Size >= Size); - - InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Size); - - SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Size, PtrType); - - return EFI_SUCCESS; - -} - - - + // + // 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 < PEI_NEX_TOKEN_NUMBER) { + InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size); + } -EFI_STATUS -SetWorkerByLocalTokenNumber ( - UINT32 LocalTokenNumber, - VOID *Data, - UINTN Size, - BOOLEAN PtrType - ) -{ - PEI_PCD_DATABASE *PeiPcdDb; - UINT8 *PeiPcdDbRaw; - UINT16 StringTableIdx; - UINTN Offset; - VOID *InternalData; - - - PeiPcdDb = GetPcdDatabase (); - PeiPcdDbRaw = (UINT8 *) PeiPcdDb; - if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) { LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size); } Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK; - InternalData = (VOID *) (PeiPcdDbRaw + Offset); + InternalData = (VOID *) ((UINT8 *) PeiPcdDb + Offset); switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) { case PCD_TYPE_VPD: @@ -367,7 +355,7 @@ SetWorkerByLocalTokenNumber ( case PCD_TYPE_STRING: StringTableIdx = *((UINT16 *)InternalData); CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size); - break; + return EFI_SUCCESS; case PCD_TYPE_DATA: { @@ -404,14 +392,53 @@ SetWorkerByLocalTokenNumber ( ASSERT (FALSE); return EFI_NOT_FOUND; + } + + +EFI_STATUS +ExSetWorker ( + IN UINTN ExTokenNumber, + IN CONST EFI_GUID *Guid, + VOID *Data, + UINTN Size, + BOOLEAN PtrType + ) +{ + UINTN TokenNumber; + + TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); + + InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, Size); + + SetWorker (TokenNumber, Data, Size, PtrType); + + return EFI_SUCCESS; + +} + + + + +VOID * +ExGetWorker ( + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINTN GetSize + ) +{ + return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize); +} + + + + VOID * -GetWorkerByLocalTokenNumber ( - PEI_PCD_DATABASE *PeiPcdDb, - UINT32 LocalTokenNumber, - UINTN Size +GetWorker ( + UINTN TokenNumber, + UINTN GetSize ) { UINT32 Offset; @@ -423,9 +450,27 @@ GetWorkerByLocalTokenNumber ( VOID *Data; UINT16 *StringTable; UINT16 StringTableIdx; - + PEI_PCD_DATABASE *PeiPcdDb; + UINT32 LocalTokenNumber; + UINTN Size; + + // + // 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--; + + ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + + Size = PeiPcdGetSize(TokenNumber + 1); + + ASSERT (GetSize == Size || GetSize == 0); + PeiPcdDb = GetPcdDatabase (); + LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber]; + if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) { LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size); } @@ -449,15 +494,20 @@ GetWorkerByLocalTokenNumber ( Name = &StringTable[VariableHead->StringIndex]; Status = GetHiiVariable (Guid, Name, &Data, &DataSize); - ASSERT_EFI_ERROR (Status); - ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size)); - return (VOID *) ((UINT8 *) Data + VariableHead->Offset); + if (Status == EFI_SUCCESS) { + ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size)); + return (VOID *) ((UINT8 *) Data + VariableHead->Offset); + } else { + // + // Return the default value specified by Platform Integrator + // + return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset); + } } case PCD_TYPE_DATA: return (VOID *) ((UINT8 *)PeiPcdDb + Offset); - break; case PCD_TYPE_STRING: StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset); @@ -476,72 +526,43 @@ GetWorkerByLocalTokenNumber ( } -VOID * -ExGetWorker ( - IN CONST EFI_GUID *Guid, - IN UINT32 ExTokenNumber, - IN UINTN GetSize - ) -{ - EX_PCD_ENTRY_ATTRIBUTE Attr; - - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - - ASSERT ((GetSize == Attr.Size) || (GetSize == 0)); - - return GetWorkerByLocalTokenNumber (GetPcdDatabase(), - Attr.LocalTokenNumberAlias, - Attr.Size - ); -} - -VOID * -GetWorker ( - UINTN TokenNumber, - UINTN GetSize - ) -{ - PEI_PCD_DATABASE *PeiPcdDb; - - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); - - ASSERT (GetSize == PeiPcdGetSize (TokenNumber) || GetSize == 0); - - PeiPcdDb = GetPcdDatabase (); - - return GetWorkerByLocalTokenNumber (PeiPcdDb, PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber], GetSize); -} - - -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; + EFI_GUID *MatchGuid; + UINTN MatchGuidIdx; PEI_PCD_DATABASE *PeiPcdDb; PeiPcdDb = GetPcdDatabase(); ExMap = PeiPcdDb->Init.ExMapTable; GuidTable = PeiPcdDb->Init.GuidTable; + + MatchGuid = ScanGuid (GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); + // + // We need to ASSERT here. If GUID can't be found in GuidTable, this is a + // error in the BUILD system. + // + 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->TokenNumber = i + PEI_NEX_TOKEN_NUMBER; - ExAttr->Size = PeiPcdDb->Init.SizeTable[i + PEI_NEX_TOKEN_NUMBER]; - ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber; + (MatchGuidIdx == ExMap[i].ExGuidIndex)) { + return ExMap[i].LocalTokenNumber; } } ASSERT (FALSE); - return; + return 0; }