From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.126; helo=mga18.intel.com; envelope-from=ray.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A81DB211CACA8 for ; Wed, 20 Feb 2019 05:14:49 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Feb 2019 05:14:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,391,1544515200"; d="scan'208";a="145022117" Received: from ray-dev.ccr.corp.intel.com (HELO [10.239.9.31]) ([10.239.9.31]) by fmsmga002.fm.intel.com with ESMTP; 20 Feb 2019 05:14:47 -0800 To: Laszlo Ersek , edk2-devel@lists.01.org Cc: Dandan Bi , Hao Wu , Jian J Wang , Sean Brogan , Star Zeng References: <20190220081644.8238-1-lersek@redhat.com> <20190220081644.8238-2-lersek@redhat.com> From: "Ni, Ray" Message-ID: Date: Wed, 20 Feb 2019 21:17:26 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.5.0 MIME-Version: 1.0 In-Reply-To: <20190220081644.8238-2-lersek@redhat.com> Subject: Re: [PATCH v2 1/5] MdeModulePkg/UefiBootManagerLib: fix LoadImage/StartImage status code rep. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Feb 2019 13:14:49 -0000 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit On 2/20/2019 4:16 PM, Laszlo Ersek wrote: > In the EFI_RETURN_STATUS_EXTENDED_DATA structure from PI-1.7, there may be > padding between the DataHeader and ReturnStatus members. The > REPORT_STATUS_CODE_EX() macro starts populating the structure immediately > after DataHeader, therefore the source data must provide for the padding. > > Extract the BmReportImageFailure() function from EfiBootManagerBoot(), > prepare a zero padding (if any) in a temporary > EFI_RETURN_STATUS_EXTENDED_DATA object, and fix the > REPORT_STATUS_CODE_EX() macro invocation. > > Cc: Dandan Bi > Cc: Hao Wu > Cc: Jian J Wang > Cc: Ray Ni > Cc: Sean Brogan > Cc: Star Zeng > Bugzilla: https://bugzilla.tianocore.org/show_bug.cgi?id=1539 > Fixes: c2cf8720a5aad74230767a1f11bade2d86de3745 > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Laszlo Ersek > --- > > Notes: > v2: > - new in v2 > > MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h | 1 + > MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 69 +++++++++++++++----- > 2 files changed, 52 insertions(+), 18 deletions(-) > > diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h > index 978fbff966f6..0fef63fceedf 100644 > --- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h > +++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h > @@ -51,6 +51,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > #include > #include > #include > +#include > #include > > #include > diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > index 9be1633b7480..ffb98c6c9b83 100644 > --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > @@ -1667,6 +1667,55 @@ BmIsBootManagerMenuFilePath ( > return FALSE; > } > > +/** > + Report status code with EFI_RETURN_STATUS_EXTENDED_DATA about LoadImage() or > + StartImage() failure. > + > + @param[in] ErrorCode An Error Code in the Software Class, DXE Boot > + Service Driver Subclass. ErrorCode will be used to > + compose the Value parameter for status code > + reporting. Must be one of > + EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR and > + EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED. > + > + @param[in] FailureStatus The failure status returned by the boot service > + that should be reported. > +**/ > +VOID > +BmReportImageFailure ( Laszlo, Thanks for quick fixing this issue. To match the status code it reports, how about rename the function as "BmReportLoadFailure"? Another minor comments in below. > + IN UINT32 ErrorCode, > + IN EFI_STATUS FailureStatus > + ) > +{ > + EFI_RETURN_STATUS_EXTENDED_DATA ExtendedData; > + VOID *PaddingStart; > + UINTN PaddingSize; > + > + if (!ReportErrorCodeEnabled ()) { > + return; > + } > + > + ASSERT ( > + (ErrorCode == EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR) || > + (ErrorCode == EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED) > + ); > + > + PaddingStart = &ExtendedData.DataHeader + 1; > + PaddingSize = (UINTN) &ExtendedData.ReturnStatus - (UINTN) PaddingStart; > + ZeroMem (PaddingStart, PaddingSize); I prefer "ZeroMem (&ExtendedData, sizeof (ExtendedData))" instead of introducing local variables such as PaddingStart/PaddingSize. This makes code more good-looking:). > + ExtendedData.ReturnStatus = FailureStatus; > + > + REPORT_STATUS_CODE_EX ( > + (EFI_ERROR_CODE | EFI_ERROR_MINOR), > + (EFI_SOFTWARE_DXE_BS_DRIVER | ErrorCode), > + 0, > + NULL, > + NULL, > + PaddingStart, &ExtendedData.DataHeader + 1 > + PaddingSize + sizeof (ExtendedData.ReturnStatus) sizeof (ExtendedData) - sizeof (ExtendedData.DataHeader) > + ); > +} > + > /** > Attempt to boot the EFI boot option. This routine sets L"BootCurent" and > also signals the EFI ready to boot event. If the device path for the option > @@ -1822,15 +1871,7 @@ EfiBootManagerBoot ( > // > // Report Status Code with the failure status to indicate that the failure to load boot option > // > - REPORT_STATUS_CODE_EX ( > - EFI_ERROR_CODE | EFI_ERROR_MINOR, > - (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR), > - 0, > - NULL, > - NULL, > - &Status, > - sizeof (EFI_STATUS) > - ); > + BmReportImageFailure (EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR, Status); > BootOption->Status = Status; > // > // Destroy the RAM disk > @@ -1911,15 +1952,7 @@ EfiBootManagerBoot ( > // > // Report Status Code with the failure status to indicate that boot failure > // > - REPORT_STATUS_CODE_EX ( > - EFI_ERROR_CODE | EFI_ERROR_MINOR, > - (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED), > - 0, > - NULL, > - NULL, > - &Status, > - sizeof (EFI_STATUS) > - ); > + BmReportImageFailure (EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED, Status); > } > PERF_END_EX (gImageHandle, "BdsAttempt", NULL, 0, (UINT32) OptionNumber); > > -- Thanks, Ray