@@ -33,6 +33,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Protocol/PciOverride.h>
#include <Protocol/PciEnumerationComplete.h>
#include <Protocol/IoMmu.h>
+#include <Protocol/PeCoffImageEmulator.h>
#include <Library/DebugLib.h>
#include <Library/UefiDriverEntryPoint.h>
@@ -96,6 +96,7 @@
gEfiIncompatiblePciDeviceSupportProtocolGuid ## SOMETIMES_CONSUMES
gEfiLoadFile2ProtocolGuid ## SOMETIMES_PRODUCES
gEdkiiIoMmuProtocolGuid ## SOMETIMES_CONSUMES
+ gEdkiiPeCoffImageEmulatorProtocolGuid ## SOMETIMES_CONSUMES
gEfiLoadedImageDevicePathProtocolGuid ## CONSUMES
[FeaturePcd]
@@ -651,6 +651,54 @@ RomDecode (
}
}
+STATIC
+BOOLEAN
+IsImageTypeSupported (
+ IN UINT16 MachineType,
+ IN UINT16 SubSystem
+ )
+{
+ EFI_STATUS Status;
+ EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *Emu;
+ UINTN HandleCount;
+ EFI_HANDLE *HandleBuffer;
+ BOOLEAN ReturnValue;
+ UINTN Index;
+
+ if (EFI_IMAGE_MACHINE_TYPE_SUPPORTED (MachineType)) {
+ return TRUE;
+ }
+
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEdkiiPeCoffImageEmulatorProtocolGuid,
+ NULL,
+ &HandleCount,
+ &HandleBuffer
+ );
+ if (EFI_ERROR (Status)) {
+ return FALSE;
+ }
+
+ ReturnValue = FALSE;
+ for (Index = 0; Index < HandleCount; Index++) {
+ Status = gBS->HandleProtocol (
+ HandleBuffer[Index],
+ &gEdkiiPeCoffImageEmulatorProtocolGuid,
+ (VOID **)&Emu
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ if (Emu->IsImageSupported (Emu, MachineType, SubSystem)) {
+ ReturnValue = TRUE;
+ break;
+ }
+ }
+
+ FreePool (HandleBuffer);
+ return ReturnValue;
+}
+
/**
Load and start the Option Rom image.
@@ -715,7 +763,8 @@ ProcessOpRomImage (
//
// Skip the EFI PCI Option ROM image if its machine type is not supported
//
- if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType)) {
+ if (!IsImageTypeSupported(EfiRomHeader->EfiMachineType,
+ EfiRomHeader->EfiSubsystem)) {
goto NextImage;
}
When enumerating option ROM images, take into account whether an emulator exists that would allow dispatch of PE/COFF images built for foreign architectures. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h | 1 + MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf | 1 + MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c | 51 +++++++++++++++++++- 3 files changed, 52 insertions(+), 1 deletion(-) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel