Commit d2b5de49 authored by Brian Gerst's avatar Brian Gerst Committed by Thomas Gleixner
Browse files

x86/entry: Refactor SYSCALL_DEFINE0 macros



Pull the common code out from the SYSCALL_DEFINE0 macros into a new
__SYS_STUB0 macro.  Also conditionalize the X64 version in preparation for
enabling syscall wrappers on 32-bit native kernels.

Signed-off-by: default avatarBrian Gerst <brgerst@gmail.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Reviewed-by: default avatarAndy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20200313195144.164260-3-brgerst@gmail.com
parent 4399e0cf
Loading
Loading
Loading
Loading
+32 −41
Original line number Diff line number Diff line
@@ -21,6 +21,12 @@ struct pt_regs;
	      ,,(unsigned int)regs->dx,,(unsigned int)regs->si		\
	      ,,(unsigned int)regs->di,,(unsigned int)regs->bp)

#define __SYS_STUB0(abi, name)						\
	asmlinkage long __##abi##_##name(const struct pt_regs *regs);	\
	ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO);			\
	asmlinkage long __##abi##_##name(const struct pt_regs *regs)	\
		__alias(__do_##name);

#define __SYS_STUBx(abi, name, ...)					\
	asmlinkage long __##abi##_##name(const struct pt_regs *regs);	\
	ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO);			\
@@ -30,10 +36,14 @@ struct pt_regs;
	}

#ifdef CONFIG_X86_64
#define __X64_SYS_STUB0(name)						\
	__SYS_STUB0(x64, sys_##name)

#define __X64_SYS_STUBx(x, name, ...)					\
	__SYS_STUBx(x64, sys##name,					\
		    SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__))
#else /* CONFIG_X86_64 */
#define __X64_SYS_STUB0(name)
#define __X64_SYS_STUBx(x, name, ...)
#endif /* CONFIG_X86_64 */

@@ -46,34 +56,20 @@ struct pt_regs;
 * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this
 * case as well.
 */
#define __IA32_COMPAT_SYS_STUB0(x, name)				\
	asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs);\
	ALLOW_ERROR_INJECTION(__ia32_compat_sys_##name, ERRNO);		\
	asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs)\
	{								\
		return __se_compat_sys_##name();			\
	}
#define __IA32_COMPAT_SYS_STUB0(name)					\
	__SYS_STUB0(ia32, compat_sys_##name)

#define __IA32_COMPAT_SYS_STUBx(x, name, ...)				\
	__SYS_STUBx(ia32, compat_sys##name,				\
		    SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__))

#define __IA32_SYS_STUB0(name)						\
	__SYS_STUB0(ia32, sys_##name)

#define __IA32_SYS_STUBx(x, name, ...)					\
	__SYS_STUBx(ia32, sys##name,					\
		    SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__))

/*
 * To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias
 * named __ia32_sys_*()
 */

#define SYSCALL_DEFINE0(sname)						\
	SYSCALL_METADATA(_##sname, 0);					\
	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
	ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO);		\
	SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname);		\
	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)

#define COND_SYSCALL(name)							\
	asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused)	\
	{									\
@@ -89,7 +85,9 @@ struct pt_regs;
	SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers)

#else /* CONFIG_IA32_EMULATION */
#define __IA32_COMPAT_SYS_STUB0(name)
#define __IA32_COMPAT_SYS_STUBx(x, name, ...)
#define __IA32_SYS_STUB0(name)
#define __IA32_SYS_STUBx(x, name, ...)
#endif /* CONFIG_IA32_EMULATION */

@@ -100,20 +98,15 @@ struct pt_regs;
 * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
 * with x86_64 obviously do not need such care.
 */
#define __X32_COMPAT_SYS_STUB0(x, name, ...)				\
	asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs);\
	ALLOW_ERROR_INJECTION(__x32_compat_sys_##name, ERRNO);		\
	asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs)\
	{								\
		return __se_compat_sys_##name();\
	}
#define __X32_COMPAT_SYS_STUB0(name)					\
	__SYS_STUB0(x32, compat_sys_##name)

#define __X32_COMPAT_SYS_STUBx(x, name, ...)				\
	__SYS_STUBx(x32, compat_sys##name,				\
		    SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__))

#else /* CONFIG_X86_X32 */
#define __X32_COMPAT_SYS_STUB0(x, name)
#define __X32_COMPAT_SYS_STUB0(name)
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
#endif /* CONFIG_X86_X32 */

@@ -125,15 +118,12 @@ struct pt_regs;
 * of them.
 */
#define COMPAT_SYSCALL_DEFINE0(name)					\
	static long __se_compat_sys_##name(void);			\
	static inline long __do_compat_sys_##name(void);		\
	__IA32_COMPAT_SYS_STUB0(x, name)				\
	__X32_COMPAT_SYS_STUB0(x, name)					\
	static long __se_compat_sys_##name(void)			\
	{								\
		return __do_compat_sys_##name();			\
	}								\
	static inline long __do_compat_sys_##name(void)
	static asmlinkage long						\
	__do_compat_sys_##name(const struct pt_regs *__unused);		\
	__IA32_COMPAT_SYS_STUB0(name)					\
	__X32_COMPAT_SYS_STUB0(name)					\
	static asmlinkage long						\
	__do_compat_sys_##name(const struct pt_regs *__unused)

#define COMPAT_SYSCALL_DEFINEx(x, name, ...)					\
	static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));	\
@@ -216,13 +206,14 @@ struct pt_regs;
 * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI()
 * macros to work correctly.
 */
#ifndef SYSCALL_DEFINE0
#define SYSCALL_DEFINE0(sname)						\
	SYSCALL_METADATA(_##sname, 0);					\
	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
	ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO);		\
	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
#endif
	static asmlinkage long						\
	__do_sys_##sname(const struct pt_regs *__unused);		\
	__X64_SYS_STUB0(sname)						\
	__IA32_SYS_STUB0(sname)						\
	static asmlinkage long						\
	__do_sys_##sname(const struct pt_regs *__unused)

#ifndef COND_SYSCALL
#define COND_SYSCALL(name) 							\