X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FPcd.c;h=c8db1b02b743d6a79f83c302151a7e113d439ea0;hp=5340ef5471bb222d9296b138d9fe7eab1fe65490;hb=3b06f97c13b36be92dd85fcd62059fda42271fc5;hpb=00b7af13f226afbbe9432a9a7bcaef3d8a1651e8 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c index 5340ef5471..c8db1b02b7 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c @@ -51,16 +51,17 @@ PCD_PROTOCOL mPcdInstance = { DxePcdSetPtrEx, DxePcdSetBoolEx, - PcdRegisterCallBackOnSet, - PcdUnRegisterCallBackOnSet, - DxePcdGetNextToken + DxeRegisterCallBackOnSet, + DxeUnRegisterCallBackOnSet, + DxePcdGetNextToken, + DxePcdGetNextTokenSpace }; // // Static global to reduce the code size // -static EFI_HANDLE NewHandle = NULL; +static EFI_HANDLE mNewHandle = NULL; EFI_STATUS EFIAPI @@ -74,17 +75,13 @@ PcdDxeInit ( // // Make sure the Pcd Protocol is not already installed in the system // - + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid); - + BuildPcdDxeDataBase (); - // - // BugBug Check if PcdDatabase is already installed. - // - Status = gBS->InstallProtocolInterface ( - &NewHandle, + &mNewHandle, &gPcdProtocolGuid, EFI_NATIVE_INTERFACE, &mPcdInstance @@ -100,10 +97,10 @@ PcdDxeInit ( VOID EFIAPI DxePcdSetSku ( - IN SKU_ID SkuId + IN UINTN SkuId ) { - gPcdDatabase->PeiDb.Init.SystemSkuId = SkuId; + mPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId; return; } @@ -113,12 +110,10 @@ DxePcdSetSku ( UINT8 EFIAPI DxePcdGet8 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber)); - - return *((UINT8 *) GetWorker (TokenNumber)); + return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); } @@ -126,12 +121,10 @@ DxePcdGet8 ( UINT16 EFIAPI DxePcdGet16 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber)); - - return ReadUnaligned16 (GetWorker (TokenNumber)); + return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); } @@ -139,12 +132,10 @@ DxePcdGet16 ( UINT32 EFIAPI DxePcdGet32 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber)); - - return ReadUnaligned32 (GetWorker (TokenNumber)); + return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); } @@ -152,12 +143,10 @@ DxePcdGet32 ( UINT64 EFIAPI DxePcdGet64 ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber)); - - return ReadUnaligned64(GetWorker (TokenNumber)); + return ReadUnaligned64(GetWorker (TokenNumber, sizeof (UINT64))); } @@ -165,10 +154,10 @@ DxePcdGet64 ( VOID * EFIAPI DxePcdGetPtr ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - return GetWorker (TokenNumber); + return GetWorker (TokenNumber, 0); } @@ -176,12 +165,10 @@ DxePcdGetPtr ( BOOLEAN EFIAPI DxePcdGetBool ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber)); - - return *((BOOLEAN *) GetWorker (TokenNumber)); + return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); } @@ -189,18 +176,53 @@ DxePcdGetBool ( UINTN EFIAPI DxePcdGetSize ( - IN UINTN TokenNumber + IN UINTN TokenNumber ) { - UINT16 * SizeTable; + UINTN Size; + UINT32 *LocalTokenNumberTable; + BOOLEAN IsPeiDb; + UINTN MaxSize; + UINTN TmpTokenNumber; + // + // 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--; - SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? gPcdDatabase->PeiDb.Init.SizeTable : - gPcdDatabase->DxeDb.Init.SizeTable; + // + // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber + // + TmpTokenNumber = 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 < PCD_TOTAL_TOKEN_NUMBER + 1); + + // 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. + IsPeiDb = (BOOLEAN) (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); + + TokenNumber = IsPeiDb ? TokenNumber : + (TokenNumber - PEI_LOCAL_TOKEN_NUMBER); + LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable + : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; - TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER); + Size = (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 (TmpTokenNumber, &MaxSize); + } else { + return Size; + } - return SizeTable[TokenNumber]; } @@ -209,7 +231,7 @@ UINT8 EFIAPI DxePcdGet8Ex ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8))); @@ -221,10 +243,10 @@ UINT16 EFIAPI DxePcdGet16Ex ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { - return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16))); + return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16))); } @@ -233,10 +255,10 @@ UINT32 EFIAPI DxePcdGet32Ex ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { - return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32))); + return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32))); } @@ -245,13 +267,10 @@ UINT64 EFIAPI DxePcdGet64Ex ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { - // - // BugBug: Must be changed to ReadUnaligned64 - // - return *((UINT64 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64))); + return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64))); } @@ -260,10 +279,10 @@ VOID * EFIAPI DxePcdGetPtrEx ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { - return ExGetWorker (Guid, ExTokenNumber, 0); + return ExGetWorker (Guid, ExTokenNumber, 0); } @@ -272,7 +291,7 @@ BOOLEAN EFIAPI DxePcdGetBoolEx ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN))); @@ -284,14 +303,10 @@ UINTN EFIAPI DxePcdGetSizeEx ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + IN UINTN ExTokenNumber ) { - EX_PCD_ENTRY_ATTRIBUTE Attr; - - GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr); - - return Attr.Size; + return DxePcdGetSize(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber)); } @@ -303,7 +318,7 @@ DxePcdSet8 ( IN UINT8 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -315,7 +330,7 @@ DxePcdSet16 ( IN UINT16 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -327,7 +342,7 @@ DxePcdSet32 ( IN UINT32 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -339,7 +354,7 @@ DxePcdSet64 ( IN UINT64 Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -347,9 +362,9 @@ DxePcdSet64 ( EFI_STATUS EFIAPI DxePcdSetPtr ( - 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); @@ -364,7 +379,7 @@ DxePcdSetBool ( IN BOOLEAN Value ) { - return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE); + return SetValueWorker (TokenNumber, &Value, sizeof (Value)); } @@ -372,18 +387,12 @@ DxePcdSetBool ( EFI_STATUS EFIAPI DxePcdSet8Ex ( - IN CONST EFI_GUID *Guid, + 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)); } @@ -391,18 +400,12 @@ DxePcdSet8Ex ( EFI_STATUS EFIAPI DxePcdSet16Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, + 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)); } @@ -410,18 +413,12 @@ DxePcdSet16Ex ( EFI_STATUS EFIAPI DxePcdSet32Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, + 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)); } @@ -429,18 +426,12 @@ DxePcdSet32Ex ( EFI_STATUS EFIAPI DxePcdSet64Ex ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, + 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)); } @@ -448,19 +439,13 @@ DxePcdSet64Ex ( EFI_STATUS EFIAPI DxePcdSetPtrEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, - IN UINTN SizeOfBuffer, - IN VOID *Buffer + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer ) { - return ExSetWorker( - ExTokenNumber, - Guid, - Buffer, - SizeOfBuffer, - TRUE - ); + return ExSetWorker(ExTokenNumber, Guid, Buffer, SizeOfBuffer, TRUE); } @@ -468,18 +453,12 @@ DxePcdSetPtrEx ( EFI_STATUS EFIAPI DxePcdSetBoolEx ( - IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber, + IN CONST EFI_GUID *Guid, + IN UINTN ExTokenNumber, IN BOOLEAN Value ) { - return ExSetWorker( - ExTokenNumber, - Guid, - &Value, - sizeof (Value), - TRUE - ); + return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); } @@ -487,26 +466,30 @@ DxePcdSetBoolEx ( EFI_STATUS EFIAPI -PcdRegisterCallBackOnSet ( - IN UINTN TokenNumber, - IN CONST EFI_GUID *Guid, OPTIONAL +DxeRegisterCallBackOnSet ( + IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN TokenNumber, IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { - return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE); + ASSERT (CallBackFunction != NULL); + + return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); } EFI_STATUS EFIAPI -PcdUnRegisterCallBackOnSet ( - IN UINTN TokenNumber, - IN CONST EFI_GUID *Guid, OPTIONAL +DxeUnRegisterCallBackOnSet ( + IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN TokenNumber, IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { - return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE); + ASSERT (CallBackFunction != NULL); + + return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); } @@ -514,10 +497,203 @@ PcdUnRegisterCallBackOnSet ( EFI_STATUS EFIAPI DxePcdGetNextToken ( - IN CONST EFI_GUID *Guid, OPTIONAL - IN OUT UINTN *TokenNumber + IN CONST EFI_GUID *Guid, OPTIONAL + IN OUT UINTN *TokenNumber ) { - return DxeGetNextTokenWorker (TokenNumber, Guid); + EFI_STATUS Status; + + if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + + Status = EFI_NOT_FOUND; + // + // Scan the local token space + // + if (Guid == NULL) { + // 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. + if (((*TokenNumber + 1 > PEI_NEX_TOKEN_NUMBER + 1) && (*TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1)) || + ((*TokenNumber + 1 > (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1)))) { + return EFI_NOT_FOUND; + } + + (*TokenNumber)++; + if ((*TokenNumber + 1 > PEI_NEX_TOKEN_NUMBER + 1) && + (*TokenNumber <= PEI_LOCAL_TOKEN_NUMBER)) { + // + // The first Non-Ex type Token Number for DXE PCD + // database is PEI_LOCAL_TOKEN_NUMBER + // + *TokenNumber = PEI_LOCAL_TOKEN_NUMBER; + } else if (*TokenNumber + 1 > DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER + 1) { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + } + return EFI_SUCCESS; + } + + if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; + return EFI_NOT_FOUND; + } + + if (!PEI_EXMAP_TABLE_EMPTY) { + Status = ExGetNextTokeNumber ( + Guid, + TokenNumber, + mPcdDatabase->PeiDb.Init.GuidTable, + sizeof(mPcdDatabase->PeiDb.Init.GuidTable), + mPcdDatabase->PeiDb.Init.ExMapTable, + sizeof(mPcdDatabase->PeiDb.Init.ExMapTable) + ); + } + + if (Status == EFI_SUCCESS) { + return Status; + } + + if (!DXE_EXMAP_TABLE_EMPTY) { + Status = ExGetNextTokeNumber ( + Guid, + TokenNumber, + mPcdDatabase->DxeDb.Init.GuidTable, + sizeof(mPcdDatabase->DxeDb.Init.GuidTable), + mPcdDatabase->DxeDb.Init.ExMapTable, + sizeof(mPcdDatabase->DxeDb.Init.ExMapTable) + ); + } + + return Status; } + +EFI_GUID ** +GetDistinctTokenSpace ( + IN OUT UINTN *ExMapTableSize, + IN DYNAMICEX_MAPPING *ExMapTable, + IN EFI_GUID *GuidTable + ) +{ + EFI_GUID **DistinctTokenSpace; + UINTN OldGuidIndex; + UINTN TsIdx; + UINTN Idx; + + + DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *)); + ASSERT (DistinctTokenSpace != NULL); + + TsIdx = 0; + OldGuidIndex = ExMapTable[0].ExGuidIndex; + DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex]; + for (Idx = 1; Idx < *ExMapTableSize; Idx++) { + if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) { + OldGuidIndex = ExMapTable[Idx].ExGuidIndex; + DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex]; + } + } + + // + // The total number of Distinct Token Space + // is TsIdx + 1 because we use TsIdx as a index + // to the DistinctTokenSpace[] + // + *ExMapTableSize = TsIdx + 1; + return DistinctTokenSpace; + +} + +// +// Just pre-allocate a memory buffer that is big enough to +// host all distinct TokenSpace guid in both +// PEI ExMap and DXE ExMap. +// +STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 }; + +EFI_STATUS +EFIAPI +DxePcdGetNextTokenSpace ( + IN OUT CONST EFI_GUID **Guid + ) +{ + UINTN Idx; + UINTN Idx2; + UINTN Idx3; + UINTN PeiTokenSpaceTableSize; + UINTN DxeTokenSpaceTableSize; + EFI_GUID **PeiTokenSpaceTable; + EFI_GUID **DxeTokenSpaceTable; + BOOLEAN Match; + + if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + + ASSERT (Guid != NULL); + + if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) { + if (*Guid != NULL) { + return EFI_NOT_FOUND; + } else { + return EFI_SUCCESS; + } + } + + + if (TmpTokenSpaceBuffer[0] == NULL) { + PeiTokenSpaceTableSize = 0; + + if (!PEI_EXMAP_TABLE_EMPTY) { + PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE; + PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize, + mPcdDatabase->PeiDb.Init.ExMapTable, + mPcdDatabase->PeiDb.Init.GuidTable + ); + CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize); + } + + if (!DXE_EXMAP_TABLE_EMPTY) { + DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE; + DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize, + mPcdDatabase->DxeDb.Init.ExMapTable, + mPcdDatabase->DxeDb.Init.GuidTable + ); + + // + // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable + // + for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) { + Match = FALSE; + for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) { + if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) { + Match = TRUE; + break; + } + } + if (!Match) { + TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2]; + } + } + } + } + + if (*Guid == NULL) { + *Guid = TmpTokenSpaceBuffer[0]; + return EFI_SUCCESS; + } + + for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) { + if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) { + Idx++; + *Guid = TmpTokenSpaceBuffer[Idx]; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; + +} + +