diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2018-01-08 10:32:03 +0000 |
---|---|---|
committer | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2018-03-07 13:02:13 +0000 |
commit | 24eb7e23cfac97cef28844f72bb622ca2afd77af (patch) | |
tree | 17dd42d5501571a5b93e72dec31e795645aeaa65 | |
parent | 0bb5e4f4031c76c5fb53ab95729a8a2e5b77edba (diff) |
MdeModulePkg/UefiBootManagerLib: allow foreign Driver#### imagesbuild31
Allow PE/COFF images that must execute under emulation for Driver####
options, by relaxing the machine type check to include support for
machine types that is provided by the emulator.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
3 files changed, 27 insertions, 1 deletions
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c index 32918caf32..1eefcc77e6 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c @@ -1178,6 +1178,29 @@ EfiBootManagerFreeLoadOptions ( return EFI_SUCCESS;
}
+STATIC
+BOOLEAN
+BmIsImageTypeSupported (
+ IN UINT16 MachineType,
+ IN UINT16 SubSystem
+ )
+{
+ EFI_STATUS Status;
+ EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *Emu;
+
+ if (EFI_IMAGE_MACHINE_TYPE_SUPPORTED (MachineType)) {
+ return TRUE;
+ }
+
+ Status = gBS->LocateProtocol (&gEdkiiPeCoffImageEmulatorProtocolGuid,
+ NULL, (VOID **)&Emu);
+ if (EFI_ERROR (Status)) {
+ return FALSE;
+ }
+
+ return Emu->IsImageSupported (Emu, MachineType, SubSystem);
+}
+
/**
Return whether the PE header of the load option is valid or not.
@@ -1228,7 +1251,8 @@ BmIsLoadOptionPeHeaderValid ( OptionalHeader = (EFI_IMAGE_OPTIONAL_HEADER32 *) &PeHeader->Pe32.OptionalHeader;
if ((OptionalHeader->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC ||
OptionalHeader->Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) &&
- EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeHeader->Pe32.FileHeader.Machine)
+ BmIsImageTypeSupported (PeHeader->Pe32.FileHeader.Machine,
+ OptionalHeader->Subsystem)
) {
//
// Check the Subsystem:
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h index 21ecd8584d..6d30a8f366 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h +++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h @@ -47,6 +47,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <Protocol/VariableLock.h>
#include <Protocol/RamDisk.h>
#include <Protocol/DeferredImageLoad.h>
+#include <Protocol/PeCoffImageEmulator.h>
#include <Guid/MemoryTypeInformation.h>
#include <Guid/FileInfo.h>
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf index 8d5b89ea29..4662615bfe 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf +++ b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf @@ -104,6 +104,7 @@ gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES
gEfiBootLogoProtocolGuid ## SOMETIMES_CONSUMES
gEfiSimpleTextInputExProtocolGuid ## SOMETIMES_CONSUMES
+ gEdkiiPeCoffImageEmulatorProtocolGuid ## SOMETIMES_CONSUMES
gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES
gEfiGraphicsOutputProtocolGuid ## SOMETIMES_CONSUMES
gEfiUsbIoProtocolGuid ## SOMETIMES_CONSUMES
|