On 25 June 2015 at 10:08, Ard Biesheuvel <ard.biesheu...@linaro.org> wrote:
> On 25 June 2015 at 09:58, Laszlo Ersek <ler...@redhat.com> wrote:
>> On 06/25/15 01:31, Yao, Jiewen wrote:
>>> Hi Ard
>>> You are right that END_OF_DXE must be signal in Bds.
>>>
>>> My thought is that this event should be signal in "platform BDS"
>>> instead of "generic BDS".
>>>
>>> The reason is that only platform know when to exit platform
>>> manufacture auth state, and platform may have some special step
>>> before that.
>>>
>>> Signing end of dxe in generic BDS may break existing platform.
>>
>> Ard, I think we have the justification we needed for going with
>> platform-specific End-of-Dxe signalling. Please update your original
>> patch with a link to Jiewen's message:
>>
>> http://thread.gmane.org/gmane.comp.bios.tianocore.devel/16088/focus=16109
>>
>> And I'm going to ACK it like that for ArmVirtPkg.
>>
>
> OK, fair enough.
>
>> (
>> Note, this is actually option #2 from my email
>> <http://thread.gmane.org/gmane.comp.bios.tianocore.devel/16088/focus=16095>:
>>
>>> - Or, OVMF will have to signal End-of-Dxe within the
>>>   SaveS3BootScript() function (see again the patch), right before
>>>   installing "gEfiDxeSmmReadyToLockProtocolGuid". Only that would
>>>   place the new step (2) between existent steps (1) and (3).
>>>
>>>   In parallel, ArmVirtPkg, which doesn't implement S3 or SMM, could
>>>   signal End-of-Dxe wherever it wanted to. Meaning, your patch is
>>>   correct (assuming it doesn't break anything in practice), *if* we
>>>   prefer this option.
>> )
>>
>> Jiewen,
>>
>>> Would you mind to let me know which platform forget to signal this,
>>
>> That's every single platform in the open source edk2 tree that uses
>> Intel BDS.
>>
>>> and can we fix it in platform BDS?
>>
>> Yes, we can do that; Ard already posted a patch with such an approach
>> for ArmVirtPkg, and I intend to do the same for OvmfPkg. Our main doubt
>> was whether it was *right* (by design) to do this separately for each
>> platform (in the respective PlatformBdsLib instance), as opposed to
>> doing it centrally in the BDS driver.
>>
>> You just lifted that doubt, so we know the way forward.
>>
>
> Indeed. FYI, I noticed that S3Save () does the right thing if it is
> invoked more than once.
> That means you may be able to get away with calling it both in
> PlatformBdsInit() (before end-of-DXE) *and* keep the original call
> site in GenericBdsLib intact, and still end up with something that
> works. It does rely on an implementation detail of AcpiS3Save though

... which you are probably doing already, I guess ... :-)


