UefiCpuPkg: Refactor the logic for placing APs in Mwait/Runloop.

Refactor the logic for placing APs in
Mwait/Runloop into a separate function.

Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com>
This commit is contained in:
Xie, Yuanhao 2023-06-28 16:47:21 +08:00 committed by mergify[bot]
parent 88f436883b
commit 243212b0d0
1 changed files with 50 additions and 33 deletions

View File

@ -658,6 +658,54 @@ PlaceAPInHltLoop (
}
}
/**
This function place APs in Mwait or Run loop.
@param[in] ApLoopMode Ap Loop Mode
@param[in] ApStartupSignalBuffer Pointer to Ap Startup Signal Buffer
@param[in] ApTargetCState Ap Target CState
**/
VOID
PlaceAPInMwaitLoopOrRunLoop (
IN UINT8 ApLoopMode,
IN volatile UINT32 *ApStartupSignalBuffer,
IN UINT8 ApTargetCState
)
{
while (TRUE) {
DisableInterrupts ();
if (ApLoopMode == ApInMwaitLoop) {
//
// Place AP in MWAIT-loop
//
AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0);
if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) {
//
// Check AP start-up signal again.
// If AP start-up signal is not set, place AP into
// the specified C-state
//
AsmMwait (ApTargetCState << 4, 0);
}
} else if (ApLoopMode == ApInRunLoop) {
//
// Place AP in Run-loop
//
CpuPause ();
} else {
ASSERT (FALSE);
}
//
// If AP start-up signal is written, AP is waken up
// otherwise place AP in loop again
//
if (*ApStartupSignalBuffer == WAKEUP_AP_SIGNAL) {
break;
}
}
}
/**
This function will be called from AP reset code if BSP uses WakeUpAP.
@ -838,39 +886,8 @@ ApWakeupFunction (
//
// Never run here
//
}
while (TRUE) {
DisableInterrupts ();
if (CpuMpData->ApLoopMode == ApInMwaitLoop) {
//
// Place AP in MWAIT-loop
//
AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0);
if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) {
//
// Check AP start-up signal again.
// If AP start-up signal is not set, place AP into
// the specified C-state
//
AsmMwait (CpuMpData->ApTargetCState << 4, 0);
}
} else if (CpuMpData->ApLoopMode == ApInRunLoop) {
//
// Place AP in Run-loop
//
CpuPause ();
} else {
ASSERT (FALSE);
}
//
// If AP start-up signal is written, AP is waken up
// otherwise place AP in loop again
//
if (*ApStartupSignalBuffer == WAKEUP_AP_SIGNAL) {
break;
}
} else {
PlaceAPInMwaitLoopOrRunLoop (CpuMpData->ApLoopMode, ApStartupSignalBuffer, CpuMpData->ApTargetCState);
}
}
}