mirror of https://github.com/acidanthera/audk.git
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:
parent
e4aaf76428
commit
fe078dd57f
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1454,7 +1454,10 @@ InitializeMpSupport (
|
|||
|
||||
InitMpSystemData ();
|
||||
|
||||
PrepareAPStartupCode ();
|
||||
|
||||
if (mMpSystemData.NumberOfProcessors == 1) {
|
||||
FreeApStartupCode ();
|
||||
FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -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_
|
||||
|
||||
|
|
Loading…
Reference in New Issue