Thanks ray, below are really great feedback. I have checked all and response as 
below:

> The default SMBASE for the x86 processor is 0x30000. When SMI happens,
> CPU runs the
> SMI handler at SMBASE+0x8000. Also, the SMM save state area is within
> SMBASE+0x10000.
> 
> One of the SMM initialization from CPU perspective is to program the new
> SMBASE (in TSEG range)
> for each CPU thread. When the SMBASE update happens in a PEI module,
> the PEI module shall
> produce the SMM_BASE_HOB in HOB database which tells the
> PiSmmCpuDxeSmm driver which runs
> at a later phase about the new SMBASE for each CPU thread.
> PiSmmCpuDxeSmm driver installs
> the SMI handler at the SMM_BASE_HOB.SmBase[Index]+0x8000 for CPU
> thread Index.
> When the HOB doesn't exist, PiSmmCpuDxeSmm driver shall program the
> new SMBASE itself.
> 
Agree, added!

> 
> 2. Can you write the code as "mSmmRelocationDone = (BOOLEAN)
> (GetFirstGuidHob (&gSmmBaseHobGuid) != NULL)"?
>     It removes the assumption that the initial value of mSmmRelocationDone is
> FALSE.
>     I understand it's TRUE usually. But it depends on the PE loader.

Agree.

> 
> > +  if (GetFirstGuidHob (&gSmmBaseHobGuid) != NULL) {
> > +    mSmmRelocated = TRUE;
> > +  } else {
> > +    mSmmRelocated = FALSE;
> 
> 3. The above code doesn't assume the initial value of global variable. Good.
>     Can you align the variable name between SmmCpuFeaturesLib and the
> PiSmmCpuDxeSmm driver?
>     If the two names are chosen to fix link error, there are two ways to avoid
> the error:
>     a. Add "static" and both component use mSmmRelocated.
>     b. One can be renamed as mSmmCpuFeaturesSmmRelocated. No change
> to the one in driver.
> 

Agree. 

> > +  }
> > +
> > +  //
> > +  // Check whether Smm Relocation is done or not.
> > +  // If not, will do the SmmBases Relocation here!!!
> >    //
> > -  SmmRelocateBases ();
> > +  if (!mSmmRelocated) {
> > +    //
> > +    // Restore SMBASE for BSP and all APs
> > +    //
> > +    SmmRelocateBases ();
> > +  } else {
> > +    mSmmInitialized = (BOOLEAN*)AllocateZeroPool (sizeof (BOOLEAN) *
> mMaxNumberOfCpus);
> 4. I guess mSmmInitialized is already allocated in normal boot phase. Here
> what we need is only to set all
> elements to FALSE. Will keep reviewing following changes and confirm my
> guess.
>     But we still cannot call Allocate in every S3 boot without freeing. It may
> cause all SMRAM be allocated.
> 

Yes, I checked the detailed, we don't need allocate that.


> 
> > +    ASSERT (mSmmInitialized != NULL);
> > +
> > +    mBspApicId = GetApicId ();
> > +
> > +    //
> > +    // Issue SMI IPI (All Excluding Self SMM IPI + BSP SMM IPI) for SMM 
> > init
> > +    //
> > +    SendSmiIpi (mBspApicId);
> > +    SendSmiIpiAllExcludingSelf ();
> > +
> > +    //
> > +    // Wait for all processors to finish its 1st SMI
> > +    //
> > +    for (Index = 0; Index < mNumberOfCpus; Index++) {
> > +      while (mSmmInitialized[Index] == FALSE) {
> > +      }
> > +    }
> 5. I am not sure if the same logic is also needed in normal boot. So, maybe a
> local function can be created to
> reduce the code duplication?

Ok, will define new API to reduce the duplication.

> 
> 
> > +  if (!mSmmRelocated) {
> > +    IsMonarch = mIsBsp;
> > +  } else if (mBspApicId == ApicId) {
> > +    IsMonarch = TRUE;
> > +  }
> 
> 6. How about removing mIsBsp and always use mBspApicId even when
> mSmmRelocated==FALSE?
> 7. How about renaming IsMonarch to IsBsp?

Agree.

> 
> >
> > -      if (mIsBsp) {
> > +      if (!mSmmRelocated) {
> > +        if (mIsBsp) {
> > +          //
> > +          // BSP rebase is already done above.
> > +          // Initialize private data during S3 resume
> > +          //
> > +          InitializeMpSyncData ();
> 8. Because the same function is already called in driver entrypoint, here the
> call is for s3 path.
>      Can you check if we need to call it as well in S3 path when SmmRelocated 
> is
> TRUE?

Yes, we need that in S3, will handle it.

> 
> > +  if (TileSize > SIZE_8KB) {
> > +    DEBUG ((DEBUG_ERROR, "The Range of Smbase in SMRAM is not
> enough -- Required TileSize = 0x%08x, Actual TileSize
> > = 0x%08x\n", TileSize, SIZE_8KB));
> > +    ASSERT (TileSize <= SIZE_8KB);
> 
> 9. I suggest we add CpuDeadLoop() here to capture the error in release build.

Agree.



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


Reply via email to