public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"ard.biesheuvel@linaro.org" <ard.biesheuvel@linaro.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Zimmer, Vincent" <vincent.zimmer@intel.com>,
	"Richardson, Brian" <brian.richardson@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, Ray" <ray.ni@intel.com>,
	"Gao, Liming" <liming.gao@intel.com>,
	"Carsey, Jaben" <jaben.carsey@intel.com>,
	"Shi, Steven" <steven.shi@intel.com>
Subject: Re: [edk2-devel] [PATCH v5 5/7] MdeModulePkg/EbcDxe: implement the PE/COFF emulator protocol
Date: Thu, 11 Apr 2019 20:29:57 +0000	[thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F5B9C907BF@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <20190411185813.2084-6-ard.biesheuvel@linaro.org>

Ard,

Comment below on a VS2015x86 build issue.

Mike

> -----Original Message-----
> From: devel@edk2.groups.io
> [mailto:devel@edk2.groups.io] On Behalf Of Ard
> Biesheuvel
> Sent: Thursday, April 11, 2019 11:58 AM
> To: devel@edk2.groups.io
> 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, Ray <ray.ni@intel.com>; Gao,
> Liming <liming.gao@intel.com>; Carsey, Jaben
> <jaben.carsey@intel.com>; Shi, Steven
> <steven.shi@intel.com>
> Subject: [edk2-devel] [PATCH v5 5/7]
> MdeModulePkg/EbcDxe: implement the PE/COFF emulator
> protocol
> 
> Implement the new EDK2 PE/COFF image emulator protocol
> so that we can
> remove the EBC specific handling in the DXE core and
> other places in
> the core code.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ard Biesheuvel
> <ard.biesheuvel@linaro.org>
> ---
>  MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf |   3 +
>  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf      |   3 +
>  MdeModulePkg/Universal/EbcDxe/EbcInt.c        | 123
> ++++++++++++++++++++
>  MdeModulePkg/Universal/EbcDxe/EbcInt.h        |   3 +
>  4 files changed, 132 insertions(+)
> 
> diff --git
> a/MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf
> b/MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf
> index 8f293f5c7c29..c7a9d519b080 100644
> --- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf
> +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf
> @@ -89,6 +89,8 @@
>    BaseMemoryLib
>    DebugLib
>    BaseLib
> +  CacheMaintenanceLib
> +  PeCoffLib
> 
>  [Protocols]
>    gEfiDebugSupportProtocolGuid                  ##
> PRODUCES
> @@ -98,6 +100,7 @@
>    gEfiEbcSimpleDebuggerProtocolGuid             ##
> SOMETIMES_CONSUMES
>    gEfiPciRootBridgeIoProtocolGuid               ##
> SOMETIMES_CONSUMES
>    gEfiSimpleFileSystemProtocolGuid              ##
> SOMETIMES_CONSUMES
> +  gEdkiiPeCoffImageEmulatorProtocolGuid         ##
> PRODUCES
> 
>  [Guids]
>    gEfiFileInfoGuid                              ##
> SOMETIMES_CONSUMES ## GUID
> diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
> b/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
> index d6ee6194a0c8..ecccf2c57ffe 100644
> --- a/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
> +++ b/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
> @@ -57,7 +57,9 @@
>    MdeModulePkg/MdeModulePkg.dec
> 
>  [LibraryClasses]
> +  CacheMaintenanceLib
>    MemoryAllocationLib
> +  PeCoffLib
>    UefiBootServicesTableLib
>    BaseMemoryLib
>    UefiDriverEntryPoint
> @@ -68,6 +70,7 @@
>  [Protocols]
>    gEfiDebugSupportProtocolGuid                  ##
> PRODUCES
>    gEfiEbcProtocolGuid                           ##
> PRODUCES
> +  gEdkiiPeCoffImageEmulatorProtocolGuid         ##
> PRODUCES
>    gEfiEbcVmTestProtocolGuid                     ##
> SOMETIMES_PRODUCES
>    gEfiEbcSimpleDebuggerProtocolGuid             ##
> SOMETIMES_CONSUMES
> 
> diff --git a/MdeModulePkg/Universal/EbcDxe/EbcInt.c
> b/MdeModulePkg/Universal/EbcDxe/EbcInt.c
> index 727ba8bcae44..051eb0aaa07b 100644
> --- a/MdeModulePkg/Universal/EbcDxe/EbcInt.c
> +++ b/MdeModulePkg/Universal/EbcDxe/EbcInt.c
> @@ -349,6 +349,119 @@ UINTN                  mStackNum
> = 0;
>  EFI_EVENT              mEbcPeriodicEvent;
>  VM_CONTEXT             *mVmPtr = NULL;
> 
> +/**
> +  Check whether the emulator supports executing a
> certain PE/COFF image
> +
> +  @param[in] This         This pointer for
> EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL
> +                          structure
> +  @param[in] ImageType    Whether the image is an
> application, a boot time
> +                          driver or a runtime driver.
> +  @param[in] DevicePath   Path to device where the
> image originated
> +                          (e.g., a PCI option ROM)
> +
> +  @retval TRUE            The image is supported by
> the emulator
> +  @retval FALSE           The image is not supported
> by the emulator.
> +**/
> +BOOLEAN
> +EFIAPI
> +EbcIsImageSupported (
> +  IN  EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL    *This,
> +  IN  UINT16
> ImageType,
> +  IN  EFI_DEVICE_PATH_PROTOCOL
> *DevicePath   OPTIONAL
> +  )
> +{
> +  if (ImageType != EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION
> &&
> +      ImageType !=
> EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) {
> +    return FALSE;
> +  }
> +  return TRUE;
> +}
> +
> +/**
> +  Register a supported PE/COFF image with the
> emulator. After this call
> +  completes successfully, the PE/COFF image may be
> started as usual, and
> +  it is the responsibility of the emulator
> implementation that any branch
> +  into the code section of the image (including
> returns from functions called
> +  from the foreign code) is executed as if it were
> running on the machine
> +  type it was built for.
> +
> +  @param[in]      This          This pointer for
> +
> EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL structure
> +  @param[in]      ImageBase     The base address in
> memory of the PE/COFF image
> +  @param[in]      ImageSize     The size in memory of
> the PE/COFF image
> +  @param[in,out]  EntryPoint    The entry point of the
> PE/COFF image. Passed by
> +                                reference so that the
> emulator may modify it.
> +
> +  @retval EFI_SUCCESS           The image was
> registered with the emulator and
> +                                can be started as
> usual.
> +  @retval other                 The image could not be
> registered.
> +
> +  If the PE/COFF machine type or image type are not
> supported by the emulator,
> +  then ASSERT().
> +**/
> +EFI_STATUS
> +EFIAPI
> +EbcRegisterImage (
> +  IN      EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL
> *This,
> +  IN      EFI_PHYSICAL_ADDRESS
> ImageBase,
> +  IN      UINT64
> ImageSize,
> +  IN  OUT EFI_IMAGE_ENTRY_POINT
> *EntryPoint
> +  )
> +{
> +  DEBUG_CODE_BEGIN ();
> +    PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;
> +    EFI_STATUS                    Status;
> +
> +    ZeroMem (&ImageContext, sizeof (ImageContext));
> +
> +    ImageContext.Handle    = (VOID *)(UINTN)ImageBase;
> +    ImageContext.ImageRead =
> PeCoffLoaderImageReadFromMemory;
> +
> +    Status = PeCoffLoaderGetImageInfo (&ImageContext);
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +
> +    ASSERT (ImageContext.Machine ==
> EFI_IMAGE_MACHINE_EBC);
> +    ASSERT (ImageContext.ImageType ==
> EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION ||
> +            ImageContext.ImageType ==
> EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER);
> +  DEBUG_CODE_END ();
> +
> +  EbcRegisterICacheFlush (NULL,
> +
> (EBC_ICACHE_FLUSH)InvalidateInstructionCacheRange);
> +
> +  return EbcCreateThunk (NULL, (VOID
> *)(UINTN)ImageBase, *EntryPoint,
> +           (VOID **)EntryPoint);

This breaks on a VS2015x86 build.

*EntryPoint is type EFI_IMAGE_ENTRY_POINT and the 3rd param is
type VOID *.  This can be fixed by adding typecasts:

  return EbcCreateThunk (NULL, (VOID *)(UINTN)ImageBase, (VOID *)(UINTN)*EntryPoint,
           (VOID **)EntryPoint);

> +}
> +
> +/**
> +  Unregister a PE/COFF image that has been registered
> with the emulator.
> +  This should be done before the image is unloaded
> from memory.
> +
> +  @param[in] This         This pointer for
> EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL
> +                          structure
> +  @param[in] ImageBase    The base address in memory
> of the PE/COFF image
> +
> +  @retval EFI_SUCCESS     The image was unregistered
> with the emulator.
> +  @retval other           Image could not be unloaded.
> +**/
> +EFI_STATUS
> +EFIAPI
> +EbcUnregisterImage (
> +  IN  EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL    *This,
> +  IN  EFI_PHYSICAL_ADDRESS
> ImageBase
> +  )
> +{
> +  return EbcUnloadImage (NULL, (VOID
> *)(UINTN)ImageBase);
> +}
> +
> +EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL
> mPeCoffEmuProtocol = {
> +  EbcIsImageSupported,
> +  EbcRegisterImage,
> +  EbcUnregisterImage,
> +  EDKII_PECOFF_IMAGE_EMULATOR_VERSION,
> +  EFI_IMAGE_MACHINE_EBC
> +};
> 
>  /**
>    Initializes the VM EFI interface.  Allocates memory
> for the VM interface
> @@ -449,6 +562,16 @@ InitializeEbcDriver (
>      }
>    }
> 
> +  Status = gBS->InstallProtocolInterface (
> +                  &ImageHandle,
> +
> &gEdkiiPeCoffImageEmulatorProtocolGuid,
> +                  EFI_NATIVE_INTERFACE,
> +                  &mPeCoffEmuProtocol
> +                  );
> +  if (EFI_ERROR(Status)) {
> +    goto ErrorExit;
> +  }
> +
>    Status = InitEBCStack();
>    if (EFI_ERROR(Status)) {
>      goto ErrorExit;
> diff --git a/MdeModulePkg/Universal/EbcDxe/EbcInt.h
> b/MdeModulePkg/Universal/EbcDxe/EbcInt.h
> index 8aa7a4abbd63..9b25e91f951c 100644
> --- a/MdeModulePkg/Universal/EbcDxe/EbcInt.h
> +++ b/MdeModulePkg/Universal/EbcDxe/EbcInt.h
> @@ -23,9 +23,12 @@ WITHOUT WARRANTIES OR
> REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>  #include <Protocol/Ebc.h>
>  #include <Protocol/EbcVmTest.h>
>  #include <Protocol/EbcSimpleDebugger.h>
> +#include <Protocol/PeCoffImageEmulator.h>
> 
>  #include <Library/BaseLib.h>
> +#include <Library/CacheMaintenanceLib.h>
>  #include <Library/DebugLib.h>
> +#include <Library/PeCoffLib.h>
>  #include <Library/UefiDriverEntryPoint.h>
>  #include <Library/BaseMemoryLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
> --
> 2.17.1
> 
> 
> 


  reply	other threads:[~2019-04-11 20:29 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-11 18:58 [PATCH v5 0/7] MdeModulePkg: add support for dispatching foreign arch PE/COFF images Ard Biesheuvel
2019-04-11 18:58 ` [PATCH v5 1/7] MdeModulePkg: introduce PE/COFF image emulator protocol Ard Biesheuvel
2019-04-11 18:58 ` [PATCH v5 2/7] MdeModulePkg/DxeCore: invoke the emulator protocol for foreign images Ard Biesheuvel
2019-04-11 20:21   ` Michael D Kinney
2019-04-11 18:58 ` [PATCH v5 3/7] MdeModulePkg/PciBusDxe: dispatch option ROMs for foreign architectures Ard Biesheuvel
2019-04-11 18:58 ` [PATCH v5 4/7] MdeModulePkg/UefiBootManagerLib: allow foreign Driver#### images Ard Biesheuvel
2019-04-11 18:58 ` [PATCH v5 5/7] MdeModulePkg/EbcDxe: implement the PE/COFF emulator protocol Ard Biesheuvel
2019-04-11 20:29   ` Michael D Kinney [this message]
2019-04-11 18:58 ` [PATCH v5 6/7] MdePkg/UefiBaseType.h: treat EBC as a non-native machine type Ard Biesheuvel
2019-04-11 18:58 ` [PATCH v5 7/7] MdeModulePkg/DxeCore: remove explicit EBC handling Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E92EE9817A31E24EB0585FDF735412F5B9C907BF@ORSMSX113.amr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox