From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web12.4381.1608186101373227803 for ; Wed, 16 Dec 2020 22:21:41 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: ming.tan@intel.com) IronPort-SDR: SKJXVPTiTmDi74acPNmSdipMkmm1d3SEPgk3hBHG7pn4krhxdiHnTmhAM18dU2joPi9ps6ja3F vw6oREcOzn8Q== X-IronPort-AV: E=McAfee;i="6000,8403,9837"; a="174428818" X-IronPort-AV: E=Sophos;i="5.78,425,1599548400"; d="scan'208";a="174428818" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2020 22:21:40 -0800 IronPort-SDR: 1nLYlUNch0Lyl24wgkNzhh3bIAlxZwFt5Kuo27oxaeq2uvrijj8ide7yeKCx/ZF+OYLKTmh0ZA zddG/+6jKtTQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,425,1599548400"; d="scan'208";a="369620112" Received: from shwdejointlab96.ccr.corp.intel.com ([10.239.134.88]) by orsmga008.jf.intel.com with ESMTP; 16 Dec 2020 22:21:38 -0800 From: "Tan, Ming" To: devel@edk2.groups.io Cc: Dandan Bi , Liming Gao Subject: [PATCH v4] MdeModulePkg/Universal/StatusCodeHandler: Fix a bug about log lost Date: Thu, 17 Dec 2020 14:20:43 +0800 Message-Id: <20201217062043.1358-1-ming.tan@intel.com> X-Mailer: git-send-email 2.24.0.windows.2 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3126 1. If use PeiDxeDebugLibReportStatusCode as DebugLib, then some logs after ExitBootService() will be lost. 2. The root cause: 2.1 The original code will register an unregister function of gEfiEventExitBootServicesGuid, this unregister function will call EFI_RSC_HANDLER_PROTOCOL->Unregister and does not support log through serial port. 2.2 And some other drivers also register call back funtions of gEfiEventExitBootServicesGuid. 2.3 Then after the unregister function is called, other call back functions can't out log if them use RSC as DebugLib. 3. The DxeMain will report status code EFI_SW_BS_PC_EXIT_BOOT_SERVICES after notify all the call back functions of gEfiEventExitBootServicesGuid. 4. Solution: the StatusCodeHandlerRuntimeDxe.c will not register an unregister function of gEfiEventExitBootServicesGuid, but unregister it after receive the status code of EFI_SW_BS_PC_EXIT_BOOT_SERVICES. Cc: Dandan Bi Cc: Liming Gao Signed-off-by: Ming Tan --- V4: Fix a spell bug in code comment, change 'a' to 'an' before 'unregister'. V3: Fix a spell bug in commit message, change 'a' to 'an' before 'unregiste= r'. V2: Add the REF link in commit message. .../RuntimeDxe/SerialStatusCodeWorker.c | 16 ++++++++++++++++ .../RuntimeDxe/StatusCodeHandlerRuntimeDxe.c | 16 +--------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/SerialStat= usCodeWorker.c b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/Serial= StatusCodeWorker.c index 0b98e7ec63..4816cf047f 100644 --- a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/SerialStatusCodeW= orker.c +++ b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/SerialStatusCodeW= orker.c @@ -8,6 +8,12 @@ =0D #include "StatusCodeHandlerRuntimeDxe.h"=0D =0D +VOID=0D +EFIAPI=0D +UnregisterBootTimeHandlers (=0D + VOID=0D + );=0D +=0D /**=0D Convert status code value and extended data to readable ASCII string, se= nd string to serial I/O device.=0D =0D @@ -151,6 +157,16 @@ SerialStatusCodeReportWorker ( //=0D SerialPortWrite ((UINT8 *) Buffer, CharCount);=0D =0D + //=0D + // If register an unregister function of gEfiEventExitBootServicesGuid,= =0D + // then some log called in ExitBootServices() will be lost,=0D + // so unregister the handler after receive the value of exit boot servic= e.=0D + //=0D + if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) =3D=3D EFI_PROGRESS_CODE &&=0D + Value =3D=3D (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT= _SERVICES)) {=0D + UnregisterBootTimeHandlers();=0D + }=0D +=0D return EFI_SUCCESS;=0D }=0D =0D diff --git a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCode= HandlerRuntimeDxe.c b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/S= tatusCodeHandlerRuntimeDxe.c index a8c0fe5b71..011d03f01b 100644 --- a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandler= RuntimeDxe.c +++ b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandler= RuntimeDxe.c @@ -17,16 +17,11 @@ EFI_RSC_HANDLER_PROTOCOL *mRscHandlerProtocol = =3D NULL; Unregister status code callback functions only available at boot time fr= om=0D report status code router when exiting boot services.=0D =0D - @param Event Event whose notification function is being invoked= .=0D - @param Context Pointer to the notification function's context, wh= ich is=0D - always zero in current implementation.=0D -=0D **/=0D VOID=0D EFIAPI=0D UnregisterBootTimeHandlers (=0D - IN EFI_EVENT Event,=0D - IN VOID *Context=0D + VOID=0D )=0D {=0D if (PcdGetBool (PcdStatusCodeUseSerial)) {=0D @@ -178,15 +173,6 @@ StatusCodeHandlerRuntimeDxeEntry ( mRscHandlerProtocol->Register (RtMemoryStatusCodeReportWorker, TPL_HIG= H_LEVEL);=0D }=0D =0D - Status =3D gBS->CreateEventEx (=0D - EVT_NOTIFY_SIGNAL,=0D - TPL_NOTIFY,=0D - UnregisterBootTimeHandlers,=0D - NULL,=0D - &gEfiEventExitBootServicesGuid,=0D - &mExitBootServicesEvent=0D - );=0D -=0D Status =3D gBS->CreateEventEx (=0D EVT_NOTIFY_SIGNAL,=0D TPL_NOTIFY,=0D --=20 2.24.0.windows.2