On 11/29/16 08:51, Jeff Fan wrote:
> Some semaphores are not cleared on S3 boot path. For example,
> mSmmMpSyncData->CpuData[CpuIndex].Present. It may still keeps the value set at
> SMM runtime during S3 resume. It may causes BSP have the wrong judgement on 
> SMM
> AP's present state.
> 
> We have one related fix at e78a2a49ee6b0c0d7c6997c87ace31d7761cf636. But that 
> is
> not completed.
> 
> This fix is to clear Busy/Run/Present semaphores in InitializeMpSyncData().
> 
> Cc: Laszlo Ersek <ler...@redhat.com>
> Cc: Feng Tian <feng.t...@intel.com>
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Michael D Kinney <michael.d.kin...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jeff Fan <jeff....@intel.com>
> ---
>  UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> index cfbf59e..a873b68 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> @@ -1357,6 +1357,9 @@ InitializeMpSyncData (
>          (UINT32 *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Run + 
> mSemaphoreSize * CpuIndex);
>        mSmmMpSyncData->CpuData[CpuIndex].Present =
>          (BOOLEAN *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Present + 
> mSemaphoreSize * CpuIndex);
> +      *(mSmmMpSyncData->CpuData[CpuIndex].Busy)    = 0;
> +      *(mSmmMpSyncData->CpuData[CpuIndex].Run)     = 0;
> +      *(mSmmMpSyncData->CpuData[CpuIndex].Present) = FALSE;
>      }
>    }
>  }
> 

Even after this patch, the values pointed-to by the following fields of
SemaphoreGlobal are not cleared: PFLock, CodeAccessCheckLock,
MemoryMappedLock. Is that okay?

The values pointed-to by the following fields of SemaphoreMsr are not
cleared either: Msr, AvailableCounter. Is that okay?

Can we imitate e78a2a49ee6b0c0d7c6997c87ace31d7761cf636 here; namely,
can we save "SemaphoreBlock" and "TotalSize" from
InitializeSmmCpuSemaphores() in global variables (in SMRAM), and then
just do another ZeroMem() here? That would cover the currently listed
objects (*Counter, *InsideSmm, *AllCpusInSync), and everything else too,
in a future-proof way.

In fact, I wonder if the ZeroMem() could be moved into
InitializeMpSyncData() from InitializeSmmCpuSemaphores().

Of course, if some pointed-to objects must not be cleared, then the
ZeroMem() is not appropriate.

Thanks!
Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to