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
>
>
>
next prev parent 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