X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FPcd.c;h=57c67d67136672c518f5caac1fd84b78e42815e4;hp=c8db1b02b743d6a79f83c302151a7e113d439ea0;hb=a696a78c371709fc6a74295296c92c4e94b23a1d;hpb=26355eed4310bfecea4a44d146919955c9be7861 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Pcd.c b/EdkModulePkg/Universal/PCD/Dxe/Pcd.c index c8db1b02b7..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, @@ -472,9 +473,20 @@ DxeRegisterCallBackOnSet ( 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; } @@ -487,9 +499,20 @@ DxeUnRegisterCallBackOnSet ( IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { + EFI_STATUS Status; + ASSERT (CallBackFunction != NULL); + + // + // Aquire lock to prevent reentrance from TPL_CALLBACK level + // + EfiAcquireLock (&mPcdDatabaseLock); - return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + Status = DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction); + + EfiReleaseLock (&mPcdDatabaseLock); + + return Status; }