[PATCH v2 1/2] UefiCpuPkg: Refactor initialization of CPU features during S3 resume


Jason Lou
 

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3621
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3631

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>
Cc: 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 | 7 +-
UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 7 +-
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c | 12 +-
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c | 18 +=
--
UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 160 +=
++++++++++---------
UefiCpuPkg/Include/AcpiCpuData.h | 91 +=
+++++-----
6 files changed, 167 insertions(+), 128 deletions(-)

diff --git a/OvmfPkg/CpuS3DataDxe/CpuS3Data.c b/OvmfPkg/CpuS3DataDxe/CpuS3D=
ata.c
index 5ffe1f3cd7..de20d87567 100644
--- a/OvmfPkg/CpuS3DataDxe/CpuS3Data.c
+++ b/OvmfPkg/CpuS3DataDxe/CpuS3Data.c
@@ -9,7 +9,7 @@ number of CPUs reported by the MP Services Protocol, so thi=
s module does not
support hot plug CPUs. This module can be copied into a CPU specific pack=
age=0D
and customized if these additional features are required.=0D
=0D
-Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>=0D
+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>=0D
Copyright (c) 2015 - 2020, Red Hat, Inc.=0D
=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
@@ -252,10 +252,7 @@ CpuS3DataInitialize (
AcpiCpuDataEx->IdtrProfile.Base =3D (UINTN)Idt;=0D
=0D
if (OldAcpiCpuData !=3D NULL) {=0D
- AcpiCpuData->RegisterTable =3D OldAcpiCpuData->RegisterTable=
;=0D
- AcpiCpuData->PreSmmInitRegisterTable =3D OldAcpiCpuData->PreSmmInitReg=
isterTable;=0D
- AcpiCpuData->ApLocation =3D OldAcpiCpuData->ApLocation;=0D
- CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus, sizeof (=
CPU_STATUS_INFORMATION));=0D
+ CopyMem (&AcpiCpuData->CpuFeatureInitData, &OldAcpiCpuData->CpuFeature=
InitData, sizeof (CPU_FEATURE_INIT_DATA));=0D
}=0D
=0D
//=0D
diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c b/UefiCpuPkg/CpuS3DataDxe/=
CpuS3Data.c
index 078af36cfb..61ec7c44b2 100644
--- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
+++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
@@ -9,7 +9,7 @@ number of CPUs reported by the MP Services Protocol, so thi=
s module does not
support hot plug CPUs. This module can be copied into a CPU specific pack=
age=0D
and customized if these additional features are required.=0D
=0D
-Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>=0D
+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>=0D
Copyright (c) 2015, Red Hat, Inc.=0D
=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
@@ -247,10 +247,7 @@ CpuS3DataInitialize (
AcpiCpuDataEx->IdtrProfile.Base =3D (UINTN)Idt;=0D
=0D
if (OldAcpiCpuData !=3D NULL) {=0D
- AcpiCpuData->RegisterTable =3D OldAcpiCpuData->RegisterTable=
;=0D
- AcpiCpuData->PreSmmInitRegisterTable =3D OldAcpiCpuData->PreSmmInitReg=
isterTable;=0D
- AcpiCpuData->ApLocation =3D OldAcpiCpuData->ApLocation;=0D
- CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus, sizeof (=
CPU_STATUS_INFORMATION));=0D
+ CopyMem (&AcpiCpuData->CpuFeatureInitData, &OldAcpiCpuData->CpuFeature=
InitData, sizeof (CPU_FEATURE_INIT_DATA));=0D
}=0D
=0D
//=0D
diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitializ=
e.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
index 57511c4efa..6e2ab79518 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
@@ -1,7 +1,7 @@
/** @file=0D
CPU Features Initialize functions.=0D
=0D
- Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -152,10 +152,10 @@ CpuInitDataInitialize (
ASSERT (AcpiCpuData !=3D NULL);=0D
CpuFeaturesData->AcpiCpuData=3D AcpiCpuData;=0D
=0D
- CpuStatus =3D &AcpiCpuData->CpuStatus;=0D
+ CpuStatus =3D &AcpiCpuData->CpuFeatureInitData.CpuStatus;=0D
Location =3D AllocateZeroPool (sizeof (EFI_CPU_PHYSICAL_LOCATION) * Numb=
erOfCpus);=0D
ASSERT (Location !=3D NULL);=0D
- AcpiCpuData->ApLocation =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Location;=0D
+ AcpiCpuData->CpuFeatureInitData.ApLocation =3D (EFI_PHYSICAL_ADDRESS)(UI=
NTN)Location;=0D
=0D
for (ProcessorNumber =3D 0; ProcessorNumber < NumberOfCpus; ProcessorNum=
ber++) {=0D
InitOrder =3D &CpuFeaturesData->InitOrder[ProcessorNumber];=0D
@@ -1131,7 +1131,7 @@ SetProcessorRegister (
CpuFeaturesData =3D (CPU_FEATURES_DATA *) Buffer;=0D
AcpiCpuData =3D CpuFeaturesData->AcpiCpuData;=0D
=0D
- RegisterTables =3D (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTab=
le;=0D
+ RegisterTables =3D (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->CpuFeatureI=
nitData.RegisterTable;=0D
=0D
InitApicId =3D GetInitialApicId ();=0D
RegisterTable =3D NULL;=0D
@@ -1147,8 +1147,8 @@ SetProcessorRegister (
=0D
ProgramProcessorRegister (=0D
RegisterTable,=0D
- (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->ApLocation + ProcInde=
x,=0D
- &AcpiCpuData->CpuStatus,=0D
+ (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->CpuFeatureInitData.Ap=
Location + ProcIndex,=0D
+ &AcpiCpuData->CpuFeatureInitData.CpuStatus,=0D
&CpuFeaturesData->CpuFlags=0D
);=0D
}=0D
diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesL=
ib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
index 60daa5cc87..e6ef9c602d 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
@@ -952,8 +952,8 @@ GetAcpiCpuData (
AcpiCpuData->NumberOfCpus =3D (UINT32)NumberOfCpus;=0D
}=0D
=0D
- if (AcpiCpuData->RegisterTable =3D=3D 0 ||=0D
- AcpiCpuData->PreSmmInitRegisterTable =3D=3D 0) {=0D
+ if (AcpiCpuData->CpuFeatureInitData.RegisterTable =3D=3D 0 ||=0D
+ AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable =3D=3D 0) {=
=0D
//=0D
// Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable=
for all CPUs=0D
//=0D
@@ -976,11 +976,11 @@ GetAcpiCpuData (
RegisterTable[NumberOfCpus + Index].AllocatedSize =3D 0;=0D
RegisterTable[NumberOfCpus + Index].RegisterTableEntry =3D 0;=0D
}=0D
- if (AcpiCpuData->RegisterTable =3D=3D 0) {=0D
- AcpiCpuData->RegisterTable =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Register=
Table;=0D
+ if (AcpiCpuData->CpuFeatureInitData.RegisterTable =3D=3D 0) {=0D
+ AcpiCpuData->CpuFeatureInitData.RegisterTable =3D (EFI_PHYSICAL_ADDR=
ESS)(UINTN)RegisterTable;=0D
}=0D
- if (AcpiCpuData->PreSmmInitRegisterTable =3D=3D 0) {=0D
- AcpiCpuData->PreSmmInitRegisterTable =3D (EFI_PHYSICAL_ADDRESS)(UINT=
N)(RegisterTable + NumberOfCpus);=0D
+ if (AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable =3D=3D 0) =
{=0D
+ AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable =3D (EFI_PHY=
SICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);=0D
}=0D
}=0D
=0D
@@ -1063,9 +1063,9 @@ CpuRegisterTableWriteWorker (
CpuFeaturesData =3D GetCpuFeaturesData ();=0D
if (CpuFeaturesData->RegisterTable =3D=3D NULL) {=0D
AcpiCpuData =3D GetAcpiCpuData ();=0D
- ASSERT ((AcpiCpuData !=3D NULL) && (AcpiCpuData->RegisterTable !=3D 0)=
);=0D
- CpuFeaturesData->RegisterTable =3D (CPU_REGISTER_TABLE *) (UINTN) Acpi=
CpuData->RegisterTable;=0D
- CpuFeaturesData->PreSmmRegisterTable =3D (CPU_REGISTER_TABLE *) (UINTN=
) AcpiCpuData->PreSmmInitRegisterTable;=0D
+ ASSERT ((AcpiCpuData !=3D NULL) && (AcpiCpuData->CpuFeatureInitData.Re=
gisterTable !=3D 0));=0D
+ CpuFeaturesData->RegisterTable =3D (CPU_REGISTER_TABLE *) (UINTN) Acpi=
CpuData->CpuFeatureInitData.RegisterTable;=0D
+ CpuFeaturesData->PreSmmRegisterTable =3D (CPU_REGISTER_TABLE *) (UINTN=
) AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable;=0D
}=0D
=0D
if (PreSmmFlag) {=0D
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/=
CpuS3.c
index ab7f39aa2b..2873cba083 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
@@ -476,16 +476,19 @@ SetRegister (
IN BOOLEAN PreSmmRegisterTable=0D
)=0D
{=0D
+ CPU_FEATURE_INIT_DATA *FeatureInitData;=0D
CPU_REGISTER_TABLE *RegisterTable;=0D
CPU_REGISTER_TABLE *RegisterTables;=0D
UINT32 InitApicId;=0D
UINTN ProcIndex;=0D
UINTN Index;=0D
=0D
+ FeatureInitData =3D &mAcpiCpuData.CpuFeatureInitData;=0D
+=0D
if (PreSmmRegisterTable) {=0D
- RegisterTables =3D (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.PreSmmIni=
tRegisterTable;=0D
+ RegisterTables =3D (CPU_REGISTER_TABLE *)(UINTN)FeatureInitData->PreSm=
mInitRegisterTable;=0D
} else {=0D
- RegisterTables =3D (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.RegisterT=
able;=0D
+ RegisterTables =3D (CPU_REGISTER_TABLE *)(UINTN)FeatureInitData->Regis=
terTable;=0D
}=0D
if (RegisterTables =3D=3D NULL) {=0D
return;=0D
@@ -503,18 +506,18 @@ SetRegister (
}=0D
ASSERT (RegisterTable !=3D NULL);=0D
=0D
- if (mAcpiCpuData.ApLocation !=3D 0) {=0D
+ if (FeatureInitData->ApLocation !=3D 0) {=0D
ProgramProcessorRegister (=0D
RegisterTable,=0D
- (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)mAcpiCpuData.ApLocation + ProcIn=
dex,=0D
- &mAcpiCpuData.CpuStatus,=0D
+ (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)FeatureInitData->ApLocation + Pr=
ocIndex,=0D
+ &FeatureInitData->CpuStatus,=0D
&mCpuFlags=0D
);=0D
} else {=0D
ProgramProcessorRegister (=0D
RegisterTable,=0D
NULL,=0D
- &mAcpiCpuData.CpuStatus,=0D
+ &FeatureInitData->CpuStatus,=0D
&mCpuFlags=0D
);=0D
}=0D
@@ -1010,6 +1013,71 @@ IsRegisterTableEmpty (
return TRUE;=0D
}=0D
=0D
+/**=0D
+ Copy the data used to initialize processor register into SMRAM.=0D
+=0D
+ @param[in,out] CpuFeatureInitDataDst Pointer to the destination CPU_F=
EATURE_INIT_DATA structure.=0D
+ @param[in] CpuFeatureInitDataSrc Pointer to the source CPU_FEATUR=
E_INIT_DATA structure.=0D
+=0D
+**/=0D
+VOID=0D
+CopyCpuFeatureInitDatatoSmram (=0D
+ IN OUT CPU_FEATURE_INIT_DATA *CpuFeatureInitDataDst,=0D
+ IN CPU_FEATURE_INIT_DATA *CpuFeatureInitDataSrc=0D
+ )=0D
+{=0D
+ CPU_STATUS_INFORMATION *CpuStatus;=0D
+=0D
+ if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDa=
taSrc->PreSmmInitRegisterTable, mAcpiCpuData.NumberOfCpus)) {=0D
+ CpuFeatureInitDataDst->PreSmmInitRegisterTable =3D (EFI_PHYSICAL_ADDRE=
SS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TA=
BLE));=0D
+ ASSERT (CpuFeatureInitDataDst->PreSmmInitRegisterTable !=3D 0);=0D
+=0D
+ CopyRegisterTable (=0D
+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataDst->PreSmmInitRegist=
erTable,=0D
+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->PreSmmInitRegist=
erTable,=0D
+ mAcpiCpuData.NumberOfCpus=0D
+ );=0D
+ }=0D
+=0D
+ if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDa=
taSrc->RegisterTable, mAcpiCpuData.NumberOfCpus)) {=0D
+ CpuFeatureInitDataDst->RegisterTable =3D (EFI_PHYSICAL_ADDRESS)(UINTN)=
AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));=0D
+ ASSERT (CpuFeatureInitDataDst->RegisterTable !=3D 0);=0D
+=0D
+ CopyRegisterTable (=0D
+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataDst->RegisterTable,=0D
+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->RegisterTable,=0D
+ mAcpiCpuData.NumberOfCpus=0D
+ );=0D
+ }=0D
+=0D
+ CpuStatus =3D &CpuFeatureInitDataDst->CpuStatus;=0D
+ CopyMem (CpuStatus, &CpuFeatureInitDataSrc->CpuStatus, sizeof (CPU_STATU=
S_INFORMATION));=0D
+=0D
+ if (CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerPackage !=3D 0) {=0D
+ CpuStatus->ThreadCountPerPackage =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Allo=
cateCopyPool (=0D
+ sizeof (UINT32) * CpuStatus->P=
ackageCount,=0D
+ (UINT32 *)(UINTN)CpuFeatureIni=
tDataSrc->CpuStatus.ThreadCountPerPackage=0D
+ );=0D
+ ASSERT (CpuStatus->ThreadCountPerPackage !=3D 0);=0D
+ }=0D
+=0D
+ if (CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerCore !=3D 0) {=0D
+ CpuStatus->ThreadCountPerCore =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Allocat=
eCopyPool (=0D
+ sizeof (UINT8) * (CpuStatus->P=
ackageCount * CpuStatus->MaxCoreCount),=0D
+ (UINT32 *)(UINTN)CpuFeatureIni=
tDataSrc->CpuStatus.ThreadCountPerCore=0D
+ );=0D
+ ASSERT (CpuStatus->ThreadCountPerCore !=3D 0);=0D
+ }=0D
+=0D
+ if (CpuFeatureInitDataSrc->ApLocation !=3D 0) {=0D
+ CpuFeatureInitDataDst->ApLocation =3D (EFI_PHYSICAL_ADDRESS)(UINTN)All=
ocateCopyPool (=0D
+ mAcpiCpuData.NumberOfCpus * sizeof (EFI_CP=
U_PHYSICAL_LOCATION),=0D
+ (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)CpuFea=
tureInitDataSrc->ApLocation=0D
+ );=0D
+ ASSERT (CpuFeatureInitDataDst->ApLocation !=3D 0);=0D
+ }=0D
+}=0D
+=0D
/**=0D
Get ACPI CPU data.=0D
=0D
@@ -1064,39 +1132,13 @@ GetAcpiCpuData (
=0D
CopyMem ((VOID *)(UINTN)mAcpiCpuData.IdtrProfile, (VOID *)(UINTN)AcpiCpu=
Data->IdtrProfile, sizeof (IA32_DESCRIPTOR));=0D
=0D
- if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->Pre=
SmmInitRegisterTable, mAcpiCpuData.NumberOfCpus)) {=0D
- mAcpiCpuData.PreSmmInitRegisterTable =3D (EFI_PHYSICAL_ADDRESS)(UINTN)=
AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));=0D
- ASSERT (mAcpiCpuData.PreSmmInitRegisterTable !=3D 0);=0D
-=0D
- CopyRegisterTable (=0D
- (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.PreSmmInitRegisterTable,=0D
- (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->PreSmmInitRegisterTable,=0D
- mAcpiCpuData.NumberOfCpus=0D
- );=0D
- } else {=0D
- mAcpiCpuData.PreSmmInitRegisterTable =3D 0;=0D
- }=0D
-=0D
- if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->Reg=
isterTable, mAcpiCpuData.NumberOfCpus)) {=0D
- mAcpiCpuData.RegisterTable =3D (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePo=
ol (mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));=0D
- ASSERT (mAcpiCpuData.RegisterTable !=3D 0);=0D
-=0D
- CopyRegisterTable (=0D
- (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.RegisterTable,=0D
- (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable,=0D
- mAcpiCpuData.NumberOfCpus=0D
- );=0D
- } else {=0D
- mAcpiCpuData.RegisterTable =3D 0;=0D
- }=0D
-=0D
//=0D
// Copy AP's GDT, IDT and Machine Check handler into SMRAM.=0D
//=0D
Gdtr =3D (IA32_DESCRIPTOR *)(UINTN)mAcpiCpuData.GdtrProfile;=0D
Idtr =3D (IA32_DESCRIPTOR *)(UINTN)mAcpiCpuData.IdtrProfile;=0D
=0D
- GdtForAp =3D AllocatePool ((Gdtr->Limit + 1) + (Idtr->Limit + 1) + mAcp=
iCpuData.ApMachineCheckHandlerSize);=0D
+ GdtForAp =3D AllocatePool ((Gdtr->Limit + 1) + (Idtr->Limit + 1) + mAcpi=
CpuData.ApMachineCheckHandlerSize);=0D
ASSERT (GdtForAp !=3D NULL);=0D
IdtForAp =3D (VOID *) ((UINTN)GdtForAp + (Gdtr->Limit + 1));=0D
MachineCheckHandlerForAp =3D (VOID *) ((UINTN)IdtForAp + (Idtr->Limit + =
1));=0D
@@ -1109,41 +1151,23 @@ GetAcpiCpuData (
Idtr->Base =3D (UINTN)IdtForAp;=0D
mAcpiCpuData.ApMachineCheckHandlerBase =3D (EFI_PHYSICAL_ADDRESS)(UINTN)=
MachineCheckHandlerForAp;=0D
=0D
- CpuStatus =3D &mAcpiCpuData.CpuStatus;=0D
- CopyMem (CpuStatus, &AcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMAT=
ION));=0D
- if (AcpiCpuData->CpuStatus.ThreadCountPerPackage !=3D 0) {=0D
- CpuStatus->ThreadCountPerPackage =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Allo=
cateCopyPool (=0D
- sizeof (UINT32) * CpuStatus->P=
ackageCount,=0D
- (UINT32 *)(UINTN)AcpiCpuData->=
CpuStatus.ThreadCountPerPackage=0D
- );=0D
- ASSERT (CpuStatus->ThreadCountPerPackage !=3D 0);=0D
- }=0D
- if (AcpiCpuData->CpuStatus.ThreadCountPerCore !=3D 0) {=0D
- CpuStatus->ThreadCountPerCore =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Allocat=
eCopyPool (=0D
- sizeof (UINT8) * (CpuStatus->P=
ackageCount * CpuStatus->MaxCoreCount),=0D
- (UINT32 *)(UINTN)AcpiCpuData->=
CpuStatus.ThreadCountPerCore=0D
- );=0D
- ASSERT (CpuStatus->ThreadCountPerCore !=3D 0);=0D
- }=0D
- if (AcpiCpuData->ApLocation !=3D 0) {=0D
- mAcpiCpuData.ApLocation =3D (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyP=
ool (=0D
- mAcpiCpuData.NumberOfCpus * sizeof (EFI_CP=
U_PHYSICAL_LOCATION),=0D
- (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCp=
uData->ApLocation=0D
- );=0D
- ASSERT (mAcpiCpuData.ApLocation !=3D 0);=0D
- }=0D
- if (CpuStatus->PackageCount !=3D 0) {=0D
- mCpuFlags.CoreSemaphoreCount =3D AllocateZeroPool (=0D
- sizeof (UINT32) * CpuStatus->PackageC=
ount *=0D
- CpuStatus->MaxCoreCount * CpuStatus->=
MaxThreadCount=0D
- );=0D
- ASSERT (mCpuFlags.CoreSemaphoreCount !=3D NULL);=0D
- mCpuFlags.PackageSemaphoreCount =3D AllocateZeroPool (=0D
- sizeof (UINT32) * CpuStatus->Packa=
geCount *=0D
- CpuStatus->MaxCoreCount * CpuStatu=
s->MaxThreadCount=0D
- );=0D
- ASSERT (mCpuFlags.PackageSemaphoreCount !=3D NULL);=0D
- }=0D
+ ZeroMem (&mAcpiCpuData.CpuFeatureInitData, sizeof (CPU_FEATURE_INIT_DATA=
));=0D
+ CopyCpuFeatureInitDatatoSmram (&mAcpiCpuData.CpuFeatureInitData, &AcpiCp=
uData->CpuFeatureInitData);=0D
+=0D
+ CpuStatus =3D &mAcpiCpuData.CpuFeatureInitData.CpuStatus;=0D
+=0D
+ mCpuFlags.CoreSemaphoreCount =3D AllocateZeroPool (=0D
+ sizeof (UINT32) * CpuStatus->PackageCou=
nt *=0D
+ CpuStatus->MaxCoreCount * CpuStatus->Ma=
xThreadCount=0D
+ );=0D
+ ASSERT (mCpuFlags.CoreSemaphoreCount !=3D NULL);=0D
+=0D
+ mCpuFlags.PackageSemaphoreCount =3D AllocateZeroPool (=0D
+ sizeof (UINT32) * CpuStatus->Package=
Count *=0D
+ CpuStatus->MaxCoreCount * CpuStatus-=
MaxThreadCount=0D
+ );=0D
+ ASSERT (mCpuFlags.PackageSemaphoreCount !=3D NULL);=0D
+=0D
InitializeSpinLock((SPIN_LOCK*) &mCpuFlags.MemoryMappedLock);=0D
}=0D
=0D
diff --git a/UefiCpuPkg/Include/AcpiCpuData.h b/UefiCpuPkg/Include/AcpiCpuD=
ata.h
index 62a01b2c6b..2fa8801d1f 100644
--- a/UefiCpuPkg/Include/AcpiCpuData.h
+++ b/UefiCpuPkg/Include/AcpiCpuData.h
@@ -1,7 +1,7 @@
/** @file=0D
Definitions for CPU S3 data.=0D
=0D
-Copyright (c) 2013 - 2020, Intel Corporation. All rights reserved.<BR>=0D
+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -9,6 +9,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _ACPI_CPU_DATA_H_=0D
#define _ACPI_CPU_DATA_H_=0D
=0D
+//=0D
+// This macro definition is used to fix incompatibility issue caused by=0D
+// ACPI_CPU_DATA structure update. It will be removed after all the platfo=
rm=0D
+// code uses new ACPI_CPU_DATA structure.=0D
+//=0D
+#ifndef ACPI_CPU_DATA_STRUCTURE_UPDATE=0D
+#define ACPI_CPU_DATA_STRUCTURE_UPDATE=0D
+#endif=0D
+=0D
//=0D
// Register types in register table=0D
//=0D
@@ -118,6 +127,49 @@ typedef struct {
EFI_PHYSICAL_ADDRESS RegisterTableEntry;=0D
} CPU_REGISTER_TABLE;=0D
=0D
+//=0D
+// Data structure that is used for CPU feature initialization during ACPI =
S3=0D
+// resume.=0D
+//=0D
+typedef struct {=0D
+ //=0D
+ // Physical address of an array of CPU_REGISTER_TABLE structures, with=0D
+ // NumberOfCpus entries. If a register table is not required, then the=
=0D
+ // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to=
0.=0D
+ // If TableLength is > 0, then elements of RegisterTableEntry are used t=
o=0D
+ // initialize the CPU that matches InitialApicId, during an ACPI S3 resu=
me,=0D
+ // before SMBASE relocation is performed.=0D
+ // If a register table is not required for any one of the CPUs, then=0D
+ // PreSmmInitRegisterTable may be set to 0.=0D
+ //=0D
+ EFI_PHYSICAL_ADDRESS PreSmmInitRegisterTable;=0D
+ //=0D
+ // Physical address of an array of CPU_REGISTER_TABLE structures, with=0D
+ // NumberOfCpus entries. If a register table is not required, then the=
=0D
+ // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to=
0.=0D
+ // If TableLength is > 0, then elements of RegisterTableEntry are used t=
o=0D
+ // initialize the CPU that matches InitialApicId, during an ACPI S3 resu=
me,=0D
+ // after SMBASE relocation is performed.=0D
+ // If a register table is not required for any one of the CPUs, then=0D
+ // RegisterTable may be set to 0.=0D
+ //=0D
+ EFI_PHYSICAL_ADDRESS RegisterTable;=0D
+ //=0D
+ // CPU information which is required when set the register table.=0D
+ //=0D
+ CPU_STATUS_INFORMATION CpuStatus;=0D
+ //=0D
+ // Location info for each AP.=0D
+ // It points to an array which saves all APs location info.=0D
+ // The array count is the AP count in this CPU.=0D
+ //=0D
+ // If the platform does not support MSR setting at S3 resume, and=0D
+ // therefore it doesn't need the dependency semaphores, it should set=0D
+ // this field to 0.=0D
+ //=0D
+ EFI_PHYSICAL_ADDRESS ApLocation;=0D
+} CPU_FEATURE_INIT_DATA;=0D
+=0D
//=0D
// Data structure that is required for ACPI S3 resume. The PCD=0D
// PcdCpuS3DataAddress must be set to the physical address where this stru=
cture=0D
@@ -172,28 +224,6 @@ typedef struct {
//=0D
EFI_PHYSICAL_ADDRESS MtrrTable;=0D
//=0D
- // Physical address of an array of CPU_REGISTER_TABLE structures, with=0D
- // NumberOfCpus entries. If a register table is not required, then the=
=0D
- // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to=
0.=0D
- // If TableLength is > 0, then elements of RegisterTableEntry are used t=
o=0D
- // initialize the CPU that matches InitialApicId, during an ACPI S3 resu=
me,=0D
- // before SMBASE relocation is performed.=0D
- // If a register table is not required for any one of the CPUs, then=0D
- // PreSmmInitRegisterTable may be set to 0.=0D
- //=0D
- EFI_PHYSICAL_ADDRESS PreSmmInitRegisterTable;=0D
- //=0D
- // Physical address of an array of CPU_REGISTER_TABLE structures, with=0D
- // NumberOfCpus entries. If a register table is not required, then the=
=0D
- // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to=
0.=0D
- // If TableLength is > 0, then elements of RegisterTableEntry are used t=
o=0D
- // initialize the CPU that matches InitialApicId, during an ACPI S3 resu=
me,=0D
- // after SMBASE relocation is performed.=0D
- // If a register table is not required for any one of the CPUs, then=0D
- // RegisterTable may be set to 0.=0D
- //=0D
- EFI_PHYSICAL_ADDRESS RegisterTable;=0D
- //=0D
// Physical address of a buffer that contains the machine check handler =
that=0D
// is used during an ACPI S3 Resume. In order for this machine check=0D
// handler to be active on an AP during an ACPI S3 resume, the machine c=
heck=0D
@@ -208,19 +238,10 @@ typedef struct {
//=0D
UINT32 ApMachineCheckHandlerSize;=0D
//=0D
- // CPU information which is required when set the register table.=0D
- //=0D
- CPU_STATUS_INFORMATION CpuStatus;=0D
- //=0D
- // Location info for each AP.=0D
- // It points to an array which saves all APs location info.=0D
- // The array count is the AP count in this CPU.=0D
- //=0D
- // If the platform does not support MSR setting at S3 resume, and=0D
- // therefore it doesn't need the dependency semaphores, it should set=0D
- // this field to 0.=0D
+ // Data structure that is used for CPU feature initialization during ACP=
I S3=0D
+ // resume.=0D
//=0D
- EFI_PHYSICAL_ADDRESS ApLocation;=0D
+ CPU_FEATURE_INIT_DATA CpuFeatureInitData;=0D
} ACPI_CPU_DATA;=0D
=0D
#endif=0D
--=20
2.28.0.windows.1


Ni, Ray
 

Reviewed-by: Ray Ni <ray.ni@Intel.com>

I merged the patch with the "#ifndef .." removed.

-----Original Message-----
From: Lou, Yun <yun.lou@intel.com>
Sent: Thursday, September 16, 2021 5:27 PM
To: devel@edk2.groups.io
Cc: Lou, Yun <yun.lou@intel.com>; Ni, Ray <ray.ni@intel.com>; Dong, Eric <eric.dong@intel.com>; Laszlo Ersek
<lersek@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
Subject: [PATCH v2 1/2] UefiCpuPkg: Refactor initialization of CPU features during S3 resume

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>
Cc: 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 | 7 +-
UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 7 +-
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c | 12 +-
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c | 18 +--
UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 160 +++++++++++---------
UefiCpuPkg/Include/AcpiCpuData.h | 91 ++++++-----
6 files changed, 167 insertions(+), 128 deletions(-)

diff --git a/OvmfPkg/CpuS3DataDxe/CpuS3Data.c b/OvmfPkg/CpuS3DataDxe/CpuS3Data.c
index 5ffe1f3cd7..de20d87567 100644
--- a/OvmfPkg/CpuS3DataDxe/CpuS3Data.c
+++ b/OvmfPkg/CpuS3DataDxe/CpuS3Data.c
@@ -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

and customized if these additional features are required.



-Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>

+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>

Copyright (c) 2015 - 2020, Red Hat, Inc.



SPDX-License-Identifier: BSD-2-Clause-Patent

@@ -252,10 +252,7 @@ CpuS3DataInitialize (
AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt;



if (OldAcpiCpuData != NULL) {

- AcpiCpuData->RegisterTable = OldAcpiCpuData->RegisterTable;

- AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData->PreSmmInitRegisterTable;

- AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;

- CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMATION));

+ CopyMem (&AcpiCpuData->CpuFeatureInitData, &OldAcpiCpuData->CpuFeatureInitData, sizeof
(CPU_FEATURE_INIT_DATA));

}



//

diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
index 078af36cfb..61ec7c44b2 100644
--- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
+++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
@@ -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

and customized if these additional features are required.



-Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>

+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>

Copyright (c) 2015, Red Hat, Inc.



SPDX-License-Identifier: BSD-2-Clause-Patent

@@ -247,10 +247,7 @@ CpuS3DataInitialize (
AcpiCpuDataEx->IdtrProfile.Base = (UINTN)Idt;



if (OldAcpiCpuData != NULL) {

- AcpiCpuData->RegisterTable = OldAcpiCpuData->RegisterTable;

- AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData->PreSmmInitRegisterTable;

- AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;

- CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMATION));

+ CopyMem (&AcpiCpuData->CpuFeatureInitData, &OldAcpiCpuData->CpuFeatureInitData, sizeof
(CPU_FEATURE_INIT_DATA));

}



//

diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
index 57511c4efa..6e2ab79518 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
@@ -1,7 +1,7 @@
/** @file

CPU Features Initialize functions.



- Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>

+ Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent



**/

