forked from Minki/linux
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:
parent
a7bf0bd5e6
commit
9cf4f298e2
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user