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

x86/entry: Drop asmlinkage from syscalls

asmlinkage is no longer required since the syscall ABI is now fully under
x86 architecture control. This makes the 32-bit native syscalls a bit more
effecient by passing in regs via EAX instead of on the stack.

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-18-brgerst@gmail.com

authored by

Brian Gerst and committed by
Thomas Gleixner
0f78ff17 25c619e5

+19 -22
+1 -1
arch/x86/entry/syscall_32.c
··· 8 8 #include <asm/unistd.h> 9 9 #include <asm/syscall.h> 10 10 11 - #define __SYSCALL_I386(nr, sym) extern asmlinkage long __ia32_##sym(const struct pt_regs *); 11 + #define __SYSCALL_I386(nr, sym) extern long __ia32_##sym(const struct pt_regs *); 12 12 13 13 #include <asm/syscalls_32.h> 14 14 #undef __SYSCALL_I386
+1 -1
arch/x86/entry/syscall_64.c
··· 11 11 #define __SYSCALL_X32(nr, sym) 12 12 #define __SYSCALL_COMMON(nr, sym) __SYSCALL_64(nr, sym) 13 13 14 - #define __SYSCALL_64(nr, sym) extern asmlinkage long __x64_##sym(const struct pt_regs *); 14 + #define __SYSCALL_64(nr, sym) extern long __x64_##sym(const struct pt_regs *); 15 15 #include <asm/syscalls_64.h> 16 16 #undef __SYSCALL_64 17 17
+2 -2
arch/x86/entry/syscall_x32.c
··· 10 10 11 11 #define __SYSCALL_64(nr, sym) 12 12 13 - #define __SYSCALL_X32(nr, sym) extern asmlinkage long __x32_##sym(const struct pt_regs *); 14 - #define __SYSCALL_COMMON(nr, sym) extern asmlinkage long __x64_##sym(const struct pt_regs *); 13 + #define __SYSCALL_X32(nr, sym) extern long __x32_##sym(const struct pt_regs *); 14 + #define __SYSCALL_COMMON(nr, sym) extern long __x64_##sym(const struct pt_regs *); 15 15 #include <asm/syscalls_64.h> 16 16 #undef __SYSCALL_X32 17 17 #undef __SYSCALL_COMMON
+1 -1
arch/x86/include/asm/syscall.h
··· 16 16 #include <asm/thread_info.h> /* for TS_COMPAT */ 17 17 #include <asm/unistd.h> 18 18 19 - typedef asmlinkage long (*sys_call_ptr_t)(const struct pt_regs *); 19 + typedef long (*sys_call_ptr_t)(const struct pt_regs *); 20 20 extern const sys_call_ptr_t sys_call_table[]; 21 21 22 22 #if defined(CONFIG_X86_32)
+14 -17
arch/x86/include/asm/syscall_wrapper.h
··· 8 8 9 9 struct pt_regs; 10 10 11 - extern asmlinkage long __x64_sys_ni_syscall(const struct pt_regs *regs); 12 - extern asmlinkage long __ia32_sys_ni_syscall(const struct pt_regs *regs); 11 + extern long __x64_sys_ni_syscall(const struct pt_regs *regs); 12 + extern long __ia32_sys_ni_syscall(const struct pt_regs *regs); 13 13 14 14 /* 15 15 * Instead of the generic __SYSCALL_DEFINEx() definition, the x86 version takes ··· 66 66 ,,(unsigned int)regs->di,,(unsigned int)regs->bp) 67 67 68 68 #define __SYS_STUB0(abi, name) \ 69 - asmlinkage long __##abi##_##name(const struct pt_regs *regs); \ 69 + long __##abi##_##name(const struct pt_regs *regs); \ 70 70 ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \ 71 - asmlinkage long __##abi##_##name(const struct pt_regs *regs) \ 71 + long __##abi##_##name(const struct pt_regs *regs) \ 72 72 __alias(__do_##name); 73 73 74 74 #define __SYS_STUBx(abi, name, ...) \ 75 - asmlinkage long __##abi##_##name(const struct pt_regs *regs); \ 75 + long __##abi##_##name(const struct pt_regs *regs); \ 76 76 ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \ 77 - asmlinkage long __##abi##_##name(const struct pt_regs *regs) \ 77 + long __##abi##_##name(const struct pt_regs *regs) \ 78 78 { \ 79 79 return __se_##name(__VA_ARGS__); \ 80 80 } 81 81 82 82 #define __COND_SYSCALL(abi, name) \ 83 - asmlinkage __weak long \ 84 - __##abi##_##name(const struct pt_regs *__unused) \ 83 + __weak long __##abi##_##name(const struct pt_regs *__unused) \ 85 84 { \ 86 85 return sys_ni_syscall(); \ 87 86 } ··· 191 192 * of them. 192 193 */ 193 194 #define COMPAT_SYSCALL_DEFINE0(name) \ 194 - static asmlinkage long \ 195 + static long \ 195 196 __do_compat_sys_##name(const struct pt_regs *__unused); \ 196 197 __IA32_COMPAT_SYS_STUB0(name) \ 197 198 __X32_COMPAT_SYS_STUB0(name) \ 198 - static asmlinkage long \ 199 + static long \ 199 200 __do_compat_sys_##name(const struct pt_regs *__unused) 200 201 201 202 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ ··· 247 248 */ 248 249 #define SYSCALL_DEFINE0(sname) \ 249 250 SYSCALL_METADATA(_##sname, 0); \ 250 - static asmlinkage long \ 251 - __do_sys_##sname(const struct pt_regs *__unused); \ 251 + static long __do_sys_##sname(const struct pt_regs *__unused); \ 252 252 __X64_SYS_STUB0(sname) \ 253 253 __IA32_SYS_STUB0(sname) \ 254 - static asmlinkage long \ 255 - __do_sys_##sname(const struct pt_regs *__unused) 254 + static long __do_sys_##sname(const struct pt_regs *__unused) 256 255 257 256 #define COND_SYSCALL(name) \ 258 257 __X64_COND_SYSCALL(name) \ ··· 265 268 * For VSYSCALLS, we need to declare these three syscalls with the new 266 269 * pt_regs-based calling convention for in-kernel use. 267 270 */ 268 - asmlinkage long __x64_sys_getcpu(const struct pt_regs *regs); 269 - asmlinkage long __x64_sys_gettimeofday(const struct pt_regs *regs); 270 - asmlinkage long __x64_sys_time(const struct pt_regs *regs); 271 + long __x64_sys_getcpu(const struct pt_regs *regs); 272 + long __x64_sys_gettimeofday(const struct pt_regs *regs); 273 + long __x64_sys_time(const struct pt_regs *regs); 271 274 272 275 #endif /* _ASM_X86_SYSCALL_WRAPPER_H */