From 9f06e5c7021c02afac4698adbb49d482cb606e3e Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Tue, 23 Jul 2024 09:46:01 +0800 Subject: [PATCH] UefiCpuPkg: Remove ApInitReconfig status ApInitReconfig status is used to indicate that when AP wakes up, AP need to restore volatile registers from BSP and use InitSipiSipi. Since we handle the volatile registers well, we can use WakeUpByInitSipiSipi flag to replace ApInitReconfig. Avoid using ApInitReconfig can simplify code. Signed-off-by: Zhiguang Liu --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 25 ++++++++++--------------- UefiCpuPkg/Library/MpInitLib/MpLib.h | 5 ++--- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 4a23fd1a92..8b2bacb65e 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -1224,7 +1224,7 @@ WakeUpAP ( ResetVectorRequired = FALSE; if (CpuMpData->WakeUpByInitSipiSipi || - (CpuMpData->InitFlag != ApInitDone)) + (CpuMpData->InitFlag == ApInitConfig)) { ResetVectorRequired = TRUE; AllocateResetVectorBelow1Mb (CpuMpData); @@ -1258,7 +1258,7 @@ WakeUpAP ( CpuData->ApFunction = (UINTN)Procedure; CpuData->ApFunctionArgument = (UINTN)ProcedureArgument; SetApState (CpuData, CpuStateReady); - if (CpuMpData->InitFlag != ApInitConfig) { + if (CpuMpData->InitFlag == ApInitDone) { *(UINT32 *)CpuData->StartupApSignal = WAKEUP_AP_SIGNAL; } } @@ -1376,7 +1376,7 @@ WakeUpAP ( // // Wakeup specified AP // - ASSERT (CpuMpData->InitFlag != ApInitConfig); + ASSERT (CpuMpData->InitFlag == ApInitDone); *(UINT32 *)CpuData->StartupApSignal = WAKEUP_AP_SIGNAL; if (ResetVectorRequired) { CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; @@ -1648,14 +1648,12 @@ ResetProcessorToIdleState ( CpuMpData = GetCpuMpData (); - CpuMpData->InitFlag = ApInitReconfig; + CpuMpData->WakeUpByInitSipiSipi = TRUE; WakeUpAP (CpuMpData, FALSE, ProcessorNumber, NULL, NULL, TRUE); while (CpuMpData->FinishedCount < 1) { CpuPause (); } - CpuMpData->InitFlag = ApInitDone; - SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle); } @@ -2315,6 +2313,12 @@ MpInitLibInitialize ( // InitMpGlobalData (CpuMpData); return EFI_SUCCESS; + } else { + // + // PEI and DXE are in different Execution Mode + // Use Init Sipi Sipi for the first AP wake up in DXE phase. + // + CpuMpData->WakeUpByInitSipiSipi = TRUE; } } @@ -2343,15 +2347,6 @@ MpInitLibInitialize ( // Wakeup APs to do some AP initialize sync (Microcode & MTRR) // if (CpuMpData->CpuCount > 1) { - if (FirstMpHandOff != NULL) { - // - // Only needs to use this flag for DXE phase to update the wake up - // buffer. Wakeup buffer allocated in PEI phase is no longer valid - // in DXE. - // - CpuMpData->InitFlag = ApInitReconfig; - } - WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData, TRUE); // // Wait for all APs finished initialization diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index 8742fa175b..e92991d5dc 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -120,9 +120,8 @@ typedef enum { // AP initialization state during APs wakeup // typedef enum { - ApInitConfig = 1, - ApInitReconfig = 2, - ApInitDone = 3 + ApInitConfig = 1, + ApInitDone = 2 } AP_INIT_STATE; //