diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 2df2cb9f22db..e3986fdc15a3 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -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 @@ -564,6 +567,11 @@ BSPHandler ( } } + // + // Perform SMM CPU Platform Hook before executing MMI Handler + // + SmmCpuPlatformHookBeforeMmiHandler (); + // // The BUSY lock is initialized to Acquired state // @@ -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 // @@ -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