summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Core/Dxe/Hand
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2016-04-22 17:08:49 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2016-04-25 13:36:37 +0800
commitae6945b61b1511e2fc4c4441794ff1877aa9abe4 (patch)
tree57a0be4fa8a799e570ebf197eb0f4b1355af733b /MdeModulePkg/Core/Dxe/Hand
parentf447df5d39134eb07a396ecca8326694c29692f0 (diff)
downloadedk2-ae6945b61b1511e2fc4c4441794ff1877aa9abe4.tar.gz
edk2-ae6945b61b1511e2fc4c4441794ff1877aa9abe4.tar.bz2
edk2-ae6945b61b1511e2fc4c4441794ff1877aa9abe4.zip
MdeModulePkg/DxeCore: Avoid assertion in CoreLocateProtocol
The patch uses CoreAcquireLockOrFail() instead of CoreAcquireProtocolLock() in CoreLocateProtocol() to avoid assertion when CoreLocateProtocol() is called with the protocol database locked. The issue was found when changing PcdDebugPrintErrorLevel to enable page/pool allocation debug message. Nt32 platform hangs immediately after DxeCore is loaded. Investigation shows the following calling stacks: DxeCore entry point (Install a certain protocol) 0 DxeCore::CoreInstallProtocolInterface // Protocol DB is locked 1 DxeCore::AllocatePool 2 PeiDxeDebugLibReportStatusCode::DebugPrint 3 DxeReportStatusCodeLib::ReportStatusCodeEx // <-------------------| 4 DxeReportStatusCodeLib::InternalGetReportStatusCode | 5 DxeCore::LocateProtocol(StatusCodeRuntimeProtocol) | // Assertion when locking Protocol DB 2nd time | 6 DxeCore::CoreAcquireProtocolLock | 7 PeiDxeDebugLibReportStatusCode::DebugAssert | 8 DxeReportStatusCodeLib::ReportSatusCodeEx // loop begins --------- In frame #6 the assertion is triggered due to the protocol database is already locked. #8 calls #4 and the loop begins. After changing #6 to CoreAcquireLockOrFail(), the assertion is avoided and the loop is broken. With the fix, NT32 can boot to Shell even setting PcdDebugPrintErrorLevel to 0xFFFFFFFF, with all error levels turned on. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
Diffstat (limited to 'MdeModulePkg/Core/Dxe/Hand')
-rw-r--r--MdeModulePkg/Core/Dxe/Hand/Locate.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/MdeModulePkg/Core/Dxe/Hand/Locate.c b/MdeModulePkg/Core/Dxe/Hand/Locate.c
index d98b55ab93..d2b6da8d6b 100644
--- a/MdeModulePkg/Core/Dxe/Hand/Locate.c
+++ b/MdeModulePkg/Core/Dxe/Hand/Locate.c
@@ -1,7 +1,7 @@
/** @file
Locate handle functions
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -581,7 +581,10 @@ CoreLocateProtocol (
//
// Lock the protocol database
//
- CoreAcquireProtocolLock ();
+ Status = CoreAcquireLockOrFail (&gProtocolDatabaseLock);
+ if (EFI_ERROR (Status)) {
+ return EFI_NOT_FOUND;
+ }
mEfiLocateHandleRequest += 1;