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

Message ID 20180912132151.4258-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. 12, 2018, 1:21 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.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 | 16 +++++++++++++++-
 3 files changed, 17 insertions(+), 1 deletion(-)

-- 
2.17.1

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

Comments

Zeng, Star Sept. 13, 2018, 10:24 a.m. | #1
On 2018/9/12 21:21, Ard Biesheuvel wrote:
> 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 | 16 +++++++++++++++-

>   3 files changed, 17 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..3d99ea0c1047 100644

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

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

> @@ -97,6 +97,7 @@

>     gEfiLoadFile2ProtocolGuid                       ## SOMETIMES_PRODUCES

>     gEdkiiIoMmuProtocolGuid                         ## SOMETIMES_CONSUMES

>     gEfiLoadedImageDevicePathProtocolGuid           ## CONSUMES

> +  gEdkiiPeCoffImageEmulatorProtocolGuid           ## SOMETIMES_CONSUMES

>   

>   [FeaturePcd]

>     gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport      ## CONSUMES

> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

> index c2be85a906af..07236afd327d 100644

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

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

> @@ -678,6 +678,7 @@ ProcessOpRomImage (

>     MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH  EfiOpRomImageNode;

>     VOID                                     *Buffer;

>     UINTN                                    BufferSize;

> +  EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL     *PeCoffEmulator;

>   

>     Indicator = 0;

>   

> @@ -693,6 +694,7 @@ ProcessOpRomImage (

>     }

>     ASSERT (((EFI_PCI_EXPANSION_ROM_HEADER *) RomBarOffset)->Signature == PCI_EXPANSION_ROM_HEADER_SIGNATURE);

>   

> +  PeCoffEmulator = NULL;

>     do {

>       EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) RomBarOffset;

>       if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {

> @@ -716,7 +718,19 @@ ProcessOpRomImage (

>       // Skip the EFI PCI Option ROM image if its machine type is not supported

>       //

>       if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType)) {

> -      goto NextImage;

> +      //

> +      // Check whether we have a PE/COFF emulator that supports this image

> +      //

> +      if (PeCoffEmulator == NULL) {

> +        gBS->LocateProtocol (&gEdkiiPeCoffImageEmulatorProtocolGuid, NULL,

> +               (VOID **)&PeCoffEmulator);

> +      }

> +      if (PeCoffEmulator == NULL ||

> +          !PeCoffEmulator->IsImageSupported (PeCoffEmulator,

> +                             EfiRomHeader->EfiMachineType,

> +                             EfiRomHeader->EfiSubsystem)) {

> +        goto NextImage;

> +      }


Hi Ard,

Could these be abstracted to a separate function like the PATCH 4/4 did?

Thanks,
Star

>       }

>   

>       //

> 


_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ard Biesheuvel Sept. 13, 2018, 10:46 a.m. | #2
On 13 September 2018 at 12:24, Zeng, Star <star.zeng@intel.com> wrote:
> On 2018/9/12 21:21, Ard Biesheuvel wrote:

>>

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

>> +++++++++++++++-

>>   3 files changed, 17 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..3d99ea0c1047 100644

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

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

>> @@ -97,6 +97,7 @@

>>     gEfiLoadFile2ProtocolGuid                       ## SOMETIMES_PRODUCES

>>     gEdkiiIoMmuProtocolGuid                         ## SOMETIMES_CONSUMES

>>     gEfiLoadedImageDevicePathProtocolGuid           ## CONSUMES

>> +  gEdkiiPeCoffImageEmulatorProtocolGuid           ## SOMETIMES_CONSUMES

>>     [FeaturePcd]

>>     gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport      ##

>> CONSUMES

>> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

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

>> index c2be85a906af..07236afd327d 100644

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

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

>> @@ -678,6 +678,7 @@ ProcessOpRomImage (

>>     MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH  EfiOpRomImageNode;

>>     VOID                                     *Buffer;

>>     UINTN                                    BufferSize;

>> +  EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL     *PeCoffEmulator;

>>       Indicator = 0;

>>   @@ -693,6 +694,7 @@ ProcessOpRomImage (

>>     }

>>     ASSERT (((EFI_PCI_EXPANSION_ROM_HEADER *) RomBarOffset)->Signature ==

>> PCI_EXPANSION_ROM_HEADER_SIGNATURE);

>>   +  PeCoffEmulator = NULL;

>>     do {

>>       EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) RomBarOffset;

>>       if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {

>> @@ -716,7 +718,19 @@ ProcessOpRomImage (

>>       // Skip the EFI PCI Option ROM image if its machine type is not

>> supported

>>       //

>>       if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED

>> (EfiRomHeader->EfiMachineType)) {

>> -      goto NextImage;

>> +      //

>> +      // Check whether we have a PE/COFF emulator that supports this

>> image

>> +      //

>> +      if (PeCoffEmulator == NULL) {

>> +        gBS->LocateProtocol (&gEdkiiPeCoffImageEmulatorProtocolGuid,

>> NULL,

>> +               (VOID **)&PeCoffEmulator);

>> +      }

>> +      if (PeCoffEmulator == NULL ||

>> +          !PeCoffEmulator->IsImageSupported (PeCoffEmulator,

>> +                             EfiRomHeader->EfiMachineType,

>> +                             EfiRomHeader->EfiSubsystem)) {

>> +        goto NextImage;

>> +      }

>

>

> Hi Ard,

>

> Could these be abstracted to a separate function like the PATCH 4/4 did?

>


Yes.
_______________________________________________
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..3d99ea0c1047 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
@@ -97,6 +97,7 @@ 
   gEfiLoadFile2ProtocolGuid                       ## SOMETIMES_PRODUCES
   gEdkiiIoMmuProtocolGuid                         ## SOMETIMES_CONSUMES
   gEfiLoadedImageDevicePathProtocolGuid           ## CONSUMES
+  gEdkiiPeCoffImageEmulatorProtocolGuid           ## SOMETIMES_CONSUMES
 
 [FeaturePcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport      ## CONSUMES
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
index c2be85a906af..07236afd327d 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
@@ -678,6 +678,7 @@  ProcessOpRomImage (
   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH  EfiOpRomImageNode;
   VOID                                     *Buffer;
   UINTN                                    BufferSize;
+  EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL     *PeCoffEmulator;
 
   Indicator = 0;
 
@@ -693,6 +694,7 @@  ProcessOpRomImage (
   }
   ASSERT (((EFI_PCI_EXPANSION_ROM_HEADER *) RomBarOffset)->Signature == PCI_EXPANSION_ROM_HEADER_SIGNATURE);
 
+  PeCoffEmulator = NULL;
   do {
     EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) RomBarOffset;
     if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {
@@ -716,7 +718,19 @@  ProcessOpRomImage (
     // Skip the EFI PCI Option ROM image if its machine type is not supported
     //
     if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType)) {
-      goto NextImage;
+      //
+      // Check whether we have a PE/COFF emulator that supports this image
+      //
+      if (PeCoffEmulator == NULL) {
+        gBS->LocateProtocol (&gEdkiiPeCoffImageEmulatorProtocolGuid, NULL,
+               (VOID **)&PeCoffEmulator);
+      }
+      if (PeCoffEmulator == NULL ||
+          !PeCoffEmulator->IsImageSupported (PeCoffEmulator,
+                             EfiRomHeader->EfiMachineType,
+                             EfiRomHeader->EfiSubsystem)) {
+        goto NextImage;
+      }
     }
 
     //