From fe078dd57f5e935c28eac7348b758ca6fb5e696f Mon Sep 17 00:00:00 2001 From: Chen Fan Date: Thu, 13 Nov 2014 18:29:01 +0000 Subject: [PATCH] UefiCpuPkg/CpuDxe: split out StartupCode from StartApsStackless() Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16365 6f19259b-4bc3-4df7-8a09-765794883524 --- UefiCpuPkg/CpuDxe/ApStartup.c | 54 ++++++++++++++++++++++++++--------- UefiCpuPkg/CpuDxe/CpuMp.c | 3 ++ UefiCpuPkg/CpuDxe/CpuMp.h | 27 +++++++++++++++--- 3 files changed, 66 insertions(+), 18 deletions(-) diff --git a/UefiCpuPkg/CpuDxe/ApStartup.c b/UefiCpuPkg/CpuDxe/ApStartup.c index 5477c52672..801f7f8611 100644 --- a/UefiCpuPkg/CpuDxe/ApStartup.c +++ b/UefiCpuPkg/CpuDxe/ApStartup.c @@ -238,27 +238,22 @@ STARTUP_CODE mStartupCodeTemplate = { }; +volatile STARTUP_CODE *StartupCode = NULL; /** - Starts the Application Processors and directs them to jump to the - specified routine. - - The processor jumps to this code in flat mode, but the processor's - stack is not initialized. - - @param ApEntryPoint Pointer to the Entry Point routine + Prepares Startup Code for APs. + This function prepares Startup Code for APs. @retval EFI_SUCCESS The APs were started @retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs **/ EFI_STATUS -StartApsStackless ( - IN STACKLESS_AP_ENTRY_POINT ApEntryPoint +PrepareAPStartupCode ( + VOID ) { EFI_STATUS Status; - volatile STARTUP_CODE *StartupCode; IA32_DESCRIPTOR Gdtr; EFI_PHYSICAL_ADDRESS StartAddress; @@ -281,7 +276,7 @@ StartApsStackless ( StartupCode->GdtLimit = Gdtr.Limit; StartupCode->GdtBase = (UINT32) Gdtr.Base; - StartupCode->CpuDxeEntryValue = (UINTN) ApEntryPoint; + StartupCode->CpuDxeEntryValue = (UINTN) AsmApEntryPoint; StartupCode->FlatJmpOffset += (UINT32) StartAddress; @@ -290,15 +285,46 @@ StartApsStackless ( StartupCode->LongJmpOffset += (UINT32) StartAddress; #endif - SendInitSipiSipiAllExcludingSelf ((UINT32)(UINTN)(VOID*) StartupCode); + return EFI_SUCCESS; +} + +/** + Free the code buffer of startup AP. + +**/ +VOID +FreeApStartupCode ( + VOID + ) +{ + if (StartupCode != NULL) { + gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)(VOID*) StartupCode, + EFI_SIZE_TO_PAGES (sizeof (*StartupCode))); + } +} + +/** + Starts the Application Processors and directs them to jump to the + specified routine. + + The processor jumps to this code in flat mode, but the processor's + stack is not initialized. + + @retval EFI_SUCCESS The APs were started + +**/ +EFI_STATUS +StartApsStackless ( + VOID + ) +{ + SendInitSipiSipiAllExcludingSelf ((UINT32)(UINTN)(VOID*) StartupCode); // // Wait 100 milliseconds for APs to arrive at the ApEntryPoint routine // MicroSecondDelay (100 * 1000); - gBS->FreePages (StartAddress, EFI_SIZE_TO_PAGES (sizeof (*StartupCode))); - return EFI_SUCCESS; } diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index 3e30d7417d..029e8d4331 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -1454,7 +1454,10 @@ InitializeMpSupport ( InitMpSystemData (); + PrepareAPStartupCode (); + if (mMpSystemData.NumberOfProcessors == 1) { + FreeApStartupCode (); FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize)); return; } diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h index a53ef52d93..2b1717d410 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.h +++ b/UefiCpuPkg/CpuDxe/CpuMp.h @@ -40,15 +40,12 @@ VOID The processor jumps to this code in flat mode, but the processor's stack is not initialized. - @param ApEntryPoint Pointer to the Entry Point routine - @retval EFI_SUCCESS The APs were started - @retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs **/ EFI_STATUS StartApsStackless ( - IN STACKLESS_AP_ENTRY_POINT ApEntryPoint + VOID ); /** @@ -603,5 +600,27 @@ ResetProcessorToIdleState ( IN CPU_DATA_BLOCK *CpuData ); +/** + Prepares Startup Code for APs. + This function prepares Startup Code for APs. + + @retval EFI_SUCCESS The APs were started + @retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs + +**/ +EFI_STATUS +PrepareAPStartupCode ( + VOID + ); + +/** + Free the code buffer of startup AP. + +**/ +VOID +FreeApStartupCode ( + VOID + ); + #endif // _CPU_MP_H_ -- 2.39.2