From e343f8f7b35a400bb1d6e0edd7dddc53dd9e436d Mon Sep 17 00:00:00 2001 From: Chen Fan Date: Thu, 13 Nov 2014 18:26:03 +0000 Subject: UefiCpuPkg/CpuDxe: Switch Ap Stack to NewStack All APs use the same common stack to initialization. after initialization, APs should switch to the stack of its own. 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@16351 6f19259b-4bc3-4df7-8a09-765794883524 --- UefiCpuPkg/CpuDxe/CpuMp.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'UefiCpuPkg') diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index bfd0d8d853..a87d67f180 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -24,6 +24,28 @@ VOID *mApStackStart = 0; volatile UINTN mNumberOfProcessors; +/** + Application Processors do loop routine + after switch to its own stack. + + @param Context1 A pointer to the context to pass into the function. + @param Context2 A pointer to the context to pass into the function. + +**/ +VOID +ProcessorToIdleState ( + IN VOID *Context1, OPTIONAL + IN VOID *Context2 OPTIONAL + ) +{ + DEBUG ((DEBUG_INFO, "Ap apicid is %d\n", GetApicId ())); + + AsmApDoneWithCommonStack (); + + CpuSleep (); + CpuDeadLoop (); +} + /** Application Processor C code entry point. @@ -35,6 +57,13 @@ ApEntryPointInC ( ) { mNumberOfProcessors++; + mApStackStart = (UINT8*)mApStackStart + gApStackSize; + + SwitchStack ( + (SWITCH_STACK_ENTRY_POINT)(UINTN)ProcessorToIdleState, + NULL, + NULL, + mApStackStart); } -- cgit v1.2.3