]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/PiSmmCpuDxeSmm: Remove duplicate aligned buffer on S3 path
authorJeff Fan <jeff.fan@intel.com>
Mon, 27 Jun 2016 07:41:50 +0000 (15:41 +0800)
committerMichael Kinney <michael.d.kinney@intel.com>
Thu, 14 Jul 2016 15:57:41 +0000 (08:57 -0700)
InitializeMpSyncData() invokes InitializeSmmCpuSemaphores() to allocate an
aligned buffer for all locks and semaphores. However, this function is
invoked on S3 resume path again to reset mSmmMpSyncData. It causes
an additional aligned buffer to be allocated.

This update moves InitializeSmmCpuSemaphores() into
InitializeMpServiceData() that is only invoked on normal boot.
InitializeMpSyncData() is updated to reset the locks/semaphore in
mSmmMpSyncData.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c

index add770ff3cbfe0f29c2bee0017fedf093e760d17..62d037cdb17867b82a20a3c16c7dfbee9e485cf6 100644 (file)
@@ -1205,7 +1205,6 @@ InitializeSmmCpuSemaphores (
   VOID\r
   )\r
 {\r
-  UINTN                      CpuIndex;\r
   UINTN                      ProcessorCount;\r
   UINTN                      TotalSize;\r
   UINTN                      GlobalSemaphoresSize;\r
@@ -1240,7 +1239,6 @@ InitializeSmmCpuSemaphores (
   SemaphoreAddr += SemaphoreSize;\r
   mSmmCpuSemaphores.SemaphoreGlobal.CodeAccessCheckLock\r
                                                   = (SPIN_LOCK *)SemaphoreAddr;\r
-\r
   SemaphoreAddr = (UINTN)SemaphoreBlock + GlobalSemaphoresSize;\r
   mSmmCpuSemaphores.SemaphoreCpu.Busy    = (SPIN_LOCK *)SemaphoreAddr;\r
   SemaphoreAddr += ProcessorCount * SemaphoreSize;\r
@@ -1254,21 +1252,9 @@ InitializeSmmCpuSemaphores (
         ((UINTN)SemaphoreBlock + Pages * SIZE_4KB - SemaphoreAddr) / SemaphoreSize;\r
   ASSERT (mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter >= MSR_SPIN_LOCK_INIT_NUM);\r
 \r
-  mSmmMpSyncData->Counter       = mSmmCpuSemaphores.SemaphoreGlobal.Counter;\r
-  mSmmMpSyncData->InsideSmm     = mSmmCpuSemaphores.SemaphoreGlobal.InsideSmm;\r
-  mSmmMpSyncData->AllCpusInSync = mSmmCpuSemaphores.SemaphoreGlobal.AllCpusInSync;\r
   mPFLock                       = mSmmCpuSemaphores.SemaphoreGlobal.PFLock;\r
   mConfigSmmCodeAccessCheckLock = mSmmCpuSemaphores.SemaphoreGlobal.CodeAccessCheckLock;\r
 \r
-  for (CpuIndex = 0; CpuIndex < ProcessorCount; CpuIndex ++) {\r
-    mSmmMpSyncData->CpuData[CpuIndex].Busy    =\r
-      (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Busy + SemaphoreSize * CpuIndex);\r
-    mSmmMpSyncData->CpuData[CpuIndex].Run     =\r
-      (UINT32 *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Run + SemaphoreSize * CpuIndex);\r
-    mSmmMpSyncData->CpuData[CpuIndex].Present =\r
-      (BOOLEAN *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Present + SemaphoreSize * CpuIndex);\r
-  }\r
-\r
   mSemaphoreSize = SemaphoreSize;\r
 }\r
 \r
@@ -1282,8 +1268,10 @@ InitializeMpSyncData (
   VOID\r
   )\r
 {\r
+  UINTN                      CpuIndex;\r
+\r
   if (mSmmMpSyncData != NULL) {\r
-    ZeroMem (mSmmMpSyncData, mSmmMpSyncDataSize);\r
+    mSmmMpSyncData->SwitchBsp = FALSE;\r
     mSmmMpSyncData->CpuData = (SMM_CPU_DATA_BLOCK *)((UINT8 *)mSmmMpSyncData + sizeof (SMM_DISPATCHER_MP_SYNC_DATA));\r
     mSmmMpSyncData->CandidateBsp = (BOOLEAN *)(mSmmMpSyncData->CpuData + gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus);\r
     if (FeaturePcdGet (PcdCpuSmmEnableBspElection)) {\r
@@ -1294,7 +1282,23 @@ InitializeMpSyncData (
     }\r
     mSmmMpSyncData->EffectiveSyncMode = (SMM_CPU_SYNC_MODE) PcdGet8 (PcdCpuSmmSyncMode);\r
 \r
-    InitializeSmmCpuSemaphores ();\r
+    mSmmMpSyncData->Counter       = mSmmCpuSemaphores.SemaphoreGlobal.Counter;\r
+    mSmmMpSyncData->InsideSmm     = mSmmCpuSemaphores.SemaphoreGlobal.InsideSmm;\r
+    mSmmMpSyncData->AllCpusInSync = mSmmCpuSemaphores.SemaphoreGlobal.AllCpusInSync;\r
+    ASSERT (mSmmMpSyncData->Counter != NULL && mSmmMpSyncData->InsideSmm != NULL &&\r
+            mSmmMpSyncData->AllCpusInSync != NULL);\r
+    *mSmmMpSyncData->Counter       = 0;\r
+    *mSmmMpSyncData->InsideSmm     = FALSE;\r
+    *mSmmMpSyncData->AllCpusInSync = FALSE;\r
+\r
+    for (CpuIndex = 0; CpuIndex < gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus; CpuIndex ++) {\r
+      mSmmMpSyncData->CpuData[CpuIndex].Busy    =\r
+        (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Busy + mSemaphoreSize * CpuIndex);\r
+      mSmmMpSyncData->CpuData[CpuIndex].Run     =\r
+        (UINT32 *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Run + mSemaphoreSize * CpuIndex);\r
+      mSmmMpSyncData->CpuData[CpuIndex].Present =\r
+        (BOOLEAN *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Present + mSemaphoreSize * CpuIndex);\r
+    }\r
   }\r
 }\r
 \r
@@ -1318,6 +1322,11 @@ InitializeMpServiceData (
   UINT8                     *GdtTssTables;\r
   UINTN                     GdtTableStepSize;\r
 \r
+  //\r
+  // Allocate memory for all locks and semaphores\r
+  //\r
+  InitializeSmmCpuSemaphores ();\r
+\r
   //\r
   // Initialize mSmmMpSyncData\r
   //\r