From e2c9d8eba49754b644ed4599331395d777afc379 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Feb 2024 17:01:03 +0100 Subject: [PATCH] UefiCpuPkg/MpInitLib: Add support for multiple HOBs to SwitchApContext() Rename the MpHandOff parameter to FirstMpHandOff. Add loops so the function inspects all HOBs present in the system. Signed-off-by: Gerd Hoffmann Reviewed-by: Ray Ni Reviewed-by: Laszlo Ersek Message-Id: <20240222160106.686484-4-kraxel@redhat.com> --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 35 ++++++++++++++++++---------- UefiCpuPkg/Library/MpInitLib/MpLib.h | 2 +- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 76449f73f4..8eab8b636d 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -1938,31 +1938,42 @@ GetBspNumber ( This procedure allows the AP to switch to another section of memory and continue its loop there. - @param[in] MpHandOff Pointer to MP hand-off data structure. + @param[in] FirstMpHandOff Pointer to first MP hand-off HOB body. **/ VOID SwitchApContext ( - IN MP_HAND_OFF *MpHandOff + IN CONST MP_HAND_OFF *FirstMpHandOff ) { - UINTN Index; - UINT32 BspNumber; + UINTN Index; + UINT32 BspNumber; + CONST MP_HAND_OFF *MpHandOff; - BspNumber = GetBspNumber (MpHandOff); + BspNumber = GetBspNumber (FirstMpHandOff); - for (Index = 0; Index < MpHandOff->CpuCount; Index++) { - if (Index != BspNumber) { - *(UINTN *)(UINTN)MpHandOff->Info[Index].StartupProcedureAddress = (UINTN)SwitchContextPerAp; - *(UINT32 *)(UINTN)MpHandOff->Info[Index].StartupSignalAddress = MpHandOff->StartupSignalValue; + for (MpHandOff = FirstMpHandOff; + MpHandOff != NULL; + MpHandOff = GetNextMpHandOffHob (MpHandOff)) + { + for (Index = 0; Index < MpHandOff->CpuCount; Index++) { + if (MpHandOff->ProcessorIndex + Index != BspNumber) { + *(UINTN *)(UINTN)MpHandOff->Info[Index].StartupProcedureAddress = (UINTN)SwitchContextPerAp; + *(UINT32 *)(UINTN)MpHandOff->Info[Index].StartupSignalAddress = MpHandOff->StartupSignalValue; + } } } // // Wait all APs waken up if this is not the 1st broadcast of SIPI // - for (Index = 0; Index < MpHandOff->CpuCount; Index++) { - if (Index != BspNumber) { - WaitApWakeup ((UINT32 *)(UINTN)(MpHandOff->Info[Index].StartupSignalAddress)); + for (MpHandOff = FirstMpHandOff; + MpHandOff != NULL; + MpHandOff = GetNextMpHandOffHob (MpHandOff)) + { + for (Index = 0; Index < MpHandOff->CpuCount; Index++) { + if (MpHandOff->ProcessorIndex + Index != BspNumber) { + WaitApWakeup ((UINT32 *)(UINTN)(MpHandOff->Info[Index].StartupSignalAddress)); + } } } } diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index fab2b2d493..3a7b9896cf 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -482,7 +482,7 @@ GetWakeupBuffer ( **/ VOID SwitchApContext ( - IN MP_HAND_OFF *MpHandOff + IN CONST MP_HAND_OFF *FirstMpHandOff ); /**