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

Commit af52201d authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Ingo Molnar
Browse files

x86/entry: Do not special-case clone(2) in compat entry



With the CPU renaming registers on its own, and all the overhead of the
syscall entry/exit, it is doubtful whether the compiled output of

	mov	%r8, %rax
	mov	%rcx, %r8
	mov	%rax, %rcx
	jmpq	sys_clone

is measurably slower than the hand-crafted version of

	xchg	%r8, %rcx

So get rid of this special case.

Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Acked-by: default avatarAndy 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: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: luto@amacapital.net
Cc: viro@zeniv.linux.org.uk
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 4ddb45db
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -406,15 +406,3 @@ ENTRY(entry_INT80_compat)
	TRACE_IRQS_ON
	jmp	swapgs_restore_regs_and_return_to_usermode
END(entry_INT80_compat)

ENTRY(stub32_clone)
	/*
	 * The 32-bit clone ABI is: clone(..., int tls_val, int *child_tidptr).
	 * The 64-bit clone ABI is: clone(..., int *child_tidptr, int tls_val).
	 *
	 * The native 64-bit kernel's sys_clone() implements the latter,
	 * so we need to swap arguments here before calling it:
	 */
	xchg	%r8, %rcx
	jmp	sys_clone
ENDPROC(stub32_clone)
+1 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@
117	i386	ipc			sys_ipc				compat_sys_ipc
118	i386	fsync			sys_fsync
119	i386	sigreturn		sys_sigreturn			sys32_sigreturn
120	i386	clone			sys_clone			stub32_clone
120	i386	clone			sys_clone			compat_sys_x86_clone
121	i386	setdomainname		sys_setdomainname
122	i386	uname			sys_newuname
123	i386	modify_ldt		sys_modify_ldt
+11 −0
Original line number Diff line number Diff line
@@ -233,3 +233,14 @@ COMPAT_SYSCALL_DEFINE6(x86_fallocate, int, fd, int, mode,
	return sys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo,
			     ((u64)len_hi << 32) | len_lo);
}

/*
 * The 32-bit clone ABI is CONFIG_CLONE_BACKWARDS
 */
COMPAT_SYSCALL_DEFINE5(x86_clone, unsigned long, clone_flags,
		       unsigned long, newsp, int __user *, parent_tidptr,
		       unsigned long, tls_val, int __user *, child_tidptr)
{
	return sys_clone(clone_flags, newsp, parent_tidptr, child_tidptr,
			tls_val);
}
+2 −0
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@ asmlinkage long compat_sys_x86_fadvise64(int, unsigned int, unsigned int,
					 size_t, int);
asmlinkage long compat_sys_x86_fallocate(int, int, unsigned int, unsigned int,
					 unsigned int, unsigned int);
asmlinkage long compat_sys_x86_clone(unsigned long, unsigned long, int __user *,
				     unsigned long, int __user *);

/* ia32/ia32_signal.c */
asmlinkage long sys32_sigreturn(void);