On 25 June 2015 at 10:35, Yao, Jiewen <jiewen....@intel.com> wrote:
> And in the future, I believe we could remove EFI_ACPI_S3_SAVE_PROTOCOL 
> protocol completely. (This is Framework 0.9 defined API, not PI defined API)
>
> The better design might be:
> 1) AcpiS3Save does not install EFI_ACPI_S3_SAVE_PROTOCOL.
> 2) AcpiS3Save registers EndOfDxe callback function.

Is there a guaranteed dispatch order for events? If not, this may be
problematic, since the silicon driver must receive the end-of-DXE
event before AcpiS3Save does, otherwise S3Save () may be called too
late

> 3) AcpiS3Save does S3Save() in EndOfDxe callback function.
> So everything could be self-contained. There is no need to rely on platform 
> BDS.
>
> Then this module eliminates IntelFrameworkPkg dependency and can be moved to 
> MdeModulePkg later.
>
> Thank you
> Yao Jiewen
>
> -----Original Message-----
> From: Yao, Jiewen [mailto:jiewen....@intel.com]
> Sent: Thursday, June 25, 2015 4:24 PM
> To: edk2-devel@lists.sourceforge.net
> Cc: Fan, Jeff
> Subject: Re: [edk2] [RFC PATCH] IntelFrameworkModulePkg: signal end-of-DXE 
> event upon platform BDS invocation
>
> HI Ard
> You are very careful and definitely right.
>
> The code in BdsBoot.c seems be added in more than 10 years ago, when we did 
> EDK-I. At that time, we do not have such thorough design review.
> In old days, we just need find a place to call S3Save() then someone added 
> it, and leave it till now.
> It still works till now, because S3Save() function only required to be 
> entered once. Since most platforms already call S3Save() in platform BDS. It 
> has no impact here. See code below:
> =======================
>   //
>   // Platform may invoke AcpiS3Save->S3Save() before ExitPmAuth, because we 
> need save S3 information there, while BDS ReadyToBoot may invoke it again.
>   // So if 2nd S3Save() is triggered later, we need ignore it.
>   //
>   if (AlreadyEntered) {
>     return EFI_SUCCESS;
>   }
>   AlreadyEntered = TRUE;
> =======================
>
> Also, if a platform fail to call S3Save() early and let BDS trigger S3Save() 
> here, I think system will ASSERT, because SaveLockBox will fail.
> =======================
>   Status = SaveLockBox (
>              &mAcpiS3IdtrProfileGuid,
>              (VOID *)(UINTN)Idtr,
>              (UINTN)sizeof(IA32_DESCRIPTOR)
>              );
>   ASSERT_EFI_ERROR (Status);
> =======================
>
> As conclusion, I completely agree with you that this code in BdsBoot.c should 
> be removed to eliminate confusing.
>
> Thank you
> Yao Jiewen
>
>
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Thursday, June 25, 2015 3:51 PM
> To: edk2-devel@lists.sourceforge.net
> Cc: Fan, Jeff
> Subject: Re: [edk2] [RFC PATCH] IntelFrameworkModulePkg: signal end-of-DXE 
> event upon platform BDS invocation
>
> On 25 June 2015 at 01:31, Yao, Jiewen <jiewen....@intel.com> 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.
>>
>
> That is true.
>
>> Signing end of dxe in generic BDS may break existing platform.
>>
>> Would you mind to let me know which platform forget to signal this, and can 
>> we fix it in platform BDS?
>>
>
> There are two constraints for the moment where end-of-DXE is signalled:
> - according to the PI spec
>
> """
> 5.1.2.1 End of DXE Event
> Prior to invoking any UEFI drivers, applications, or connecting consoles, the 
> platform should signal the event EFI_END_OF_DXE_EVENT_GUID.
> """
>
> which means PlatformBdsInit() would be a reasonable candidate location, 
> provided that it gets documented in the PlatformBdsLib API that the even 
> should be signalled then.
>
> However, there is another constraint, according to 
> https://firmware.intel.com/sites/default/files/A_Tour_Beyond_BIOS_Implementing_S3_resume_with_EDKII.pdf
>
> """
> PlatformBDS need 1) call AcpiS3->S3Save() to save S3 system information, then 
> 2) signal EndOfDxe to give DXE silicon driver last chance to save boot 
> script, and finally 3) signal 17 SmmReadyToLock to close boot script and save 
> boot script to LockBox. These calls must be in this order, or the boot script 
> might not be able to save correctly.
> """
>
> The problem is (as Laszlo has pointed out) that the generic BDS calls
> AcpiS3->S3Save () in BdsLibBootViaBootOption (), which is problematic
> for two reasons:
> - it is long after PlatformBdsInit(), so signalling end-of-DXE there will 
> occur before S3Save
> - BdsLibBootViaBootOption () may never return control to the Platform BDS, so 
> there is no way the Platform BDS can ensure that end-of-DXE will be signalled 
> after the existing S3Save()
>
> In summary, the S3Save() call needs to be moved if we want to adhere to both 
> constraints above.
>
> --
> Ard.
>
>
>> -----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
>
> ------------------------------------------------------------------------------
> 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
>
> ------------------------------------------------------------------------------
> 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