Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9468df5 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Ingo Molnar
Browse files

x86/boot/64: Use a common function for starting CPUs



There are two different pieces of code for starting a CPU: start_cpu0()
and the end of secondary_startup_64().  They're identical except for the
stack setup.  Combine the common parts into a shared start_cpu()
function.

Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1d692ffa62fcb3cc835a5b254e953f2d9bab3549.1474480779.git.jpoimboe@redhat.com


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent b9b1a9c3
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -270,8 +270,12 @@ ENTRY(secondary_startup_64)
	/* rsi is pointer to real mode structure with interesting info.
	   pass it to C */
	movq	%rsi, %rdi
	jmp	start_cpu
ENDPROC(secondary_startup_64)

	/* Finally jump to run C code and to be on real kernel address
ENTRY(start_cpu)
	/*
	 * Jump to run C code and to be on a real kernel address.
	 * Since we are running on identity-mapped space we have to jump
	 * to the full 64bit address, this is only possible as indirect
	 * jump.  In addition we need to ensure %cs is set so we make this
@@ -300,7 +304,7 @@ ENTRY(secondary_startup_64)
	pushq	$__KERNEL_CS	# set correct cs
	pushq	%rax		# target address in negative space
	lretq
ENDPROC(secondary_startup_64)
ENDPROC(start_cpu)

#include "verify_cpu.S"

@@ -308,15 +312,11 @@ ENDPROC(secondary_startup_64)
/*
 * Boot CPU0 entry point. It's called from play_dead(). Everything has been set
 * up already except stack. We just set up stack here. Then call
 * start_secondary().
 * start_secondary() via start_cpu().
 */
ENTRY(start_cpu0)
	movq	initial_stack(%rip), %rsp
	movq	initial_code(%rip),%rax
	pushq	$0		# fake return address to stop unwinder
	pushq	$__KERNEL_CS	# set correct cs
	pushq	%rax		# target address in negative space
	lretq
	jmp	start_cpu
ENDPROC(start_cpu0)
#endif