From: Jordan Justen <jordan.l.jus...@intel.com>

The AP startup code simply jumps into this code with the CpuDxe driver
without setting up a stack for the processor.

Therefore, this code must setup the stack before calling into C code.

This is the basic flow:
* AP enters CpuDxe driver code (AsmApEntryPoint) without stack
  - AP grabs a lock
  - AP sets up stack
  - AP calls CpuMp.c:ApEntryPointInC
  - If ApEntryPointInC returns, the lock is freed, and another AP may
    run
  - The AP C code may call AsmApDoneWithCommonStack to indicate that
    the AP is no longer using the stack, and another may therefore
    proceed to use the stack and then call ApEntryPointInC

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com>
---
 UefiCpuPkg/CpuDxe/CpuDxe.inf      |  6 ++++
 UefiCpuPkg/CpuDxe/CpuMp.c         |  4 +++
 UefiCpuPkg/CpuDxe/CpuMp.h         | 27 ++++++++++++++
 UefiCpuPkg/CpuDxe/Ia32/MpAsm.asm  | 75 ++++++++++++++++++++++++++++++++++++++
 UefiCpuPkg/CpuDxe/Ia32/MpAsm.nasm | 68 +++++++++++++++++++++++++++++++++++
 UefiCpuPkg/CpuDxe/X64/MpAsm.asm   | 76 +++++++++++++++++++++++++++++++++++++++
 UefiCpuPkg/CpuDxe/X64/MpAsm.nasm  | 70 ++++++++++++++++++++++++++++++++++++
 7 files changed, 326 insertions(+)
 create mode 100644 UefiCpuPkg/CpuDxe/Ia32/MpAsm.asm
 create mode 100644 UefiCpuPkg/CpuDxe/Ia32/MpAsm.nasm
 create mode 100644 UefiCpuPkg/CpuDxe/X64/MpAsm.asm
 create mode 100644 UefiCpuPkg/CpuDxe/X64/MpAsm.nasm

diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf
index e49548f..9952eb7 100644
--- a/UefiCpuPkg/CpuDxe/CpuDxe.inf
+++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf
@@ -53,11 +53,17 @@
   Ia32/CpuAsm.asm | MSFT
   Ia32/CpuAsm.asm | INTEL
   Ia32/CpuAsm.S   | GCC
+  Ia32/MpAsm.asm  | MSFT
+  Ia32/MpAsm.asm  | INTEL
+  Ia32/MpAsm.nasm | GCC
 
 [Sources.X64]
   X64/CpuAsm.asm | MSFT
   X64/CpuAsm.asm | INTEL
   X64/CpuAsm.S   | GCC
+  X64/MpAsm.asm  | MSFT
+  X64/MpAsm.asm  | INTEL
+  X64/MpAsm.nasm | GCC
 
 [Protocols]
   gEfiCpuArchProtocolGuid                       ## PRODUCES
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c
index aa564c1..ea403e8 100644
--- a/UefiCpuPkg/CpuDxe/CpuMp.c
+++ b/UefiCpuPkg/CpuDxe/CpuMp.c
@@ -15,6 +15,10 @@
 #include "CpuDxe.h"
 #include "CpuMp.h"
 
+VOID *mCommonStack = 0;
+VOID *mTopOfApCommonStack = 0;
+
+
 /**
   Application Processor C code entry point.
 
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h
index 9468212..cdca152 100644
--- a/UefiCpuPkg/CpuDxe/CpuMp.h
+++ b/UefiCpuPkg/CpuDxe/CpuMp.h
@@ -23,5 +23,32 @@ VOID InitializeMpSupport (
   VOID
   );
 
+/**
+  The AP entry point that the Startup-IPI target code will jump to.
+
+  The processor jumps to this code in flat mode, but the processor's
+  stack is not initialized.
+
+**/
+VOID
+EFIAPI
+AsmApEntryPoint (
+  VOID
+  );
+
+/**
+  Releases the lock preventing other APs from using the shared AP
+  stack.
+
+  Once the AP has transitioned to using a new stack, it can call this
+  function to allow another AP to proceed with using the shared stack.
+
+**/
+VOID
+EFIAPI
+AsmApDoneWithCommonStack (
+  VOID
+  );
+
 #endif // _CPU_MP_H_
 
