Hi Ard,

Similar to my PciBusDxe feedback, it would be better if
the image supported information was determined by calling
LoadImage() and checking for an EFI_UNSUPPORTED return
value.

This also has the advantage of reducing the number of 
components that need to be aware of any new protocols
associated with emulation with the best case being the
DXE Core and the modules that provide the emulators.

Thanks,

Mike

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-
> [email protected]] On Behalf Of Ard Biesheuvel
> Sent: Thursday, September 20, 2018 4:02 PM
> To: [email protected]
> Cc: Ni, Ruiyu <[email protected]>; Zimmer, Vincent
> <[email protected]>; Dong, Eric
> <[email protected]>; Andrew Fish <[email protected]>;
> Carsey, Jaben <[email protected]>; Richardson,
> Brian <[email protected]>; Gao, Liming
> <[email protected]>; Kinney, Michael D
> <[email protected]>; Zeng, Star
> <[email protected]>
> Subject: [edk2] [PATCH v3 4/7]
> MdeModulePkg/UefiBootManagerLib: allow foreign
> Driver#### images
> 
> 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 an emulator.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ard Biesheuvel
> <[email protected]>
> ---
>  MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c
> | 51 +++++++++++++++++++-
>  MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> |  1 +
> 
> MdeModulePkg/Library/UefiBootManagerLib/UefiBootManager
> Lib.inf |  1 +
>  3 files changed, 52 insertions(+), 1 deletion(-)
> 
> diff --git
> a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.
> c
> b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.
> c
> index 7bf96646c690..f6fda8f2c3f7 100644
> ---
> a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.
> c
> +++
> b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.
> c
> @@ -1185,6 +1185,54 @@ EfiBootManagerFreeLoadOptions (
>    return EFI_SUCCESS;
>  }
> 
> +STATIC
> +BOOLEAN
> +BmIsImageTypeSupported (
> +  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, NULL)) {
> +      ReturnValue = TRUE;
> +      break;
> +    }
> +  }
> +
> +  FreePool (HandleBuffer);
> +  return ReturnValue;
> +}
> +
>  /**
>    Return whether the PE header of the load option is
> valid or not.
> 
> @@ -1235,7 +1283,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 978fbff966f6..5f64ef304b87 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/UefiBootManag
> erLib.inf
> b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManag
> erLib.inf
> index 72c5ca1cd59e..09e2134acf8e 100644
> ---
> a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManag
> erLib.inf
> +++
> b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManag
> erLib.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
> --
> 2.17.1
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to