X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FPcd.c;h=c8db1b02b743d6a79f83c302151a7e113d439ea0;hp=3e35363a3b345f679bc867de09664cd1eaebcc99;hb=3b06f97c13b36be92dd85fcd62059fda42271fc5;hpb=1de04b4f83050f9a8f6c3eedce27f841591972f3 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c index 3e35363a3b..c8db1b02b7 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c @@ -53,14 +53,15 @@ PCD_PROTOCOL mPcdInstance = { DxeRegisterCallBackOnSet, DxeUnRegisterCallBackOnSet, - DxePcdGetNextToken + DxePcdGetNextToken, + DxePcdGetNextTokenSpace }; // // Static global to reduce the code size // -static EFI_HANDLE NewHandle = NULL; +static EFI_HANDLE mNewHandle = NULL; EFI_STATUS EFIAPI @@ -79,12 +80,8 @@ PcdDxeInit ( BuildPcdDxeDataBase (); - // - // BugBug Check if PcdDatabase is already installed. - // - Status = gBS->InstallProtocolInterface ( - &NewHandle, + &mNewHandle, &gPcdProtocolGuid, EFI_NATIVE_INTERFACE, &mPcdInstance @@ -199,9 +196,15 @@ DxePcdGetSize ( // TmpTokenNumber = TokenNumber; - ASSERT (TokenNumber < PCD_TOTAL_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 < PCD_TOTAL_TOKEN_NUMBER + 1); - IsPeiDb = (BOOLEAN) (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. + IsPeiDb = (BOOLEAN) (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); TokenNumber = IsPeiDb ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER); @@ -464,8 +467,8 @@ DxePcdSetBoolEx ( EFI_STATUS EFIAPI DxeRegisterCallBackOnSet ( - IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN TokenNumber, IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { @@ -479,8 +482,8 @@ DxeRegisterCallBackOnSet ( EFI_STATUS EFIAPI DxeUnRegisterCallBackOnSet ( - IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN TokenNumber, IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { @@ -498,41 +501,48 @@ DxePcdGetNextToken ( IN OUT UINTN *TokenNumber ) { - UINTN ExTokenNumber; - + 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 == PCD_INVALID_TOKEN_NUMBER) { - return EFI_SUCCESS; - } else { - if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER && - *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; - return EFI_SUCCESS; - } else if (*TokenNumber >= DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER) { - *TokenNumber = PCD_INVALID_TOKEN_NUMBER; - return EFI_SUCCESS; - } + 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 && PEI_EXMAP_TABLE_EMPTY) { - *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER; + if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) { + *TokenNumber = PCD_INVALID_TOKEN_NUMBER; return EFI_NOT_FOUND; } - ExTokenNumber = *TokenNumber; if (!PEI_EXMAP_TABLE_EMPTY) { - ExTokenNumber = ExGetNextTokeNumber ( + Status = ExGetNextTokeNumber ( Guid, - ExTokenNumber, + TokenNumber, mPcdDatabase->PeiDb.Init.GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), mPcdDatabase->PeiDb.Init.ExMapTable, @@ -540,22 +550,22 @@ DxePcdGetNextToken ( ); } - if ((ExTokenNumber == PCD_INVALID_TOKEN_NUMBER) && - !DXE_EXMAP_TABLE_EMPTY - ) { - ExTokenNumber = ExGetNextTokeNumber ( + if (Status == EFI_SUCCESS) { + return Status; + } + + if (!DXE_EXMAP_TABLE_EMPTY) { + Status = ExGetNextTokeNumber ( Guid, - ExTokenNumber, - mPcdDatabase->PeiDb.Init.GuidTable, - sizeof(mPcdDatabase->PeiDb.Init.GuidTable), - mPcdDatabase->PeiDb.Init.ExMapTable, - sizeof(mPcdDatabase->PeiDb.Init.ExMapTable) + TokenNumber, + mPcdDatabase->DxeDb.Init.GuidTable, + sizeof(mPcdDatabase->DxeDb.Init.GuidTable), + mPcdDatabase->DxeDb.Init.ExMapTable, + sizeof(mPcdDatabase->DxeDb.Init.ExMapTable) ); } - *TokenNumber = ExTokenNumber; - - return EFI_SUCCESS; + return Status; } @@ -578,19 +588,28 @@ GetDistinctTokenSpace ( TsIdx = 0; OldGuidIndex = ExMapTable[0].ExGuidIndex; DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex]; - for (Idx = 1; Idx < PEI_EXMAPPING_TABLE_SIZE; Idx++) { + for (Idx = 1; Idx < *ExMapTableSize; Idx++) { if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) { OldGuidIndex = ExMapTable[Idx].ExGuidIndex; DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex]; } } - *ExMapTableSize = TsIdx; + // + // 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 @@ -608,6 +627,10 @@ DxePcdGetNextTokenSpace ( EFI_GUID **DxeTokenSpaceTable; BOOLEAN Match; + if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + ASSERT (Guid != NULL); if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) { @@ -619,7 +642,7 @@ DxePcdGetNextTokenSpace ( } - if (TmpTokenSpaceBuffer[0] != NULL) { + if (TmpTokenSpaceBuffer[0] == NULL) { PeiTokenSpaceTableSize = 0; if (!PEI_EXMAP_TABLE_EMPTY) {