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

Commit 46eabf06 authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar
Browse files

x86/entry/64: Call all native slow-path syscalls with full pt-regs



This removes all of the remaining asm syscall stubs except for
stub_ptregs_64.  Entries in the main syscall table are now all
callable from C.

The resulting asm is every bit as ridiculous as it looks.  The
next few patches will clean it up.  This patch is here to let
reviewers rest their brains and for bisection.

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/a6b3801be0d505d50aefabda02d3b93efbfc9c73.1454022279.git.luto@kernel.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 302f5b26
Loading
Loading
Loading
Loading
+1 −78
Original line number Diff line number Diff line
@@ -253,7 +253,6 @@ tracesys:
	 * the value it wants us to use in the table lookup.
	 */
	RESTORE_C_REGS_EXCEPT_RAX
	RESTORE_EXTRA_REGS
#if __SYSCALL_MASK == ~0
	cmpq	$__NR_syscall_max, %rax
#else
@@ -264,6 +263,7 @@ tracesys:
	movq	%r10, %rcx			/* fixup for C */
	call	*sys_call_table(, %rax, 8)
	movq	%rax, RAX(%rsp)
	RESTORE_EXTRA_REGS
1:
	/* Use IRET because user could have changed pt_regs->foo */

@@ -384,83 +384,6 @@ END(ptregs_\func)
#define __SYSCALL_64(nr, sym, qual) __SYSCALL_64_QUAL_##qual(sym)
#include <asm/syscalls_64.h>

	.macro FORK_LIKE func
ENTRY(stub_\func)
	SAVE_EXTRA_REGS 8
	jmp	sys_\func
END(stub_\func)
	.endm

	FORK_LIKE  clone
	FORK_LIKE  fork
	FORK_LIKE  vfork

ENTRY(stub_execve)
	call	sys_execve
return_from_execve:
	testl	%eax, %eax
	jz	1f
	/* exec failed, can use fast SYSRET code path in this case */
	ret
1:
	/* must use IRET code path (pt_regs->cs may have changed) */
	addq	$8, %rsp
	ZERO_EXTRA_REGS
	movq	%rax, RAX(%rsp)
	jmp	int_ret_from_sys_call
END(stub_execve)
/*
 * Remaining execve stubs are only 7 bytes long.
 * ENTRY() often aligns to 16 bytes, which in this case has no benefits.
 */
	.align	8
GLOBAL(stub_execveat)
	call	sys_execveat
	jmp	return_from_execve
END(stub_execveat)

#if defined(CONFIG_X86_X32_ABI)
	.align	8
GLOBAL(stub_x32_execve)
	call	compat_sys_execve
	jmp	return_from_execve
END(stub_x32_execve)
	.align	8
GLOBAL(stub_x32_execveat)
	call	compat_sys_execveat
	jmp	return_from_execve
END(stub_x32_execveat)
#endif

/*
 * sigreturn is special because it needs to restore all registers on return.
 * This cannot be done with SYSRET, so use the IRET return path instead.
 */
ENTRY(stub_rt_sigreturn)
	/*
	 * SAVE_EXTRA_REGS result is not normally needed:
	 * sigreturn overwrites all pt_regs->GPREGS.
	 * But sigreturn can fail (!), and there is no easy way to detect that.
	 * To make sure RESTORE_EXTRA_REGS doesn't restore garbage on error,
	 * we SAVE_EXTRA_REGS here.
	 */
	SAVE_EXTRA_REGS 8
	call	sys_rt_sigreturn
return_from_stub:
	addq	$8, %rsp
	RESTORE_EXTRA_REGS
	movq	%rax, RAX(%rsp)
	jmp	int_ret_from_sys_call
END(stub_rt_sigreturn)

#ifdef CONFIG_X86_X32_ABI
ENTRY(stub_x32_rt_sigreturn)
	SAVE_EXTRA_REGS 8
	call	sys32_x32_rt_sigreturn
	jmp	return_from_stub
END(stub_x32_rt_sigreturn)
#endif

/*
 * A newly forked process directly context switches into this address.
 *
+9 −9
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@
12	common	brk			sys_brk
13	64	rt_sigaction		sys_rt_sigaction
14	common	rt_sigprocmask		sys_rt_sigprocmask
15	64	rt_sigreturn		stub_rt_sigreturn/ptregs
15	64	rt_sigreturn		sys_rt_sigreturn/ptregs
16	64	ioctl			sys_ioctl
17	common	pread64			sys_pread64
18	common	pwrite64		sys_pwrite64
@@ -62,10 +62,10 @@
53	common	socketpair		sys_socketpair
54	64	setsockopt		sys_setsockopt
55	64	getsockopt		sys_getsockopt
56	common	clone			stub_clone/ptregs
57	common	fork			stub_fork/ptregs
58	common	vfork			stub_vfork/ptregs
59	64	execve			stub_execve/ptregs
56	common	clone			sys_clone/ptregs
57	common	fork			sys_fork/ptregs
58	common	vfork			sys_vfork/ptregs
59	64	execve			sys_execve/ptregs
60	common	exit			sys_exit
61	common	wait4			sys_wait4
62	common	kill			sys_kill
@@ -328,7 +328,7 @@
319	common	memfd_create		sys_memfd_create
320	common	kexec_file_load		sys_kexec_file_load
321	common	bpf			sys_bpf
322	64	execveat		stub_execveat/ptregs
322	64	execveat		sys_execveat/ptregs
323	common	userfaultfd		sys_userfaultfd
324	common	membarrier		sys_membarrier
325	common	mlock2			sys_mlock2
@@ -339,14 +339,14 @@
# for native 64-bit operation.
#
512	x32	rt_sigaction		compat_sys_rt_sigaction
513	x32	rt_sigreturn		stub_x32_rt_sigreturn
513	x32	rt_sigreturn		sys32_x32_rt_sigreturn
514	x32	ioctl			compat_sys_ioctl
515	x32	readv			compat_sys_readv
516	x32	writev			compat_sys_writev
517	x32	recvfrom		compat_sys_recvfrom
518	x32	sendmsg			compat_sys_sendmsg
519	x32	recvmsg			compat_sys_recvmsg
520	x32	execve			stub_x32_execve/ptregs
520	x32	execve			compat_sys_execve/ptregs
521	x32	ptrace			compat_sys_ptrace
522	x32	rt_sigpending		compat_sys_rt_sigpending
523	x32	rt_sigtimedwait		compat_sys_rt_sigtimedwait
@@ -371,4 +371,4 @@
542	x32	getsockopt		compat_sys_getsockopt
543	x32	io_setup		compat_sys_io_setup
544	x32	io_submit		compat_sys_io_submit
545	x32	execveat		stub_x32_execveat/ptregs
545	x32	execveat		compat_sys_execveat/ptregs