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 <chen.fan.f...@cn.fujitsu.com>
---
 UefiCpuPkg/CpuDxe/CpuMp.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c
index bfd0d8d..a87d67f 100644
--- a/UefiCpuPkg/CpuDxe/CpuMp.c
+++ b/UefiCpuPkg/CpuDxe/CpuMp.c
@@ -25,6 +25,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);
 }
 
 
-- 
1.9.3


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to