diff --git a/UefiCpuPkg/CpuDxe/Ia32/MpAsm.asm b/UefiCpuPkg/CpuDxe/Ia32/MpAsm.asm
new file mode 100644
index 0000000..d476829
--- /dev/null
+++ b/UefiCpuPkg/CpuDxe/Ia32/MpAsm.asm
@@ -0,0 +1,75 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+; This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD 
License
+; which accompanies this distribution.  The full text of the license may be 
found at
+; http://opensource.org/licenses/bsd-license.php.
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+;------------------------------------------------------------------------------
+
+.586p
+.model flat, C
+
+extern mTopOfApCommonStack:DWORD
+extern ApEntryPointInC:PROC
+
+.code
+
+;
+; This lock only allows one AP to use the mTopOfApCommonStack stack at a time
+;
+ApStackLock dd      0
+
+;.code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApEntryPoint (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmApEntryPoint PROC
+
+    cli
+AsmApEntryPointAcquireLock:
+lock bts    dword ptr [ApStackLock], 0
+    pause
+    jc      AsmApEntryPointAcquireLock
+
+    mov     esp, [mTopOfApCommonStack]
+    call    ApEntryPointInC
+
+    cli
+
+lock btc    dword ptr [ApStackLock], 0
+
+    mov     eax, 100h
+AsmApEntryPointShareLock:
+    pause
+    dec     eax
+    jnz     AsmApEntryPointShareLock
+
+    jmp     AsmApEntryPoint
+
+AsmApEntryPoint ENDP
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApDoneWithCommonStack (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmApDoneWithCommonStack PROC PUBLIC
+
+lock btc    dword ptr [ApStackLock], 0
+    ret
+
+AsmApDoneWithCommonStack ENDP
+
+END
diff --git a/UefiCpuPkg/CpuDxe/Ia32/MpAsm.nasm 
b/UefiCpuPkg/CpuDxe/Ia32/MpAsm.nasm
new file mode 100644
index 0000000..c47cdce
--- /dev/null
+++ b/UefiCpuPkg/CpuDxe/Ia32/MpAsm.nasm
@@ -0,0 +1,68 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+; This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD 
License
+; which accompanies this distribution.  The full text of the license may be 
found at
+; http://opensource.org/licenses/bsd-license.php.
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+;------------------------------------------------------------------------------
+
+extern ASM_PFX(mTopOfApCommonStack)
+extern ASM_PFX(ApEntryPointInC)
+
+SECTION .data
+
+;
+; This lock only allows one AP to use the mTopOfApCommonStack stack at a time
+;
+ApStackLock:
+    dd      0
+
+SECTION .text
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApEntryPoint (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+global ASM_PFX(AsmApEntryPoint)
+ASM_PFX(AsmApEntryPoint):
+    cli
+AsmApEntryPointAcquireLock:
+lock bts    dword [ApStackLock], 0
+    pause
+    jc      AsmApEntryPointAcquireLock
+
+    mov     esp, [ASM_PFX(mTopOfApCommonStack)]
+    call    ASM_PFX(ApEntryPointInC)
+
+    cli
+
+lock btc    dword [ApStackLock], 0
+
+    mov     eax, 0x100
+AsmApEntryPointShareLock:
+    pause
+    dec     eax
+    jnz     AsmApEntryPointShareLock
+
+    jmp     ASM_PFX(AsmApEntryPoint)
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApDoneWithCommonStack (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+global ASM_PFX(AsmApDoneWithCommonStack)
+ASM_PFX(AsmApDoneWithCommonStack):
+lock btc    dword [ApStackLock], 0
+    ret
+
diff --git a/UefiCpuPkg/CpuDxe/X64/MpAsm.asm b/UefiCpuPkg/CpuDxe/X64/MpAsm.asm
new file mode 100644
index 0000000..308de51
--- /dev/null
+++ b/UefiCpuPkg/CpuDxe/X64/MpAsm.asm
@@ -0,0 +1,76 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+; This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD 
License
+; which accompanies this distribution.  The full text of the license may be 
found at
+; http://opensource.org/licenses/bsd-license.php.
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+;------------------------------------------------------------------------------
+
+#include <Base.h>
+
+extern ASM_PFX(mTopOfApCommonStack):QWORD
+extern ASM_PFX(ApEntryPointInC):PROC
+
+.data
+
+;
+; This lock only allows one AP to use the mTopOfApCommonStack stack at a time
+;
+ApStackLock:
+    dd      0
+
+.code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApEntryPoint (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+ASM_PFX(AsmApEntryPoint) PROC PUBLIC
+
+    cli
+AsmApEntryPointAcquireLock:
+lock bts    dword ptr [ApStackLock], 0
+    pause
+    jc      AsmApEntryPointAcquireLock
+
+    mov     rsp, [ASM_PFX(mTopOfApCommonStack)]
+    call    ASM_PFX(ApEntryPointInC)
+
+    cli
+
+lock btc    dword ptr [ApStackLock], 0
+
+    mov     eax, 100h
+AsmApEntryPointShareLock:
+    pause
+    dec     eax
+    jnz     AsmApEntryPointShareLock
+
+    jmp     ASM_PFX(AsmApEntryPoint)
+
+ASM_PFX(AsmApEntryPoint) ENDP
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApDoneWithCommonStack (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+ASM_PFX(AsmApDoneWithCommonStack) PROC PUBLIC
+
+lock btc    dword ptr [ApStackLock], 0
+    ret
+
+ASM_PFX(AsmApDoneWithCommonStack) ENDP
+
+END
+
diff --git a/UefiCpuPkg/CpuDxe/X64/MpAsm.nasm b/UefiCpuPkg/CpuDxe/X64/MpAsm.nasm
new file mode 100644
index 0000000..e3dc248
--- /dev/null
+++ b/UefiCpuPkg/CpuDxe/X64/MpAsm.nasm
@@ -0,0 +1,70 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+; This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD 
License
+; which accompanies this distribution.  The full text of the license may be 
found at
+; http://opensource.org/licenses/bsd-license.php.
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+;------------------------------------------------------------------------------
+
+extern ASM_PFX(mTopOfApCommonStack)
+extern ASM_PFX(ApEntryPointInC)
+
+DEFAULT REL
+
+SECTION .data
+
+;
+; This lock only allows one AP to use the mTopOfApCommonStack stack at a time
+;
+ApStackLock:
+    dd      0
+
+SECTION .text
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApEntryPoint (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+global ASM_PFX(AsmApEntryPoint)
+ASM_PFX(AsmApEntryPoint):
+    cli
+AsmApEntryPointAcquireLock:
+lock bts    dword [ApStackLock], 0
+    pause
+    jc      AsmApEntryPointAcquireLock
+
+    mov     rsp, [ASM_PFX(mTopOfApCommonStack)]
+    call    ASM_PFX(ApEntryPointInC)
+
+    cli
+
+lock btc    dword [ApStackLock], 0
+
+    mov     eax, 0x100
+AsmApEntryPointShareLock:
+    pause
+    dec     eax
+    jnz     AsmApEntryPointShareLock
+
+    jmp     ASM_PFX(AsmApEntryPoint)
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmApDoneWithCommonStack (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+global ASM_PFX(AsmApDoneWithCommonStack)
+ASM_PFX(AsmApDoneWithCommonStack):
+lock btc    dword [ApStackLock], 0
+    ret
+
-- 
1.9.3


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

Reply via email to