Reviewed-by: Ray Ni <[email protected]>

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

> -----Original Message-----
> From: Lou, Yun <[email protected]>
> Sent: Thursday, September 16, 2021 5:27 PM
> To: [email protected]
> Cc: Lou, Yun <[email protected]>; Ni, Ray <[email protected]>; Dong, Eric 
> <[email protected]>; Laszlo Ersek
> <[email protected]>; Kumar, Rahul1 <[email protected]>
> 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 <[email protected]>
> Cc: Ray Ni <[email protected]>
> Cc: Eric Dong <[email protected]>
> Cc: Laszlo Ersek <[email protected]>
> Cc: Rahul Kumar <[email protected]>
> ---
>  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



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#80807): https://edk2.groups.io/g/devel/message/80807
Mute This Topic: https://groups.io/mt/85647863/21656
Group Owner: [email protected]
Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to