@@ -152,10 +152,10 @@ CpuInitDataInitialize (
ASSERT (AcpiCpuData != NULL);

CpuFeaturesData->AcpiCpuData= AcpiCpuData;



- CpuStatus = &AcpiCpuData->CpuStatus;

+ CpuStatus = &AcpiCpuData->CpuFeatureInitData.CpuStatus;

Location = AllocateZeroPool (sizeof (EFI_CPU_PHYSICAL_LOCATION) * NumberOfCpus);

ASSERT (Location != NULL);

- AcpiCpuData->ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)Location;

+ AcpiCpuData->CpuFeatureInitData.ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)Location;



for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {

InitOrder = &CpuFeaturesData->InitOrder[ProcessorNumber];

@@ -1131,7 +1131,7 @@ SetProcessorRegister (
CpuFeaturesData = (CPU_FEATURES_DATA *) Buffer;

AcpiCpuData = CpuFeaturesData->AcpiCpuData;



- RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable;

+ RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->CpuFeatureInitData.RegisterTable;



InitApicId = GetInitialApicId ();

RegisterTable = NULL;

@@ -1147,8 +1147,8 @@ SetProcessorRegister (


ProgramProcessorRegister (

RegisterTable,

- (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->ApLocation + ProcIndex,

- &AcpiCpuData->CpuStatus,

+ (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->CpuFeatureInitData.ApLocation + ProcIndex,

+ &AcpiCpuData->CpuFeatureInitData.CpuStatus,

&CpuFeaturesData->CpuFlags

);

}

diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
index 60daa5cc87..e6ef9c602d 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
@@ -952,8 +952,8 @@ GetAcpiCpuData (
AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;

}



- if (AcpiCpuData->RegisterTable == 0 ||

- AcpiCpuData->PreSmmInitRegisterTable == 0) {

+ if (AcpiCpuData->CpuFeatureInitData.RegisterTable == 0 ||

+ AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable == 0) {

//

// Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs

//

@@ -976,11 +976,11 @@ GetAcpiCpuData (
RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;

RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;

}

- if (AcpiCpuData->RegisterTable == 0) {

- AcpiCpuData->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;

+ if (AcpiCpuData->CpuFeatureInitData.RegisterTable == 0) {

+ AcpiCpuData->CpuFeatureInitData.RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;

}

- if (AcpiCpuData->PreSmmInitRegisterTable == 0) {

- AcpiCpuData->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);

+ if (AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable == 0) {

+ AcpiCpuData->CpuFeatureInitData.PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable +
NumberOfCpus);

}

}



@@ -1063,9 +1063,9 @@ CpuRegisterTableWriteWorker (
CpuFeaturesData = GetCpuFeaturesData ();

if (CpuFeaturesData->RegisterTable == NULL) {

AcpiCpuData = GetAcpiCpuData ();

- ASSERT ((AcpiCpuData != NULL) && (AcpiCpuData->RegisterTable != 0));

- CpuFeaturesData->RegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->RegisterTable;

- CpuFeaturesData->PreSmmRegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->PreSmmInitRegisterTable;

+ ASSERT ((AcpiCpuData != NULL) && (AcpiCpuData->CpuFeatureInitData.RegisterTable != 0));

+ CpuFeaturesData->RegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData->CpuFeatureInitData.RegisterTable;

+ CpuFeaturesData->PreSmmRegisterTable = (CPU_REGISTER_TABLE *) (UINTN) AcpiCpuData-
CpuFeatureInitData.PreSmmInitRegisterTable;
}



if (PreSmmFlag) {

diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
index ab7f39aa2b..2873cba083 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
@@ -476,16 +476,19 @@ SetRegister (
IN BOOLEAN PreSmmRegisterTable

)

{

+ CPU_FEATURE_INIT_DATA *FeatureInitData;

CPU_REGISTER_TABLE *RegisterTable;

CPU_REGISTER_TABLE *RegisterTables;

UINT32 InitApicId;

UINTN ProcIndex;

UINTN Index;



+ FeatureInitData = &mAcpiCpuData.CpuFeatureInitData;

+

if (PreSmmRegisterTable) {

- RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.PreSmmInitRegisterTable;

+ RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)FeatureInitData->PreSmmInitRegisterTable;

} else {

- RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.RegisterTable;

+ RegisterTables = (CPU_REGISTER_TABLE *)(UINTN)FeatureInitData->RegisterTable;

}

if (RegisterTables == NULL) {

return;

@@ -503,18 +506,18 @@ SetRegister (
}

ASSERT (RegisterTable != NULL);



- if (mAcpiCpuData.ApLocation != 0) {

+ if (FeatureInitData->ApLocation != 0) {

ProgramProcessorRegister (

RegisterTable,

- (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)mAcpiCpuData.ApLocation + ProcIndex,

- &mAcpiCpuData.CpuStatus,

+ (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)FeatureInitData->ApLocation + ProcIndex,

+ &FeatureInitData->CpuStatus,

&mCpuFlags

);

} else {

ProgramProcessorRegister (

RegisterTable,

NULL,

- &mAcpiCpuData.CpuStatus,

+ &FeatureInitData->CpuStatus,

&mCpuFlags

);

}

@@ -1010,6 +1013,71 @@ IsRegisterTableEmpty (
return TRUE;

}



+/**

+ Copy the data used to initialize processor register into SMRAM.

+

+ @param[in,out] CpuFeatureInitDataDst Pointer to the destination CPU_FEATURE_INIT_DATA structure.

+ @param[in] CpuFeatureInitDataSrc Pointer to the source CPU_FEATURE_INIT_DATA structure.

+

+**/

+VOID

+CopyCpuFeatureInitDatatoSmram (

+ IN OUT CPU_FEATURE_INIT_DATA *CpuFeatureInitDataDst,

+ IN CPU_FEATURE_INIT_DATA *CpuFeatureInitDataSrc

+ )

+{

+ CPU_STATUS_INFORMATION *CpuStatus;

+

+ if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->PreSmmInitRegisterTable,
mAcpiCpuData.NumberOfCpus)) {

+ CpuFeatureInitDataDst->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool
(mAcpiCpuData.NumberOfCpus * sizeof (CPU_REGISTER_TABLE));

+ ASSERT (CpuFeatureInitDataDst->PreSmmInitRegisterTable != 0);

+

+ CopyRegisterTable (

+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataDst->PreSmmInitRegisterTable,

+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->PreSmmInitRegisterTable,

+ mAcpiCpuData.NumberOfCpus

+ );

+ }

+

+ if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->RegisterTable,
mAcpiCpuData.NumberOfCpus)) {

+ CpuFeatureInitDataDst->RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus *
sizeof (CPU_REGISTER_TABLE));

+ ASSERT (CpuFeatureInitDataDst->RegisterTable != 0);

+

+ CopyRegisterTable (

+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataDst->RegisterTable,

+ (CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->RegisterTable,

+ mAcpiCpuData.NumberOfCpus

+ );

+ }

+

+ CpuStatus = &CpuFeatureInitDataDst->CpuStatus;

+ CopyMem (CpuStatus, &CpuFeatureInitDataSrc->CpuStatus, sizeof (CPU_STATUS_INFORMATION));

+

+ if (CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerPackage != 0) {

+ CpuStatus->ThreadCountPerPackage = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (

+ sizeof (UINT32) * CpuStatus->PackageCount,

+ (UINT32 *)(UINTN)CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerPackage

+ );

+ ASSERT (CpuStatus->ThreadCountPerPackage != 0);

+ }

+

+ if (CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerCore != 0) {

+ CpuStatus->ThreadCountPerCore = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (

+ sizeof (UINT8) * (CpuStatus->PackageCount * CpuStatus->MaxCoreCount),

+ (UINT32 *)(UINTN)CpuFeatureInitDataSrc->CpuStatus.ThreadCountPerCore

+ );

+ ASSERT (CpuStatus->ThreadCountPerCore != 0);

+ }

+

+ if (CpuFeatureInitDataSrc->ApLocation != 0) {

+ CpuFeatureInitDataDst->ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (

+ mAcpiCpuData.NumberOfCpus * sizeof (EFI_CPU_PHYSICAL_LOCATION),

+ (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)CpuFeatureInitDataSrc->ApLocation

+ );

+ ASSERT (CpuFeatureInitDataDst->ApLocation != 0);

+ }

+}

+

/**

Get ACPI CPU data.



@@ -1064,39 +1132,13 @@ GetAcpiCpuData (


CopyMem ((VOID *)(UINTN)mAcpiCpuData.IdtrProfile, (VOID *)(UINTN)AcpiCpuData->IdtrProfile, sizeof (IA32_DESCRIPTOR));



- if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->PreSmmInitRegisterTable,
mAcpiCpuData.NumberOfCpus)) {

- mAcpiCpuData.PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus *
sizeof (CPU_REGISTER_TABLE));

- ASSERT (mAcpiCpuData.PreSmmInitRegisterTable != 0);

-

- CopyRegisterTable (

- (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.PreSmmInitRegisterTable,

- (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->PreSmmInitRegisterTable,

- mAcpiCpuData.NumberOfCpus

- );

- } else {

- mAcpiCpuData.PreSmmInitRegisterTable = 0;

- }

-

- if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable, mAcpiCpuData.NumberOfCpus)) {

- mAcpiCpuData.RegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData.NumberOfCpus * sizeof
(CPU_REGISTER_TABLE));

- ASSERT (mAcpiCpuData.RegisterTable != 0);

-

- CopyRegisterTable (

- (CPU_REGISTER_TABLE *)(UINTN)mAcpiCpuData.RegisterTable,

- (CPU_REGISTER_TABLE *)(UINTN)AcpiCpuData->RegisterTable,

- mAcpiCpuData.NumberOfCpus

- );

- } else {

- mAcpiCpuData.RegisterTable = 0;

- }

-

//

// Copy AP's GDT, IDT and Machine Check handler into SMRAM.

//

Gdtr = (IA32_DESCRIPTOR *)(UINTN)mAcpiCpuData.GdtrProfile;

Idtr = (IA32_DESCRIPTOR *)(UINTN)mAcpiCpuData.IdtrProfile;



- GdtForAp = AllocatePool ((Gdtr->Limit + 1) + (Idtr->Limit + 1) + mAcpiCpuData.ApMachineCheckHandlerSize);

+ GdtForAp = AllocatePool ((Gdtr->Limit + 1) + (Idtr->Limit + 1) + mAcpiCpuData.ApMachineCheckHandlerSize);

ASSERT (GdtForAp != NULL);

IdtForAp = (VOID *) ((UINTN)GdtForAp + (Gdtr->Limit + 1));

MachineCheckHandlerForAp = (VOID *) ((UINTN)IdtForAp + (Idtr->Limit + 1));

@@ -1109,41 +1151,23 @@ GetAcpiCpuData (
Idtr->Base = (UINTN)IdtForAp;

mAcpiCpuData.ApMachineCheckHandlerBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MachineCheckHandlerForAp;



- CpuStatus = &mAcpiCpuData.CpuStatus;

- CopyMem (CpuStatus, &AcpiCpuData->CpuStatus, sizeof (CPU_STATUS_INFORMATION));

- if (AcpiCpuData->CpuStatus.ThreadCountPerPackage != 0) {

- CpuStatus->ThreadCountPerPackage = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (

- sizeof (UINT32) * CpuStatus->PackageCount,

- (UINT32 *)(UINTN)AcpiCpuData->CpuStatus.ThreadCountPerPackage

- );

- ASSERT (CpuStatus->ThreadCountPerPackage != 0);

- }

- if (AcpiCpuData->CpuStatus.ThreadCountPerCore != 0) {

- CpuStatus->ThreadCountPerCore = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (

- sizeof (UINT8) * (CpuStatus->PackageCount * CpuStatus->MaxCoreCount),

- (UINT32 *)(UINTN)AcpiCpuData->CpuStatus.ThreadCountPerCore

- );

- ASSERT (CpuStatus->ThreadCountPerCore != 0);

- }

- if (AcpiCpuData->ApLocation != 0) {

- mAcpiCpuData.ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateCopyPool (

- mAcpiCpuData.NumberOfCpus * sizeof (EFI_CPU_PHYSICAL_LOCATION),

- (EFI_CPU_PHYSICAL_LOCATION *)(UINTN)AcpiCpuData->ApLocation

- );

- ASSERT (mAcpiCpuData.ApLocation != 0);

- }

- if (CpuStatus->PackageCount != 0) {

- mCpuFlags.CoreSemaphoreCount = AllocateZeroPool (

- sizeof (UINT32) * CpuStatus->PackageCount *

- CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount

- );

- ASSERT (mCpuFlags.CoreSemaphoreCount != NULL);

- mCpuFlags.PackageSemaphoreCount = AllocateZeroPool (

- sizeof (UINT32) * CpuStatus->PackageCount *

- CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount

- );

- ASSERT (mCpuFlags.PackageSemaphoreCount != NULL);

- }

+ ZeroMem (&mAcpiCpuData.CpuFeatureInitData, sizeof (CPU_FEATURE_INIT_DATA));

+ CopyCpuFeatureInitDatatoSmram (&mAcpiCpuData.CpuFeatureInitData, &AcpiCpuData->CpuFeatureInitData);

+

+ CpuStatus = &mAcpiCpuData.CpuFeatureInitData.CpuStatus;

+

+ mCpuFlags.CoreSemaphoreCount = AllocateZeroPool (

+ sizeof (UINT32) * CpuStatus->PackageCount *

+ CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount

+ );

+ ASSERT (mCpuFlags.CoreSemaphoreCount != NULL);

+

+ mCpuFlags.PackageSemaphoreCount = AllocateZeroPool (

+ sizeof (UINT32) * CpuStatus->PackageCount *

+ CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount

+ );

+ ASSERT (mCpuFlags.PackageSemaphoreCount != NULL);

+

InitializeSpinLock((SPIN_LOCK*) &mCpuFlags.MemoryMappedLock);

}



diff --git a/UefiCpuPkg/Include/AcpiCpuData.h b/UefiCpuPkg/Include/AcpiCpuData.h
index 62a01b2c6b..2fa8801d1f 100644
--- a/UefiCpuPkg/Include/AcpiCpuData.h
+++ b/UefiCpuPkg/Include/AcpiCpuData.h
@@ -1,7 +1,7 @@
/** @file

Definitions for CPU S3 data.



-Copyright (c) 2013 - 2020, Intel Corporation. All rights reserved.<BR>

+Copyright (c) 2013 - 2021, Intel Corporation. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent



**/

@@ -9,6 +9,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _ACPI_CPU_DATA_H_

#define _ACPI_CPU_DATA_H_



+//

+// This macro definition 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.

+//

+#ifndef ACPI_CPU_DATA_STRUCTURE_UPDATE

+#define ACPI_CPU_DATA_STRUCTURE_UPDATE

+#endif

+

//

// Register types in register table

//

@@ -118,6 +127,49 @@ typedef struct {
EFI_PHYSICAL_ADDRESS RegisterTableEntry;

} CPU_REGISTER_TABLE;



+//

+// Data structure that is used for CPU feature initialization during ACPI S3

+// resume.

+//

+typedef struct {

+ //

+ // Physical address of an array of CPU_REGISTER_TABLE structures, with

+ // NumberOfCpus entries. If a register table is not required, then the

+ // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.

+ // If TableLength is > 0, then elements of RegisterTableEntry are used to

+ // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,

+ // before SMBASE relocation is performed.

+ // If a register table is not required for any one of the CPUs, then

+ // PreSmmInitRegisterTable may be set to 0.

+ //

+ EFI_PHYSICAL_ADDRESS PreSmmInitRegisterTable;

+ //

+ // Physical address of an array of CPU_REGISTER_TABLE structures, with

+ // NumberOfCpus entries. If a register table is not required, then the

+ // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.

+ // If TableLength is > 0, then elements of RegisterTableEntry are used to

+ // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,

+ // after SMBASE relocation is performed.

+ // If a register table is not required for any one of the CPUs, then

+ // RegisterTable may be set to 0.

+ //

+ EFI_PHYSICAL_ADDRESS RegisterTable;

+ //

+ // CPU information which is required when set the register table.

+ //

+ CPU_STATUS_INFORMATION CpuStatus;

+ //

+ // Location info for each AP.

+ // It points to an array which saves all APs location info.

+ // The array count is the AP count in this CPU.

+ //

+ // If the platform does not support MSR setting at S3 resume, and

+ // therefore it doesn't need the dependency semaphores, it should set

+ // this field to 0.

+ //

+ EFI_PHYSICAL_ADDRESS ApLocation;

+} CPU_FEATURE_INIT_DATA;

+

//

// Data structure that is required for ACPI S3 resume. The PCD

// PcdCpuS3DataAddress must be set to the physical address where this structure

@@ -172,28 +224,6 @@ typedef struct {
//

EFI_PHYSICAL_ADDRESS MtrrTable;

//

- // Physical address of an array of CPU_REGISTER_TABLE structures, with

- // NumberOfCpus entries. If a register table is not required, then the

- // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.

- // If TableLength is > 0, then elements of RegisterTableEntry are used to

- // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,

- // before SMBASE relocation is performed.

- // If a register table is not required for any one of the CPUs, then

- // PreSmmInitRegisterTable may be set to 0.

- //

- EFI_PHYSICAL_ADDRESS PreSmmInitRegisterTable;

- //

- // Physical address of an array of CPU_REGISTER_TABLE structures, with

- // NumberOfCpus entries. If a register table is not required, then the

- // TableLength and AllocatedSize fields of CPU_REGISTER_TABLE are set to 0.

- // If TableLength is > 0, then elements of RegisterTableEntry are used to

- // initialize the CPU that matches InitialApicId, during an ACPI S3 resume,

- // after SMBASE relocation is performed.

- // If a register table is not required for any one of the CPUs, then

- // RegisterTable may be set to 0.

- //

- EFI_PHYSICAL_ADDRESS RegisterTable;

- //

// Physical address of a buffer that contains the machine check handler that

// is used during an ACPI S3 Resume. In order for this machine check

// handler to be active on an AP during an ACPI S3 resume, the machine check

@@ -208,19 +238,10 @@ typedef struct {
//

UINT32 ApMachineCheckHandlerSize;

//

- // CPU information which is required when set the register table.

- //

- CPU_STATUS_INFORMATION CpuStatus;

- //

- // Location info for each AP.

- // It points to an array which saves all APs location info.

- // The array count is the AP count in this CPU.

- //

- // If the platform does not support MSR setting at S3 resume, and

- // therefore it doesn't need the dependency semaphores, it should set

- // this field to 0.

+ // Data structure that is used for CPU feature initialization during ACPI S3

+ // resume.

//

- EFI_PHYSICAL_ADDRESS ApLocation;

+ CPU_FEATURE_INIT_DATA CpuFeatureInitData;

} ACPI_CPU_DATA;



#endif

--
2.28.0.windows.1