]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg: Refactor initialization of CPU features during S3 resume
authorLou, Yun <Yun.Lou@intel.com>
Thu, 16 Sep 2021 09:27:11 +0000 (17:27 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 16 Sep 2021 12:50:06 +0000 (12:50 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3621
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3631

Refactor initialization of CPU features during S3 resume.

In addition, the macro ACPI_CPU_DATA_STRUCTURE_UPDATE is used to fix
incompatibility issue caused by ACPI_CPU_DATA structure update. It will
be removed after all the platform code uses new ACPI_CPU_DATA structure.

Signed-off-by: Jason Lou <yun.lou@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
OvmfPkg/CpuS3DataDxe/CpuS3Data.c
UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
UefiCpuPkg/Include/AcpiCpuData.h
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c

index 5ffe1f3cd74e49f6e052bc2d6d628f0ae409db03..de20d875670c14c2a9e636c9cd5acbdadeba4dca 100644 (file)
@@ -9,7 +9,7 @@ number of CPUs reported by the MP Services Protocol, so this module does not
 support hot plug CPUs.  This module can be copied into a CPU specific package\r
 and customized if these additional features are required.\r
 \r
-Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>\r
 Copyright (c) 2015 - 2020, Red Hat, Inc.\r
 \r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -252,10 +252,7 @@ CpuS3DataInitialize (
   AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt;\r
 \r
   if (OldAcpiCpuData != NULL) {\r
-    AcpiCpuData->RegisterTable           = OldAcpiCpuData->RegisterTable;\r
-    AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData->PreSmmInitRegisterTable;\r
-    AcpiCpuData->ApLocation              = OldAcpiCpuData->ApLocation;\r
-    CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMATION));\r
+    CopyMem (&AcpiCpuData->CpuFeatureInitData, &OldAcpiCpuData->CpuFeatureInitData, sizeof (CPU_FEATURE_INIT_DATA));\r
   }\r
 \r
   //\r
index 078af36cfb41104adb1be6e2b2bacc4a335cacdd..61ec7c44b217745cf7e80f6b7455d6e90f916390 100644 (file)
@@ -9,7 +9,7 @@ number of CPUs reported by the MP Services Protocol, so this module does not
 support hot plug CPUs.  This module can be copied into a CPU specific package\r
 and customized if these additional features are required.\r
 \r
-Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>\r
 Copyright (c) 2015, Red Hat, Inc.\r
 \r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -247,10 +247,7 @@ CpuS3DataInitialize (
   AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt;\r
 \r
   if (OldAcpiCpuData != NULL) {\r
-    AcpiCpuData->RegisterTable           = OldAcpiCpuData->RegisterTable;\r
-    AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData->PreSmmInitRegisterTable;\r
-    AcpiCpuData->ApLocation              = OldAcpiCpuData->ApLocation;\r
-    CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMATION));\r
+    CopyMem (&AcpiCpuData->CpuFeatureInitData, &OldAcpiCpuData->CpuFeatureInitData, sizeof (CPU_FEATURE_INIT_DATA));\r
   }\r
 \r
   //\r
index 62a01b2c6baccc1e16c67d6c27f82e5ed30dd54c..659821072d0d74cdddfc180fd684c32aadb0f2bc 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Definitions for CPU S3 data.\r
 \r
-Copyright (c) 2013 - 2020, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -9,6 +9,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #ifndef _ACPI_CPU_DATA_H_\r
 #define _ACPI_CPU_DATA_H_\r
 \r
+//\r
+// This macro definition is used to fix incompatibility issue caused by\r
+// ACPI_CPU_DATA structure update. It will be removed after all the platform\r
+// code uses new ACPI_CPU_DATA structure.\r
+//\r
+#define ACPI_CPU_DATA_STRUCTURE_UPDATE\r
+\r
 //\r
 // Register types in register table\r
 //\r
@@ -118,6 +125,49 @@ typedef struct {
   EFI_PHYSICAL_ADDRESS      RegisterTableEntry;\r
 } CPU_REGISTER_TABLE;\r
 \r
