mAcpiCpuData.ApMachineCheckHandlerBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MachineCheckHandlerForAp;\r
\r
ZeroMem (&mAcpiCpuData.CpuFeatureInitData, sizeof (CPU_FEATURE_INIT_DATA));\r
- CopyCpuFeatureInitDatatoSmram (&mAcpiCpuData.CpuFeatureInitData, &AcpiCpuData->CpuFeatureInitData);\r
\r
- CpuStatus = &mAcpiCpuData.CpuFeatureInitData.CpuStatus;\r
+ if (!PcdGetBool (PcdCpuFeaturesInitOnS3Resume)) {\r
+ //\r
+ // If the CPU features will not be initialized by CpuFeaturesPei module during\r
+ // next ACPI S3 resume, copy the CPU features initialization data into SMRAM,\r
+ // which will be consumed in SmmRestoreCpu during next S3 resume.\r
+ //\r
+ CopyCpuFeatureInitDatatoSmram (&mAcpiCpuData.CpuFeatureInitData, &AcpiCpuData->CpuFeatureInitData);\r
\r
- mCpuFlags.CoreSemaphoreCount = AllocateZeroPool (\r
- sizeof (UINT32) * CpuStatus->PackageCount *\r
- CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
- );\r
- ASSERT (mCpuFlags.CoreSemaphoreCount != NULL);\r
+ CpuStatus = &mAcpiCpuData.CpuFeatureInitData.CpuStatus;\r
\r
- mCpuFlags.PackageSemaphoreCount = AllocateZeroPool (\r
- sizeof (UINT32) * CpuStatus->PackageCount *\r
- CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
- );\r
- ASSERT (mCpuFlags.PackageSemaphoreCount != NULL);\r
+ mCpuFlags.CoreSemaphoreCount = AllocateZeroPool (\r
+ sizeof (UINT32) * CpuStatus->PackageCount *\r
+ CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
+ );\r
+ ASSERT (mCpuFlags.CoreSemaphoreCount != NULL);\r
\r
- InitializeSpinLock((SPIN_LOCK*) &mCpuFlags.MemoryMappedLock);\r
+ mCpuFlags.PackageSemaphoreCount = AllocateZeroPool (\r
+ sizeof (UINT32) * CpuStatus->PackageCount *\r
+ CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
+ );\r
+ ASSERT (mCpuFlags.PackageSemaphoreCount != NULL);\r
+\r
+ InitializeSpinLock((SPIN_LOCK*) &mCpuFlags.MemoryMappedLock);\r
+ }\r
}\r
\r
/**\r