UefiCpuPkg/PiSmmCpuDxeSmm: Allocate buffer for MSRs semaphores
Allocate MSRs semaphores in allocated aligned semaphores buffer. And add it into semaphores structure. 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>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Code for Processor S3 restoration
|
Code for Processor S3 restoration
|
||||||
|
|
||||||
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -48,7 +48,6 @@ AsmGetAddressMap (
|
|||||||
|
|
||||||
#define LEGACY_REGION_SIZE (2 * 0x1000)
|
#define LEGACY_REGION_SIZE (2 * 0x1000)
|
||||||
#define LEGACY_REGION_BASE (0xA0000 - LEGACY_REGION_SIZE)
|
#define LEGACY_REGION_BASE (0xA0000 - LEGACY_REGION_SIZE)
|
||||||
#define MSR_SPIN_LOCK_INIT_NUM 15
|
|
||||||
|
|
||||||
ACPI_CPU_DATA mAcpiCpuData;
|
ACPI_CPU_DATA mAcpiCpuData;
|
||||||
UINT32 mNumberToFinish;
|
UINT32 mNumberToFinish;
|
||||||
|
@@ -1210,6 +1210,7 @@ InitializeSmmCpuSemaphores (
|
|||||||
UINTN TotalSize;
|
UINTN TotalSize;
|
||||||
UINTN GlobalSemaphoresSize;
|
UINTN GlobalSemaphoresSize;
|
||||||
UINTN CpuSemaphoresSize;
|
UINTN CpuSemaphoresSize;
|
||||||
|
UINTN MsrSemahporeSize;
|
||||||
UINTN SemaphoreSize;
|
UINTN SemaphoreSize;
|
||||||
UINTN Pages;
|
UINTN Pages;
|
||||||
UINTN *SemaphoreBlock;
|
UINTN *SemaphoreBlock;
|
||||||
@@ -1219,7 +1220,8 @@ InitializeSmmCpuSemaphores (
|
|||||||
ProcessorCount = gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus;
|
ProcessorCount = gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus;
|
||||||
GlobalSemaphoresSize = (sizeof (SMM_CPU_SEMAPHORE_GLOBAL) / sizeof (VOID *)) * SemaphoreSize;
|
GlobalSemaphoresSize = (sizeof (SMM_CPU_SEMAPHORE_GLOBAL) / sizeof (VOID *)) * SemaphoreSize;
|
||||||
CpuSemaphoresSize = (sizeof (SMM_CPU_SEMAPHORE_CPU) / sizeof (VOID *)) * ProcessorCount * SemaphoreSize;
|
CpuSemaphoresSize = (sizeof (SMM_CPU_SEMAPHORE_CPU) / sizeof (VOID *)) * ProcessorCount * SemaphoreSize;
|
||||||
TotalSize = GlobalSemaphoresSize + CpuSemaphoresSize;
|
MsrSemahporeSize = MSR_SPIN_LOCK_INIT_NUM * SemaphoreSize;
|
||||||
|
TotalSize = GlobalSemaphoresSize + CpuSemaphoresSize + MsrSemahporeSize;
|
||||||
DEBUG((EFI_D_INFO, "One Semaphore Size = 0x%x\n", SemaphoreSize));
|
DEBUG((EFI_D_INFO, "One Semaphore Size = 0x%x\n", SemaphoreSize));
|
||||||
DEBUG((EFI_D_INFO, "Total Semaphores Size = 0x%x\n", TotalSize));
|
DEBUG((EFI_D_INFO, "Total Semaphores Size = 0x%x\n", TotalSize));
|
||||||
Pages = EFI_SIZE_TO_PAGES (TotalSize);
|
Pages = EFI_SIZE_TO_PAGES (TotalSize);
|
||||||
@@ -1246,6 +1248,12 @@ InitializeSmmCpuSemaphores (
|
|||||||
SemaphoreAddr += ProcessorCount * SemaphoreSize;
|
SemaphoreAddr += ProcessorCount * SemaphoreSize;
|
||||||
mSmmCpuSemaphores.SemaphoreCpu.Present = (BOOLEAN *)SemaphoreAddr;
|
mSmmCpuSemaphores.SemaphoreCpu.Present = (BOOLEAN *)SemaphoreAddr;
|
||||||
|
|
||||||
|
SemaphoreAddr = (UINTN)SemaphoreBlock + GlobalSemaphoresSize + CpuSemaphoresSize;
|
||||||
|
mSmmCpuSemaphores.SemaphoreMsr.Msr = (SPIN_LOCK *)SemaphoreAddr;
|
||||||
|
mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter =
|
||||||
|
((UINTN)SemaphoreBlock + Pages * SIZE_4KB - SemaphoreAddr) / SemaphoreSize;
|
||||||
|
ASSERT (mSmmCpuSemaphores.SemaphoreMsr.AvailableCounter >= MSR_SPIN_LOCK_INIT_NUM);
|
||||||
|
|
||||||
mSmmMpSyncData->Counter = mSmmCpuSemaphores.SemaphoreGlobal.Counter;
|
mSmmMpSyncData->Counter = mSmmCpuSemaphores.SemaphoreGlobal.Counter;
|
||||||
mSmmMpSyncData->InsideSmm = mSmmCpuSemaphores.SemaphoreGlobal.InsideSmm;
|
mSmmMpSyncData->InsideSmm = mSmmCpuSemaphores.SemaphoreGlobal.InsideSmm;
|
||||||
mSmmMpSyncData->AllCpusInSync = mSmmCpuSemaphores.SemaphoreGlobal.AllCpusInSync;
|
mSmmMpSyncData->AllCpusInSync = mSmmCpuSemaphores.SemaphoreGlobal.AllCpusInSync;
|
||||||
|
@@ -323,6 +323,8 @@ typedef struct {
|
|||||||
volatile BOOLEAN *CandidateBsp;
|
volatile BOOLEAN *CandidateBsp;
|
||||||
} SMM_DISPATCHER_MP_SYNC_DATA;
|
} SMM_DISPATCHER_MP_SYNC_DATA;
|
||||||
|
|
||||||
|
#define MSR_SPIN_LOCK_INIT_NUM 15
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SPIN_LOCK SpinLock;
|
SPIN_LOCK SpinLock;
|
||||||
UINT32 MsrIndex;
|
UINT32 MsrIndex;
|
||||||
@@ -375,6 +377,13 @@ typedef struct {
|
|||||||
volatile BOOLEAN *Present;
|
volatile BOOLEAN *Present;
|
||||||
} SMM_CPU_SEMAPHORE_CPU;
|
} SMM_CPU_SEMAPHORE_CPU;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// All MSRs semaphores' pointer and counter
|
||||||
|
///
|
||||||
|
typedef struct {
|
||||||
|
SPIN_LOCK *Msr;
|
||||||
|
UINTN AvailableCounter;
|
||||||
|
} SMM_CPU_SEMAPHORE_MSR;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// All semaphores' information
|
/// All semaphores' information
|
||||||
@@ -382,6 +391,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
SMM_CPU_SEMAPHORE_GLOBAL SemaphoreGlobal;
|
SMM_CPU_SEMAPHORE_GLOBAL SemaphoreGlobal;
|
||||||
SMM_CPU_SEMAPHORE_CPU SemaphoreCpu;
|
SMM_CPU_SEMAPHORE_CPU SemaphoreCpu;
|
||||||
|
SMM_CPU_SEMAPHORE_MSR SemaphoreMsr;
|
||||||
} SMM_CPU_SEMAPHORES;
|
} SMM_CPU_SEMAPHORES;
|
||||||
|
|
||||||
extern IA32_DESCRIPTOR gcSmiGdtr;
|
extern IA32_DESCRIPTOR gcSmiGdtr;
|
||||||
|
Reference in New Issue
Block a user