Skip to content

Commit

Permalink
UefiCpuPkg/PiSmmCpuDxeSmm: Consume SmmCpuPlatformHookBeforeMmiHandler…
Browse files Browse the repository at this point in the history
… func

This patch is for PiSmmCpuDxeSmm driver to add one round wait/release sync
for BSP and AP to perform the SMM CPU Platform Hook before executing MMI
Handler: SmmCpuPlatformHookBeforeMmiHandler (). With the function, SMM CPU
driver can perform the platform specific items after one round BSP and AP
sync (to make sure all APs in SMI) and before the MMI handlers.

After the change, steps tianocore#1 and tianocore#2 are additional requirements if the
MmCpuSyncModeTradition mode is selected.

Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com>
  • Loading branch information
jiaxinwu authored and ishih1 committed Nov 11, 2024
1 parent 33f61bc commit 7319b59
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
Original file line number Diff line number Diff line change
Expand Up @@ -520,16 +520,19 @@ BSPHandler (
ApCount = CpuCount - 1;

//
// Wait for all APs to get ready for programming MTRRs
// Wait for all APs of arrival at this point
//
SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #1: Wait APs

//
// Signal all APs it's time for:
// 1. Backup MTRRs if needed.
// 2. Perform SMM CPU Platform Hook before executing MMI Handler.
//
ReleaseAllAPs (); /// #2: Signal APs

if (SmmCpuFeaturesNeedConfigureMtrrs ()) {
//
// Signal all APs it's time for backup MTRRs
//
ReleaseAllAPs (); /// #2: Signal APs

//
// SmmCpuSyncWaitForAPs() may wait for ever if an AP happens to enter SMM at
// exactly this point. Please make sure PcdCpuSmmMaxSyncLoops has been set
Expand Down Expand Up @@ -564,6 +567,11 @@ BSPHandler (
}
}

//
// Perform SMM CPU Platform Hook before executing MMI Handler
//
SmmCpuPlatformHookBeforeMmiHandler ();

//
// The BUSY lock is initialized to Acquired state
//
Expand Down Expand Up @@ -806,14 +814,16 @@ APHandler (
// Notify BSP of arrival at this point
//
SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #1: Signal BSP
}

if (SmmCpuFeaturesNeedConfigureMtrrs ()) {
//
// Wait for the signal from BSP to backup MTRRs
// Wait for the signal from BSP to:
// 1. Backup MTRRs if needed.
// 2. Perform SMM CPU Platform Hook before executing MMI Handler.
//
SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #2: Wait BSP
}

if (SmmCpuFeaturesNeedConfigureMtrrs ()) {
//
// Backup OS MTRRs
//
Expand All @@ -840,6 +850,11 @@ APHandler (
SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #5: Signal BSP
}

//
// Perform SMM CPU Platform Hook before executing MMI Handler
//
SmmCpuPlatformHookBeforeMmiHandler ();

while (TRUE) {
//
// Wait for something to happen
Expand Down

0 comments on commit 7319b59

Please sign in to comment.