Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Brian Gerst <brgerst@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net>
Reviewed-by: Andy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20200313195144.164260-3-brgerst@gmail.com

authored by

Brian Gerst and committed by
Thomas Gleixner
d2b5de49 4399e0cf

+32 -41
+32 -41
arch/x86/include/asm/syscall_wrapper.h
··· 21 21 ,,(unsigned int)regs->dx,,(unsigned int)regs->si \ 22 22 ,,(unsigned int)regs->di,,(unsigned int)regs->bp) 23 23 24 + #define __SYS_STUB0(abi, name) \ 25 + asmlinkage long __##abi##_##name(const struct pt_regs *regs); \ 26 + ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \ 27 + asmlinkage long __##abi##_##name(const struct pt_regs *regs) \ 28 + __alias(__do_##name); 29 + 24 30 #define __SYS_STUBx(abi, name, ...) \ 25 31 asmlinkage long __##abi##_##name(const struct pt_regs *regs); \ 26 32 ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \ ··· 36 30 } 37 31 38 32 #ifdef CONFIG_X86_64 33 + #define __X64_SYS_STUB0(name) \ 34 + __SYS_STUB0(x64, sys_##name) 35 + 39 36 #define __X64_SYS_STUBx(x, name, ...) \ 40 37 __SYS_STUBx(x64, sys##name, \ 41 38 SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__)) 42 39 #else /* CONFIG_X86_64 */ 40 + #define __X64_SYS_STUB0(name) 43 41 #define __X64_SYS_STUBx(x, name, ...) 44 42 #endif /* CONFIG_X86_64 */ 45 43 ··· 56 46 * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this 57 47 * case as well. 58 48 */ 59 - #define __IA32_COMPAT_SYS_STUB0(x, name) \ 60 - asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs);\ 61 - ALLOW_ERROR_INJECTION(__ia32_compat_sys_##name, ERRNO); \ 62 - asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs)\ 63 - { \ 64 - return __se_compat_sys_##name(); \ 65 - } 49 + #define __IA32_COMPAT_SYS_STUB0(name) \ 50 + __SYS_STUB0(ia32, compat_sys_##name) 66 51 67 52 #define __IA32_COMPAT_SYS_STUBx(x, name, ...) \ 68 53 __SYS_STUBx(ia32, compat_sys##name, \ 69 54 SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__)) 70 55 56 + #define __IA32_SYS_STUB0(name) \ 57 + __SYS_STUB0(ia32, sys_##name) 58 + 71 59 #define __IA32_SYS_STUBx(x, name, ...) \ 72 60 __SYS_STUBx(ia32, sys##name, \ 73 61 SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__)) 74 - 75 - /* 76 - * To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias 77 - * named __ia32_sys_*() 78 - */ 79 - 80 - #define SYSCALL_DEFINE0(sname) \ 81 - SYSCALL_METADATA(_##sname, 0); \ 82 - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\ 83 - ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ 84 - SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \ 85 - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) 86 62 87 63 #define COND_SYSCALL(name) \ 88 64 asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ ··· 85 89 SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers) 86 90 87 91 #else /* CONFIG_IA32_EMULATION */ 92 + #define __IA32_COMPAT_SYS_STUB0(name) 88 93 #define __IA32_COMPAT_SYS_STUBx(x, name, ...) 94 + #define __IA32_SYS_STUB0(name) 89 95 #define __IA32_SYS_STUBx(x, name, ...) 90 96 #endif /* CONFIG_IA32_EMULATION */ 91 97 ··· 98 100 * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common 99 101 * with x86_64 obviously do not need such care. 100 102 */ 101 - #define __X32_COMPAT_SYS_STUB0(x, name, ...) \ 102 - asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs);\ 103 - ALLOW_ERROR_INJECTION(__x32_compat_sys_##name, ERRNO); \ 104 - asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs)\ 105 - { \ 106 - return __se_compat_sys_##name();\ 107 - } 103 + #define __X32_COMPAT_SYS_STUB0(name) \ 104 + __SYS_STUB0(x32, compat_sys_##name) 108 105 109 106 #define __X32_COMPAT_SYS_STUBx(x, name, ...) \ 110 107 __SYS_STUBx(x32, compat_sys##name, \ 111 108 SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__)) 112 109 113 110 #else /* CONFIG_X86_X32 */ 114 - #define __X32_COMPAT_SYS_STUB0(x, name) 111 + #define __X32_COMPAT_SYS_STUB0(name) 115 112 #define __X32_COMPAT_SYS_STUBx(x, name, ...) 116 113 #endif /* CONFIG_X86_X32 */ 117 114 ··· 118 125 * of them. 119 126 */ 120 127 #define COMPAT_SYSCALL_DEFINE0(name) \ 121 - static long __se_compat_sys_##name(void); \ 122 - static inline long __do_compat_sys_##name(void); \ 123 - __IA32_COMPAT_SYS_STUB0(x, name) \ 124 - __X32_COMPAT_SYS_STUB0(x, name) \ 125 - static long __se_compat_sys_##name(void) \ 126 - { \ 127 - return __do_compat_sys_##name(); \ 128 - } \ 129 - static inline long __do_compat_sys_##name(void) 128 + static asmlinkage long \ 129 + __do_compat_sys_##name(const struct pt_regs *__unused); \ 130 + __IA32_COMPAT_SYS_STUB0(name) \ 131 + __X32_COMPAT_SYS_STUB0(name) \ 132 + static asmlinkage long \ 133 + __do_compat_sys_##name(const struct pt_regs *__unused) 130 134 131 135 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ 132 136 static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ ··· 206 216 * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI() 207 217 * macros to work correctly. 208 218 */ 209 - #ifndef SYSCALL_DEFINE0 210 219 #define SYSCALL_DEFINE0(sname) \ 211 220 SYSCALL_METADATA(_##sname, 0); \ 212 - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\ 213 - ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ 214 - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) 215 - #endif 221 + static asmlinkage long \ 222 + __do_sys_##sname(const struct pt_regs *__unused); \ 223 + __X64_SYS_STUB0(sname) \ 224 + __IA32_SYS_STUB0(sname) \ 225 + static asmlinkage long \ 226 + __do_sys_##sname(const struct pt_regs *__unused) 216 227 217 228 #ifndef COND_SYSCALL 218 229 #define COND_SYSCALL(name) \