[edk2,v3,3/7] MdeModulePkg/PciBusDxe: invoke PE/COFF emulator for foreign option ROMs

Message ID 20180920230145.7565-4-ard.biesheuvel@linaro.org
State New
Headers show
Series
  • MdeModulePkg: add support for dispatching foreign arch PE/COFF images
Related show

Commit Message

Ard Biesheuvel Sept. 20, 2018, 11:01 p.m.
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.1
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 | 53 +++++++++++++++++++-
 3 files changed, 54 insertions(+), 1 deletion(-)

-- 
2.17.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Kinney, Michael D Sept. 26, 2018, 6:26 p.m. | #1
Hi Ard,

I am wondering if we can simplify the PciBusDxe driver and 
remove the image type supported check and instead depend on
LoadImage().  LoadImage() will return EFI_UNSUPPORTED if the
image type is not supported.

Thanks,

Mike

> -----Original Message-----

> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]

> Sent: Thursday, September 20, 2018 4:02 PM

> To: edk2-devel@lists.01.org

> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>; Zimmer,

> Vincent <vincent.zimmer@intel.com>; Richardson, Brian

> <brian.richardson@intel.com>; Kinney, Michael D

> <michael.d.kinney@intel.com>; Andrew Fish

> <afish@apple.com>; Leif Lindholm

> <leif.lindholm@linaro.org>; Zeng, Star

> <star.zeng@intel.com>; Dong, Eric

> <eric.dong@intel.com>; Ni, Ruiyu <ruiyu.ni@intel.com>;

> Gao, Liming <liming.gao@intel.com>; Carsey, Jaben

> <jaben.carsey@intel.com>; Shi, Steven

> <steven.shi@intel.com>

> Subject: [PATCH v3 3/7] MdeModulePkg/PciBusDxe: invoke

> PE/COFF emulator for foreign option ROMs

> 

> 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.1

> 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 |

> 53 +++++++++++++++++++-

>  3 files changed, 54 insertions(+), 1 deletion(-)

> 

> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> index 55eb3a5a8070..dc57d4876c0f 100644

> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> @@ -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>

> diff --git

> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> index a21dd2b5edf4..c8b861093292 100644

> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> @@ -96,6 +96,7 @@

>    gEfiIncompatiblePciDeviceSupportProtocolGuid    ##

> SOMETIMES_CONSUMES

>    gEfiLoadFile2ProtocolGuid                       ##

> SOMETIMES_PRODUCES

>    gEdkiiIoMmuProtocolGuid                         ##

> SOMETIMES_CONSUMES

> +  gEdkiiPeCoffImageEmulatorProtocolGuid           ##

> SOMETIMES_CONSUMES

>    gEfiLoadedImageDevicePathProtocolGuid           ##

> CONSUMES

> 

>  [FeaturePcd]

> diff --git

> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> index c2be85a906af..085bd5d571bd 100644

> ---

> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> +++

> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> @@ -651,6 +651,55 @@ RomDecode (

>    }

>  }

> 

> +STATIC

> +BOOLEAN

> +IsImageTypeSupported (

> +  IN  UINT16                    MachineType,

> +  IN  UINT16                    SubSystem,

> +  IN  EFI_DEVICE_PATH_PROTOCOL  *DevicePath

> +  )

> +{

> +  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, DevicePath)) {

> +      ReturnValue = TRUE;

> +      break;

> +    }

> +  }

> +

> +  FreePool (HandleBuffer);

> +  return ReturnValue;

> +}

> +

