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

x86/entry: Refactor COND_SYSCALL macros

Pull the common code out from the COND_SYSCALL macros into a new
__COND_SYSCALL 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-4-brgerst@gmail.com

authored by

Brian Gerst and committed by
Thomas Gleixner
6cc8d2b2 d2b5de49

+26 -18
+26 -18
arch/x86/include/asm/syscall_wrapper.h
··· 35 35 return __se_##name(__VA_ARGS__); \ 36 36 } 37 37 38 + #define __COND_SYSCALL(abi, name) \ 39 + asmlinkage __weak long \ 40 + __##abi##_##name(const struct pt_regs *__unused) \ 41 + { \ 42 + return sys_ni_syscall(); \ 43 + } 44 + 38 45 #ifdef CONFIG_X86_64 39 46 #define __X64_SYS_STUB0(name) \ 40 47 __SYS_STUB0(x64, sys_##name) ··· 49 42 #define __X64_SYS_STUBx(x, name, ...) \ 50 43 __SYS_STUBx(x64, sys##name, \ 51 44 SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__)) 45 + 46 + #define __X64_COND_SYSCALL(name) \ 47 + __COND_SYSCALL(x64, sys_##name) 52 48 #else /* CONFIG_X86_64 */ 53 49 #define __X64_SYS_STUB0(name) 54 50 #define __X64_SYS_STUBx(x, name, ...) 51 + #define __X64_COND_SYSCALL(name) 55 52 #endif /* CONFIG_X86_64 */ 56 53 57 54 #ifdef CONFIG_IA32_EMULATION ··· 74 63 __SYS_STUBx(ia32, compat_sys##name, \ 75 64 SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__)) 76 65 66 + #define __IA32_COMPAT_COND_SYSCALL(name) \ 67 + __COND_SYSCALL(ia32, compat_sys_##name) 68 + 77 69 #define __IA32_SYS_STUB0(name) \ 78 70 __SYS_STUB0(ia32, sys_##name) 79 71 ··· 84 70 __SYS_STUBx(ia32, sys##name, \ 85 71 SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__)) 86 72 87 - #define COND_SYSCALL(name) \ 88 - asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ 89 - { \ 90 - return sys_ni_syscall(); \ 91 - } \ 92 - asmlinkage __weak long __ia32_sys_##name(const struct pt_regs *__unused)\ 93 - { \ 94 - return sys_ni_syscall(); \ 95 - } 73 + #define __IA32_COND_SYSCALL(name) \ 74 + __COND_SYSCALL(ia32, sys_##name) 96 75 97 76 #define SYS_NI(name) \ 98 77 SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); \ ··· 94 87 #else /* CONFIG_IA32_EMULATION */ 95 88 #define __IA32_COMPAT_SYS_STUB0(name) 96 89 #define __IA32_COMPAT_SYS_STUBx(x, name, ...) 90 + #define __IA32_COMPAT_COND_SYSCALL(name) 97 91 #define __IA32_SYS_STUB0(name) 98 92 #define __IA32_SYS_STUBx(x, name, ...) 93 + #define __IA32_COND_SYSCALL(name) 99 94 #endif /* CONFIG_IA32_EMULATION */ 100 95 101 96 ··· 114 105 __SYS_STUBx(x32, compat_sys##name, \ 115 106 SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__)) 116 107 108 + #define __X32_COMPAT_COND_SYSCALL(name) \ 109 + __COND_SYSCALL(x32, compat_sys_##name) 117 110 #else /* CONFIG_X86_X32 */ 118 111 #define __X32_COMPAT_SYS_STUB0(name) 119 112 #define __X32_COMPAT_SYS_STUBx(x, name, ...) 113 + #define __X32_COMPAT_COND_SYSCALL(name) 120 114 #endif /* CONFIG_X86_X32 */ 121 115 122 116 ··· 154 142 * kernel/time/posix-stubs.c to cover this case as well. 155 143 */ 156 144 #define COND_SYSCALL_COMPAT(name) \ 157 - cond_syscall(__ia32_compat_sys_##name); \ 158 - cond_syscall(__x32_compat_sys_##name) 145 + __IA32_COMPAT_COND_SYSCALL(name) \ 146 + __X32_COMPAT_COND_SYSCALL(name) 159 147 160 148 #define COMPAT_SYS_NI(name) \ 161 149 SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers); \ ··· 227 215 static asmlinkage long \ 228 216 __do_sys_##sname(const struct pt_regs *__unused) 229 217 230 - #ifndef COND_SYSCALL 231 - #define COND_SYSCALL(name) \ 232 - asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ 233 - { \ 234 - return sys_ni_syscall(); \ 235 - } 236 - #endif 218 + #define COND_SYSCALL(name) \ 219 + __X64_COND_SYSCALL(name) \ 220 + __IA32_COND_SYSCALL(name) 237 221 238 222 #ifndef SYS_NI 239 223 #define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);