summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Fan <jeff.fan@intel.com>2016-03-22 10:42:12 +0800
committerHao Wu <hao.a.wu@intel.com>2016-07-06 16:20:48 +0800
commit818232ff4b9c4f5f818516c4c2b6d060fe86fc73 (patch)
treee757582937671655882e77c039473b8eabe69a76
parent8a8092794d2f7afea63d918552e3b036721312ef (diff)
downloadedk2-platforms-818232ff4b9c4f5f818516c4c2b6d060fe86fc73.tar.xz
UefiCpuPkg/PiSmmCpuDxeSmm: Using MSRs semaphores in aligned buffer
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> (cherry picked from commit dc99315b8732b6e3032d01319d3f534d440b43d0)
-rw-r--r--UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c32
-rw-r--r--UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h4
2 files changed, 30 insertions, 6 deletions
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
index 22c133202c..5e63f8aab2 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
@@ -57,7 +57,7 @@ VOID *mGdtForAp = NULL;
VOID *mIdtForAp = NULL;
VOID *mMachineCheckHandlerForAp = NULL;
MP_MSR_LOCK *mMsrSpinLocks = NULL;
-UINTN mMsrSpinLockCount = MSR_SPIN_LOCK_INIT_NUM;
+UINTN mMsrSpinLockCount;
UINTN mMsrCount = 0;
/**
@@ -76,7 +76,7 @@ GetMsrSpinLockByIndex (
UINTN Index;
for (Index = 0; Index < mMsrCount; Index++) {
if (MsrIndex == mMsrSpinLocks[Index].MsrIndex) {
- return &mMsrSpinLocks[Index].SpinLock;
+ return mMsrSpinLocks[Index].SpinLock;
}
}
return NULL;
@@ -93,30 +93,52 @@ InitMsrSpinLockByIndex (
IN UINT32 MsrIndex
)
{
+ UINTN MsrSpinLockCount;
UINTN NewMsrSpinLockCount;
+ UINTN Index;
+ UINTN AddedSize;
if (mMsrSpinLocks == NULL) {
- mMsrSpinLocks = (MP_MSR_LOCK *) AllocatePool (sizeof (MP_MSR_LOCK) * mMsrSpinLockCount);
+ MsrSpinLockCount = mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter;
+ mMsrSpinLocks = (MP_MSR_LOCK *) AllocatePool (sizeof (MP_MSR_LOCK) * MsrSpinLockCount);
ASSERT (mMsrSpinLocks != NULL);
+ for (Index = 0; Index < MsrSpinLockCount; Index++) {
+ mMsrSpinLocks[Index].SpinLock =
+ (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreMsr.Msr + Index * mSemaphoreSize);
+ mMsrSpinLocks[Index].MsrIndex = (UINT32)-1;
+ }
+ mMsrSpinLockCount = MsrSpinLockCount;
+ mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter = 0;
}
if (GetMsrSpinLockByIndex (MsrIndex) == NULL) {
//
// Initialize spin lock for MSR programming
//
mMsrSpinLocks[mMsrCount].MsrIndex = MsrIndex;
- InitializeSpinLock (&mMsrSpinLocks[mMsrCount].SpinLock);
+ InitializeSpinLock (mMsrSpinLocks[mMsrCount].SpinLock);
mMsrCount ++;
if (mMsrCount == mMsrSpinLockCount) {
//
// If MSR spin lock buffer is full, enlarge it
//
- NewMsrSpinLockCount = mMsrSpinLockCount + MSR_SPIN_LOCK_INIT_NUM;
+ AddedSize = SIZE_4KB;
+ mSmmCpuSemaphores.SemaphoreMsr.Msr =
+ AllocatePages (EFI_SIZE_TO_PAGES(AddedSize));
+ ASSERT (mSmmCpuSemaphores.SemaphoreMsr.Msr != NULL);
+ NewMsrSpinLockCount = mMsrSpinLockCount + AddedSize / mSemaphoreSize;
mMsrSpinLocks = ReallocatePool (
sizeof (MP_MSR_LOCK) * mMsrSpinLockCount,
sizeof (MP_MSR_LOCK) * NewMsrSpinLockCount,
mMsrSpinLocks
);
+ ASSERT (mMsrSpinLocks != NULL);
mMsrSpinLockCount = NewMsrSpinLockCount;
+ for (Index = mMsrCount; Index < mMsrSpinLockCount; Index++) {
+ mMsrSpinLocks[Index].SpinLock =
+ (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreMsr.Msr +
+ (Index - mMsrCount) * mSemaphoreSize);
+ mMsrSpinLocks[Index].MsrIndex = (UINT32)-1;
+ }
}
}
}
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
index c344886c08..dfdafa61fa 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
@@ -325,7 +325,7 @@ typedef struct {
#define MSR_SPIN_LOCK_INIT_NUM 15
typedef struct {
- SPIN_LOCK SpinLock;
+ SPIN_LOCK *SpinLock;
UINT32 MsrIndex;
} MP_MSR_LOCK;
@@ -408,6 +408,8 @@ extern UINTN mSmmStackArrayEnd;
extern UINTN mSmmStackSize;
extern EFI_SMM_CPU_SERVICE_PROTOCOL mSmmCpuService;
extern IA32_DESCRIPTOR gcSmiInitGdtr;
+extern SMM_CPU_SEMAPHORES mSmmCpuSemaphores;
+extern UINTN mSemaphoreSize;
extern SPIN_LOCK *mPFLock;
extern SPIN_LOCK *mConfigSmmCodeAccessCheckLock;