>  /**

>    Load and start the Option Rom image.

> 

> @@ -715,7 +764,9 @@ 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,

> +                              PciDevice->DevicePath))

> {

>        goto NextImage;

>      }

> 

> --

> 2.17.1


_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ard Biesheuvel Dec. 27, 2018, 10:13 a.m. | #2
(digging up this old thread)

On Wed, 26 Sep 2018 at 20:26, Kinney, Michael D
<michael.d.kinney@intel.com> wrote:
>

> Hi Ard,

>

> I am wondering if we can simplify the PciBusDxe driver and

> remove the image type supported check and instead depend on

> LoadImage().  LoadImage() will return EFI_UNSUPPORTED if the

> image type is not supported.

>


I don't think so. A failure of gBS->LoadImage() is treated in a special way:

    if (EFI_ERROR (Status)) {
      //
      // Record the Option ROM Image device path when LoadImage fails.
      // PciOverride.GetDriver() will try to look for the Image Handle
using the device path later.
      //
      AddDriver (PciDevice, NULL, PciOptionRomImageDevicePath);

and other drivers in the same ROM image are disregarded. So it is
probably better to leave this logic alone, given that the override
implementation could be platform specific, and so we have no idea what
it might do.

>

> > -----Original Message-----

> > From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]

> > Sent: Thursday, September 20, 2018 4:02 PM

> > To: edk2-devel@lists.01.org

> > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>; Zimmer,

> > Vincent <vincent.zimmer@intel.com>; Richardson, Brian

> > <brian.richardson@intel.com>; Kinney, Michael D

> > <michael.d.kinney@intel.com>; Andrew Fish

> > <afish@apple.com>; Leif Lindholm

> > <leif.lindholm@linaro.org>; Zeng, Star

> > <star.zeng@intel.com>; Dong, Eric

> > <eric.dong@intel.com>; Ni, Ruiyu <ruiyu.ni@intel.com>;

> > Gao, Liming <liming.gao@intel.com>; Carsey, Jaben

> > <jaben.carsey@intel.com>; Shi, Steven

> > <steven.shi@intel.com>

> > Subject: [PATCH v3 3/7] MdeModulePkg/PciBusDxe: invoke

> > PE/COFF emulator for foreign option ROMs

> >

> > 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.1

> > 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 |

> > 53 +++++++++++++++++++-

> >  3 files changed, 54 insertions(+), 1 deletion(-)

> >

> > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> > index 55eb3a5a8070..dc57d4876c0f 100644

> > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h

> > @@ -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>

> > diff --git

> > a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> > index a21dd2b5edf4..c8b861093292 100644

> > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf

> > @@ -96,6 +96,7 @@

> >    gEfiIncompatiblePciDeviceSupportProtocolGuid    ##

> > SOMETIMES_CONSUMES

> >    gEfiLoadFile2ProtocolGuid                       ##

> > SOMETIMES_PRODUCES

> >    gEdkiiIoMmuProtocolGuid                         ##

> > SOMETIMES_CONSUMES

> > +  gEdkiiPeCoffImageEmulatorProtocolGuid           ##

> > SOMETIMES_CONSUMES

> >    gEfiLoadedImageDevicePathProtocolGuid           ##

> > CONSUMES

> >

> >  [FeaturePcd]

> > diff --git

> > a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> > index c2be85a906af..085bd5d571bd 100644

> > ---

> > a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> > +++

> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> > @@ -651,6 +651,55 @@ RomDecode (

> >    }

> >  }

> >

> > +STATIC

> > +BOOLEAN

> > +IsImageTypeSupported (

> > +  IN  UINT16                    MachineType,

> > +  IN  UINT16                    SubSystem,

> > +  IN  EFI_DEVICE_PATH_PROTOCOL  *DevicePath

> > +  )

> > +{

> > +  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, DevicePath)) {

> > +      ReturnValue = TRUE;

> > +      break;

> > +    }

> > +  }

> > +

> > +  FreePool (HandleBuffer);

> > +  return ReturnValue;

> > +}

> > +

> >  /**

> >    Load and start the Option Rom image.

> >

> > @@ -715,7 +764,9 @@ 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,

> > +                              PciDevice->DevicePath))

> > {

> >        goto NextImage;

> >      }

> >

> > --

> > 2.17.1

>

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h
index 55eb3a5a8070..dc57d4876c0f 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h
@@ -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>
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
index a21dd2b5edf4..c8b861093292 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
@@ -96,6 +96,7 @@ 
   gEfiIncompatiblePciDeviceSupportProtocolGuid    ## SOMETIMES_CONSUMES
   gEfiLoadFile2ProtocolGuid                       ## SOMETIMES_PRODUCES
   gEdkiiIoMmuProtocolGuid                         ## SOMETIMES_CONSUMES
+  gEdkiiPeCoffImageEmulatorProtocolGuid           ## SOMETIMES_CONSUMES
   gEfiLoadedImageDevicePathProtocolGuid           ## CONSUMES
 
 [FeaturePcd]
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
index c2be85a906af..085bd5d571bd 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
@@ -651,6 +651,55 @@  RomDecode (
   }
 }
 
+STATIC
+BOOLEAN
+IsImageTypeSupported (
+  IN  UINT16                    MachineType,
+  IN  UINT16                    SubSystem,
+  IN  EFI_DEVICE_PATH_PROTOCOL  *DevicePath
+  )
+{
+  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, DevicePath)) {
+      ReturnValue = TRUE;
+      break;
+    }
+  }
+
+  FreePool (HandleBuffer);
+  return ReturnValue;
+}
+
 /**
   Load and start the Option Rom image.
 
@@ -715,7 +764,9 @@  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,
+                              PciDevice->DevicePath)) {
       goto NextImage;
     }