x86: use stack_start in x86_64

call x86_64's init_rsp stack_start, just as i386 does.
Put a zeroed stack segment for consistency. With this,
we can eliminate one ugly ifdef in smpboot.c.

Signed-off-by: Glauber Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Glauber Costa 2008-05-27 18:22:54 -07:00 committed by Ingo Molnar
parent a7bf0bd5e6
commit 9cf4f298e2
3 changed files with 5 additions and 9 deletions

View File

@ -86,7 +86,7 @@ int acpi_save_state_mem(void)
saved_magic = 0x12345678; saved_magic = 0x12345678;
#else /* CONFIG_64BIT */ #else /* CONFIG_64BIT */
header->trampoline_segment = setup_trampoline() >> 4; header->trampoline_segment = setup_trampoline() >> 4;
init_rsp = (unsigned long)temp_stack + 4096; stack_start.sp = temp_stack + 4096;
initial_code = (unsigned long)wakeup_long64; initial_code = (unsigned long)wakeup_long64;
saved_magic = 0x123456789abcdef0; saved_magic = 0x123456789abcdef0;
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */

View File

@ -191,7 +191,7 @@ ENTRY(secondary_startup_64)
movq %rax, %cr0 movq %rax, %cr0
/* Setup a boot time stack */ /* Setup a boot time stack */
movq init_rsp(%rip),%rsp movq stack_start(%rip),%rsp
/* zero EFLAGS after setting rsp */ /* zero EFLAGS after setting rsp */
pushq $0 pushq $0
@ -252,8 +252,9 @@ ENTRY(secondary_startup_64)
.quad x86_64_start_kernel .quad x86_64_start_kernel
__FINITDATA __FINITDATA
ENTRY(init_rsp) ENTRY(stack_start)
.quad init_thread_union+THREAD_SIZE-8 .quad init_thread_union+THREAD_SIZE-8
.word 0
bad_address: bad_address:
jmp bad_address jmp bad_address

View File

@ -714,11 +714,7 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
* target processor state. * target processor state.
*/ */
startup_ipi_hook(phys_apicid, (unsigned long) start_secondary, startup_ipi_hook(phys_apicid, (unsigned long) start_secondary,
#ifdef CONFIG_X86_64
(unsigned long)init_rsp);
#else
(unsigned long)stack_start.sp); (unsigned long)stack_start.sp);
#endif
/* /*
* Run STARTUP IPI loop. * Run STARTUP IPI loop.
@ -905,15 +901,14 @@ do_rest:
early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
c_idle.idle->thread.ip = (unsigned long) start_secondary; c_idle.idle->thread.ip = (unsigned long) start_secondary;
/* Stack for startup_32 can be just as for start_secondary onwards */ /* Stack for startup_32 can be just as for start_secondary onwards */
stack_start.sp = (void *) c_idle.idle->thread.sp;
irq_ctx_init(cpu); irq_ctx_init(cpu);
#else #else
cpu_pda(cpu)->pcurrent = c_idle.idle; cpu_pda(cpu)->pcurrent = c_idle.idle;
init_rsp = c_idle.idle->thread.sp;
load_sp0(&per_cpu(init_tss, cpu), &c_idle.idle->thread); load_sp0(&per_cpu(init_tss, cpu), &c_idle.idle->thread);
initial_code = (unsigned long)start_secondary; initial_code = (unsigned long)start_secondary;
clear_tsk_thread_flag(c_idle.idle, TIF_FORK); clear_tsk_thread_flag(c_idle.idle, TIF_FORK);
#endif #endif
stack_start.sp = (void *) c_idle.idle->thread.sp;
/* start_ip had better be page-aligned! */ /* start_ip had better be page-aligned! */
start_ip = setup_trampoline(); start_ip = setup_trampoline();