X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FPcd.c;h=33bc4e1069edb063fc5745010d4c0fb5078c3654;hp=88d1fb0f62a1276193fdb47dec076056d7a20099;hb=5f5f28c90dc44075e9f9202b030c66300218f7c0;hpb=52e1905d39d71e013d253845cf8f2cdabea7c4f9 diff --git a/EdkModulePkg/Universal/PCD/Pei/Pcd.c b/EdkModulePkg/Universal/PCD/Pei/Pcd.c index 88d1fb0f62..33bc4e1069 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Pei/Pcd.c @@ -14,7 +14,6 @@ Module Name: Pcd.c **/ -#include "PcdCommon.h" #include "Service.h" @@ -51,9 +50,10 @@ PCD_PPI mPcdPpiInstance = { PeiPcdSetPtrEx, PeiPcdSetBoolEx, - PcdRegisterCallBackOnSet, + PeiRegisterCallBackOnSet, PcdUnRegisterCallBackOnSet, - PeiPcdGetNextToken + PeiPcdGetNextToken, + PeiPcdGetNextTokenSpace }; @@ -77,14 +77,14 @@ PcdPeimInit ( BuildPcdDatabase (); - Status = PeiCoreInstallPpi (&mPpiPCD); + Status = PeiServicesInstallPpi (&mPpiPCD); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; } -EFI_STATUS +VOID EFIAPI PeiPcdSetSku ( IN UINTN SkuId @@ -93,7 +93,7 @@ PeiPcdSetSku ( GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId; - return EFI_SUCCESS; + return; } @@ -101,7 +101,7 @@ PeiPcdSetSku ( UINT8 EFIAPI PeiPcdGet8 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); @@ -112,7 +112,7 @@ PeiPcdGet8 ( UINT16 EFIAPI PeiPcdGet16 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); @@ -123,7 +123,7 @@ PeiPcdGet16 ( UINT32 EFIAPI PeiPcdGet32 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); @@ -134,7 +134,7 @@ PeiPcdGet32 ( UINT64 EFIAPI PeiPcdGet64 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64))); @@ -145,7 +145,7 @@ PeiPcdGet64 ( VOID * EFIAPI PeiPcdGetPtr ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return GetWorker (TokenNumber, 0); @@ -156,7 +156,7 @@ PeiPcdGetPtr ( BOOLEAN EFIAPI PeiPcdGetBool ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); @@ -167,12 +167,46 @@ PeiPcdGetBool ( UINTN EFIAPI PeiPcdGetSize ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + PEI_PCD_DATABASE *PeiPcdDb; + UINTN Size; + UINTN MaxSize; + + // + // If DebugAssertEnabled is TRUE, we still need to provide the GET size + // function as GetWorker and SetWoker need this function to do ASSERT. + // + if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) && + (!DebugAssertEnabled ())) { + return 0; + } + + PeiPcdDb = GetPcdDatabase (); + // + // 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); + + Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT; + + if (Size == 0) { + // + // For pointer type, we need to scan the SIZE_TABLE to get the current size. + // + return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb); + } else { + return Size; + } - return GetPcdDatabase()->Init.SizeTable[TokenNumber]; } @@ -180,8 +214,8 @@ PeiPcdGetSize ( UINT8 EFIAPI PeiPcdGet8Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8))); @@ -192,8 +226,8 @@ PeiPcdGet8Ex ( UINT16 EFIAPI PeiPcdGet16Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16))); @@ -204,8 +238,8 @@ PeiPcdGet16Ex ( UINT32 EFIAPI PeiPcdGet32Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32))); @@ -216,8 +250,8 @@ PeiPcdGet32Ex ( UINT64 EFIAPI PeiPcdGet64Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64))); @@ -228,8 +262,8 @@ PeiPcdGet64Ex ( VOID * EFIAPI PeiPcdGetPtrEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ExGetWorker (Guid, ExTokenNumber, 0); @@ -240,8 +274,8 @@ PeiPcdGetPtrEx ( BOOLEAN EFIAPI PeiPcdGetBoolEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN))); @@ -252,15 +286,15 @@ PeiPcdGetBoolEx ( UINTN EFIAPI PeiPcdGetSizeEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { - EX_PCD_ENTRY_ATTRIBUTE Attr; + if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) { + return 0; + } - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - - return Attr.Size; + return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber)); } @@ -268,11 +302,11 @@ PeiPcdGetSizeEx ( EFI_STATUS EFIAPI PeiPcdSet8 ( - IN UINTN TokenNumber, - IN UINT8 Value + IN UINTN TokenNumber, + IN UINT8 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -280,11 +314,11 @@ PeiPcdSet8 ( EFI_STATUS EFIAPI PeiPcdSet16 ( - IN UINTN TokenNumber, - IN UINT16 Value + IN UINTN TokenNumber, + IN UINT16 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -292,11 +326,11 @@ PeiPcdSet16 ( EFI_STATUS EFIAPI PeiPcdSet32 ( - IN UINTN TokenNumber, - IN UINT32 Value + IN UINTN TokenNumber, + IN UINT32 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -304,27 +338,23 @@ PeiPcdSet32 ( EFI_STATUS EFIAPI PeiPcdSet64 ( - IN UINTN TokenNumber, - IN UINT64 Value + IN UINTN TokenNumber, + IN UINT64 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } EFI_STATUS EFIAPI PeiPcdSetPtr ( - IN UINTN TokenNumber, - IN CONST VOID *Value + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer ) { - // - // BugBug, please change the Size to Input size when sync with spec - // - //ASSERT (sizeof (Value) == GetPcdDatabase()->Init.SizeTable[TokenNumber]); - - return SetWorker (TokenNumber, (VOID *) Value, GetPcdDatabase()->Init.SizeTable[TokenNumber], TRUE); + return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE); } @@ -332,11 +362,11 @@ PeiPcdSetPtr ( EFI_STATUS EFIAPI PeiPcdSetBool ( - IN UINTN TokenNumber, - IN BOOLEAN Value + IN UINTN TokenNumber, + IN BOOLEAN Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -344,18 +374,12 @@ PeiPcdSetBool ( EFI_STATUS EFIAPI PeiPcdSet8Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN UINT8 Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINT8 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -363,18 +387,12 @@ PeiPcdSet8Ex ( EFI_STATUS EFIAPI PeiPcdSet16Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN UINT16 Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINT16 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -382,18 +400,12 @@ PeiPcdSet16Ex ( EFI_STATUS EFIAPI PeiPcdSet32Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN UINT32 Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINT32 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -401,18 +413,12 @@ PeiPcdSet32Ex ( EFI_STATUS EFIAPI PeiPcdSet64Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN UINT64 Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINT64 Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -420,18 +426,13 @@ PeiPcdSet64Ex ( EFI_STATUS EFIAPI PeiPcdSetPtrEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN CONST VOID *Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINTN *SizeOfBuffer, + IN VOID *Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - (VOID *) Value, - sizeof (Value), - TRUE - ); + return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE); } @@ -439,18 +440,12 @@ PeiPcdSetPtrEx ( EFI_STATUS EFIAPI PeiPcdSetBoolEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN BOOLEAN Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN BOOLEAN Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - FALSE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -458,12 +453,18 @@ PeiPcdSetBoolEx ( EFI_STATUS EFIAPI -PcdRegisterCallBackOnSet ( - IN UINTN ExTokenNumber, +PeiRegisterCallBackOnSet ( IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN ExTokenNumber, IN PCD_PPI_CALLBACK CallBackFunction ) { + if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) { + return EFI_UNSUPPORTED; + } + + ASSERT (CallBackFunction != NULL); + return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE); } @@ -472,11 +473,17 @@ PcdRegisterCallBackOnSet ( EFI_STATUS EFIAPI PcdUnRegisterCallBackOnSet ( - IN UINTN ExTokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN ExTokenNumber, IN PCD_PPI_CALLBACK CallBackFunction ) { + if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) { + return EFI_UNSUPPORTED; + } + + ASSERT (CallBackFunction != NULL); + return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE); } @@ -489,19 +496,168 @@ PeiPcdGetNextToken ( IN OUT UINTN *TokenNumber ) { + UINTN GuidTableIdx; + PEI_PCD_DATABASE *PeiPcdDb; + EFI_GUID *MatchGuid; + DYNAMICEX_MAPPING *ExMapTable; + UINTN i; + BOOLEAN Found; + + if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + if (Guid == NULL) { - *TokenNumber++; + if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) { + return EFI_NOT_FOUND; + } + (*TokenNumber)++; + if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + } + return EFI_SUCCESS; + } else { + if (PEI_EXMAP_TABLE_EMPTY) { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; + } + + // + // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order + // 1) ExGuid + // 2) ExTokenNumber + // + PeiPcdDb = GetPcdDatabase (); + + MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); + + if (MatchGuid == NULL) { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_NOT_FOUND; + } + + GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; - if (*TokenNumber >= PEI_LOCAL_TOKEN_NUMBER) { - *TokenNumber = 0; + ExMapTable = PeiPcdDb->Init.ExMapTable; + + Found = FALSE; + // + // Locate the GUID in ExMapTable first. + // + for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { + if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { + Found = TRUE; + break; + } + } + + if (Found) { + if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) { + *TokenNumber = ExMapTable[i].ExTokenNumber; + return EFI_SUCCESS; + } + + for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) { + if (ExMapTable[i].ExTokenNumber == *TokenNumber) { + i++; + if (i == PEI_EXMAPPING_TABLE_SIZE) { + // + // Exceed the length of ExMap Table + // + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; + } + if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { + *TokenNumber = ExMapTable[i].ExTokenNumber; + return EFI_SUCCESS; + } else { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; + } + } + } + return EFI_NOT_FOUND; + } + } + + return EFI_NOT_FOUND; +} + + + +EFI_STATUS +EFIAPI +PeiPcdGetNextTokenSpace ( + IN OUT CONST EFI_GUID **Guid + ) +{ + UINTN GuidTableIdx; + EFI_GUID *MatchGuid; + PEI_PCD_DATABASE *PeiPcdDb; + DYNAMICEX_MAPPING *ExMapTable; + UINTN i; + BOOLEAN Found; + + if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + + ASSERT (Guid != NULL); + + if (PEI_EXMAP_TABLE_EMPTY) { + if (*Guid != NULL) { + return EFI_NOT_FOUND; + } else { + return EFI_SUCCESS; } } // - // BugBug: Haven't implemented the portion to get Next Token for GuidSpace is not Local GuidSpace. + // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order + // 1) ExGuid + // 2) ExTokenNumber // + PeiPcdDb = GetPcdDatabase (); - return EFI_SUCCESS; -} + ExMapTable = PeiPcdDb->Init.ExMapTable; + + if (*Guid == NULL) { + // + // return the first Token Space Guid. + // + *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex]; + return EFI_SUCCESS; + } + + MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid); + if (MatchGuid == NULL) { + return EFI_NOT_FOUND; + } + + GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; + + Found = FALSE; + for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { + if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { + Found = TRUE; + break; + } + } + + if (Found) { + i++; + for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) { + if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) { + *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex]; + return EFI_SUCCESS; + } + } + *Guid = NULL; + return EFI_SUCCESS; + } + + return EFI_NOT_FOUND; + +}