MdeModulePkg/UefiBootManagerLib: fix LoadImage/StartImage status code rep.

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 BmReportLoadFailure() 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 <dandan.bi@intel.com>
Cc: Hao Wu <hao.a.wu@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Sean Brogan <sean.brogan@microsoft.com>
Cc: Star Zeng <star.zeng@intel.com>
Bugzilla: https://bugzilla.tianocore.org/show_bug.cgi?id=1539
Fixes: c2cf8720a5
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
Laszlo Ersek 2019-02-20 03:31:28 +01:00
parent 2df8798274
commit 5cc67962ec
2 changed files with 48 additions and 18 deletions

View File

@ -1667,6 +1667,51 @@ 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
BmReportLoadFailure (
IN UINT32 ErrorCode,
IN EFI_STATUS FailureStatus
)
{
EFI_RETURN_STATUS_EXTENDED_DATA ExtendedData;
if (!ReportErrorCodeEnabled ()) {
return;
}
ASSERT (
(ErrorCode == EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR) ||
(ErrorCode == EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED)
);
ZeroMem (&ExtendedData, sizeof (ExtendedData));
ExtendedData.ReturnStatus = FailureStatus;
REPORT_STATUS_CODE_EX (
(EFI_ERROR_CODE | EFI_ERROR_MINOR),
(EFI_SOFTWARE_DXE_BS_DRIVER | ErrorCode),
0,
NULL,
NULL,
&ExtendedData.DataHeader + 1,
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 +1867,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)
);
BmReportLoadFailure (EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR, Status);
BootOption->Status = Status;
//
// Destroy the RAM disk
@ -1911,15 +1948,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)
);
BmReportLoadFailure (EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED, Status);
}
PERF_END_EX (gImageHandle, "BdsAttempt", NULL, 0, (UINT32) OptionNumber);

View File

@ -51,6 +51,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Guid/MemoryTypeInformation.h>
#include <Guid/FileInfo.h>
#include <Guid/GlobalVariable.h>
#include <Guid/StatusCodeDataTypeId.h>
#include <Guid/StatusCodeDataTypeVariable.h>
#include <Library/PrintLib.h>