1. mInitApsAfterSmmBaseReloc assignment is done in different places. It's set 
to FALSE before BSP/AP initialization, and it's set to TRUE in 
InitializeCpuAfterRebase().
    Do you think it's better to only assign it to FALSE/TRUE in InitializeBsp()?

2. ASSERT (mNumberOfCpus <= mAcpiCpuData.NumberOfCpus); is done in multiple 
places.
    Do you think the assertion in InitializeCpuAfterRebase() can be removed?

3. Do you think if InitializeAp and InitializeBsp could be implemented as a 
single function because I found that they are doing almost the same thing?


> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of duntan
> Sent: Thursday, July 27, 2023 10:21 AM
> To: devel@edk2.groups.io
> Cc: Dong, Eric <eric.d...@intel.com>; Ni, Ray <ray...@intel.com>; Kumar, Rahul
> R <rahul.r.ku...@intel.com>
> Subject: [edk2-devel] [PATCH 4/5] UefiCpuPkg/PiSmmCpuDxe: code refinement
> for CpuS3.c
> 
> This commit is code logic refinement for CpuS3.c. It doesn't
> change any code functionality.
> In this commit, abstract the function originally executed by BSP
> into a new InitializeBsp(). Also prepare the AP StartupVector and
> send InitSipiSipi in SmmRestoreCpu() when mAcpiCpuData is valid.
> Or only InitializeBsp will be executed by BSP. This can make the
> code logic easier to understand.
> 
> Signed-off-by: Dun Tan <dun....@intel.com>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Ray Ni <ray...@intel.com>
> Cc: Rahul Kumar <rahul1.ku...@intel.com>
> ---
>  UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 110
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
> --------------------------------------------
>  1 file changed, 63 insertions(+), 47 deletions(-)
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> index 0f7ee0372d..d2e2135d08 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> @@ -627,6 +627,7 @@ PrepareApStartupVector (
>    mExchangeInfo->BufferStart                         = (UINT32)StartupVector;
>    mExchangeInfo->Cr3                                 = (UINT32)(AsmReadCr3 
> ());
>    mExchangeInfo->InitializeFloatingPointUnitsAddress =
> (UINTN)InitializeFloatingPointUnits;
> +  mExchangeInfo->ApFunction                          = (VOID 
> *)(UINTN)InitializeAp;
>  }
> 
>  /**
> @@ -647,27 +648,6 @@ InitializeCpuBeforeRebase (
> 
>    ProgramVirtualWireMode ();
> 
> -  PrepareApStartupVector (mAcpiCpuData.StartupVector);
> -
> -  if (FeaturePcdGet (PcdCpuHotPlugSupport)) {
> -    ASSERT (mNumberOfCpus <= mAcpiCpuData.NumberOfCpus);
> -  } else {
> -    ASSERT (mNumberOfCpus == mAcpiCpuData.NumberOfCpus);
> -  }
> -
> -  mNumberToFinish           = (UINT32)(mNumberOfCpus - 1);
> -  mExchangeInfo->ApFunction = (VOID *)(UINTN)InitializeAp;
> -
> -  //
> -  // Execute code for before SmmBaseReloc. Note: This flag is maintained 
> across
> S3 boots.
> -  //
> -  mInitApsAfterSmmBaseReloc = FALSE;
> -
> -  //
> -  // Send INIT IPI - SIPI to all APs
> -  //
> -  SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector);
> -
>    while (mNumberToFinish > 0) {
>      CpuPause ();
>    }
> @@ -714,6 +694,54 @@ InitializeCpuAfterRebase (
>    }
>  }
> 
> +/**
> +  Procedure for BSP to do the cpu initialization.
> +
> +**/
> +VOID
> +InitializeBsp (
> +  VOID
> +  )
> +{
> +  //
> +  // Skip initialization if mAcpiCpuData is not valid
> +  //
> +  if (mAcpiCpuData.NumberOfCpus > 0) {
> +    //
> +    // First time microcode load and restore MTRRs
> +    //
> +    InitializeCpuBeforeRebase ();
> +  }
> +
> +  DEBUG ((DEBUG_INFO, "SmmRestoreCpu: mSmmRelocated is %d\n",
> mSmmRelocated));
> +
> +  //
> +  // Check whether Smm Relocation is done or not.
> +  // If not, will do the SmmBases Relocation here!!!
> +  //
> +  if (!mSmmRelocated) {
> +    //
> +    // Restore SMBASE for BSP and all APs
> +    //
> +    SmmRelocateBases ();
> +  } else {
> +    //
> +    // Issue SMI IPI (All Excluding  Self SMM IPI + BSP SMM IPI) to execute 
> first
> SMI init.
> +    //
> +    ExecuteFirstSmiInit ();
> +  }
> +
> +  //
> +  // Skip initialization if mAcpiCpuData is not valid
> +  //
> +  if (mAcpiCpuData.NumberOfCpus > 0) {
> +    //
> +    // Restore MSRs for BSP and all APs
> +    //
> +    InitializeCpuAfterRebase ();
> +  }
> +}
> +
>  /**
>    Restore SMM Configuration in S3 boot path.
> 
> @@ -814,43 +842,31 @@ SmmRestoreCpu (
>    }
> 
>    //
> -  // Skip initialization if mAcpiCpuData is not valid
> +  // Skip AP initialization if mAcpiCpuData is not valid
>    //
>    if (mAcpiCpuData.NumberOfCpus > 0) {
> -    //
> -    // First time microcode load and restore MTRRs
> -    //
> -    InitializeCpuBeforeRebase ();
> -  }
> +    if (FeaturePcdGet (PcdCpuHotPlugSupport)) {
> +      ASSERT (mNumberOfCpus <= mAcpiCpuData.NumberOfCpus);
> +    } else {
> +      ASSERT (mNumberOfCpus == mAcpiCpuData.NumberOfCpus);
> +    }
> 
> -  DEBUG ((DEBUG_INFO, "SmmRestoreCpu: mSmmRelocated is %d\n",
> mSmmRelocated));
> +    mNumberToFinish = (UINT32)(mNumberOfCpus - 1);
> 
> -  //
> -  // Check whether Smm Relocation is done or not.
> -  // If not, will do the SmmBases Relocation here!!!
> -  //
> -  if (!mSmmRelocated) {
> -    //
> -    // Restore SMBASE for BSP and all APs
> -    //
> -    SmmRelocateBases ();
> -  } else {
>      //
> -    // Issue SMI IPI (All Excluding  Self SMM IPI + BSP SMM IPI) to execute 
> first SMI
> init.
> +    // Execute code for before SmmBaseReloc. Note: This flag is maintained
> across S3 boots.
>      //
> -    ExecuteFirstSmiInit ();
> -  }
> +    mInitApsAfterSmmBaseReloc = FALSE;
> 
> -  //
> -  // Skip initialization if mAcpiCpuData is not valid
> -  //
> -  if (mAcpiCpuData.NumberOfCpus > 0) {
> +    PrepareApStartupVector (mAcpiCpuData.StartupVector);
>      //
> -    // Restore MSRs for BSP and all APs
> +    // Send INIT IPI - SIPI to all APs
>      //
> -    InitializeCpuAfterRebase ();
> +    SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector);
>    }
> 
> +  InitializeBsp ();
> +
>    //
>    // Set a flag to restore SMM configuration in S3 path.
>    //
> --
> 2.31.1.windows.1
> 
> 
> 
> 
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#107373): https://edk2.groups.io/g/devel/message/107373
Mute This Topic: https://groups.io/mt/100383962/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: 
https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to