>>> -----Original Message-----
>>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>>> Sent: Thursday, June 25, 2015 3:48 AM
>>> To: edk2-devel@lists.sourceforge.net; ler...@redhat.com; 
>>> olivier.mar...@arm.com; Justen, Jordan L; Fan, Jeff
>>> Subject: [edk2] [RFC PATCH] IntelFrameworkModulePkg: signal end-of-DXE 
>>> event upon platform BDS invocation
>>>
>>> According to paragraph 5.1.2.1 of the PI spec vol 2 version 1.4, the 
>>> EFI_END_OF_DXE_EVENT_GUID event must be signalled prior to invoking any 
>>> UEFI drivers, applications, or connecting consoles.
>>>
>>> This implements the event signalling in a new GenericBdsLib function 
>>> BdsLibSignalEndOfDxeEvent (), and adds the invocation to BdsEntry () right 
>>> before the point where it hands over to PlatformBdsInit().
>>>
>>> In order to retain the mandated ordering between saving the ACPI S3 script 
>>> and signalling the EFI_END_OF_DXE_EVENT_GUID event, saving of the S3 script 
>>> is moved to BdsLibSignalEndOfDxeEvent () as well, right before the event is 
>>> signalled.
>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
>>> ---
>>>
>>> I am having trouble wrapping my head around all the interdependencies, but 
>>> I do think that this may be a feasible approach.
>>>
>>>  IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h         | 14 +++
>>>  IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c         | 70 
>>> ++++++++++--
>>>  IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf |  1 +  
>>> IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h  |  1 +
>>>  IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c             |  3 +
>>>  5 files changed, 79 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h 
>>> b/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h
>>> index ecd68a003bbb..86cda6615bf7 100644
>>> --- a/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h
>>> +++ b/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h
>>> @@ -1110,5 +1110,19 @@ DisableQuietBoot (
>>>    VOID
>>>    );
>>>
>>> +
>>> +/**
>>> +  Signal the event EFI_END_OF_DXE_EVENT_GUID as specified by the PI
>>> +spec
>>> +  vol 2 version 1.4 paragraph 5.1.2.1
>>> +
>>> +  @retval EFI_SUCCESS     The event was signalled successfully
>>> +
>>> +**/
>>> +EFI_STATUS
>>> +EFIAPI
>>> +BdsLibSignalEndOfDxeEvent (
>>> +  VOID
>>> +  );
>>> +
>>>  #endif
>>>
>>> diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c 
>>> b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
>>> index e02a71015edc..d84b0c1a453b 100644
>>> --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
>>> +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c
>>> @@ -2233,7 +2233,6 @@ BdsLibBootViaBootOption (
>>>    EFI_DEVICE_PATH_PROTOCOL  *FilePath;
>>>    EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
>>>    EFI_DEVICE_PATH_PROTOCOL  *WorkingDevicePath;
>>> -  EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save;
>>>    LIST_ENTRY                TempBootLists;
>>>    EFI_BOOT_LOGO_PROTOCOL    *BootLogo;
>>>
>>> @@ -2241,15 +2240,6 @@ BdsLibBootViaBootOption (
>>>    *ExitData     = NULL;
>>>
>>>    //
>>> -  // Notes: this code can be remove after the s3 script table
>>> -  // hook on the event EVT_SIGNAL_READY_TO_BOOT or
>>> -  // EVT_SIGNAL_LEGACY_BOOT
>>> -  //
>>> -  Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL, (VOID 
>>> **) &AcpiS3Save);
>>> -  if (!EFI_ERROR (Status)) {
>>> -    AcpiS3Save->S3Save (AcpiS3Save, NULL);
>>> -  }
>>> -  //
>>>    // If it's Device Path that starts with a hard drive path, append it 
>>> with the front part to compose a
>>>    // full device path
>>>    //
>>> @@ -4363,3 +4353,63 @@ BdsLibUpdateFvFileDevicePath (
>>>    }
>>>    return EFI_NOT_FOUND;
>>>  }
>>> +
>>> +/**
>>> +  An empty function to pass error checking of CreateEventEx ().
>>> +
>>> +  @param  Event                 Event whose notification function is being 
>>> invoked.
>>> +  @param  Context               Pointer to the notification function's 
>>> context,
>>> +                                which is implementation-dependent.
>>> +
>>> +**/
>>> +STATIC VOID
>>> +EFIAPI
>>> +BdsEmptyCallbackFunction (
>>> +  IN EFI_EVENT                Event,
>>> +  IN VOID                     *Context
>>> +  )
>>> +{
>>> +}
>>> +
>>> +/**
>>> +  Signal the event EFI_END_OF_DXE_EVENT_GUID as specified by the PI
>>> +spec
>>> +  vol 2 version 1.4 paragraph 5.1.2.1
>>> +
>>> +  @retval EFI_SUCCESS     The event was signalled successfully
>>> +
>>> +**/
>>> +EFI_STATUS
>>> +EFIAPI
>>> +BdsLibSignalEndOfDxeEvent (
>>> +  VOID
>>> +  )
>>> +{
>>> +  EFI_ACPI_S3_SAVE_PROTOCOL       *AcpiS3Save;
>>> +  EFI_EVENT                       EndOfDxeEvent;
>>> +  EFI_STATUS                      Status;
>>> +
>>> +  //
>>> +  // Save the S3 resume script before signalling the end-of-DXE event.
>>> +  //
>>> +  Status = gBS->LocateProtocol (&gEfiAcpiS3SaveProtocolGuid, NULL,
>>> + (VOID **) &AcpiS3Save);  if (!EFI_ERROR (Status)) {
>>> +    AcpiS3Save->S3Save (AcpiS3Save, NULL);  }
>>> +
>>> +  //
>>> +  // Signal EndOfDxe PI Event
>>> +  //
>>> +  Status = gBS->CreateEventEx (
>>> +      EVT_NOTIFY_SIGNAL,
>>> +      TPL_NOTIFY,
>>> +      BdsEmptyCallbackFunction,
>>> +      NULL,
>>> +      &gEfiEndOfDxeEventGroupGuid,
>>> +      &EndOfDxeEvent
>>> +      );
>>> +  if (!EFI_ERROR (Status)) {
>>> +    gBS->SignalEvent (EndOfDxeEvent);
>>> +  }
>>> +
>>> +  return Status;
>>> +}
>>> diff --git 
>>> a/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf 
>>> b/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
>>> index 5381e331ff8c..42ac1185f3ab 100644
>>> --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
>>> +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
>>> @@ -104,6 +104,7 @@ [Guids]
>>>    ## SOMETIMES_CONSUMES ## Variable:L"LegacyDevOrder"
>>>    gEfiLegacyDevOrderVariableGuid
>>>    gEdkiiStatusCodeDataTypeVariableGuid          ## SOMETIMES_CONSUMES ## 
>>> GUID
>>> +  gEfiEndOfDxeEventGroupGuid
>>>
>>>  [Protocols]
>>>    gEfiSimpleFileSystemProtocolGuid              ## SOMETIMES_CONSUMES
>>> diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h 
>>> b/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
>>> index c32579bfc577..658097ec22ea 100644
>>> --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
>>> +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/InternalBdsLib.h
>>> @@ -52,6 +52,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
>>> EXPRESS OR IMPLIED.
>>>  #include <Guid/LastEnumLang.h>
>>>  #include <Guid/LegacyDevOrder.h>
>>>  #include <Guid/StatusCodeDataTypeVariable.h>
>>> +#include <Guid/EventGroup.h>
>>>
>>>  #include <Library/PrintLib.h>
>>>  #include <Library/DebugLib.h>
>>> diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c 
>>> b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
>>> index ae7ad2153c51..0413d34fce02 100644
>>> --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
>>> +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
>>> @@ -623,6 +623,9 @@ BdsEntry (
>>>    InitializeLanguage (TRUE);
>>>    InitializeFrontPage (TRUE);
>>>
>>> +  Status = BdsLibSignalEndOfDxeEvent ();  ASSERT_EFI_ERROR (Status);
>>> +
>>>    //
>>>    // Do the platform init, can be customized by OEM/IBV
>>>    //
>>> --
>>> 1.9.1
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Monitor 25 network devices or servers for free with OpManager!
>>> OpManager is web-based network management software that monitors
>>> network devices and physical & virtual servers, alerts via email & sms
>>> for fault. Monitor 25 devices for free with no restriction. Download now
>>> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>
>>

------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to