mirror of https://github.com/acidanthera/audk.git
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:
parent
2df8798274
commit
5cc67962ec
|
@ -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);
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue