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

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.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 46eabf06
...@@ -390,7 +390,6 @@ END(ptregs_\func) ...@@ -390,7 +390,6 @@ END(ptregs_\func)
* rdi: prev task we switched from * rdi: prev task we switched from
*/ */
ENTRY(ret_from_fork) ENTRY(ret_from_fork)
LOCK ; btr $TIF_FORK, TI_flags(%r8) LOCK ; btr $TIF_FORK, TI_flags(%r8)
pushq $0x0002 pushq $0x0002
...@@ -398,28 +397,32 @@ ENTRY(ret_from_fork) ...@@ -398,28 +397,32 @@ ENTRY(ret_from_fork)
call schedule_tail /* rdi: 'prev' task parameter */ call schedule_tail /* rdi: 'prev' task parameter */
RESTORE_EXTRA_REGS
testb $3, CS(%rsp) /* from kernel_thread? */ testb $3, CS(%rsp) /* from kernel_thread? */
jnz 1f
/* /*
* By the time we get here, we have no idea whether our pt_regs, * We came from kernel_thread. This code path is quite twisted, and
* ti flags, and ti status came from the 64-bit SYSCALL fast path, * someone should clean it up.
* the slow path, or one of the 32-bit compat paths. *
* Use IRET code path to return, since it can safely handle * copy_thread_tls stashes the function pointer in RBX and the
* all of the above. * 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 * Fall through as though we're exiting a syscall. This makes a
* nb: we depend on RESTORE_EXTRA_REGS above * twisted sort of sense if we just called do_execve.
*/ */
movq %rbp, %rdi
call *%rbx 1:
movl $0, RAX(%rsp) movq %rsp, %rdi
RESTORE_EXTRA_REGS call syscall_return_slowpath /* returns with IRQs disabled */
jmp int_ret_from_sys_call TRACE_IRQS_ON /* user mode is traced as IRQS on */
SWAPGS
jmp restore_regs_and_iret
END(ret_from_fork) END(ret_from_fork)
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment