Skip to content

Commit d2b5de4

Browse files
Brian GerstKAGA-KOKO
authored andcommitted
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 <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Dominik Brodowski <[email protected]> Reviewed-by: Andy Lutomirski <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent 4399e0c commit d2b5de4

File tree

1 file changed

+32
-41
lines changed

1 file changed

+32
-41
lines changed

arch/x86/include/asm/syscall_wrapper.h

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ struct pt_regs;
2121
,,(unsigned int)regs->dx,,(unsigned int)regs->si \
2222
,,(unsigned int)regs->di,,(unsigned int)regs->bp)
2323

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+
2430
#define __SYS_STUBx(abi, name, ...) \
2531
asmlinkage long __##abi##_##name(const struct pt_regs *regs); \
2632
ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \
@@ -30,10 +36,14 @@ struct pt_regs;
3036
}
3137

3238
#ifdef CONFIG_X86_64
39+
#define __X64_SYS_STUB0(name) \
40+
__SYS_STUB0(x64, sys_##name)
41+
3342
#define __X64_SYS_STUBx(x, name, ...) \
3443
__SYS_STUBx(x64, sys##name, \
3544
SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__))
3645
#else /* CONFIG_X86_64 */
46+
#define __X64_SYS_STUB0(name)
3747
#define __X64_SYS_STUBx(x, name, ...)
3848
#endif /* CONFIG_X86_64 */
3949

@@ -46,34 +56,20 @@ struct pt_regs;
4656
* kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this
4757
* case as well.
4858
*/
49-
#define __IA32_COMPAT_SYS_STUB0(x, name) \
50-
asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs);\
51-
ALLOW_ERROR_INJECTION(__ia32_compat_sys_##name, ERRNO); \
52-
asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs)\
53-
{ \
54-
return __se_compat_sys_##name(); \
55-
}
59+
#define __IA32_COMPAT_SYS_STUB0(name) \
60+
__SYS_STUB0(ia32, compat_sys_##name)
5661

5762
#define __IA32_COMPAT_SYS_STUBx(x, name, ...) \
5863
__SYS_STUBx(ia32, compat_sys##name, \
5964
SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__))
6065

66+
#define __IA32_SYS_STUB0(name) \
67+
__SYS_STUB0(ia32, sys_##name)
68+
6169
#define __IA32_SYS_STUBx(x, name, ...) \
6270
__SYS_STUBx(ia32, sys##name, \
6371
SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__))
6472

65-
/*
66-
* To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias
67-
* named __ia32_sys_*()
68-
*/
69-
70-
#define SYSCALL_DEFINE0(sname) \
71-
SYSCALL_METADATA(_##sname, 0); \
72-
asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
73-
ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \
74-
SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \
75-
asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
76-
7773
#define COND_SYSCALL(name) \
7874
asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \
7975
{ \
@@ -89,7 +85,9 @@ struct pt_regs;
8985
SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers)
9086

9187
#else /* CONFIG_IA32_EMULATION */
88+
#define __IA32_COMPAT_SYS_STUB0(name)
9289
#define __IA32_COMPAT_SYS_STUBx(x, name, ...)
90+
#define __IA32_SYS_STUB0(name)
9391
#define __IA32_SYS_STUBx(x, name, ...)
9492
#endif /* CONFIG_IA32_EMULATION */
9593

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

111104
#define __X32_COMPAT_SYS_STUBx(x, name, ...) \
112105
__SYS_STUBx(x32, compat_sys##name, \
113106
SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__))
114107

115108
#else /* CONFIG_X86_X32 */
116-
#define __X32_COMPAT_SYS_STUB0(x, name)
109+
#define __X32_COMPAT_SYS_STUB0(name)
117110
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
118111
#endif /* CONFIG_X86_X32 */
119112

@@ -125,15 +118,12 @@ struct pt_regs;
125118
* of them.
126119
*/
127120
#define COMPAT_SYSCALL_DEFINE0(name) \
128-
static long __se_compat_sys_##name(void); \
129-
static inline long __do_compat_sys_##name(void); \
130-
__IA32_COMPAT_SYS_STUB0(x, name) \
131-
__X32_COMPAT_SYS_STUB0(x, name) \
132-
static long __se_compat_sys_##name(void) \
133-
{ \
134-
return __do_compat_sys_##name(); \
135-
} \
136-
static inline long __do_compat_sys_##name(void)
121+
static asmlinkage long \
122+
__do_compat_sys_##name(const struct pt_regs *__unused); \
123+
__IA32_COMPAT_SYS_STUB0(name) \
124+
__X32_COMPAT_SYS_STUB0(name) \
125+
static asmlinkage long \
126+
__do_compat_sys_##name(const struct pt_regs *__unused)
137127

138128
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
139129
static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
@@ -216,13 +206,14 @@ struct pt_regs;
216206
* SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI()
217207
* macros to work correctly.
218208
*/
219-
#ifndef SYSCALL_DEFINE0
220209
#define SYSCALL_DEFINE0(sname) \
221210
SYSCALL_METADATA(_##sname, 0); \
222-
asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
223-
ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \
224-
asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
225-
#endif
211+
static asmlinkage long \
212+
__do_sys_##sname(const struct pt_regs *__unused); \
213+
__X64_SYS_STUB0(sname) \
214+
__IA32_SYS_STUB0(sname) \
215+
static asmlinkage long \
216+
__do_sys_##sname(const struct pt_regs *__unused)
226217

227218
#ifndef COND_SYSCALL
228219
#define COND_SYSCALL(name) \

0 commit comments

Comments
 (0)