+//\r
+// Data structure that is used for CPU feature initialization during ACPI S3\r
+// resume.\r
+//\r
+typedef struct {\r
+  //\r
+  // Physical address of an array of CPU_REGISTER_TABLE structures, with\r
+  // NumberOfCpus entries.  If a register table is not required, then the\r
+  // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.\r
+  // If TableLength is > 0, then elements of RegisterTableEntry are used to\r
+  // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,\r
+  // before SMBASE relocation is performed.\r
+  // If a register table is not required for any one of the CPUs, then\r
+  // PreSmmInitRegisterTable may be set to 0.\r
+  //\r
+  EFI_PHYSICAL_ADDRESS    PreSmmInitRegisterTable;\r
+  //\r
+  // Physical address of an array of CPU_REGISTER_TABLE structures, with\r
+  // NumberOfCpus entries.  If a register table is not required, then the\r
+  // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.\r
+  // If TableLength is > 0, then elements of RegisterTableEntry are used to\r
+  // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,\r
+  // after SMBASE relocation is performed.\r
+  // If a register table is not required for any one of the CPUs, then\r
+  // RegisterTable may be set to 0.\r
+  //\r
+  EFI_PHYSICAL_ADDRESS    RegisterTable;\r
+  //\r
+  // CPU information which is required when set the register table.\r
+  //\r
+  CPU_STATUS_INFORMATION  CpuStatus;\r
+  //\r
+  // Location info for each AP.\r
+  // It points to an array which saves all APs location info.\r
+  // The array count is the AP count in this CPU.\r
+  //\r
+  // If the platform does not support MSR setting at S3 resume, and\r
+  // therefore it doesn't need the dependency semaphores, it should set\r
+  // this field to 0.\r
+  //\r
+  EFI_PHYSICAL_ADDRESS    ApLocation;\r
+} CPU_FEATURE_INIT_DATA;\r
+\r
 //\r
 // Data structure that is required for ACPI S3 resume. The PCD\r
 // PcdCpuS3DataAddress must be set to the physical address where this structure\r
