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
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;
}

View File

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

View File

@ -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_