X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FPcd.c;h=33bc4e1069edb063fc5745010d4c0fb5078c3654;hp=974095f2841e462f9bc5a1d320e6b15e0fafc57f;hb=5f5f28c90dc44075e9f9202b030c66300218f7c0;hpb=00b7af13f226afbbe9432a9a7bcaef3d8a1651e8 diff --git a/EdkModulePkg/Universal/PCD/Pei/Pcd.c b/EdkModulePkg/Universal/PCD/Pei/Pcd.c index 974095f284..33bc4e1069 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Pei/Pcd.c @@ -50,9 +50,10 @@ PCD_PPI mPcdPpiInstance = { PeiPcdSetPtrEx, PeiPcdSetBoolEx, - PcdRegisterCallBackOnSet, + PeiRegisterCallBackOnSet, PcdUnRegisterCallBackOnSet, - PeiPcdGetNextToken + PeiPcdGetNextToken, + PeiPcdGetNextTokenSpace }; @@ -76,7 +77,7 @@ PcdPeimInit ( BuildPcdDatabase (); - Status = PeiCoreInstallPpi (&mPpiPCD); + Status = PeiServicesInstallPpi (&mPpiPCD); ASSERT_EFI_ERROR (Status); @@ -86,11 +87,11 @@ PcdPeimInit ( VOID EFIAPI PeiPcdSetSku ( - IN SKU_ID SkuId + IN UINTN SkuId ) { - GetPcdDatabase()->Init.SystemSkuId = SkuId; + GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId; return; } @@ -100,7 +101,7 @@ PeiPcdSetSku ( UINT8 EFIAPI PeiPcdGet8 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); @@ -111,7 +112,7 @@ PeiPcdGet8 ( UINT16 EFIAPI PeiPcdGet16 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); @@ -122,7 +123,7 @@ PeiPcdGet16 ( UINT32 EFIAPI PeiPcdGet32 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); @@ -133,7 +134,7 @@ PeiPcdGet32 ( UINT64 EFIAPI PeiPcdGet64 ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64))); @@ -144,7 +145,7 @@ PeiPcdGet64 ( VOID * EFIAPI PeiPcdGetPtr ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return GetWorker (TokenNumber, 0); @@ -155,7 +156,7 @@ PeiPcdGetPtr ( BOOLEAN EFIAPI PeiPcdGetBool ( - IN PCD_TOKEN_NUMBER TokenNumber + IN UINTN TokenNumber ) { return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); @@ -166,12 +167,46 @@ PeiPcdGetBool ( UINTN EFIAPI PeiPcdGetSize ( - IN PCD_TOKEN_NUMBER 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]; } @@ -179,8 +214,8 @@ PeiPcdGetSize ( UINT8 EFIAPI PeiPcdGet8Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8))); @@ -191,8 +226,8 @@ PeiPcdGet8Ex ( UINT16 EFIAPI PeiPcdGet16Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16))); @@ -203,8 +238,8 @@ PeiPcdGet16Ex ( UINT32 EFIAPI PeiPcdGet32Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32))); @@ -215,8 +250,8 @@ PeiPcdGet32Ex ( UINT64 EFIAPI PeiPcdGet64Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64))); @@ -227,8 +262,8 @@ PeiPcdGet64Ex ( VOID * EFIAPI PeiPcdGetPtrEx ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return ExGetWorker (Guid, ExTokenNumber, 0); @@ -239,8 +274,8 @@ PeiPcdGetPtrEx ( BOOLEAN EFIAPI PeiPcdGetBoolEx ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN))); @@ -251,15 +286,15 @@ PeiPcdGetBoolEx ( UINTN EFIAPI PeiPcdGetSizeEx ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER 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)); } @@ -267,11 +302,11 @@ PeiPcdGetSizeEx ( EFI_STATUS EFIAPI PeiPcdSet8 ( - IN PCD_TOKEN_NUMBER TokenNumber, - IN UINT8 Value + IN UINTN TokenNumber, + IN UINT8 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -279,11 +314,11 @@ PeiPcdSet8 ( EFI_STATUS EFIAPI PeiPcdSet16 ( - IN PCD_TOKEN_NUMBER TokenNumber, - IN UINT16 Value + IN UINTN TokenNumber, + IN UINT16 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -291,11 +326,11 @@ PeiPcdSet16 ( EFI_STATUS EFIAPI PeiPcdSet32 ( - IN PCD_TOKEN_NUMBER TokenNumber, - IN UINT32 Value + IN UINTN TokenNumber, + IN UINT32 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -303,20 +338,20 @@ PeiPcdSet32 ( EFI_STATUS EFIAPI PeiPcdSet64 ( - IN PCD_TOKEN_NUMBER 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 PCD_TOKEN_NUMBER TokenNumber, - IN UINTN SizeOfBuffer, - IN VOID *Buffer + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer ) { return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE); @@ -327,11 +362,11 @@ PeiPcdSetPtr ( EFI_STATUS EFIAPI PeiPcdSetBool ( - IN PCD_TOKEN_NUMBER TokenNumber, - IN BOOLEAN Value + IN UINTN TokenNumber, + IN BOOLEAN Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -339,18 +374,12 @@ PeiPcdSetBool ( EFI_STATUS EFIAPI PeiPcdSet8Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER 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)); } @@ -358,18 +387,12 @@ PeiPcdSet8Ex ( EFI_STATUS EFIAPI PeiPcdSet16Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER 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)); } @@ -377,18 +400,12 @@ PeiPcdSet16Ex ( EFI_STATUS EFIAPI PeiPcdSet32Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER 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)); } @@ -396,18 +413,12 @@ PeiPcdSet32Ex ( EFI_STATUS EFIAPI PeiPcdSet64Ex ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER 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)); } @@ -415,19 +426,13 @@ PeiPcdSet64Ex ( EFI_STATUS EFIAPI PeiPcdSetPtrEx ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber, - IN UINTN SizeOfBuffer, - IN VOID *Value + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN UINTN *SizeOfBuffer, + IN VOID *Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - Value, - SizeOfBuffer, - TRUE - ); + return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE); } @@ -435,18 +440,12 @@ PeiPcdSetPtrEx ( EFI_STATUS EFIAPI PeiPcdSetBoolEx ( - IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER 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)); } @@ -454,12 +453,18 @@ PeiPcdSetBoolEx ( EFI_STATUS EFIAPI -PcdRegisterCallBackOnSet ( - IN PCD_TOKEN_NUMBER 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); } @@ -468,11 +473,17 @@ PcdRegisterCallBackOnSet ( EFI_STATUS EFIAPI PcdUnRegisterCallBackOnSet ( - IN PCD_TOKEN_NUMBER 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); } @@ -482,7 +493,7 @@ EFI_STATUS EFIAPI PeiPcdGetNextToken ( IN CONST EFI_GUID *Guid, OPTIONAL - IN OUT PCD_TOKEN_NUMBER *TokenNumber + IN OUT UINTN *TokenNumber ) { UINTN GuidTableIdx; @@ -492,18 +503,23 @@ PeiPcdGetNextToken ( UINTN i; BOOLEAN Found; + if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + if (Guid == NULL) { - *TokenNumber++; - - if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) { - *TokenNumber = 0; + 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 = (UINTN) PCD_INVALID_TOKEN_NUMBER; - return EFI_NOT_FOUND; + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_SUCCESS; } // @@ -516,7 +532,7 @@ PeiPcdGetNextToken ( MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); if (MatchGuid == NULL) { - *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER; + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; return EFI_NOT_FOUND; } @@ -525,6 +541,9 @@ PeiPcdGetNextToken ( 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; @@ -537,32 +556,39 @@ PeiPcdGetNextToken ( *TokenNumber = ExMapTable[i].ExTokenNumber; return EFI_SUCCESS; } - - for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) { + + 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 = (UINTN) PCD_INVALID_TOKEN_NUMBER; + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; return EFI_SUCCESS; } } } - return EFI_NOT_FOUND; } - } - return EFI_SUCCESS; + return EFI_NOT_FOUND; } -EFI_GUID * + + +EFI_STATUS EFIAPI -PeiPcdGetNextTokenSpaceGuid ( - IN CONST EFI_GUID *Guid +PeiPcdGetNextTokenSpace ( + IN OUT CONST EFI_GUID **Guid ) { UINTN GuidTableIdx; @@ -572,8 +598,18 @@ PeiPcdGetNextTokenSpaceGuid ( UINTN i; BOOLEAN Found; + if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + + ASSERT (Guid != NULL); + if (PEI_EXMAP_TABLE_EMPTY) { - return NULL; + if (*Guid != NULL) { + return EFI_NOT_FOUND; + } else { + return EFI_SUCCESS; + } } // @@ -583,16 +619,24 @@ PeiPcdGetNextTokenSpaceGuid ( // PeiPcdDb = GetPcdDatabase (); - MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); + 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 NULL; + return EFI_NOT_FOUND; } GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; - ExMapTable = PeiPcdDb->Init.ExMapTable; - Found = FALSE; for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { @@ -602,18 +646,18 @@ PeiPcdGetNextTokenSpaceGuid ( } if (Found) { + i++; for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) { if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) { - if (i < PEI_EXMAPPING_TABLE_SIZE) { - return &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex]; - } else { - return NULL; - } + *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex]; + return EFI_SUCCESS; } } + *Guid = NULL; + return EFI_SUCCESS; } - return NULL; + return EFI_NOT_FOUND; }