From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4864:20::132; helo=mail-it1-x132.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-it1-x132.google.com (mail-it1-x132.google.com [IPv6:2607:f8b0:4864:20::132]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 57E4921B02822 for ; Thu, 27 Sep 2018 03:58:50 -0700 (PDT) Received: by mail-it1-x132.google.com with SMTP id m9-v6so7085311ita.2 for ; Thu, 27 Sep 2018 03:58:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=VuVeKXv7qs2NEX4k9+Vq9jAi9bc4X8W1eM9F+47mWU0=; b=SpJSJUrWgZ8SP+HZXX9Oj4vom5RFztmxSN+H7SH7BW7nPZpJ2jLhKNaepZllo3yvIb r2rD5MfOF6RqyABBOJYSlSEQ1hir0OJpNBfF9Hgd04NgoAobpqEjvsFFaVGRfv68EaKr Ro922cPs7fqvyO5C1gr6aU7gFFUcw0ORNMXGY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=VuVeKXv7qs2NEX4k9+Vq9jAi9bc4X8W1eM9F+47mWU0=; b=mR0+6CrTPkxhZyz66E1eeBZHIuvRbfwxTHShRUPiH5w8AsVZaawlMprZafYIlpDPW/ cmRpNeMPdsRX6Rpze+NPXN65xyu0qZqzaDBNCIV1oCtXGAAQvrakAqHmNzJMvljcl9MP lULuZt7Ie8RA7l1V/TEEE81rWV8TNSyBNTJNWF2hfRzlf8rja+eS7QYYzroWZb4ksFc3 o1mDR7H2aLFz8+SHsnnaN2EF32L1ASfBXwAV8dZPG8zrTQ2qf5ebFQDuRrsfzQy3/dx3 znQX4A5ZLGPhOefg+jCL0wGb3HTMb9iXMTnYWAFP36XLS+VMlrEUrrUhqyzKVYPnu4yb nMVA== X-Gm-Message-State: ABuFfojQmcVnngJxOhsOgGhcu90AQdQo/T4WsPSUDQla/Q0P1co9MG7O Styg2TfDtjmUaP4HERdUsWiUPhUPmrheu0r9rR9GPQ== X-Google-Smtp-Source: ACcGV61qNf+2pmaQpyPERWHpvl2IUt4hKJDNbbSQ9vyNf633KPuX1cUP74JvX8VK+qVhQFvfQPBhiGOQ1oy7MIxhtDg= X-Received: by 2002:a24:e48e:: with SMTP id o136-v6mr8485862ith.58.1538045929144; Thu, 27 Sep 2018 03:58:49 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a6b:2848:0:0:0:0:0 with HTTP; Thu, 27 Sep 2018 03:58:48 -0700 (PDT) In-Reply-To: <0C09AFA07DD0434D9E2A0C6AEB0483103BBF1D27@shsmsx102.ccr.corp.intel.com> References: <20180920230145.7565-1-ard.biesheuvel@linaro.org> <20180920230145.7565-2-ard.biesheuvel@linaro.org> <0C09AFA07DD0434D9E2A0C6AEB0483103BBF0A34@shsmsx102.ccr.corp.intel.com> <0C09AFA07DD0434D9E2A0C6AEB0483103BBF1D27@shsmsx102.ccr.corp.intel.com> From: Ard Biesheuvel Date: Thu, 27 Sep 2018 12:58:48 +0200 Message-ID: To: "Zeng, Star" Cc: "Kinney, Michael D" , "edk2-devel@lists.01.org" , "Zimmer, Vincent" , "Richardson, Brian" , Andrew Fish , Leif Lindholm , "Dong, Eric" , "Ni, Ruiyu" , "Gao, Liming" , "Carsey, Jaben" , "Shi, Steven" Subject: Re: [PATCH v3 1/7] MdeModulePkg: introduce PE/COFF image emulator protocol X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Sep 2018 10:58:51 -0000 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On 27 September 2018 at 02:48, Zeng, Star wrote: > Yes. This idea also came to my mind last night, then no need introduce Pe= CoffEmulatorDxe and no platform change is needed. > The only problem with this approach is that we cannot keep track of which emulator returned TRUE for IsSupported(), and so RegisterImage() and also UnregisterImage() will have to do some internal bookkeeping in the 'manager' protocol implementation that duplicates code in the emulators. So could we flesh this out a bit before I dive into the code again and turn everything upside down? - the PCI bus driver no longer checks the machine type - the BDS no longer checks the machine type for Driver#### images - CoreLoadImage() checks IsSupported() to establish whether the emulator manager has an emulator available that is willing to take charge of the image - what happens next? CoreLoadImage() calls RegisterImage() on what? Should IsSupported() return some kind of handle? Also, perhaps we should simply stick with one emulator per machine type (which doesn't preclude an implementation from registering itself for multiple ones). That simplifies the IsSupported vs RegisterImage issue above as well (i.e., it is unambiguous *which* RegisterImage() should be called) > -----Original Message----- > From: Kinney, Michael D > Sent: Thursday, September 27, 2018 1:32 AM > To: Ard Biesheuvel ; Zeng, Star ; Kinney, Michael D > Cc: edk2-devel@lists.01.org; Zimmer, Vincent ; = Richardson, Brian ; Andrew Fish ; Leif Lindholm ; Dong, Eric ; Ni, Ruiyu ; Gao, Liming ; Ca= rsey, Jaben ; Shi, Steven > Subject: RE: [PATCH v3 1/7] MdeModulePkg: introduce PE/COFF image emulato= r protocol > > Hi Ard, > > I think this registration protocol would be a new protocol in the MdeModu= lePkg and the protocol would be produced by the DXE Core. The emulation dr= ivers, including EBC would consume this protocol to register their services= . This removes the need for the DXE Core to do a Register Protocol Notify = event for the emulator protocol. The DXE Core would build a table of regis= tered services, so it can quickly loop through them to check if an emulator= supports a specific PE/COFF image or not. > > Best regards, > > Mike > >> -----Original Message----- >> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org] >> Sent: Wednesday, September 26, 2018 3:14 AM >> To: Zeng, Star >> Cc: edk2-devel@lists.01.org; Zimmer, Vincent >> ; Richardson, Brian >> ; Kinney, Michael D >> ; Andrew Fish ; Leif >> Lindholm ; Dong, Eric ; >> Ni, Ruiyu ; Gao, Liming ; >> Carsey, Jaben ; Shi, Steven >> >> Subject: Re: [PATCH v3 1/7] MdeModulePkg: introduce PE/COFF image >> emulator protocol >> >> On Wed, 26 Sep 2018 at 12:07, Zeng, Star wrote: >> > >> > A little late feedback. Just an idea. >> > >> > Do you think whether it can make the consumer simpler >> like below or not? >> > >> > Add a new API RegisterInterfaces in the protocol and >> add a wrapper driver PeCoffEmulatorDxe. >> > The emulators can call RegisterInterfaces, and >> consumer will call other APIs simply, PeCoffEmulatorDxe will be a >> wrapper as manager. >> > >> > typedef >> > EFI_STATUS >> > (EFIAPI >> *EDKII_PECOFF_IMAGE_EMULATOR_REGISTER_INTERFACES) ( >> > IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This, >> > IN EDKII_PECOFF_IMAGE_EMULATOR_IS_IMAGE_SUPPORTED >> IsImageSupported, >> > IN EDKII_PECOFF_IMAGE_EMULATOR_REGISTER_IMAGE >> RegisterImage, >> > IN EDKII_PECOFF_IMAGE_EMULATOR_UNREGISTER_IMAGE >> UnregisterImage >> > ); >> > >> > typedef struct _EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL { >> > EDKII_PECOFF_IMAGE_EMULATOR_REGISTER_INTERFACES >> RegisterInterfaces; >> > EDKII_PECOFF_IMAGE_EMULATOR_IS_IMAGE_SUPPORTED >> IsImageSupported; >> > EDKII_PECOFF_IMAGE_EMULATOR_REGISTER_IMAGE >> RegisterImage; >> > EDKII_PECOFF_IMAGE_EMULATOR_UNREGISTER_IMAGE >> UnregisterImage; >> > } EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL; >> > >> >> Hi Star, >> >> Thanks for taking a look. >> >> I tried to avoid introducing new drivers or library classes because it >> will break existing platforms that incorporate EbcDxe. >> Do you think >> this is not an issue? >> >> > -----Original Message----- >> > From: Ard Biesheuvel >> [mailto:ard.biesheuvel@linaro.org] >> > Sent: Friday, September 21, 2018 7:02 AM >> > To: edk2-devel@lists.01.org >> > Cc: Ard Biesheuvel ; >> Zimmer, Vincent ; Richardson, Brian >> ; Kinney, Michael D >> ; Andrew Fish ; Leif >> Lindholm ; Zeng, Star ; >> Dong, Eric ; Ni, Ruiyu ; Gao, >> Liming ; Carsey, Jaben ; >> Shi, Steven >> > Subject: [PATCH v3 1/7] MdeModulePkg: introduce >> PE/COFF image emulator protocol >> > >> > Introduce a protocol that can be invoked by the image >> loading services to execute foreign architecture PE/COFF images via an >> emulator. >> > >> > Contributed-under: TianoCore Contribution Agreement >> 1.1 >> > Signed-off-by: Ard Biesheuvel >> >> > --- >> > MdeModulePkg/Include/Protocol/PeCoffImageEmulator.h | >> 102 ++++++++++++++++++++ >> > MdeModulePkg/MdeModulePkg.dec | >> 4 + >> > 2 files changed, 106 insertions(+) >> > >> > diff --git >> a/MdeModulePkg/Include/Protocol/PeCoffImageEmulator.h >> b/MdeModulePkg/Include/Protocol/PeCoffImageEmulator.h >> > new file mode 100644 >> > index 000000000000..27bad556209c >> > --- /dev/null >> > +++ >> b/MdeModulePkg/Include/Protocol/PeCoffImageEmulator.h >> > @@ -0,0 +1,102 @@ >> > +/** @file >> > + Copyright (c) 2018, Linaro, Ltd. All rights >> reserved.
>> > + >> > + This program and the accompanying materials are >> licensed and made >> > + available under the terms and conditions of the BSD >> License which >> > + accompanies this distribution. The full text of >> the license may be >> > + found at http://opensource.org/licenses/bsd- >> license.php >> > + >> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON >> AN "AS IS" BASIS, >> > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, >> EITHER EXPRESS OR IMPLIED. >> > + >> > +**/ >> > + >> > +#ifndef PECOFF_IMAGE_EMULATOR_PROTOCOL_GUID_H >> > +#define PECOFF_IMAGE_EMULATOR_PROTOCOL_GUID_H >> > + >> > +#define EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL_GUID \ >> > + { 0x96F46153, 0x97A7, 0x4793, { 0xAC, 0xC1, 0xFA, >> 0x19, 0xBF, 0x78, >> > +0xEA, 0x97 } } >> > + >> > +typedef struct _EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL >> > +EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL; >> > + >> > +/** >> > + 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] MachineType The >> > + machine type for which >> the image was built >> > + @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. >> > +**/ >> > +typedef >> > +BOOLEAN >> > +(EFIAPI >> *EDKII_PECOFF_IMAGE_EMULATOR_IS_IMAGE_SUPPORTED) ( >> > + IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This, >> > + IN UINT16 >> MachineType, >> > + IN UINT16 >> ImageType, >> > + IN EFI_DEVICE_PATH_PROTOCOL >> *DevicePath OPTIONAL >> > + ); >> > + >> > +/** >> > + 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(). >> > +**/ >> > +typedef >> > +EFI_STATUS >> > +(EFIAPI *EDKII_PECOFF_IMAGE_EMULATOR_REGISTER_IMAGE) >> ( >> > + IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL >> *This, >> > + IN EFI_PHYSICAL_ADDRESS >> ImageBase, >> > + IN UINT64 >> ImageSize, >> > + IN OUT EFI_IMAGE_ENTRY_POINT >> *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. >> > +**/ >> > +typedef >> > +EFI_STATUS >> > +(EFIAPI >> *EDKII_PECOFF_IMAGE_EMULATOR_UNREGISTER_IMAGE) ( >> > + IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This, >> > + IN EFI_PHYSICAL_ADDRESS >> ImageBase >> > + ); >> > + >> > +typedef struct _EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL >> { >> > + EDKII_PECOFF_IMAGE_EMULATOR_IS_IMAGE_SUPPORTED >> IsImageSupported; >> > + EDKII_PECOFF_IMAGE_EMULATOR_REGISTER_IMAGE >> RegisterImage; >> > + EDKII_PECOFF_IMAGE_EMULATOR_UNREGISTER_IMAGE >> UnregisterImage; >> > +} EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL; >> > + >> > +extern EFI_GUID >> gEdkiiPeCoffImageEmulatorProtocolGuid; >> > + >> > +#endif >> > diff --git a/MdeModulePkg/MdeModulePkg.dec >> b/MdeModulePkg/MdeModulePkg.dec index >> 6a6d9660edc2..be307329f901 100644 >> > --- a/MdeModulePkg/MdeModulePkg.dec >> > +++ b/MdeModulePkg/MdeModulePkg.dec >> > @@ -617,6 +617,10 @@ >> > >> > ## Include/Protocol/AtaAtapiPolicy.h >> > gEdkiiAtaAtapiPolicyProtocolGuid =3D { 0xe59cd769, >> 0x5083, 0x4f26,{ 0x90, 0x94, 0x6c, 0x91, 0x9f, 0x91, 0x6c, 0x4e } } >> > + >> > + ## Include/Protocol/PeCoffImageEmulator.h >> > + gEdkiiPeCoffImageEmulatorProtocolGuid =3D { >> 0x96f46153, 0x97a7, 0x4793, >> > + { 0xac, 0xc1, 0xfa, 0x19, 0xbf, 0x78, 0xea, 0x97 } } >> > + >> > # >> > # [Error.gEfiMdeModulePkgTokenSpaceGuid] >> > # 0x80000001 | Invalid value provided. >> > -- >> > 2.17.1 >> >