diff options
author | Fenghua Yu <fenghua.yu@intel.com> | 2012-11-13 14:32:44 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2012-11-14 12:39:51 -0500 |
commit | 42e78e9719aa0c76711e2731b19c90fe5ae05278 (patch) | |
tree | 54b5a1bf71a4b2180247512c2a18d4c5927b8bd5 | |
parent | 6e32d479db6079dd5d4309aa66aecbcf2664a5fe (diff) |
x86-64, hotplug: Add start_cpu0() entry point to head_64.S
start_cpu0() is defined in head_64.S for 64-bit. The function sets up stack and
jumps to start_secondary() for CPU0 wake up.
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Link: http://lkml.kernel.org/r/1352835171-3958-8-git-send-email-fenghua.yu@intel.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | arch/x86/kernel/head_64.S | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 94bf9cc2c7ee..980053c4b9cc 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
@@ -252,6 +252,22 @@ ENTRY(secondary_startup_64) | |||
252 | pushq %rax # target address in negative space | 252 | pushq %rax # target address in negative space |
253 | lretq | 253 | lretq |
254 | 254 | ||
255 | #ifdef CONFIG_HOTPLUG_CPU | ||
256 | /* | ||
257 | * Boot CPU0 entry point. It's called from play_dead(). Everything has been set | ||
258 | * up already except stack. We just set up stack here. Then call | ||
259 | * start_secondary(). | ||
260 | */ | ||
261 | ENTRY(start_cpu0) | ||
262 | movq stack_start(%rip),%rsp | ||
263 | movq initial_code(%rip),%rax | ||
264 | pushq $0 # fake return address to stop unwinder | ||
265 | pushq $__KERNEL_CS # set correct cs | ||
266 | pushq %rax # target address in negative space | ||
267 | lretq | ||
268 | ENDPROC(start_cpu0) | ||
269 | #endif | ||
270 | |||
255 | /* SMP bootup changes these two */ | 271 | /* SMP bootup changes these two */ |
256 | __REFDATA | 272 | __REFDATA |
257 | .align 8 | 273 | .align 8 |