X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FPei%2FPcd.c;h=33bc4e1069edb063fc5745010d4c0fb5078c3654;hp=34af220f6686ded58515fd20fb4aa9c2b33ea5af;hb=5f5f28c90dc44075e9f9202b030c66300218f7c0;hpb=58f1099f3dd6d1d7606cc57046e59488d4cbf023 diff --git a/EdkModulePkg/Universal/PCD/Pei/Pcd.c b/EdkModulePkg/Universal/PCD/Pei/Pcd.c index 34af220f66..33bc4e1069 100644 --- a/EdkModulePkg/Universal/PCD/Pei/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Pei/Pcd.c @@ -52,7 +52,8 @@ PCD_PPI mPcdPpiInstance = { PeiRegisterCallBackOnSet, PcdUnRegisterCallBackOnSet, - PeiPcdGetNextToken + PeiPcdGetNextToken, + PeiPcdGetNextTokenSpace }; @@ -100,7 +101,7 @@ PeiPcdSetSku ( UINT8 EFIAPI PeiPcdGet8 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); @@ -111,7 +112,7 @@ PeiPcdGet8 ( UINT16 EFIAPI PeiPcdGet16 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); @@ -122,7 +123,7 @@ PeiPcdGet16 ( UINT32 EFIAPI PeiPcdGet32 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); @@ -133,7 +134,7 @@ PeiPcdGet32 ( UINT64 EFIAPI PeiPcdGet64 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64))); @@ -144,7 +145,7 @@ PeiPcdGet64 ( VOID * EFIAPI PeiPcdGetPtr ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return GetWorker (TokenNumber, 0); @@ -155,7 +156,7 @@ PeiPcdGetPtr ( BOOLEAN EFIAPI PeiPcdGetBool ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); @@ -166,9 +167,23 @@ PeiPcdGetBool ( UINTN EFIAPI PeiPcdGetSize ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { + 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 @@ -176,9 +191,22 @@ PeiPcdGetSize ( // TokenNumber--; - ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER); + // 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]; } @@ -186,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))); @@ -198,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))); @@ -210,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))); @@ -222,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))); @@ -234,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); @@ -246,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))); @@ -258,10 +286,14 @@ PeiPcdGetBoolEx ( UINTN EFIAPI PeiPcdGetSizeEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber ) { + if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) { + return 0; + } + return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber)); } @@ -271,10 +303,10 @@ EFI_STATUS EFIAPI PeiPcdSet8 ( IN UINTN TokenNumber, - IN UINT8 Value + IN UINT8 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -283,10 +315,10 @@ EFI_STATUS EFIAPI PeiPcdSet16 ( IN UINTN TokenNumber, - IN UINT16 Value + IN UINT16 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -295,10 +327,10 @@ EFI_STATUS EFIAPI PeiPcdSet32 ( IN UINTN TokenNumber, - IN UINT32 Value + IN UINT32 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -307,19 +339,19 @@ EFI_STATUS EFIAPI PeiPcdSet64 ( IN UINTN TokenNumber, - IN UINT64 Value + IN UINT64 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } EFI_STATUS EFIAPI PeiPcdSetPtr ( - IN UINTN TokenNumber, - IN UINTN SizeOfBuffer, - IN VOID *Buffer + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer ) { return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE); @@ -331,10 +363,10 @@ EFI_STATUS EFIAPI PeiPcdSetBool ( IN UINTN TokenNumber, - IN BOOLEAN Value + IN BOOLEAN Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -342,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)); } @@ -361,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)); } @@ -380,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)); } @@ -399,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)); } @@ -418,19 +426,13 @@ PeiPcdSet64Ex ( EFI_STATUS EFIAPI PeiPcdSetPtrEx ( - IN CONST EFI_GUID *Guid, - IN UINTN 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); } @@ -438,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,11 +454,15 @@ PeiPcdSetBoolEx ( EFI_STATUS EFIAPI PeiRegisterCallBackOnSet ( - 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, TRUE); @@ -473,11 +473,15 @@ PeiRegisterCallBackOnSet ( 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); @@ -499,18 +503,23 @@ PeiPcdGetNextToken ( UINTN i; BOOLEAN Found; + if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + if (Guid == NULL) { + if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) { + return EFI_NOT_FOUND; + } (*TokenNumber)++; - - if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) { + 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_NOT_FOUND; + return EFI_SUCCESS; } // @@ -523,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; } @@ -532,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; @@ -544,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_STATUS EFIAPI -PeiPcdGetNextTokenSpaceGuid ( - IN OUT CONST EFI_GUID **Guid +PeiPcdGetNextTokenSpace ( + IN OUT CONST EFI_GUID **Guid ) { UINTN GuidTableIdx; @@ -579,17 +598,19 @@ PeiPcdGetNextTokenSpaceGuid ( UINTN i; BOOLEAN Found; - if (*Guid == NULL) { - if (PEI_EXMAP_TABLE_EMPTY) { - return EFI_SUCCESS; + if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + + ASSERT (Guid != NULL); + + if (PEI_EXMAP_TABLE_EMPTY) { + if (*Guid != NULL) { + return EFI_NOT_FOUND; } else { - // - // return the first Token Space Guid. - // - *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex]; return EFI_SUCCESS; } - } + } // // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order @@ -598,6 +619,16 @@ PeiPcdGetNextTokenSpaceGuid ( // PeiPcdDb = GetPcdDatabase (); + 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) { @@ -606,8 +637,6 @@ PeiPcdGetNextTokenSpaceGuid ( 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) { @@ -617,12 +646,15 @@ PeiPcdGetNextTokenSpaceGuid ( } 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;