public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Siyuan, Fu" <siyuan.fu@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"Li, Zhihao" <zhihao.li@intel.com>
Cc: "Dong, Eric" <eric.dong@intel.com>, "Ni, Ray" <ray.ni@intel.com>,
	"Kumar, Rahul1" <rahul1.kumar@intel.com>
Subject: Re: [edk2-devel] [PATCH v2 1/1] UefiCpuPkg: Extend SMM CPU Service with rendezvous support.
Date: Wed, 23 Feb 2022 10:19:30 +0000	[thread overview]
Message-ID: <MWHPR11MB1598346405268F175B2EBD11EB3C9@MWHPR11MB1598.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20220223064215.3570-1-zhihao.li@intel.com>

Hi, Zhihao

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Li, Zhihao
> Sent: 2022年2月23日 14:42
> To: devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Ni, Ray <ray.ni@intel.com>; Kumar,
> Rahul1 <rahul1.kumar@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>
> Subject: [edk2-devel] [PATCH v2 1/1] UefiCpuPkg: Extend SMM CPU Service with
> rendezvous support.
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3815
> 
> This patch define a new Protocol with the new services
> SmmWaitForAllProcessor(), which can be used by SMI handler
> to optionally wait for other APs to complete SMM rendezvous in
> relaxed AP mode.
> 
> A new library SmmCpuRendezvousLib is provided to abstract the service
> into library API to simple SMI handler code.
> 
> Patch_v3 modified to pass CI test. (1)Add SmmCpuRendezvousLib.inf into
> UefiCpuPkg.dsc <LibraryClasses>/<Component> (2)Add
> SmmCpuRendezvousLib.h
> in UefiCpuPkg.dec [Libraryclasses.IA32, Libraryclasses.x64] (3) Some
> UncrustifyCheck modifications.
> 
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Rahul Kumar <rahul1.kumar@intel.com>
> Cc: Siyuan Fu <siyuan.fu@intel.com>
> 
> Signed-off-by: Zhihao Li <zhihao.li@intel.com>
> ---
>  UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c   | 98
> ++++++++++++++++++++
>  UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c                         | 68
> +++++++++++++-
>  UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c                          | 15 ++-
>  UefiCpuPkg/Include/Library/SmmCpuRendezvousLib.h               | 27 ++++++
>  UefiCpuPkg/Include/Protocol/SmmCpuService.h                    | 36 ++++++-
>  UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf | 35
> +++++++
>  UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h                     | 30 +++++-
>  UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf                   |  5 +-
>  UefiCpuPkg/UefiCpuPkg.dec                                      |  8 +-
>  UefiCpuPkg/UefiCpuPkg.dsc                                      |  2 +
>  10 files changed, 314 insertions(+), 10 deletions(-)
> 
> diff --git
> a/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c
> b/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c
> new file mode 100644
> index 000000000000..a53a5a8f301a
> --- /dev/null
> +++ b/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c
> @@ -0,0 +1,98 @@
> +/** @file
> 
> +  SMM CPU Rendezvous sevice implement.
> 
> +
> 
> +  Copyright (c) 2021 - 2022, Intel Corporation. All rights reserved.<BR>
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Uefi.h>
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/DebugLib.h>
> 
> +#include <Library/MmServicesTableLib.h>
> 
> +#include <Protocol/SmmCpuService.h>
> 
> +#include <Library/SmmCpuRendezvousLib.h>
> 
> +
> 
> +STATIC EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL  *mSmmCpuRendezvous =
> NULL;
> 
> +STATIC VOID                               *mRegistration     = NULL;
> 
> +
> 
> +/**
> 
> +  Register status code callback function only when Report Status Code protocol
> 
> +  is installed.
> 
> +
> 
> +  @param[in] Protocol   Points to the protocol's unique identifier.
> 
> +  @param[in] Interface  Points to the interface instance.
> 
> +  @param[in] Handle     The handle on which the interface was installed.
> 
> +
> 
> +  @retval EFI_SUCCESS  Notification runs successfully.
> 
> +
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI
> 
> +SmmCpuRendezvousProtocolNotify (
> 
> +  IN CONST EFI_GUID    *Protocol,
> 
> +  IN       VOID        *Interface,
> 
> +  IN       EFI_HANDLE  Handle
> 
> +  )
> 
> +{
> 
> +  EFI_STATUS  Status;
> 
> +
> 
> +  Status = gMmst->MmLocateProtocol (
> 
> +                    &gEdkiiSmmCpuRendezvousProtocolGuid,
> 
> +                    NULL,
> 
> +                    (VOID **)&mSmmCpuRendezvous
> 
> +                    );
> 
> +  ASSERT_EFI_ERROR (Status);
> 
> +
> 
> +  return EFI_SUCCESS;
> 
> +}
> 
> +
> 
> +/**
> 
> +  This routine wait for all AP processors to arrive in SMM.
> 
> +
> 
> +  @param[in] BlockingMode  Blocking mode or non-blocking mode.
> 
> +
> 
> +  @retval EFI_SUCCESS  All avaiable APs arrived.
> 
> +  @retval EFI_TIMEOUT  Wait for all APs until timeout.
> 
> +  @retval OTHER        Fail to register SMM CPU Rendezvous service Protocol.
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI
> 
> +SmmWaitForAllProcessor (
> 
> +  IN BOOLEAN  BlockingMode
> 
> +  )
> 
> +{
> 
> +  EFI_STATUS  Status;
> 
> +
> 
> +  if ((mRegistration == NULL) && (mSmmCpuRendezvous == NULL)) {
> 
> +    //
> 
> +    // Locate SMM cpu rendezvous protocol for the first time execute the
> function.
> 
> +    //
> 
> +    Status = gMmst->MmLocateProtocol (
> 
> +                      &gEdkiiSmmCpuRendezvousProtocolGuid,
> 
> +                      NULL,
> 
> +                      (VOID **)&mSmmCpuRendezvous
> 
> +                      );
> 
> +    if (EFI_ERROR (Status)) {
> 
> +      Status = gMmst->MmRegisterProtocolNotify (
> 
> +                        &gEdkiiSmmCpuRendezvousProtocolGuid,
> 
> +                        SmmCpuRendezvousProtocolNotify,
> 
> +                        &mRegistration
> 
> +                        );
> 
> +      if (EFI_ERROR (Status)) {
> 
> +        return Status;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  if (mSmmCpuRendezvous == NULL) {
> 
> +    return EFI_SUCCESS;
> 
> +  }
> 
> +
> 
> +  Status = mSmmCpuRendezvous->WaitForAllProcessor (
> 
> +                                mSmmCpuRendezvous,
> 
> +                                BlockingMode
> 
> +                                );
> 
> +  return Status;
> 
> +}
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c
> b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c
> index 5d624f8e9ed6..fceb663fb74f 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c
> @@ -1,7 +1,7 @@
>  /** @file
> 
>  Implementation of SMM CPU Services Protocol.
> 
> 
> 
> -Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2011 - 2022, Intel Corporation. All rights reserved.<BR>
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> 
> 
>  **/
> 
> @@ -20,6 +20,13 @@ EFI_SMM_CPU_SERVICE_PROTOCOL  mSmmCpuService
> = {
>    SmmRegisterExceptionHandler
> 
>  };
> 
> 
> 
> +//
> 
> +// EDKII SMM CPU Rendezvous Service Protocol instance
> 
> +//
> 
> +EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL  mSmmCpuRendezvousService = {
> 
> +  SmmWaitForAllProcessor
> 
> +};
> 
> +
> 
>  /**
> 
>    Gets processor information on the requested processor at the instant this call
> is made.
> 
> 
> 
> @@ -350,6 +357,7 @@ SmmRegisterExceptionHandler (
>    @param ImageHandle The firmware allocated handle for the EFI image.
> 
> 
> 
>    @retval EFI_SUCCESS    EFI SMM CPU Services Protocol was installed
> successfully.
> 
> +  @retval OTHER          Fail to install Protocol.
> 
>  **/
> 
>  EFI_STATUS
> 
>  InitializeSmmCpuServices (
> 
> @@ -364,6 +372,64 @@ InitializeSmmCpuServices (
>                      EFI_NATIVE_INTERFACE,
> 
>                      &mSmmCpuService
> 
>                      );
> 
> +  if (EFI_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  Status = gSmst->SmmInstallProtocolInterface (
> 
> +                    &Handle,
> 
> +                    &gEdkiiSmmCpuRendezvousProtocolGuid,
> 
> +                    EFI_NATIVE_INTERFACE,
> 
> +                    &mSmmCpuRendezvousService
> 
> +                    );
> 
>    ASSERT_EFI_ERROR (Status);
> 
>    return Status;
> 
>  }
> 
> +
> 
> +/**
> 
> +  Wait for all processors enterring SMM until all CPUs are already synchronized
> or not.
> 
> +
> 
> +  If BlockingMode is False, timeout value is zero.
> 
> +
> 
> +  @param This          A pointer to the
> EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL instance.
> 
> +  @param BlockingMode  Blocking mode or non-blocking mode.
> 
> +
> 
> +  @retval EFI_SUCCESS  All avaiable APs arrived.
> 
> +  @retval EFI_TIMEOUT  Wait for all APs until timeout.
> 
> +
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI
> 
> +SmmWaitForAllProcessor (
> 
> +  IN EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL  *This,
> 
> +  IN BOOLEAN                            BlockingMode
> 
> +  )
> 
> +{
> 
> +  EFI_STATUS  Status;
> 
> +
> 
> +  //
> 
> +  // Return success immediately if all CPUs are already synchronized.
> 
> +  //
> 
> +  if (mSmmMpSyncData->AllApArrivedWithException) {
> 
> +    Status = EFI_SUCCESS;
> 
> +    goto ON_EXIT;
> 
> +  }
> 
> +
> 
> +  if (!BlockingMode) {
> 
> +    Status = EFI_TIMEOUT;
> 
> +    goto ON_EXIT;
> 
> +  }
> 
> +
> 
> +  //
> 
> +  // There are some APs outside SMM, Wait for all avaiable APs to arrive.
> 
> +  //
> 
> +  SmmWaitForApArrival (BlockingMode);
> 
> +  Status = mSmmMpSyncData->AllApArrivedWithException ? EFI_SUCCESS :
> EFI_TIMEOUT;
> 
> +
> 
> +ON_EXIT:
> 
> +  if (!mSmmMpSyncData->AllApArrivedWithException) {
> 
> +    DEBUG ((DEBUG_INFO, "EdkiiSmmWaitForAllApArrival: Timeout to wait all
> APs arrival\n"));
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> index 882dee4fe246..6a8693dae989 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> @@ -1,7 +1,7 @@
>  /** @file
> 
>  SMM MP service implementation
> 
> 
> 
> -Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2009 - 2022, Intel Corporation. All rights reserved.<BR>
> 
>  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> 
> 
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -261,7 +261,7 @@ IsLmceSignaled (
>  **/
> 
>  VOID
> 
>  SmmWaitForApArrival (
> 
> -  VOID
> 
> +  IN BOOLEAN  BlockingMode
Do we really need to add the parameter BlockingMode for this function? I found
it's set to FALSE in all the code path.

Thanks.

> 
>    )
> 
>  {
> 
>    UINT64   Timer;
> 
> @@ -271,6 +271,13 @@ SmmWaitForApArrival (
> 
> 
>    ASSERT (*mSmmMpSyncData->Counter <= mNumberOfCpus);
> 
> 
> 
> +  //
> 
> +  // If block is False, do not wait and return immediately.
> 
> +  //
> 
> +  if (!BlockingMode) {
> 
> +    return;
> 
> +  }
> 
> +
> 
>    LmceEn     = FALSE;
> 
>    LmceSignal = FALSE;
> 
>    if (mMachineCheckSupported) {
> 
> @@ -511,7 +518,7 @@ BSPHandler (
>      //
> 
>      // Wait for APs to arrive
> 
>      //
> 
> -    SmmWaitForApArrival ();
> 
> +    SmmWaitForApArrival (TRUE);
> 
> 
> 
>      //
> 
>      // Lock the counter down and retrieve the number of APs
> 
> @@ -1887,6 +1894,8 @@ InitializeMpSyncData (
>      *mSmmMpSyncData->InsideSmm     = FALSE;
> 
>      *mSmmMpSyncData->AllCpusInSync = FALSE;
> 
> 
> 
> +    mSmmMpSyncData->AllApArrivedWithException = FALSE;
> 
> +
> 
>      for (CpuIndex = 0; CpuIndex < gSmmCpuPrivate-
> >SmmCoreEntryContext.NumberOfCpus; CpuIndex++) {
> 
>        mSmmMpSyncData->CpuData[CpuIndex].Busy =
> 
>          (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Busy +
> mSemaphoreSize * CpuIndex);
> 
> diff --git a/UefiCpuPkg/Include/Library/SmmCpuRendezvousLib.h
> b/UefiCpuPkg/Include/Library/SmmCpuRendezvousLib.h
> new file mode 100644
> index 000000000000..d0a987dc7d0a
> --- /dev/null
> +++ b/UefiCpuPkg/Include/Library/SmmCpuRendezvousLib.h
> @@ -0,0 +1,27 @@
> +/** @file
> 
> +  SMM CPU Rendezvous library header file.
> 
> +
> 
> +  Copyright (c) 2021 - 2022, Intel Corporation. All rights reserved.<BR>
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#ifndef SMM_CPU_RENDEZVOUS_H_
> 
> +#define SMM_CPU_RENDEZVOUS_H_
> 
> +
> 
> +/**
> 
> +  This routine wait for all AP processors to arrive in SMM.
> 
> +
> 
> +  @param[in]  BlockingMode  Blocking mode or non-blocking mode.
> 
> +
> 
> +  @retval EFI_SUCCESS       All processors checked in to SMM.
> 
> +  @retval EFI_TIMEOUT       Wait for all APs until timeout.
> 
> +
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI
> 
> +SmmWaitForAllProcessor (
> 
> +  IN  BOOLEAN  BlockingMode
> 
> +  );
> 
> +
> 
> +#endif
> 
> diff --git a/UefiCpuPkg/Include/Protocol/SmmCpuService.h
> b/UefiCpuPkg/Include/Protocol/SmmCpuService.h
> index 952767afce75..3d93d243409c 100644
> --- a/UefiCpuPkg/Include/Protocol/SmmCpuService.h
> +++ b/UefiCpuPkg/Include/Protocol/SmmCpuService.h
> @@ -1,7 +1,7 @@
>  /** @file
> 
>  SMM CPU Service protocol definition.
> 
> 
> 
> -Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2013 - 2022, Intel Corporation. All rights reserved.<BR>
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> 
> 
>  **/
> 
> @@ -200,4 +200,38 @@ struct _EFI_SMM_CPU_SERVICE_PROTOCOL {
> 
> 
>  extern EFI_GUID  gEfiSmmCpuServiceProtocolGuid;
> 
> 
> 
> +//
> 
> +//  EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL provide SMM CPU
> 
> +//  rendezvous service support.
> 
> +//
> 
> +#define EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL_GUID \
> 
> +  { \
> 
> +    0xaa00d50b, 0x4911, 0x428f, { 0xb9, 0x1a, 0xa5, 0x9d, 0xdb, 0x13, 0xe2,
> 0x4c } \
> 
> +  }
> 
> +
> 
> +typedef struct _EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL
> EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL;
> 
> +
> 
> +/**
> 
> +  Wait for all APs to arrive SMM mode in given timeout constraint.
> 
> +
> 
> +  @param[in]  This                  A pointer to the
> EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL instance.
> 
> +  @param[in]  BlockingMode          Block or non-block mode.
> 
> +
> 
> +  @retval EFI_SUCCESS               All APs have arrived SMM mode except SMI
> disabled APs.
> 
> +  @retval EFI_TIMEOUT               There are APs not in SMM mode in given
> timeout constraint.
> 
> +
> 
> +**/
> 
> +typedef
> 
> +EFI_STATUS
> 
> +(EFIAPI *EDKII_WAIT_FOR_ALL_PROCESSOR)(
> 
> +  IN  EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL  *This,
> 
> +  IN  BOOLEAN                            BlockingMode
> 
> +  );
> 
> +
> 
> +struct _EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL {
> 
> +  EDKII_WAIT_FOR_ALL_PROCESSOR    WaitForAllProcessor;
> 
> +};
> 
> +
> 
> +extern EFI_GUID  gEdkiiSmmCpuRendezvousProtocolGuid;
> 
> +
> 
>  #endif
> 
> diff --git
> a/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf
> b/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf
> new file mode 100644
> index 000000000000..76896a5b0e1a
> --- /dev/null
> +++ b/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf
> @@ -0,0 +1,35 @@
> +## @file
> 
> +# SMM CPU Rendezvous service lib.
> 
> +#
> 
> +# This is SMM CPU rendezvous service lib that wait for all
> 
> +# APs to enter SMM mode.
> 
> +#
> 
> +# Copyright (c) 2021 - 2022, Intel Corporation. All rights reserved.<BR>
> 
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +[Defines]
> 
> +  INF_VERSION                    = 0x00010005
> 
> +  BASE_NAME                      = SmmCpuRendezvousLib
> 
> +  FILE_GUID                      = 1509Bb36-9Ba4-438B-B195-Ac5914Db14E2
> 
> +  MODULE_TYPE                    = DXE_SMM_DRIVER
> 
> +  LIBRARY_CLASS                  = SmmCpuRendezvousLib|MM_STANDALONE
> DXE_SMM_DRIVER
> 
> +
> 
> +[Sources]
> 
> +  SmmCpuRendezvousLib.c
> 
> +
> 
> +[Packages]
> 
> +  MdePkg/MdePkg.dec
> 
> +  UefiCpuPkg/UefiCpuPkg.dec
> 
> +
> 
> +[LibraryClasses]
> 
> +  BaseLib
> 
> +  DebugLib
> 
> +  MmServicesTableLib
> 
> +
> 
> +[Pcd]
> 
> +  gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout                 ##
> CONSUMES
> 
> +
> 
> +[Protocols]
> 
> +  gEdkiiSmmCpuRendezvousProtocolGuid
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
> b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
> index 26d07c5b5ea0..1960bb4015ef 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
> @@ -1,7 +1,7 @@
>  /** @file
> 
>  Agent Module to load other modules to deploy SMM Entry Vector for X86 CPU.
> 
> 
> 
> -Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2009 - 2022, Intel Corporation. All rights reserved.<BR>
> 
>  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> 
> 
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -428,6 +428,7 @@ typedef struct {
>    volatile SMM_CPU_SYNC_MODE    EffectiveSyncMode;
> 
>    volatile BOOLEAN              SwitchBsp;
> 
>    volatile BOOLEAN              *CandidateBsp;
> 
> +  volatile BOOLEAN              AllApArrivedWithException;
> 
>    EFI_AP_PROCEDURE              StartupProcedure;
> 
>    VOID                          *StartupProcArgs;
> 
>  } SMM_DISPATCHER_MP_SYNC_DATA;
> 
> @@ -1488,4 +1489,31 @@ IsRestrictedMemoryAccess (
>    VOID
> 
>    );
> 
> 
> 
> +/**
> 
> +  Choose blocking or non-blocking mode to Wait for all APs.
> 
> +
> 
> +  @param[in]  This                  A pointer to the
> EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL instance.
> 
> +  @param[in]  BlockingMode          Blocking or non-blocking mode.
> 
> +
> 
> +  @retval EFI_SUCCESS               All APs have arrived SMM mode except SMI
> disabled APs.
> 
> +  @retval EFI_TIMEOUT               There are APs not in SMM mode in given
> timeout constraint.
> 
> +
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI
> 
> +SmmWaitForAllProcessor (
> 
> +  IN  EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL  *This,
> 
> +  IN  BOOLEAN                            BlockingMode
> 
> +  );
> 
> +
> 
> +/**
> 
> +  Choose blocking or non-blocking mode to wait for all APs. True for Blocking
> and false for not.
> 
> +  Insure when this function returns, no AP will execute normal mode code
> before entering SMM, except SMI disabled APs.
> 
> +
> 
> +**/
> 
> +VOID
> 
> +SmmWaitForApArrival (
> 
> +  IN  BOOLEAN  BlockingMode
> 
> +  );
> 
> +
> 
>  #endif
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
> b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
> index 0e88071c7079..deef00f9c6e9 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf
> @@ -4,7 +4,7 @@
>  # This SMM driver performs SMM initialization, deploy SMM Entry Vector,
> 
>  # provides CPU specific services in SMM.
> 
>  #
> 
> -# Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>
> 
> +# Copyright (c) 2009 - 2022, Intel Corporation. All rights reserved.<BR>
> 
>  # Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> 
>  #
> 
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -107,7 +107,8 @@
>    gEfiSmmReadyToLockProtocolGuid           ## NOTIFY
> 
>    gEfiSmmCpuServiceProtocolGuid            ## PRODUCES
> 
>    gEdkiiSmmMemoryAttributeProtocolGuid     ## PRODUCES
> 
> -  gEfiMmMpProtocolGuid                    ## PRODUCES
> 
> +  gEfiMmMpProtocolGuid                     ## PRODUCES
> 
> +  gEdkiiSmmCpuRendezvousProtocolGuid       ## PRODUCES
> 
> 
> 
>  [Guids]
> 
>    gEfiAcpiVariableGuid                     ## SOMETIMES_CONSUMES ## HOB # it is
> used for S3 boot.
> 
> diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec
> index 7de66fde674c..525cde463435 100644
> --- a/UefiCpuPkg/UefiCpuPkg.dec
> +++ b/UefiCpuPkg/UefiCpuPkg.dec
> @@ -1,7 +1,7 @@
>  ## @file  UefiCpuPkg.dec
> 
>  # This Package provides UEFI compatible CPU modules and libraries.
> 
>  #
> 
> -# Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR>
> 
> +# Copyright (c) 2007 - 2022, Intel Corporation. All rights reserved.<BR>
> 
>  #
> 
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  #
> 
> @@ -62,6 +62,9 @@
>    ##  @libraryclass  Provides function for loading microcode.
> 
>    MicrocodeLib|Include/Library/MicrocodeLib.h
> 
> 
> 
> +  ## @libraryclass  Provides function for SMM CPU Rendezvous Library.
> 
> +  SmmCpuRendezvousLib|Include/Library/SmmCpuRendezvousLib.h
> 
> +
> 
>  [Guids]
> 
>    gUefiCpuPkgTokenSpaceGuid      = { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa, 0xb8,
> 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }}
> 
>    gMsegSmramGuid                 = { 0x5802bce4, 0xeeee, 0x4e33, { 0xa1, 0x30,
> 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }}
> 
> @@ -77,7 +80,8 @@
> 
> 
>  [Protocols]
> 
>    ## Include/Protocol/SmmCpuService.h
> 
> -  gEfiSmmCpuServiceProtocolGuid  = { 0x1d202cab, 0xc8ab, 0x4d5c, { 0x94,
> 0xf7, 0x3c, 0xfc, 0xc0, 0xd3, 0xd3, 0x35 }}
> 
> +  gEfiSmmCpuServiceProtocolGuid   = { 0x1d202cab, 0xc8ab, 0x4d5c, { 0x94,
> 0xf7, 0x3c, 0xfc, 0xc0, 0xd3, 0xd3, 0x35 }}
> 
> +  gEdkiiSmmCpuRendezvousProtocolGuid = { 0xaa00d50b, 0x4911, 0x428f,
> { 0xb9, 0x1a, 0xa5, 0x9d, 0xdb, 0x13, 0xe2, 0x4c }}
> 
> 
> 
>    ## Include/Protocol/SmMonitorInit.h
> 
>    gEfiSmMonitorInitProtocolGuid  = { 0x228f344d, 0xb3de, 0x43bb, { 0xa4, 0xd7,
> 0xea, 0x20, 0xb, 0x1b, 0x14, 0x82 }}
> 
> diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc
> index d1d61dd6a03b..a0bbde9985d3 100644
> --- a/UefiCpuPkg/UefiCpuPkg.dsc
> +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> @@ -61,6 +61,7 @@
> 
> TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmM
> easurementLibNull.inf
> 
>    VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf
> 
>    MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf
> 
> +
> SmmCpuRendezvousLib|UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuR
> endezvousLib.inf
> 
> 
> 
>  [LibraryClasses.common.SEC]
> 
>    PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf
> 
> @@ -173,6 +174,7 @@
>    }
> 
>    UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
> 
>    UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf
> 
> +  UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf
> 
> 
> 
>  [BuildOptions]
> 
>    *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES
> 
> --
> 2.26.2.windows.1
> 
> 
> 
> 
> 


  reply	other threads:[~2022-02-23 10:19 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-23  6:42 [PATCH v2 1/1] UefiCpuPkg: Extend SMM CPU Service with rendezvous support Li, Zhihao
2022-02-23 10:19 ` Siyuan, Fu [this message]
2022-02-23 13:00   ` [edk2-devel] " Li, Zhihao
2022-03-01  7:31 ` Ni, Ray

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MWHPR11MB1598346405268F175B2EBD11EB3C9@MWHPR11MB1598.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox