X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FPcd.c;h=57c67d67136672c518f5caac1fd84b78e42815e4;hp=b78752df293027cd11e6f868ac58e35b47001416;hb=a696a78c371709fc6a74295296c92c4e94b23a1d;hpb=c24ba2f612d89d6dd15871cdb8a66080859d9ab3 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c index b78752df29..57c67d6713 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c @@ -17,6 +17,7 @@ Module Name: Pcd.c #include "Service.h" +EFI_LOCK mPcdDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(EFI_TPL_CALLBACK); PCD_PROTOCOL mPcdInstance = { DxePcdSetSku, @@ -61,7 +62,7 @@ PCD_PROTOCOL mPcdInstance = { // // Static global to reduce the code size // -static EFI_HANDLE NewHandle = NULL; +static EFI_HANDLE mNewHandle = NULL; EFI_STATUS EFIAPI @@ -80,12 +81,8 @@ PcdDxeInit ( BuildPcdDxeDataBase (); - // - // BugBug Check if PcdDatabase is already installed. - // - Status = gBS->InstallProtocolInterface ( - &NewHandle, + &mNewHandle, &gPcdProtocolGuid, EFI_NATIVE_INTERFACE, &mPcdInstance @@ -200,9 +197,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); @@ -465,14 +468,25 @@ DxePcdSetBoolEx ( EFI_STATUS EFIAPI DxeRegisterCallBackOnSet ( - IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN TokenNumber, IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { + EFI_STATUS Status; + ASSERT (CallBackFunction != NULL); - return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + // + // Aquire lock to prevent reentrance from TPL_CALLBACK level + // + EfiAcquireLock (&mPcdDatabaseLock); + + Status = DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + + EfiReleaseLock (&mPcdDatabaseLock); + + return Status; } @@ -480,14 +494,25 @@ DxeRegisterCallBackOnSet ( EFI_STATUS EFIAPI DxeUnRegisterCallBackOnSet ( - IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL + IN UINTN TokenNumber, IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { + EFI_STATUS Status; + ASSERT (CallBackFunction != NULL); + + // + // Aquire lock to prevent reentrance from TPL_CALLBACK level + // + EfiAcquireLock (&mPcdDatabaseLock); + + Status = DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + + EfiReleaseLock (&mPcdDatabaseLock); - return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + return Status; } @@ -499,21 +524,34 @@ 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 > PEI_NEX_TOKEN_NUMBER && - *TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) { + 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 > DXE_NEX_TOKEN_NUMBER + 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; @@ -525,10 +563,9 @@ DxePcdGetNextToken ( } if (!PEI_EXMAP_TABLE_EMPTY) { - ExTokenNumber = *TokenNumber; - ExTokenNumber = ExGetNextTokeNumber ( + Status = ExGetNextTokeNumber ( Guid, - ExTokenNumber, + TokenNumber, mPcdDatabase->PeiDb.Init.GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), mPcdDatabase->PeiDb.Init.ExMapTable, @@ -536,13 +573,14 @@ DxePcdGetNextToken ( ); } - if ((ExTokenNumber == PCD_INVALID_TOKEN_NUMBER) && - !DXE_EXMAP_TABLE_EMPTY - ) { - ExTokenNumber = *TokenNumber; - ExTokenNumber = ExGetNextTokeNumber ( + if (Status == EFI_SUCCESS) { + return Status; + } + + if (!DXE_EXMAP_TABLE_EMPTY) { + Status = ExGetNextTokeNumber ( Guid, - ExTokenNumber, + TokenNumber, mPcdDatabase->DxeDb.Init.GuidTable, sizeof(mPcdDatabase->DxeDb.Init.GuidTable), mPcdDatabase->DxeDb.Init.ExMapTable, @@ -550,9 +588,7 @@ DxePcdGetNextToken ( ); } - *TokenNumber = ExTokenNumber; - - return EFI_SUCCESS; + return Status; } @@ -614,6 +650,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) {