]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/PiSmmCpuDxeSmm: Using MSRs semaphores in aligned buffer
authorJeff Fan <jeff.fan@intel.com>
Tue, 22 Mar 2016 02:42:12 +0000 (10:42 +0800)
committerMichael Kinney <michael.d.kinney@intel.com>
Tue, 24 May 2016 22:20:22 +0000 (15:20 -0700)
Update MSRs semaphores to the ones in allocated aligned semaphores
buffer. If MSRs semaphores is not enough, allocate one page more.

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/CpuS3.c
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h

index 22c133202ca069df5ea1a3f716b248ca117f7917..5e63f8aab292c7efb88532439e4e4036d14e5df0 100644 (file)
@@ -57,7 +57,7 @@ VOID                         *mGdtForAp = NULL;
 VOID                         *mIdtForAp = NULL;\r
 VOID                         *mMachineCheckHandlerForAp = NULL;\r
 MP_MSR_LOCK                  *mMsrSpinLocks = NULL;\r
 VOID                         *mIdtForAp = NULL;\r
 VOID                         *mMachineCheckHandlerForAp = NULL;\r
 MP_MSR_LOCK                  *mMsrSpinLocks = NULL;\r
-UINTN                        mMsrSpinLockCount = MSR_SPIN_LOCK_INIT_NUM;\r
+UINTN                        mMsrSpinLockCount;\r
 UINTN                        mMsrCount = 0;\r
 \r
 /**\r
 UINTN                        mMsrCount = 0;\r
 \r
 /**\r
@@ -76,7 +76,7 @@ GetMsrSpinLockByIndex (
   UINTN     Index;\r
   for (Index = 0; Index < mMsrCount; Index++) {\r
     if (MsrIndex == mMsrSpinLocks[Index].MsrIndex) {\r
   UINTN     Index;\r
   for (Index = 0; Index < mMsrCount; Index++) {\r
     if (MsrIndex == mMsrSpinLocks[Index].MsrIndex) {\r
-      return &mMsrSpinLocks[Index].SpinLock;\r
+      return mMsrSpinLocks[Index].SpinLock;\r
     }\r
   }\r
   return NULL;\r
     }\r
   }\r
   return NULL;\r
@@ -93,30 +93,52 @@ InitMsrSpinLockByIndex (
   IN UINT32      MsrIndex\r
   )\r
 {\r
   IN UINT32      MsrIndex\r
   )\r
 {\r
+  UINTN    MsrSpinLockCount;\r
   UINTN    NewMsrSpinLockCount;\r
   UINTN    NewMsrSpinLockCount;\r
+  UINTN    Index;\r
+  UINTN    AddedSize;\r
 \r
   if (mMsrSpinLocks == NULL) {\r
 \r
   if (mMsrSpinLocks == NULL) {\r
-    mMsrSpinLocks = (MP_MSR_LOCK *) AllocatePool (sizeof (MP_MSR_LOCK) * mMsrSpinLockCount);\r
+    MsrSpinLockCount = mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter;\r
+    mMsrSpinLocks = (MP_MSR_LOCK *) AllocatePool (sizeof (MP_MSR_LOCK) * MsrSpinLockCount);\r
     ASSERT (mMsrSpinLocks != NULL);\r
     ASSERT (mMsrSpinLocks != NULL);\r
+    for (Index = 0; Index < MsrSpinLockCount; Index++) {\r
+      mMsrSpinLocks[Index].SpinLock =\r
+       (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreMsr.Msr + Index * mSemaphoreSize);\r
+      mMsrSpinLocks[Index].MsrIndex = (UINT32)-1;\r
+    }\r
+    mMsrSpinLockCount = MsrSpinLockCount;\r
+    mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter = 0;\r
   }\r
   if (GetMsrSpinLockByIndex (MsrIndex) == NULL) {\r
     //\r
     // Initialize spin lock for MSR programming\r
     //\r
     mMsrSpinLocks[mMsrCount].MsrIndex = MsrIndex;\r
   }\r
   if (GetMsrSpinLockByIndex (MsrIndex) == NULL) {\r
     //\r
     // Initialize spin lock for MSR programming\r
     //\r
     mMsrSpinLocks[mMsrCount].MsrIndex = MsrIndex;\r
-    InitializeSpinLock (&mMsrSpinLocks[mMsrCount].SpinLock);\r
+    InitializeSpinLock (mMsrSpinLocks[mMsrCount].SpinLock);\r
     mMsrCount ++;\r
     if (mMsrCount == mMsrSpinLockCount) {\r
       //\r
       // If MSR spin lock buffer is full, enlarge it\r
       //\r
     mMsrCount ++;\r
     if (mMsrCount == mMsrSpinLockCount) {\r
       //\r
       // If MSR spin lock buffer is full, enlarge it\r
       //\r
-      NewMsrSpinLockCount = mMsrSpinLockCount + MSR_SPIN_LOCK_INIT_NUM;\r
+      AddedSize = SIZE_4KB;\r
+      mSmmCpuSemaphores.SemaphoreMsr.Msr =\r
+                        AllocatePages (EFI_SIZE_TO_PAGES(AddedSize));\r
+      ASSERT (mSmmCpuSemaphores.SemaphoreMsr.Msr != NULL);\r
+      NewMsrSpinLockCount = mMsrSpinLockCount + AddedSize / mSemaphoreSize;\r
       mMsrSpinLocks = ReallocatePool (\r
                         sizeof (MP_MSR_LOCK) * mMsrSpinLockCount,\r
                         sizeof (MP_MSR_LOCK) * NewMsrSpinLockCount,\r
                         mMsrSpinLocks\r
                         );\r
       mMsrSpinLocks = ReallocatePool (\r
                         sizeof (MP_MSR_LOCK) * mMsrSpinLockCount,\r
                         sizeof (MP_MSR_LOCK) * NewMsrSpinLockCount,\r
                         mMsrSpinLocks\r
                         );\r
+      ASSERT (mMsrSpinLocks != NULL);\r
       mMsrSpinLockCount = NewMsrSpinLockCount;\r
       mMsrSpinLockCount = NewMsrSpinLockCount;\r
+      for (Index = mMsrCount; Index < mMsrSpinLockCount; Index++) {\r
+        mMsrSpinLocks[Index].SpinLock =\r
+                 (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreMsr.Msr +\r
+                 (Index - mMsrCount)  * mSemaphoreSize);\r
+        mMsrSpinLocks[Index].MsrIndex = (UINT32)-1;\r
+      }\r
     }\r
   }\r
 }\r
     }\r
   }\r
 }\r
index ad2109fde8277851ed509ea3de87570be9711c78..b6c57e3f169f02ea9ddf5fa396e2045695d29983 100644 (file)
@@ -326,7 +326,7 @@ typedef struct {
 #define MSR_SPIN_LOCK_INIT_NUM 15\r
 \r
 typedef struct {\r
 #define MSR_SPIN_LOCK_INIT_NUM 15\r
 \r
 typedef struct {\r
-  SPIN_LOCK    SpinLock;\r
+  SPIN_LOCK    *SpinLock;\r
   UINT32       MsrIndex;\r
 } MP_MSR_LOCK;\r
 \r
   UINT32       MsrIndex;\r
 } MP_MSR_LOCK;\r
 \r
@@ -409,6 +409,8 @@ extern UINTN                               mSmmStackArrayEnd;
 extern UINTN                               mSmmStackSize;\r
 extern EFI_SMM_CPU_SERVICE_PROTOCOL        mSmmCpuService;\r
 extern IA32_DESCRIPTOR                     gcSmiInitGdtr;\r
 extern UINTN                               mSmmStackSize;\r
 extern EFI_SMM_CPU_SERVICE_PROTOCOL        mSmmCpuService;\r
 extern IA32_DESCRIPTOR                     gcSmiInitGdtr;\r
+extern SMM_CPU_SEMAPHORES                  mSmmCpuSemaphores;\r
+extern UINTN                               mSemaphoreSize;\r
 extern SPIN_LOCK                           *mPFLock;\r
 extern SPIN_LOCK                           *mConfigSmmCodeAccessCheckLock;\r
 \r
 extern SPIN_LOCK                           *mPFLock;\r
 extern SPIN_LOCK                           *mConfigSmmCodeAccessCheckLock;\r
 \r