Reviewed-by: Liming Gao <[email protected]> > -----Original Message----- > From: Ni, Ruiyu > Sent: Friday, April 22, 2016 5:09 PM > To: [email protected] > Cc: Ni, Ruiyu; Gao, Liming > Subject: [Patch] 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 <[email protected]> > Cc: Liming Gao <[email protected]> > --- > MdeModulePkg/Core/Dxe/Hand/Locate.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/MdeModulePkg/Core/Dxe/Hand/Locate.c > b/MdeModulePkg/Core/Dxe/Hand/Locate.c > index d98b55a..d2b6da8 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; > > -- > 2.7.0.windows.1
_______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

