From fab82c1873b792bce33fb22c32db71324fc0ac3b Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Thu, 13 Nov 2014 18:24:59 +0000 Subject: [PATCH] UefiCpuPkg/CpuDxe: Add stackless assembly AP entry points 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 Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16347 6f19259b-4bc3-4df7-8a09-765794883524 --- 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 e49548f40b..9952eb7007 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 aa564c1f93..ea403e8e12 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 93d054002a..dd2d0e1200 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.h +++ b/UefiCpuPkg/CpuDxe/CpuMp.h @@ -24,5 +24,32 @@ 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 0000000000..d476829b91 --- /dev/null +++ b/UefiCpuPkg/CpuDxe/Ia32/MpAsm.asm @@ -0,0 +1,75 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+; 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 0000000000..c47cdcef54 --- /dev/null +++ b/UefiCpuPkg/CpuDxe/Ia32/MpAsm.nasm @@ -0,0 +1,68 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+; 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 0000000000..308de51330 --- /dev/null +++ b/UefiCpuPkg/CpuDxe/X64/MpAsm.asm @@ -0,0 +1,76 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+; 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 + +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 0000000000..e3dc248002 --- /dev/null +++ b/UefiCpuPkg/CpuDxe/X64/MpAsm.nasm @@ -0,0 +1,70 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+; 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 + -- 2.39.2