Hi Eric,

On 06/19/19 07:51, Dong, Eric wrote:
> EFI MM MP Protocol is defined in the PI 1.7 specification.

I can only offer regression-testing for this series. I'll report back
with such results hopefully soon.

Regarding the above sentence. I think we should clarify it. The MM MP
protocol is present in PI 1.6 already (possibly in even earlier PI
releases). But then it was amended in PI 1.7.

In fact, the file-level comments in your code below reference "PI 1.5".
So please update the above statement, in the commit message.

Thanks
Laszlo

> The MM MP protocol provides a set of functions to allow execution of
> procedures on processors that have entered MM. This protocol has the
> following properties:
> 1. The caller can invoke execution of a procedure on a processor, other
> than the caller, that has also entered MM. Supports blocking and
> non-blocking modes of operation.
> 2. The caller can invoke a procedure on multiple processors. Supports
> blocking and non-blocking modes of operation.
> 
> Cc: Ray Ni <ray...@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> Signed-off-by: Eric Dong <eric.d...@intel.com>
> ---
>  MdePkg/Include/Pi/PiMultiPhase.h |  16 ++
>  MdePkg/Include/Protocol/MmMp.h   | 334 +++++++++++++++++++++++++++++++
>  MdePkg/Include/Protocol/SmmMp.h  |  44 ++++
>  MdePkg/MdePkg.dec                |   6 +
>  4 files changed, 400 insertions(+)
>  create mode 100644 MdePkg/Include/Protocol/MmMp.h
>  create mode 100644 MdePkg/Include/Protocol/SmmMp.h
> 
> diff --git a/MdePkg/Include/Pi/PiMultiPhase.h 
> b/MdePkg/Include/Pi/PiMultiPhase.h
> index eb12527767..a5056799e1 100644
> --- a/MdePkg/Include/Pi/PiMultiPhase.h
> +++ b/MdePkg/Include/Pi/PiMultiPhase.h
> @@ -176,4 +176,20 @@ VOID
>    IN OUT VOID  *Buffer
>    );
>  
> +/**
> +  The function prototype for invoking a function on an Application Processor.
> +
> +  This definition is used by the UEFI MM MP Serices Protocol.
> +
> +  @param[in] ProcedureArgument    The pointer to private data buffer.
> +
> +  @retval EFI_SUCCESS             Excutive the procedure successfully
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_AP_PROCEDURE2)(
> +  IN VOID  *ProcedureArgument
> +);
> +
>  #endif
> diff --git a/MdePkg/Include/Protocol/MmMp.h b/MdePkg/Include/Protocol/MmMp.h
> new file mode 100644
> index 0000000000..0467072bec
> --- /dev/null
> +++ b/MdePkg/Include/Protocol/MmMp.h
> @@ -0,0 +1,334 @@
> +/** @file
> +  EFI MM MP Protocol is defined in the PI 1.5 specification.
> +
> +  The MM MP protocol provides a set of functions to allow execution of 
> procedures on processors that
> +  have entered MM. This protocol has the following properties:
> +  1. The caller can only invoke execution of a procedure on a processor, 
> other than the caller, that
> +     has also entered MM.
> +  2. It is possible to invoke a procedure on multiple processors. Supports 
> blocking and non-blocking
> +     modes of operation.
> +
> +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef _MM_MP_H_
> +#define _MM_MP_H_
> +
> +#include <Pi/PiMmCis.h>
> +
> +#define EFI_MM_MP_PROTOCOL_GUID \
> +  { \
> +    0x5d5450d7, 0x990c, 0x4180, {0xa8, 0x3, 0x8e, 0x63, 0xf0, 0x60, 0x83, 
> 0x7  }  \
> +  }
> +
> +//
> +// Revision definition.
> +//
> +#define EFI_MM_MP_PROTOCOL_REVISION    0x00
> +
> +//
> +// Attribute flags
> +//
> +#define EFI_MM_MP_TIMEOUT_SUPPORTED    0x01
> +
> +//
> +// Completion token
> +//
> +typedef VOID* MM_COMPLETION;
> +
> +typedef struct {
> +  MM_COMPLETION  Completion;
> +  EFI_STATUS     Status;
> +} MM_DISPATCH_COMPLETION_TOKEN;
> +
> +typedef struct _EFI_MM_MP_PROTOCOL  EFI_MM_MP_PROTOCOL;
> +
> +/**
> +  Service to retrieves the number of logical processor in the platform.
> +
> +  @param[in]  This                The EFI_MM_MP_PROTOCOL instance.
> +  @param[out] NumberOfProcessors  Pointer to the total number of logical 
> processors in the system,
> +                                  including the BSP and all APs.
> +
> +  @retval EFI_SUCCESS             The number of processors was retrieved 
> successfully
> +  @retval EFI_INVALID_PARAMETER   NumberOfProcessors is NULL
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_MM_GET_NUMBER_OF_PROCESSORS) (
> +  IN CONST EFI_MM_MP_PROTOCOL  *This,
> +  OUT      UINTN               *NumberOfProcessors
> +);
> +
> +
> +/**
> +  This service allows the caller to invoke a procedure one of the 
> application processors (AP). This
> +  function uses an optional token parameter to support blocking and 
> non-blocking modes. If the token
> +  is passed into the call, the function will operate in a non-blocking 
> fashion and the caller can
> +  check for completion with CheckOnProcedure or WaitForProcedure.
> +
> +  @param[in]     This                   The EFI_MM_MP_PROTOCOL instance.
> +  @param[in]     Procedure              A pointer to the procedure to be run 
> on the designated target
> +                                        AP of the system. Type 
> EFI_AP_PROCEDURE2 is defined below in
> +                                        related definitions.
> +  @param[in]     CpuNumber              The zero-based index of the 
> processor number of the target
> +                                        AP, on which the code stream is 
> supposed to run. If the number
> +                                        points to the calling processor then 
> it will not run the
> +                                        supplied code.
> +  @param[in]     TimeoutInMicroseconds  Indicates the time limit in 
> microseconds for this AP to
> +                                        finish execution of Procedure, 
> either for blocking or
> +                                        non-blocking mode. Zero means 
> infinity. If the timeout
> +                                        expires before this AP returns from 
> Procedure, then Procedure
> +                                        on the AP is terminated. If the 
> timeout expires in blocking
> +                                        mode, the call returns EFI_TIMEOUT. 
> If the timeout expires
> +                                        in non-blocking mode, the timeout 
> determined can be through
> +                                        CheckOnProcedure or WaitForProcedure.
> +                                        Note that timeout support is 
> optional. Whether an
> +                                        implementation supports this 
> feature, can be determined via
> +                                        the Attributes data member.
> +  @param[in,out] ProcedureArguments     Allows the caller to pass a list of 
> parameters to the code
> +                                        that is run by the AP. It is an 
> optional common mailbox
> +                                        between APs and the caller to share 
> information.
> +  @param[in,out] Token                  This is parameter is broken into two 
> components:
> +                                        1.Token->Completion is an optional 
> parameter that allows the
> +                                        caller to execute the procedure in a 
> blocking or non-blocking
> +                                        fashion. If it is NULL the call is 
> blocking, and the call will
> +                                        not return until the AP has 
> completed the procedure. If the
> +                                        token is not NULL, the call will 
> return immediately. The caller
> +                                        can check whether the procedure has 
> completed with
> +                                        CheckOnProcedure or WaitForProcedure.
> +                                        2.Token->Status The implementation 
> updates the address pointed
> +                                        at by this variable with the status 
> code returned by Procedure
> +                                        when it completes execution on the 
> target AP, or with EFI_TIMEOUT
> +                                        if the Procedure fails to complete 
> within the optional timeout.
> +                                        The implementation will update this 
> variable with EFI_NOT_READY
> +                                        prior to starting Procedure on the 
> target AP.
> +  @param[in,out] CPUStatus              This optional pointer may be used to 
> get the status code returned
> +                                        by Procedure when it completes 
> execution on the target AP, or with
> +                                        EFI_TIMEOUT if the Procedure fails 
> to complete within the optional
> +                                        timeout. The implementation will 
> update this variable with
> +                                        EFI_NOT_READY prior to starting 
> Procedure on the target AP.
> +
> +  @retval EFI_SUCCESS                   In the blocking case, this indicates 
> that Procedure has completed
> +                                        execution on the target AP.
> +                                        In the non-blocking case this 
> indicates that the procedure has
> +                                        been successfully scheduled for 
> execution on the target AP.
> +  @retval EFI_INVALID_PARAMETER         The input arguments are out of 
> range. Either the target AP is the
> +                                        caller of the function, or the 
> Procedure or Token is NULL
> +  @retval EFI_NOT_READY                 If the target AP is busy executing 
> another procedure
> +  @retval EFI_ALREADY_STARTED           Token is already in use for another 
> procedure
> +  @retval EFI_TIMEOUT                   In blocking mode, the timeout 
> expired before the specified AP
> +                                        has finished
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_MM_DISPATCH_PROCEDURE) (
> +  IN CONST EFI_MM_MP_PROTOCOL            *This,
> +  IN       EFI_AP_PROCEDURE2             Procedure,
> +  IN       UINTN                         CpuNumber,
> +  IN       UINTN                         TimeoutInMicroseconds,
> +  IN OUT   VOID                          *ProcedureArguments OPTIONAL,
> +  IN OUT   MM_COMPLETION                 *Token,
> +  IN OUT   EFI_STATUS                    *CPUStatus
> +);
> +
> +/**
> +  This service allows the caller to invoke a procedure on all running 
> application processors (AP)
> +  except the caller. This function uses an optional token parameter to 
> support blocking and
> +  nonblocking modes. If the token is passed into the call, the function will 
> operate in a non-blocking
> +  fashion and the caller can check for completion with CheckOnProcedure or 
> WaitForProcedure.
> +
> +  It is not necessary for the implementation to run the procedure on every 
> processor on the platform.
> +  Processors that are powered down in such a way that they cannot respond to 
> interrupts, may be
> +  excluded from the broadcast.
> +
> +
> +  @param[in]     This                   The EFI_MM_MP_PROTOCOL instance.
> +  @param[in]     Procedure              A pointer to the code stream to be 
> run on the APs that have
> +                                        entered MM. Type EFI_AP_PROCEDURE is 
> defined below in related
> +                                        definitions.
> +  @param[in]     TimeoutInMicroseconds  Indicates the time limit in 
> microseconds for the APs to finish
> +                                        execution of Procedure, either for 
> blocking or non-blocking mode.
> +                                        Zero means infinity. If the timeout 
> expires before all APs return
> +                                        from Procedure, then Procedure on 
> the failed APs is terminated. If
> +                                        the timeout expires in blocking 
> mode, the call returns EFI_TIMEOUT.
> +                                        If the timeout expires in 
> non-blocking mode, the timeout determined
> +                                        can be through CheckOnProcedure or 
> WaitForProcedure.
> +                                        Note that timeout support is 
> optional. Whether an implementation
> +                                        supports this feature can be 
> determined via the Attributes data
> +                                        member.
> +  @param[in,out] ProcedureArguments     Allows the caller to pass a list of 
> parameters to the code
> +                                        that is run by the AP. It is an 
> optional common mailbox
> +                                        between APs and the caller to share 
> information.
> +  @param[in,out] Token                  This is parameter is broken into two 
> components:
> +                                        1.Token->Completion is an optional 
> parameter that allows the
> +                                        caller to execute the procedure in a 
> blocking or non-blocking
> +                                        fashion. If it is NULL the call is 
> blocking, and the call will
> +                                        not return until the AP has 
> completed the procedure. If the
> +                                        token is not NULL, the call will 
> return immediately. The caller
> +                                        can check whether the procedure has 
> completed with
> +                                        CheckOnProcedure or WaitForProcedure.
> +                                        2.Token->Status The implementation 
> updates the address pointed
> +                                        at by this variable with the status 
> code returned by Procedure
> +                                        when it completes execution on the 
> target AP, or with EFI_TIMEOUT
> +                                        if the Procedure fails to complete 
> within the optional timeout.
> +                                        The implementation will update this 
> variable with EFI_NOT_READY
> +                                        prior to starting Procedure on the 
> target AP
> +  @param[in,out] CPUStatus              This optional pointer may be used to 
> get the individual status
> +                                        returned by every AP that 
> participated in the broadcast. This
> +                                        parameter if used provides the base 
> address of an array to hold
> +                                        the EFI_STATUS value of each AP in 
> the system. The size of the
> +                                        array can be ascertained by the 
> GetNumberOfProcessors function.
> +                                        As mentioned above, the broadcast 
> may not include every processor
> +                                        in the system. Some implementations 
> may exclude processors that
> +                                        have been powered down in such a way 
> that they are not responsive
> +                                        to interrupts. Additionally the 
> broadcast excludes the processor
> +                                        which is making the 
> BroadcastProcedure call. For every excluded
> +                                        processor, the array entry must 
> contain a value of EFI_NOT_STARTED
> +
> +  @retval EFI_SUCCESS                   In the blocking case, this indicates 
> that Procedure has completed
> +                                        execution on the APs. In the 
> non-blocking case this indicates that
> +                                        the procedure has been successfully 
> scheduled for execution on the
> +                                        APs.
> +  @retval EFI_INVALID_PARAMETER         Procedure or Token is NULL.
> +  @retval EFI_NOT_READY                 If a target AP is busy executing 
> another procedure.
> +  @retval EFI_TIMEOUT                   In blocking mode, the timeout 
> expired before all enabled APs have
> +                                        finished.
> +  @retval EFI_ALREADY_STARTED           Before the AP procedure associated 
> with the Token is finished, the
> +                                        same Token cannot be used to 
> dispatch or broadcast another procedure.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_MM_BROADCAST_PROCEDURE) (
> +  IN CONST EFI_MM_MP_PROTOCOL            *This,
> +  IN       EFI_AP_PROCEDURE2             Procedure,
> +  IN       UINTN                         TimeoutInMicroseconds,
> +  IN OUT   VOID                          *ProcedureArguments OPTIONAL,
> +  IN OUT   MM_COMPLETION                 *Token,
> +  IN OUT   EFI_STATUS                    *CPUStatus
> +);
> +
> +
> +/**
> +  This service allows the caller to set a startup procedure that will be 
> executed when an AP powers
> +  up from a state where core configuration and context is lost. The 
> procedure is execution has the
> +  following properties:
> +  1. The procedure executes before the processor is handed over to the 
> operating system.
> +  2. All processors execute the same startup procedure.
> +  3. The procedure may run in parallel with other procedures invoked through 
> the functions in this
> +  protocol, or with processors that are executing an MM handler or running 
> in the operating system.
> +
> +
> +  @param[in]      This                 The EFI_MM_MP_PROTOCOL instance.
> +  @param[in]      Procedure            A pointer to the code stream to be 
> run on the designated target AP
> +                                       of the system. Type EFI_AP_PROCEDURE 
> is defined below in Volume 2
> +                                       with the related definitions of
> +                                       
> EFI_MP_SERVICES_PROTOCOL.StartupAllAPs.
> +                                       If caller may pass a value of NULL to 
> deregister any existing
> +                                       startup procedure.
> +  @param[in,out]  ProcedureArguments   Allows the caller to pass a list of 
> parameters to the code that is
> +                                       run by the AP. It is an optional 
> common mailbox between APs and
> +                                       the caller to share information
> +
> +  @retval EFI_SUCCESS                  The Procedure has been set 
> successfully.
> +  @retval EFI_INVALID_PARAMETER        The Procedure is NULL.
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_MM_SET_STARTUP_PROCEDURE) (
> +  IN CONST EFI_MM_MP_PROTOCOL *This,
> +  IN       EFI_AP_PROCEDURE   Procedure,
> +  IN OUT   VOID               *ProcedureArguments OPTIONAL
> +);
> +
> +/**
> +  When non-blocking execution of a procedure on an AP is invoked with 
> DispatchProcedure,
> +  via the use of a token, this function can be used to check for completion 
> of the procedure on the AP.
> +  The function takes the token that was passed into the DispatchProcedure 
> call. If the procedure
> +  is complete, and therefore it is now possible to run another procedure on 
> the same AP, this function
> +  returns EFI_SUCESS. In this case the status returned by the procedure that 
> executed on the AP is
> +  returned in the token's Status field. If the procedure has not yet 
> completed, then this function
> +  returns EFI_NOT_READY.
> +
> +  When a non-blocking execution of a procedure is invoked with 
> BroadcastProcedure, via the
> +  use of a token, this function can be used to check for completion of the 
> procedure on all the
> +  broadcast APs. The function takes the token that was passed into the 
> BroadcastProcedure
> +  call. If the procedure is complete on all broadcast APs this function 
> returns EFI_SUCESS. In this
> +  case the Status field in the token passed into the function reflects the 
> overall result of the
> +  invocation, which may be EFI_SUCCESS, if all executions succeeded, or the 
> first observed failure.
> +  If the procedure has not yet completed on the broadcast APs, the function 
> returns
> +  EFI_NOT_READY.
> +
> +  @param[in]      This                 The EFI_MM_MP_PROTOCOL instance.
> +  @param[in]      Token                This parameter describes the token 
> that was passed into
> +                                       DispatchProcedure or 
> BroadcastProcedure.
> +
> +  @retval EFI_SUCCESS                  Procedure has completed.
> +  @retval EFI_NOT_READY                The Procedure has not completed.
> +  @retval EFI_INVALID_PARAMETER        Token or Token->Completion is NULL
> +  @retval EFI_NOT_FOUND                Token is not currently in use for a 
> non-blocking call
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_CHECK_FOR_PROCEDURE) (
> +  IN CONST EFI_MM_MP_PROTOCOL            *This,
> +  IN       MM_COMPLETION                 Token
> +);
> +
> +/**
> +  When a non-blocking execution of a procedure on an AP is invoked via 
> DispatchProcedure,
> +  this function will block the caller until the remote procedure has 
> completed on the designated AP.
> +  The non-blocking procedure invocation is identified by the Token 
> parameter, which must match the
> +  token that used when DispatchProcedure was called. Upon completion the 
> status returned by
> +  the procedure that executed on the AP is used to update the token's Status 
> field.
> +
> +  When a non-blocking execution of a procedure on an AP is invoked via 
> BroadcastProcedure
> +  this function will block the caller until the remote procedure has 
> completed on all of the APs that
> +  entered MM. The non-blocking procedure invocation is identified by the 
> Token parameter, which
> +  must match the token that used when BroadcastProcedure was called. Upon 
> completion the
> +  overall status returned by the procedures that executed on the broadcast 
> AP is used to update the
> +  token's Status field. The overall status may be EFI_SUCCESS, if all 
> executions succeeded, or the
> +  first observed failure.
> +
> +
> +  @param[in]      This                 The EFI_MM_MP_PROTOCOL instance.
> +  @param[in]      Token                This parameter describes the token 
> that was passed into
> +                                       DispatchProcedure or 
> BroadcastProcedure.
> +
> +  @retval EFI_SUCCESS                  Procedure has completed.
> +  @retval EFI_INVALID_PARAMETER        Token or Token->Completion is NULL
> +  @retval EFI_NOT_FOUND                Token is not currently in use for a 
> non-blocking call
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *EFI_WAIT_FOR_PROCEDURE) (
> +  IN CONST EFI_MM_MP_PROTOCOL            *This,
> +  IN       MM_COMPLETION                 Token
> +);
> +
> +
> +
> +///
> +/// The MM MP protocol provides a set of functions to allow execution of 
> procedures on processors that
> +/// have entered MM.
> +///
> +struct _EFI_MM_MP_PROTOCOL {
> +  UINT32                            Revision;
> +  UINT32                            Attributes;
> +  EFI_MM_GET_NUMBER_OF_PROCESSORS   GetNumberOfProcessors;
> +  EFI_MM_DISPATCH_PROCEDURE         DispatchProcedure;
> +  EFI_MM_BROADCAST_PROCEDURE        BroadcastProcedure;
> +  EFI_MM_SET_STARTUP_PROCEDURE      SetStartupProcedure;
> +  EFI_CHECK_FOR_PROCEDURE           CheckForProcedure;
> +  EFI_WAIT_FOR_PROCEDURE            WaitForProcedure;
> +};
> +
> +extern EFI_GUID gEfiMmMpProtocolGuid;
> +
> +#endif
> +
> diff --git a/MdePkg/Include/Protocol/SmmMp.h b/MdePkg/Include/Protocol/SmmMp.h
> new file mode 100644
> index 0000000000..5f391a3860
> --- /dev/null
> +++ b/MdePkg/Include/Protocol/SmmMp.h
> @@ -0,0 +1,44 @@
> +/** @file
> +  EFI SMM MP Protocol is defined in the PI 1.5 specification.
> +
> +  The SMM MP protocol provides a set of functions to allow execution of 
> procedures on processors that
> +  have entered SMM. This protocol has the following properties:
> +  1. The caller can only invoke execution of a procedure on a processor, 
> other than the caller, that
> +     has also entered SMM.
> +  2. It is possible to invoke a procedure on multiple processors. Supports 
> blocking and non-blocking
> +     modes of operation.
> +
> +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef _SMM_MP_H_
> +#define _SMM_MP_H_
> +
> +#include <Protocol/MmMp.h>
> +
> +#define EFI_SMM_MP_PROTOCOL_GUID EFI_MM_MP_PROTOCOL_GUID
> +
> +#define EFI_SMM_MP_TIMEOUT_SUPPORTED EFI_MM_MP_TIMEOUT_SUPPORTED
> +
> +#define EFI_SMM_MP_PROTOCOL_REVISION    EFI_MM_MP_PROTOCOL_REVISION
> +
> +typedef MM_COMPLETION SMM_COMPLETION;
> +
> +typedef MM_DISPATCH_COMPLETION_TOKEN SMM_DISPATCH_COMPLETION_TOKEN;
> +
> +typedef EFI_MM_MP_PROTOCOL  EFI_SMM_MP_PROTOCOL;
> +
> +typedef EFI_MM_GET_NUMBER_OF_PROCESSORS EFI_SMM_GET_NUMBER_OF_PROCESSORS;
> +
> +typedef EFI_MM_DISPATCH_PROCEDURE EFI_SMM_DISPATCH_PROCEDURE;
> +
> +typedef EFI_MM_BROADCAST_PROCEDURE EFI_SMM_BROADCAST_PROCEDURE;
> +
> +typedef EFI_MM_SET_STARTUP_PROCEDURE EFI_SMM_SET_STARTUP_PROCEDURE;
> +
> +extern EFI_GUID gEfiSmmMpProtocolGuid;
> +
> +#endif
> +
> diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
> index 6c563375ee..0b8da9f2cb 100644
> --- a/MdePkg/MdePkg.dec
> +++ b/MdePkg/MdePkg.dec
> @@ -1167,6 +1167,12 @@
>    # Protocols defined in PI 1.5.
>    #
>  
> +  ## Include/Protocol/SmmMp.h
> +  gEfiSmmMpProtocolGuid = { 0x5d5450d7, 0x990c, 0x4180, { 0xa8, 0x3, 0x8e, 
> 0x63, 0xf0, 0x60, 0x83, 0x7 }}
> +
> +  ## Include/Protocol/MmMp.h
> +  gEfiMmMpProtocolGuid = { 0x5d5450d7, 0x990c, 0x4180, { 0xa8, 0x3, 0x8e, 
> 0x63, 0xf0, 0x60, 0x83, 0x7 }}
> +
>    ## Include/Protocol/MmEndOfDxe.h
>    gEfiMmEndOfDxeProtocolGuid = { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39, 
> 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }}
>  
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#42656): https://edk2.groups.io/g/devel/message/42656
Mute This Topic: https://groups.io/mt/32120262/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to