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

Reply via email to