UefiCpuPkg/CpuDxe: split out StartupCode from StartApsStackless()

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16365 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chen Fan 2014-11-13 18:29:01 +00:00 committed by jljusten
parent e4aaf76428
commit fe078dd57f
3 changed files with 66 additions and 18 deletions

View File

@ -238,27 +238,22 @@ STARTUP_CODE mStartupCodeTemplate = {
}; };
volatile STARTUP_CODE *StartupCode = NULL;
/** /**
Starts the Application Processors and directs them to jump to the Prepares Startup Code for APs.
specified routine. This function prepares Startup Code for APs.
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_SUCCESS The APs were started
@retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs @retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs
**/ **/
EFI_STATUS EFI_STATUS
StartApsStackless ( PrepareAPStartupCode (
IN STACKLESS_AP_ENTRY_POINT ApEntryPoint VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
volatile STARTUP_CODE *StartupCode;
IA32_DESCRIPTOR Gdtr; IA32_DESCRIPTOR Gdtr;
EFI_PHYSICAL_ADDRESS StartAddress; EFI_PHYSICAL_ADDRESS StartAddress;
@ -281,7 +276,7 @@ StartApsStackless (
StartupCode->GdtLimit = Gdtr.Limit; StartupCode->GdtLimit = Gdtr.Limit;
StartupCode->GdtBase = (UINT32) Gdtr.Base; StartupCode->GdtBase = (UINT32) Gdtr.Base;
StartupCode->CpuDxeEntryValue = (UINTN) ApEntryPoint; StartupCode->CpuDxeEntryValue = (UINTN) AsmApEntryPoint;
StartupCode->FlatJmpOffset += (UINT32) StartAddress; StartupCode->FlatJmpOffset += (UINT32) StartAddress;
@ -290,15 +285,46 @@ StartApsStackless (
StartupCode->LongJmpOffset += (UINT32) StartAddress; StartupCode->LongJmpOffset += (UINT32) StartAddress;
#endif #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 // Wait 100 milliseconds for APs to arrive at the ApEntryPoint routine
// //
MicroSecondDelay (100 * 1000); MicroSecondDelay (100 * 1000);
gBS->FreePages (StartAddress, EFI_SIZE_TO_PAGES (sizeof (*StartupCode)));
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -1454,7 +1454,10 @@ InitializeMpSupport (
InitMpSystemData (); InitMpSystemData ();
PrepareAPStartupCode ();
if (mMpSystemData.NumberOfProcessors == 1) { if (mMpSystemData.NumberOfProcessors == 1) {
FreeApStartupCode ();
FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize)); FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
return; return;
} }

View File

@ -40,15 +40,12 @@ VOID
The processor jumps to this code in flat mode, but the processor's The processor jumps to this code in flat mode, but the processor's
stack is not initialized. stack is not initialized.
@param ApEntryPoint Pointer to the Entry Point routine
@retval EFI_SUCCESS The APs were started @retval EFI_SUCCESS The APs were started
@retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs
**/ **/
EFI_STATUS EFI_STATUS
StartApsStackless ( StartApsStackless (
IN STACKLESS_AP_ENTRY_POINT ApEntryPoint VOID
); );
/** /**
@ -603,5 +600,27 @@ ResetProcessorToIdleState (
IN CPU_DATA_BLOCK *CpuData 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_ #endif // _CPU_MP_H_