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 +