@@ -172,28 +222,6 @@ typedef struct {
   //\r
   EFI_PHYSICAL_ADDRESS  MtrrTable;\r
   //\r
-  // Physical address of an array of CPU_REGISTER_TABLE structures, with\r
-  // NumberOfCpus entries.  If a register table is not required, then the\r
-  // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.\r
-  // If TableLength is > 0, then elements of RegisterTableEntry are used to\r
-  // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,\r
-  // before SMBASE relocation is performed.\r
-  // If a register table is not required for any one of the CPUs, then\r
-  // PreSmmInitRegisterTable may be set to 0.\r
-  //\r
-  EFI_PHYSICAL_ADDRESS  PreSmmInitRegisterTable;\r
-  //\r
-  // Physical address of an array of CPU_REGISTER_TABLE structures, with\r
-  // NumberOfCpus entries.  If a register table is not required, then the\r
-  // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.\r
-  // If TableLength is > 0, then elements of RegisterTableEntry are used to\r
-  // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,\r
-  // after SMBASE relocation is performed.\r
-  // If a register table is not required for any one of the CPUs, then\r
-  // RegisterTable may be set to 0.\r
-  //\r
-  EFI_PHYSICAL_ADDRESS  RegisterTable;\r
-  //\r
   // Physical address of a buffer that contains the machine check handler that\r
   // is used during an ACPI S3 Resume.  In order for this machine check\r
   // handler to be active on an AP during an ACPI S3 resume, the machine check\r
@@ -208,19 +236,10 @@ typedef struct {
   //\r
   UINT32                ApMachineCheckHandlerSize;\r
   //\r
-  // CPU information which is required when set the register table.\r
-  //\r
-  CPU_STATUS_INFORMATION     CpuStatus;\r
-  //\r
-  // Location info for each AP.\r
-  // It points to an array which saves all APs location info.\r
-  // The array count is the AP count in this CPU.\r
-  //\r
-  // If the platform does not support MSR setting at S3 resume, and\r
-  // therefore it doesn't need the dependency semaphores, it should set\r
-  // this field to 0.\r
+  // Data structure that is used for CPU feature initialization during ACPI S3\r
+  // resume.\r
   //\r
-  EFI_PHYSICAL_ADDRESS  ApLocation;\r
+  CPU_FEATURE_INIT_DATA CpuFeatureInitData;\r
 } ACPI_CPU_DATA;\r
 \r
 #endif\r
index 57511c4efa7c3ec189240bf26f8e5ff58963fad3..6e2ab7951821b76444b1597e015c9770e7d39053 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   CPU Features Initialize functions.\r
 \r
-  Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -152,10 +152,10 @@ CpuInitDataInitialize (
   ASSERT (AcpiCpuData != NULL);\r
   CpuFeaturesData->AcpiCpuData= AcpiCpuData;\r
 \r
-  CpuStatus = &AcpiCpuData->CpuStatus;\r
+  CpuStatus = &AcpiCpuData->CpuFeatureInitData.CpuStatus;\r
   Location = AllocateZeroPool (sizeof (EFI_CPU_PHYSICAL_LOCATION) * NumberOfCpus);\r
   ASSERT (Location != NULL);\r
-  AcpiCpuData->ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)Location;\r
+  AcpiCpuData->CpuFeatureInitData.ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)Location;\r
 \r
   for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {\r
     InitOrder = &CpuFeaturesData->InitOrder[ProcessorNumber];\r
@@ -1131,7 +1131,7 @@ SetProcessorRegister (
   CpuFeaturesData = (CPU_FEATURES_DATA *) Buffer;\r
   AcpiCpuData = CpuFeaturesData->AcpiCpuData;\r
 \r
-  RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable;\r
+  RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->CpuFeatureInitData.RegisterTable;\r
 \r
   InitApicId = GetInitialApicId ();\r
   RegisterTable = NULL;\r
@@ -1147,8 +1147,8 @@ SetProcessorRegister (
 \r
   ProgramProcessorRegister (\r
     RegisterTable,\r
-    (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->ApLocation + ProcIndex,\r
-    &AcpiCpuData->CpuStatus,\r
+    (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->CpuFeatureInitData.ApLocation + ProcIndex,\r
+    &AcpiCpuData->CpuFeatureInitData.CpuStatus,\r
     &CpuFeaturesData->CpuFlags\r
     );\r
 }\r
index 60daa5cc87f0cfdb2d93f71b02c6ae114e028cd9..e6ef9c602deeab3abaaaa26d4d60b479e4ad4da0 100644 (file)
@@ -952,8 +952,8 @@ GetAcpiCpuData (
     AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;\r
   }\r
 \r
-  if (AcpiCpuData->RegisterTable == 0 ||\r
-      AcpiCpuData->PreSmmInitRegisterTable == 0) {\r
+  if (AcpiCpuData->CpuFeatureInitData.RegisterTable == 0 ||\r
+      AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable == 0) {\r
     //\r
     // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs\r
     //\r
@@ -976,11 +976,11 @@ GetAcpiCpuData (
       RegisterTable[NumberOfCpus + Index].AllocatedSize      = 0;\r
       RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;\r
     }\r
-    if (AcpiCpuData->RegisterTable == 0) {\r
-      AcpiCpuData->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;\r
+    if (AcpiCpuData->CpuFeatureInitData.RegisterTable == 0) {\r
+      AcpiCpuData->CpuFeatureInitData.RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;\r
     }\r
-    if (AcpiCpuData->PreSmmInitRegisterTable == 0) {\r
-      AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);\r
+    if (AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable == 0) {\r
+      AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);\r
     }\r
   }\r
 \r
@@ -1063,9 +1063,9 @@ CpuRegisterTableWriteWorker (
   CpuFeaturesData = GetCpuFeaturesData ();\r
   if (CpuFeaturesData->RegisterTable == NULL) {\r
     AcpiCpuData = GetAcpiCpuData ();\r
-    ASSERT ((AcpiCpuData != NULL) && (AcpiCpuData->RegisterTable != 0));\r
-    CpuFeaturesData->RegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->RegisterTable;\r
-    CpuFeaturesData->PreSmmRegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->PreSmmInitRegisterTable;\r
+    ASSERT ((AcpiCpuData != NULL) && (AcpiCpuData->CpuFeatureInitData.RegisterTable != 0));\r
+    CpuFeaturesData->RegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->CpuFeatureInitData.RegisterTable;\r
+    CpuFeaturesData->PreSmmRegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable;\r
   }\r
 \r
   if (PreSmmFlag) {\r
index ab7f39aa2bd4b7770f45ff1cf93c715e1cbb70ed..2873cba08357c1f4225346daf7708b71d3f6d3b3 100644 (file)
@@ -476,16 +476,19 @@ SetRegister (
   IN BOOLEAN                 PreSmmRegisterTable\r
   )\r
 {\r
+  CPU_FEATURE_INIT_DATA     *FeatureInitData;\r
   CPU_REGISTER_TABLE        *RegisterTable;\r
   CPU_REGISTER_TABLE        *RegisterTables;\r
   UINT32                    InitApicId;\r
   UINTN                     ProcIndex;\r
   UINTN                     Index;\r
 \r
+  FeatureInitData = &mAcpiCpuData.CpuFeatureInitData;\r
+\r
   if (PreSmmRegisterTable) {\r
-    RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.PreSmmInitRegisterTable;\r
+    RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)FeatureInitData->PreSmmInitRegisterTable;\r
   } else {\r
-    RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.RegisterTable;\r
+    RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)FeatureInitData->RegisterTable;\r
   }\r
   if (RegisterTables == NULL) {\r
     return;\r
@@ -503,18 +506,18 @@ SetRegister (
   }\r
   ASSERT (RegisterTable != NULL);\r
 \r
-  if (mAcpiCpuData.ApLocation != 0) {\r
+  if (FeatureInitData->ApLocation != 0) {\r
     ProgramProcessorRegister (\r
       RegisterTable,\r
-      (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)mAcpiCpuData.ApLocation + ProcIndex,\r
-      &mAcpiCpuData.CpuStatus,\r
+      (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)FeatureInitData->ApLocation + ProcIndex,\r
+      &FeatureInitData->CpuStatus,\r
       &mCpuFlags\r
       );\r
   } else {\r
     ProgramProcessorRegister (\r
       RegisterTable,\r
       NULL,\r
-      &mAcpiCpuData.CpuStatus,\r
+      &FeatureInitData->CpuStatus,\r
       &mCpuFlags\r
       );\r
   }\r
@@ -1010,6 +1013,71 @@ IsRegisterTableEmpty (
   return TRUE;\r
 }\r
 \r
+/**\r
+  Copy the data used to initialize processor register into SMRAM.\r
+\r
+  @param[in,out]  CpuFeatureInitDataDst   Pointer to the destination CPU_FEATURE_INIT_DATA structure.\r
+  @param[in]      CpuFeatureInitDataSrc   Pointer to the source CPU_FEATURE_INIT_DATA structure.\r
+\r
+**/\r
+VOID\r
+CopyCpuFeatureInitDatatoSmram (\r
+  IN OUT CPU_FEATURE_INIT_DATA    *CpuFeatureInitDataDst,\r
+  IN     CPU_FEATURE_INIT_DATA    *CpuFeatureInitDataSrc\r
+  )\r
+{\r
+  CPU_STATUS_INFORMATION    *CpuStatus;\r
+\r
+  if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->PreSmmInitRegisterTable, mAcpiCpuData.NumberOfCpus)) {\r
+    CpuFeatureInitDataDst->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));\r
+    ASSERT (CpuFeatureInitDataDst->PreSmmInitRegisterTable != 0);\r
+\r
+    CopyRegisterTable (\r
+      (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataDst->PreSmmInitRegisterTable,\r
+      (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->PreSmmInitRegisterTable,\r
+      mAcpiCpuData.NumberOfCpus\r
+      );\r
+  }\r
+\r
+  if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->RegisterTable, mAcpiCpuData.NumberOfCpus)) {\r
+    CpuFeatureInitDataDst->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));\r
+    ASSERT (CpuFeatureInitDataDst->RegisterTable != 0);\r
+\r
+    CopyRegisterTable (\r
+      (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataDst->RegisterTable,\r
+      (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->RegisterTable,\r
+      mAcpiCpuData.NumberOfCpus\r
+      );\r
+  }\r
+\r
+  CpuStatus = &CpuFeatureInitDataDst->CpuStatus;\r
+  CopyMem (CpuStatus, &CpuFeatureInitDataSrc->CpuStatus, sizeof (CPU_STATUS_INFORMATION));\r
+\r
+  if (CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerPackage != 0) {\r
+    CpuStatus->ThreadCountPerPackage = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (\r
+                                            sizeof (UINT32) * CpuStatus->PackageCount,\r
+                                            (UINT32 *)(UINTN)CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerPackage\r
+                                            );\r
+    ASSERT (CpuStatus->ThreadCountPerPackage != 0);\r
+  }\r
+\r
+  if (CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerCore != 0) {\r
+    CpuStatus->ThreadCountPerCore = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (\r
+                                            sizeof (UINT8) * (CpuStatus->PackageCount * CpuStatus->MaxCoreCount),\r
+                                            (UINT32 *)(UINTN)CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerCore\r
+                                            );\r
+    ASSERT (CpuStatus->ThreadCountPerCore != 0);\r
+  }\r
+\r
+  if (CpuFeatureInitDataSrc->ApLocation != 0) {\r
+    CpuFeatureInitDataDst->ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (\r
+                                mAcpiCpuData.NumberOfCpus * sizeof (EFI_CPU_PHYSICAL_LOCATION),\r
+                                (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)CpuFeatureInitDataSrc->ApLocation\r
+                                );\r
+    ASSERT (CpuFeatureInitDataDst->ApLocation != 0);\r
+  }\r
+}\r
+\r
 /**\r
   Get ACPI CPU data.\r
 \r
@@ -1064,39 +1132,13 @@ GetAcpiCpuData (
 \r
   CopyMem ((VOID *)(UINTN)mAcpiCpuData.IdtrProfile, (VOID *)(UINTN)AcpiCpuData->IdtrProfile, sizeof (IA32_DESCRIPTOR));\r
 \r
-  if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->PreSmmInitRegisterTable, mAcpiCpuData.NumberOfCpus)) {\r
-    mAcpiCpuData.PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));\r
-    ASSERT (mAcpiCpuData.PreSmmInitRegisterTable != 0);\r
-\r
-    CopyRegisterTable (\r
-      (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.PreSmmInitRegisterTable,\r
-      (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->PreSmmInitRegisterTable,\r
-      mAcpiCpuData.NumberOfCpus\r
-      );\r
-  } else {\r
-    mAcpiCpuData.PreSmmInitRegisterTable = 0;\r
-  }\r
-\r
-  if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable, mAcpiCpuData.NumberOfCpus)) {\r
-    mAcpiCpuData.RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));\r
-    ASSERT (mAcpiCpuData.RegisterTable != 0);\r
-\r
-    CopyRegisterTable (\r
-      (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.RegisterTable,\r
-      (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable,\r
-      mAcpiCpuData.NumberOfCpus\r
-      );\r
-  } else {\r
-    mAcpiCpuData.RegisterTable = 0;\r
-  }\r
-\r
   //\r
   // Copy AP's GDT, IDT and Machine Check handler into SMRAM.\r
   //\r
   Gdtr = (IA32_DESCRIPTOR *)(UINTN)mAcpiCpuData.GdtrProfile;\r
   Idtr = (IA32_DESCRIPTOR *)(UINTN)mAcpiCpuData.IdtrProfile;\r
 \r
-  GdtForAp = AllocatePool ((Gdtr->Limit + 1) + (Idtr->Limit + 1) +  mAcpiCpuData.ApMachineCheckHandlerSize);\r
+  GdtForAp = AllocatePool ((Gdtr->Limit + 1) + (Idtr->Limit + 1) + mAcpiCpuData.ApMachineCheckHandlerSize);\r
   ASSERT (GdtForAp != NULL);\r
   IdtForAp = (VOID *) ((UINTN)GdtForAp + (Gdtr->Limit + 1));\r
   MachineCheckHandlerForAp = (VOID *) ((UINTN)IdtForAp + (Idtr->Limit + 1));\r
@@ -1109,41 +1151,23 @@ GetAcpiCpuData (
   Idtr->Base = (UINTN)IdtForAp;\r
   mAcpiCpuData.ApMachineCheckHandlerBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MachineCheckHandlerForAp;\r
 \r
-  CpuStatus = &mAcpiCpuData.CpuStatus;\r
-  CopyMem (CpuStatus, &AcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMATION));\r
-  if (AcpiCpuData->CpuStatus.ThreadCountPerPackage != 0) {\r
-    CpuStatus->ThreadCountPerPackage = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (\r
-                                            sizeof (UINT32) * CpuStatus->PackageCount,\r
-                                            (UINT32 *)(UINTN)AcpiCpuData->CpuStatus.ThreadCountPerPackage\r
-                                            );\r
-    ASSERT (CpuStatus->ThreadCountPerPackage != 0);\r
-  }\r
-  if (AcpiCpuData->CpuStatus.ThreadCountPerCore != 0) {\r
-    CpuStatus->ThreadCountPerCore = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (\r
-                                            sizeof (UINT8) * (CpuStatus->PackageCount * CpuStatus->MaxCoreCount),\r
-                                            (UINT32 *)(UINTN)AcpiCpuData->CpuStatus.ThreadCountPerCore\r
-                                            );\r
-    ASSERT (CpuStatus->ThreadCountPerCore != 0);\r
-  }\r
-  if (AcpiCpuData->ApLocation != 0) {\r
-    mAcpiCpuData.ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (\r
-                                mAcpiCpuData.NumberOfCpus * sizeof (EFI_CPU_PHYSICAL_LOCATION),\r
-                                (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->ApLocation\r
-                                );\r
-    ASSERT (mAcpiCpuData.ApLocation != 0);\r
-  }\r
-  if (CpuStatus->PackageCount != 0) {\r
-    mCpuFlags.CoreSemaphoreCount = AllocateZeroPool (\r
-                                     sizeof (UINT32) * CpuStatus->PackageCount *\r
-                                     CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
-                                     );\r
-    ASSERT (mCpuFlags.CoreSemaphoreCount != NULL);\r
-    mCpuFlags.PackageSemaphoreCount = AllocateZeroPool (\r
-                                        sizeof (UINT32) * CpuStatus->PackageCount *\r
-                                        CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
-                                        );\r
-    ASSERT (mCpuFlags.PackageSemaphoreCount != NULL);\r
-  }\r
+  ZeroMem (&mAcpiCpuData.CpuFeatureInitData, sizeof (CPU_FEATURE_INIT_DATA));\r
+  CopyCpuFeatureInitDatatoSmram (&mAcpiCpuData.CpuFeatureInitData, &AcpiCpuData->CpuFeatureInitData);\r
+\r
+  CpuStatus = &mAcpiCpuData.CpuFeatureInitData.CpuStatus;\r
+\r
+  mCpuFlags.CoreSemaphoreCount = AllocateZeroPool (\r
+                                   sizeof (UINT32) * CpuStatus->PackageCount *\r
+                                   CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount\r
+                                   );\r
+  ASSERT (mCpuFlags.CoreSemaphoreCount != NULL);\r
+\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