From: "Li, Zhihao" <zhihao.li@intel.com>
To: "Fu, Siyuan" <siyuan.fu@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
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 13:00:04 +0000 [thread overview]
Message-ID: <DM6PR11MB47380AE65E1B7B5E2C53FEEEF93C9@DM6PR11MB4738.namprd11.prod.outlook.com> (raw)
In-Reply-To: <MWHPR11MB1598346405268F175B2EBD11EB3C9@MWHPR11MB1598.namprd11.prod.outlook.com>
Send patch v4 following Siyuan comments.
> -----Original Message-----
> From: Fu, Siyuan <siyuan.fu@intel.com>
> Sent: Wednesday, February 23, 2022 6:20 PM
> To: 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.
>
> 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/Tp
> mM
> > easurementLibNull.inf
> >
> > VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf
> >
> > MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf
> >
> > +
> >
> SmmCpuRendezvousLib|UefiCpuPkg/Library/SmmCpuRendezvousLib/Smm
> CpuR
> > endezvousLib.inf
> >
> >
> >
> > [LibraryClasses.common.SEC]
> >
> >
> > PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNul
> > l.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
> >
> >
> >
> >
> >
next prev parent reply other threads:[~2022-02-23 13:00 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 ` [edk2-devel] " Siyuan, Fu
2022-02-23 13:00 ` Li, Zhihao [this message]
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=DM6PR11MB47380AE65E1B7B5E2C53FEEEF93C9@DM6PR11MB4738.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