[edk2-devel] [PATCH v2 2/4] MdePkg: DelayedDispatch: Added WaitOnEvent interface

Laszlo Ersek lersek at redhat.com
Tue Oct 10 08:46:12 UTC 2023


On 10/10/23 02:18, Kun Qin wrote:
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4496
> 
> This change adds a new interface for the delayed dispatch PPI. This
> new addition allows functional components relying on delayed dispatch
> callbacks to be managed/dispatched with definitive order.
> 
> The full defintion has been added into PI spec.
> 
> Cc: Michael D Kinney <michael.d.kinney at intel.com>
> Cc: Liming Gao <gaoliming at byosoft.com.cn>
> Cc: Zhiguang Liu <zhiguang.liu at intel.com>
> 
> Co-authored-by: Mike Turner <mikeyt at pobox.com>
> Signed-off-by: Kun Qin <kuqin12 at gmail.com>
> ---
> 
> Notes:
>     v2:
>     - Fixed PI spec version number to v1.8 [Liming]
> 
>  MdePkg/Include/Ppi/DelayedDispatch.h | 26 ++++++++++++++++++--
>  1 file changed, 24 insertions(+), 2 deletions(-)

I have a question that admittedly targets the spec more than it targets
the implementation.

What is the envisaged programming model / use case for WaitOnEvent? How
are multiple PEIMs to interoperate via the UniqueId GUIDs? Some concrete
use case would be good to know.

Second: the WaitOnEvent function can wait for completion in one of two ways:

(a) by calling back into the PEI dispatcher,

(b) by longjumping to the PEI dispatcher, and then the PEI dispatcher
longjumping back to WaitOnEvent.

Option (b) seems complicated (although not unseen in edk2; we frequently
use StackSwitch for various purposes, and see for example the Exit()
boot service -- that can *only* work with longjump).

Option (a) seems problematic, because if multiple PEIMs use ("nest")
WaitOnEvent, then we get repeated stack frames that all stand for the
PEI dispatcher. Stack space is considered "premium" during PEI; because
-- for example -- otherwise we wouldn't have
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH, opposing
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK.

Thanks,
Laszlo

> 
> diff --git a/MdePkg/Include/Ppi/DelayedDispatch.h b/MdePkg/Include/Ppi/DelayedDispatch.h
> index 098d57758551..0efcfdbfced6 100644
> --- a/MdePkg/Include/Ppi/DelayedDispatch.h
> +++ b/MdePkg/Include/Ppi/DelayedDispatch.h
> @@ -1,5 +1,5 @@
>  /** @file
> -    EFI Delayed Dispatch PPI as defined in the PI 1.7 Specification
> +    EFI Delayed Dispatch PPI as defined in the PI 1.8 Specification
>  
>      Provide timed event service in PEI
>  
> @@ -50,6 +50,7 @@ This service is the single member function of the EFI_DELAYED_DISPATCH_PPI
>    @param[in] This           Pointer to the EFI_DELAYED_DISPATCH_PPI instance
>    @param[in] Function       Function to call back
>    @param[in] Context        Context data
> +  @param[in] UniqueId       GUID for this Delayed Dispatch request.
>    @param[in] Delay          Delay interval
>  
>    @retval EFI_SUCCESS               Function successfully loaded
> @@ -63,9 +64,29 @@ EFI_STATUS
>    IN  EFI_DELAYED_DISPATCH_PPI      *This,
>    IN  EFI_DELAYED_DISPATCH_FUNCTION  Function,
>    IN  UINT64                         Context,
> +  IN  EFI_GUID                      *UniqueId   OPTIONAL,
>    IN  UINT32                         Delay
>    );
>  
> +/**
> +  Wait on a registered Delayed Dispatch unit that has a UniqueId.  Continue
> +  to dispatch all registered delayed dispatch entries until *ALL* entries with
> +  UniqueId have completed.
> +
> +  @param[in]     This            The Delayed Dispatch PPI pointer.
> +  @param[in]     UniqueId        UniqueId of delayed dispatch entry.
> +
> +  @retval EFI_SUCCESS            The operation succeeds.
> +  @retval EFI_INVALID_PARAMETER  The parameters are invalid.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_DELAYED_DISPATCH_WAIT_ON_EVENT)(
> +  IN  EFI_DELAYED_DISPATCH_PPI      *This,
> +  IN  EFI_GUID                      *UniqueId
> +  );
> +
>  ///
>  /// This PPI is a pointer to the Delayed Dispatch Service.
>  /// This service will be published by the Pei Foundation. The PEI Foundation
> @@ -73,7 +94,8 @@ EFI_STATUS
>  /// execution.
>  ///
>  struct _EFI_DELAYED_DISPATCH_PPI {
> -  EFI_DELAYED_DISPATCH_REGISTER    Register;
> +  EFI_DELAYED_DISPATCH_REGISTER         Register;
> +  EFI_DELAYED_DISPATCH_WAIT_ON_EVENT    WaitOnEvent;
>  };
>  
>  extern EFI_GUID  gEfiPeiDelayedDispatchPpiGuid;



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#109481): https://edk2.groups.io/g/devel/message/109481
Mute This Topic: https://groups.io/mt/101865809/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/3943202/1813853/130120423/xyzzy [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list