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

Commit 24d978b7 authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar
Browse files

x86/entry/64: Stop using int_ret_from_sys_call in ret_from_fork



ret_from_fork is now open-coded and is no longer tangled up with
the syscall code.  This isn't so bad -- this adds very little
code, and IMO the result is much easier to understand.

Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/a0747e2a5e47084655a1e96351c545b755c41fa7.1454022279.git.luto@kernel.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 46eabf06
Loading
Loading
Loading
Loading
+19 −16
Original line number Diff line number Diff line
@@ -390,7 +390,6 @@ END(ptregs_\func)
 * rdi: prev task we switched from
 */
ENTRY(ret_from_fork)

	LOCK ; btr $TIF_FORK, TI_flags(%r8)

	pushq	$0x0002
@@ -398,28 +397,32 @@ ENTRY(ret_from_fork)

	call	schedule_tail			/* rdi: 'prev' task parameter */

	RESTORE_EXTRA_REGS

	testb	$3, CS(%rsp)			/* from kernel_thread? */
	jnz	1f

	/*
	 * By the time we get here, we have no idea whether our pt_regs,
	 * ti flags, and ti status came from the 64-bit SYSCALL fast path,
	 * the slow path, or one of the 32-bit compat paths.
	 * Use IRET code path to return, since it can safely handle
	 * all of the above.
	 * We came from kernel_thread.  This code path is quite twisted, and
	 * someone should clean it up.
	 *
	 * copy_thread_tls stashes the function pointer in RBX and the
	 * parameter to be passed in RBP.  The called function is permitted
	 * to call do_execve and thereby jump to user mode.
	 */
	jnz	int_ret_from_sys_call
	movq	RBP(%rsp), %rdi
	call	*RBX(%rsp)
	movl	$0, RAX(%rsp)

	/*
	 * We came from kernel_thread
	 * nb: we depend on RESTORE_EXTRA_REGS above
	 * Fall through as though we're exiting a syscall.  This makes a
	 * twisted sort of sense if we just called do_execve.
	 */
	movq	%rbp, %rdi
	call	*%rbx
	movl	$0, RAX(%rsp)
	RESTORE_EXTRA_REGS
	jmp	int_ret_from_sys_call

1:
	movq	%rsp, %rdi
	call	syscall_return_slowpath	/* returns with IRQs disabled */
	TRACE_IRQS_ON			/* user mode is traced as IRQS on */
	SWAPGS
	jmp	restore_regs_and_iret
END(ret_from_fork)

/*