]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
UefiCpuPkg: Prevent from re-initializing CPU features during S3 resume
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / CpuS3.c
index 2873cba08357c1f4225346daf7708b71d3f6d3b3..2496abb3923ff9e2655cc30c80b7591682b86f0e 100644 (file)
@@ -1152,23 +1152,31 @@ GetAcpiCpuData (
   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