#include <Protocol/SmmCpu.h>\r
#include <Protocol/LoadedImage.h>\r
#include <Protocol/SmmCpuSaveState.h>\r
+#include <Protocol/MpService.h>\r
\r
///\r
/// Structure for tracking paired information of registered Framework SMI handler\r
EFI_GUID mEfiSmmCpuIoGuid = EFI_SMM_CPU_IO_GUID;\r
EFI_SMM_BASE_HELPER_READY_PROTOCOL *mSmmBaseHelperReady;\r
EFI_SMM_SYSTEM_TABLE *mFrameworkSmst;\r
+UINTN mNumberOfProcessors;\r
\r
LIST_ENTRY mCallbackInfoListHead = INITIALIZE_LIST_HEAD_VARIABLE (mCallbackInfoListHead);\r
\r
FrameworkSmst->Hdr.Revision = EFI_SMM_SYSTEM_TABLE_REVISION;\r
CopyGuid (&FrameworkSmst->EfiSmmCpuIoGuid, &mEfiSmmCpuIoGuid);\r
\r
- FrameworkSmst->CpuSaveState = (EFI_SMM_CPU_SAVE_STATE *)AllocateZeroPool (gSmst->NumberOfCpus * sizeof (EFI_SMM_CPU_SAVE_STATE));\r
+ FrameworkSmst->CpuSaveState = (EFI_SMM_CPU_SAVE_STATE *)AllocateZeroPool (mNumberOfProcessors * sizeof (EFI_SMM_CPU_SAVE_STATE));\r
ASSERT (FrameworkSmst->CpuSaveState != NULL);\r
\r
///\r
/// and MP states in the Framework SMST.\r
///\r
\r
- for (CpuIndex = 0; CpuIndex < gSmst->NumberOfCpus; CpuIndex++) {\r
+ for (CpuIndex = 0; CpuIndex < mNumberOfProcessors; CpuIndex++) {\r
State = (EFI_SMM_CPU_STATE *)gSmst->CpuSaveState[CpuIndex];\r
SaveState = &mFrameworkSmst->CpuSaveState[CpuIndex].Ia32SaveState;\r
\r
///\r
/// Save CPU Save States in case any of them was modified\r
///\r
- for (CpuIndex = 0; CpuIndex < gSmst->NumberOfCpus; CpuIndex++) {\r
+ for (CpuIndex = 0; CpuIndex < mNumberOfProcessors; CpuIndex++) {\r
for (Index = 0; Index < sizeof (mCpuSaveStateConvTable) / sizeof (CPU_SAVE_STATE_CONVERSION); Index++) {\r
Status = mSmmCpu->WriteSaveState (\r
mSmmCpu,\r
)\r
{\r
EFI_STATUS Status;\r
+ EFI_MP_SERVICES_PROTOCOL *MpServices;\r
EFI_HANDLE Handle = NULL;\r
+ UINTN NumberOfEnabledProcessors;\r
\r
///\r
/// Locate SMM CPU Protocol which is used later to retrieve/update CPU Save States\r
Status = gSmst->SmmLocateProtocol (&gEfiSmmCpuProtocolGuid, NULL, (VOID **) &mSmmCpu);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ //\r
+ // Get MP Services Protocol\r
+ //\r
+ Status = SystemTable->BootServices->LocateProtocol (&gEfiMpServiceProtocolGuid, NULL, (VOID **)&MpServices);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Use MP Services Protocol to retrieve the number of processors and number of enabled processors\r
+ //\r
+ Status = MpServices->GetNumberOfProcessors (MpServices, &mNumberOfProcessors, &NumberOfEnabledProcessors);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
///\r
/// Interface structure of SMM BASE Helper Ready Protocol is allocated from UEFI pool\r
/// instead of SMM pool so that SMM Base Thunk driver can access it in Non-SMM mode.\r