Init CPU_HOT_EJECT_DATA, which will be used to share CPU ejection state between SmmCpuFeaturesLib (via PiSmmCpuDxeSmm) and CpuHotPlugSmm. CpuHotplugSmm also sets up the CPU ejection mechanism via CPU_HOT_EJECT_DATA->Handler.
Additionally, expose CPU_HOT_EJECT_DATA via PcdCpuHotEjectDataAddress. Cc: Laszlo Ersek <ler...@redhat.com> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Ard Biesheuvel <ard.biesheu...@arm.com> Cc: Igor Mammedov <imamm...@redhat.com> Cc: Boris Ostrovsky <boris.ostrov...@oracle.com> Cc: Aaron Young <aaron.yo...@oracle.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3132 Signed-off-by: Ankur Arora <ankur.a.ar...@oracle.com> --- .../SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf | 3 + .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 78 ++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf index 97a10afb6e27..32c63722ee62 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf @@ -35,4 +35,7 @@ [LibraryClasses] UefiBootServicesTableLib [Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugSupport + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber + gUefiOvmfPkgTokenSpaceGuid.PcdCpuHotEjectDataAddress gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c index 7ef7ed98342e..33dd5da92432 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c @@ -14,7 +14,9 @@ #include <Library/PcdLib.h> #include <Library/SmmCpuFeaturesLib.h> #include <Library/SmmServicesTableLib.h> +#include <Library/MemoryAllocationLib.h> #include <Library/UefiBootServicesTableLib.h> +#include <Library/CpuHotEjectData.h> #include <PiSmm.h> #include <Register/Intel/SmramSaveStateMap.h> #include <Register/QemuSmramSaveStateMap.h> @@ -171,6 +173,70 @@ SmmCpuFeaturesHookReturnFromSmm ( return OriginalInstructionPointer; } +GLOBAL_REMOVE_IF_UNREFERENCED +CPU_HOT_EJECT_DATA *mCpuHotEjectData = NULL; + +/** + Initialize CpuHotEjectData if PcdCpuHotPlugSupport is enabled + and, if more than 1 CPU is configured. + + Also sets up the corresponding PcdCpuHotEjectDataAddress. +**/ +STATIC +VOID +SmmCpuFeaturesSmmInitHotEject ( + VOID + ) +{ + UINT32 mMaxNumberOfCpus; + EFI_STATUS Status; + + if (!FeaturePcdGet (PcdCpuHotPlugSupport)) { + return; + } + + // PcdCpuHotPlugSupport => PcdCpuMaxLogicalProcessorNumber + mMaxNumberOfCpus = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); + + // No spare CPUs to hot-eject + if (mMaxNumberOfCpus == 1) { + return; + } + + mCpuHotEjectData = + (CPU_HOT_EJECT_DATA *)AllocatePool (sizeof (*mCpuHotEjectData)); + ASSERT (mCpuHotEjectData != NULL); + + // + // Allocate buffer for pointers to array in CPU_HOT_EJECT_DATA. + // + + // Revision + mCpuHotEjectData->Revision = CPU_HOT_EJECT_DATA_REVISION_1; + + // Array Length of APIC ID + mCpuHotEjectData->ArrayLength = mMaxNumberOfCpus; + + // CpuIndex -> APIC ID map + mCpuHotEjectData->ApicIdMap = (UINT64 *)AllocatePool + (sizeof (*mCpuHotEjectData->ApicIdMap) * mCpuHotEjectData->ArrayLength); + + // Hot-eject handler + mCpuHotEjectData->Handler = NULL; + + // Reserved + mCpuHotEjectData->Reserved = 0; + + ASSERT (mCpuHotEjectData->ApicIdMap != NULL); + + // + // Expose address of CPU Hot eject Data structure + // + Status = PcdSet64S (PcdCpuHotEjectDataAddress, + (UINT64)(VOID *)mCpuHotEjectData); + ASSERT_EFI_ERROR (Status); +} + /** Hook point in normal execution mode that allows the one CPU that was elected as monarch during System Management Mode initialization to perform additional @@ -188,6 +254,9 @@ SmmCpuFeaturesSmmRelocationComplete ( UINTN MapPagesBase; UINTN MapPagesCount; + + SmmCpuFeaturesSmmInitHotEject (); + if (!MemEncryptSevIsEnabled ()) { return; } @@ -375,6 +444,15 @@ SmmCpuFeaturesRendezvousExit ( IN UINTN CpuIndex ) { + // + // CPU Hot-eject not enabled. + // + if (mCpuHotEjectData == NULL || + mCpuHotEjectData->Handler == NULL) { + return; + } + + mCpuHotEjectData->Handler (CpuIndex); } /** -- 2.9.3 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#70872): https://edk2.groups.io/g/devel/message/70872 Mute This Topic: https://groups.io/mt/80199922/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-