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
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue