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.biesheu...@linaro.org>; Zimmer, > Vincent <vincent.zim...@intel.com>; Richardson, Brian > <brian.richard...@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com>; Andrew Fish > <af...@apple.com>; Leif Lindholm > <leif.lindh...@linaro.org>; Zeng, Star > <star.z...@intel.com>; Dong, Eric > <eric.d...@intel.com>; Ni, Ray <ray...@intel.com>; Gao, > Liming <liming....@intel.com>; Carsey, Jaben > <jaben.car...@intel.com>; Shi, Steven > <steven....@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.biesheu...@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 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#38920): https://edk2.groups.io/g/devel/message/38920 Mute This Topic: https://groups.io/mt/31034152/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-