]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/PiSmmCpuDxeSmm: Using global semaphores in aligned buffer
authorJeff Fan <jeff.fan@intel.com>
Tue, 22 Mar 2016 02:15:53 +0000 (10:15 +0800)
committerMichael Kinney <michael.d.kinney@intel.com>
Tue, 24 May 2016 22:20:01 +0000 (15:20 -0700)
Update all global semaphores to the ones in allocated aligned
semaphores buffer.

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/Ia32/PageTbl.c
UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c

index 5d299044c41b0083364035a41408b5811e7e41ed..a871bef4e28f9c32202a32d5ea1e675cc08a6984 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Page table manipulation functions for IA-32 processors\r
 \r
-Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -14,8 +14,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "PiSmmCpuDxeSmm.h"\r
 \r
-SPIN_LOCK                           mPFLock;\r
-\r
 /**\r
   Create PageTable for SMM use.\r
 \r
@@ -33,7 +31,7 @@ SmmInitPageTable (
   //\r
   // Initialize spin lock\r
   //\r
-  InitializeSpinLock (&mPFLock);\r
+  InitializeSpinLock (mPFLock);\r
 \r
   if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {\r
     //\r
@@ -94,7 +92,7 @@ SmiPFHandler (
 \r
   ASSERT (InterruptType == EXCEPT_IA32_PAGE_FAULT);\r
 \r
-  AcquireSpinLock (&mPFLock);\r
+  AcquireSpinLock (mPFLock);\r
 \r
   PFAddress = AsmReadCr2 ();\r
 \r
@@ -128,5 +126,5 @@ SmiPFHandler (
     SmiDefaultPFHandler ();\r
   }\r
 \r
-  ReleaseSpinLock (&mPFLock);\r
+  ReleaseSpinLock (mPFLock);\r
 }\r
index 68ef0a34272de1d74391428597a77a2cf69ebbc4..22ff813b344d58ba71269e74a8fef4160ce3efa4 100644 (file)
@@ -23,6 +23,7 @@ SMM_DISPATCHER_MP_SYNC_DATA                 *mSmmMpSyncData = NULL;
 UINTN                                       mSmmMpSyncDataSize;\r
 SMM_CPU_SEMAPHORES                          mSmmCpuSemaphores;\r
 UINTN                                       mSemaphoreSize;\r
+SPIN_LOCK                                   *mPFLock = NULL;\r
 \r
 /**\r
   Performs an atomic compare exchange operation to get semaphore.\r
@@ -165,9 +166,9 @@ AllCpusInSmmWithExceptions (
   SMM_CPU_DATA_BLOCK                *CpuData;\r
   EFI_PROCESSOR_INFORMATION         *ProcessorInfo;\r
 \r
-  ASSERT (mSmmMpSyncData->Counter <= mNumberOfCpus);\r
+  ASSERT (*mSmmMpSyncData->Counter <= mNumberOfCpus);\r
 \r
-  if (mSmmMpSyncData->Counter == mNumberOfCpus) {\r
+  if (*mSmmMpSyncData->Counter == mNumberOfCpus) {\r
     return TRUE;\r
   }\r
 \r
@@ -206,7 +207,7 @@ SmmWaitForApArrival (
   UINT64                            Timer;\r
   UINTN                             Index;\r
 \r
-  ASSERT (mSmmMpSyncData->Counter <= mNumberOfCpus);\r
+  ASSERT (*mSmmMpSyncData->Counter <= mNumberOfCpus);\r
 \r
   //\r
   // Platform implementor should choose a timeout value appropriately:\r
@@ -245,7 +246,7 @@ SmmWaitForApArrival (
   //    - In relaxed flow, CheckApArrival() will check SMI disabling status before calling this function.\r
   //    In both cases, adding SMI-disabling checking code increases overhead.\r
   //\r
-  if (mSmmMpSyncData->Counter < mNumberOfCpus) {\r
+  if (*mSmmMpSyncData->Counter < mNumberOfCpus) {\r
     //\r
     // Send SMI IPIs to bring outside processors in\r
     //\r
@@ -322,7 +323,7 @@ BSPHandler (
   //\r
   // Flag BSP's presence\r
   //\r
-  mSmmMpSyncData->InsideSmm = TRUE;\r
+  *mSmmMpSyncData->InsideSmm = TRUE;\r
 \r
   //\r
   // Initialize Debug Agent to start source level debug in BSP handler\r
@@ -360,8 +361,8 @@ BSPHandler (
     //\r
     // Lock the counter down and retrieve the number of APs\r
     //\r
-    mSmmMpSyncData->AllCpusInSync = TRUE;\r
-    ApCount = LockdownSemaphore (&mSmmMpSyncData->Counter) - 1;\r
+    *mSmmMpSyncData->AllCpusInSync = TRUE;\r
+    ApCount = LockdownSemaphore (mSmmMpSyncData->Counter) - 1;\r
 \r
     //\r
     // Wait for all APs to get ready for programming MTRRs\r
@@ -448,8 +449,8 @@ BSPHandler (
     //\r
     // Lock the counter down and retrieve the number of APs\r
     //\r
-    mSmmMpSyncData->AllCpusInSync = TRUE;\r
-    ApCount = LockdownSemaphore (&mSmmMpSyncData->Counter) - 1;\r
+    *mSmmMpSyncData->AllCpusInSync = TRUE;\r
+    ApCount = LockdownSemaphore (mSmmMpSyncData->Counter) - 1;\r
     //\r
     // Make sure all APs have their Present flag set\r
     //\r
@@ -469,7 +470,7 @@ BSPHandler (
   //\r
   // Notify all APs to exit\r
   //\r
-  mSmmMpSyncData->InsideSmm = FALSE;\r
+  *mSmmMpSyncData->InsideSmm = FALSE;\r
   ReleaseAllAPs ();\r
 \r
   //\r
@@ -532,8 +533,8 @@ BSPHandler (
   //\r
   // Allow APs to check in from this point on\r
   //\r
-  mSmmMpSyncData->Counter = 0;\r
-  mSmmMpSyncData->AllCpusInSync = FALSE;\r
+  *mSmmMpSyncData->Counter = 0;\r
+  *mSmmMpSyncData->AllCpusInSync = FALSE;\r
 }\r
 \r
 /**\r
@@ -560,12 +561,12 @@ APHandler (
   //\r
   for (Timer = StartSyncTimer ();\r
        !IsSyncTimerTimeout (Timer) &&\r
-       !mSmmMpSyncData->InsideSmm;\r
+       !(*mSmmMpSyncData->InsideSmm);\r
        ) {\r
     CpuPause ();\r
   }\r
 \r
-  if (!mSmmMpSyncData->InsideSmm) {\r
+  if (!(*mSmmMpSyncData->InsideSmm)) {\r
     //\r
     // BSP timeout in the first round\r
     //\r
@@ -586,23 +587,23 @@ APHandler (
       //\r
       for (Timer = StartSyncTimer ();\r
            !IsSyncTimerTimeout (Timer) &&\r
-           !mSmmMpSyncData->InsideSmm;\r
+           !(*mSmmMpSyncData->InsideSmm);\r
            ) {\r
         CpuPause ();\r
       }\r
 \r
-      if (!mSmmMpSyncData->InsideSmm) {\r
+      if (!(*mSmmMpSyncData->InsideSmm)) {\r
         //\r
         // Give up since BSP is unable to enter SMM\r
         // and signal the completion of this AP\r
-        WaitForSemaphore (&mSmmMpSyncData->Counter);\r
+        WaitForSemaphore (mSmmMpSyncData->Counter);\r
         return;\r
       }\r
     } else {\r
       //\r
       // Don't know BSP index. Give up without sending IPI to BSP.\r
       //\r
-      WaitForSemaphore (&mSmmMpSyncData->Counter);\r
+      WaitForSemaphore (mSmmMpSyncData->Counter);\r
       return;\r
     }\r
   }\r
@@ -666,7 +667,7 @@ APHandler (
     //\r
     // Check if BSP wants to exit SMM\r
     //\r
-    if (!mSmmMpSyncData->InsideSmm) {\r
+    if (!(*mSmmMpSyncData->InsideSmm)) {\r
       break;\r
     }\r
 \r
@@ -1043,7 +1044,7 @@ SmiRendezvous (
   // Determine if BSP has been already in progress. Note this must be checked after\r
   // ValidSmi because BSP may clear a valid SMI source after checking in.\r
   //\r
-  BspInProgress = mSmmMpSyncData->InsideSmm;\r
+  BspInProgress = *mSmmMpSyncData->InsideSmm;\r
 \r
   if (!BspInProgress && !ValidSmi) {\r
     //\r
@@ -1058,7 +1059,7 @@ SmiRendezvous (
     //\r
     // Signal presence of this processor\r
     //\r
-    if (ReleaseSemaphore (&mSmmMpSyncData->Counter) == 0) {\r
+    if (ReleaseSemaphore (mSmmMpSyncData->Counter) == 0) {\r
       //\r
       // BSP has already ended the synchronization, so QUIT!!!\r
       //\r
@@ -1066,7 +1067,7 @@ SmiRendezvous (
       //\r
       // Wait for BSP's signal to finish SMI\r
       //\r
-      while (mSmmMpSyncData->AllCpusInSync) {\r
+      while (*mSmmMpSyncData->AllCpusInSync) {\r
         CpuPause ();\r
       }\r
       goto Exit;\r
@@ -1173,7 +1174,7 @@ SmiRendezvous (
     //\r
     // Wait for BSP's signal to exit SMI\r
     //\r
-    while (mSmmMpSyncData->AllCpusInSync) {\r
+    while (*mSmmMpSyncData->AllCpusInSync) {\r
       CpuPause ();\r
      }\r
 \r
@@ -1235,6 +1236,12 @@ InitializeSmmCpuSemaphores (
   mSmmCpuSemaphores.SemaphoreGlobal.CodeAccessCheckLock\r
                                                   = (SPIN_LOCK *)SemaphoreAddr;\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
   mSemaphoreSize = SemaphoreSize;\r
 }\r
 \r
index 36a0650b2fd06c1b1dc521cd11bf134f8d79cc34..4ef535fb4ec388c5396987b4e2599cab62853d16 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Agent Module to load other modules to deploy SMM Entry Vector for X86 CPU.\r
 \r
-Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -104,7 +104,7 @@ BOOLEAN                  mSmmCodeAccessCheckEnable = FALSE;
 //\r
 // Spin lock used to serialize setting of SMM Code Access Check feature\r
 //\r
-SPIN_LOCK                mConfigSmmCodeAccessCheckLock;\r
+SPIN_LOCK                *mConfigSmmCodeAccessCheckLock = NULL;\r
 \r
 /**\r
   Initialize IDT to setup exception handlers for SMM.\r
@@ -1338,7 +1338,7 @@ ConfigSmmCodeAccessCheckOnCurrentProcessor (
   //\r
   // Release the spin lock user to serialize the updates to the SMM Feature Control MSR\r
   //\r
-  ReleaseSpinLock (&mConfigSmmCodeAccessCheckLock);\r
+  ReleaseSpinLock (mConfigSmmCodeAccessCheckLock);\r
 }\r
 \r
 /**\r
@@ -1374,13 +1374,13 @@ ConfigSmmCodeAccessCheck (
   //\r
   // Initialize the lock used to serialize the MSR programming in BSP and all APs\r
   //\r
-  InitializeSpinLock (&mConfigSmmCodeAccessCheckLock);\r
+  InitializeSpinLock (mConfigSmmCodeAccessCheckLock);\r
 \r
   //\r
   // Acquire Config SMM Code Access Check spin lock.  The BSP will release the\r
   // spin lock when it is done executing ConfigSmmCodeAccessCheckOnCurrentProcessor().\r
   //\r
-  AcquireSpinLock (&mConfigSmmCodeAccessCheckLock);\r
+  AcquireSpinLock (mConfigSmmCodeAccessCheckLock);\r
 \r
   //\r
   // Enable SMM Code Access Check feature on the BSP.\r
@@ -1397,7 +1397,7 @@ ConfigSmmCodeAccessCheck (
       // Acquire Config SMM Code Access Check spin lock.  The AP will release the\r
       // spin lock when it is done executing ConfigSmmCodeAccessCheckOnCurrentProcessor().\r
       //\r
-      AcquireSpinLock (&mConfigSmmCodeAccessCheckLock);\r
+      AcquireSpinLock (mConfigSmmCodeAccessCheckLock);\r
 \r
       //\r
       // Call SmmStartupThisAp() to enable SMM Code Access Check on an AP.\r
@@ -1408,14 +1408,14 @@ ConfigSmmCodeAccessCheck (
       //\r
       // Wait for the AP to release the Config SMM Code Access Check spin lock.\r
       //\r
-      while (!AcquireSpinLockOrFail (&mConfigSmmCodeAccessCheckLock)) {\r
+      while (!AcquireSpinLockOrFail (mConfigSmmCodeAccessCheckLock)) {\r
         CpuPause ();\r
       }\r
 \r
       //\r
       // Release the Config SMM Code Access Check spin lock.\r
       //\r
-      ReleaseSpinLock (&mConfigSmmCodeAccessCheckLock);\r
+      ReleaseSpinLock (mConfigSmmCodeAccessCheckLock);\r
     }\r
   }\r
 }\r
index f846e190ba7de3672734898db22f315630b8886e..eca42aa8d69863b93b114fcc0852afa078bfec7b 100644 (file)
@@ -314,10 +314,10 @@ typedef struct {
   // so that UC cache-ability can be set together.\r
   //\r
   SMM_CPU_DATA_BLOCK            *CpuData;\r
-  volatile UINT32               Counter;\r
+  volatile UINT32               *Counter;\r
   volatile UINT32               BspIndex;\r
-  volatile BOOLEAN              InsideSmm;\r
-  volatile BOOLEAN              AllCpusInSync;\r
+  volatile BOOLEAN              *InsideSmm;\r
+  volatile BOOLEAN              *AllCpusInSync;\r
   volatile SMM_CPU_SYNC_MODE    EffectiveSyncMode;\r
   volatile BOOLEAN              SwitchBsp;\r
   volatile BOOLEAN              *CandidateBsp;\r
@@ -388,6 +388,8 @@ extern UINTN                               mSmmStackArrayEnd;
 extern UINTN                               mSmmStackSize;\r
 extern EFI_SMM_CPU_SERVICE_PROTOCOL        mSmmCpuService;\r
 extern IA32_DESCRIPTOR                     gcSmiInitGdtr;\r
+extern SPIN_LOCK                           *mPFLock;\r
+extern SPIN_LOCK                           *mConfigSmmCodeAccessCheckLock;\r
 \r
 /**\r
   Create 4G PageTable in SMRAM.\r
index 5b11e5eb48a836a19c47512db0af4ddf6696a244..9cee784156eb0338e647d62464591e6319bd6110 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Page Fault (#PF) handler for X64 processors\r
 \r
-Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -17,7 +17,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define PAGE_TABLE_PAGES            8\r
 #define ACC_MAX_BIT                 BIT3\r
 LIST_ENTRY                          mPagePool = INITIALIZE_LIST_HEAD_VARIABLE (mPagePool);\r
-SPIN_LOCK                           mPFLock;\r
 BOOLEAN                             m1GPageTableSupport = FALSE;\r
 \r
 /**\r
@@ -107,7 +106,7 @@ SmmInitPageTable (
   //\r
   // Initialize spin lock\r
   //\r
-  InitializeSpinLock (&mPFLock);\r
+  InitializeSpinLock (mPFLock);\r
 \r
   m1GPageTableSupport = Is1GPageSupport ();\r
   //\r
@@ -651,7 +650,7 @@ SmiPFHandler (
 \r
   ASSERT (InterruptType == EXCEPT_IA32_PAGE_FAULT);\r
 \r
-  AcquireSpinLock (&mPFLock);\r
+  AcquireSpinLock (mPFLock);\r
 \r
   PFAddress = AsmReadCr2 ();\r
 \r
@@ -688,5 +687,5 @@ SmiPFHandler (
     SmiDefaultPFHandler ();\r
   }\r
 \r
-  ReleaseSpinLock (&mPFLock);\r
+  ReleaseSpinLock (mPFLock);\r
 }\r