X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FPcd.c;h=57c67d67136672c518f5caac1fd84b78e42815e4;hb=a696a78c371709fc6a74295296c92c4e94b23a1d;hp=115b1ac93837fc3d89abab856c55115a27fe033b;hpb=2b21a9713ce974c14f26dfb5d3496372e04b501b;p=mirror_edk2.git diff --git a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c index 115b1ac938..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; } @@ -501,25 +526,32 @@ DxePcdGetNextToken ( { EFI_STATUS Status; + if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) { + return EFI_UNSUPPORTED; + } + Status = EFI_NOT_FOUND; // // Scan the local token space // if (Guid == NULL) { - if (((*TokenNumber > PEI_NEX_TOKEN_NUMBER) && (*TokenNumber < PEI_LOCAL_TOKEN_NUMBER)) || - ((*TokenNumber > (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_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. + 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; @@ -618,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) {