.. | .. |
---|
8 | 8 | |
---|
9 | 9 | struct pt_regs; |
---|
10 | 10 | |
---|
11 | | -/* Mapping of registers to parameters for syscalls on x86-64 and x32 */ |
---|
12 | | -#define SC_X86_64_REGS_TO_ARGS(x, ...) \ |
---|
13 | | - __MAP(x,__SC_ARGS \ |
---|
14 | | - ,,regs->di,,regs->si,,regs->dx \ |
---|
15 | | - ,,regs->r10,,regs->r8,,regs->r9) \ |
---|
16 | | - |
---|
17 | | -/* Mapping of registers to parameters for syscalls on i386 */ |
---|
18 | | -#define SC_IA32_REGS_TO_ARGS(x, ...) \ |
---|
19 | | - __MAP(x,__SC_ARGS \ |
---|
20 | | - ,,(unsigned int)regs->bx,,(unsigned int)regs->cx \ |
---|
21 | | - ,,(unsigned int)regs->dx,,(unsigned int)regs->si \ |
---|
22 | | - ,,(unsigned int)regs->di,,(unsigned int)regs->bp) |
---|
23 | | - |
---|
24 | | -#ifdef CONFIG_IA32_EMULATION |
---|
25 | | -/* |
---|
26 | | - * For IA32 emulation, we need to handle "compat" syscalls *and* create |
---|
27 | | - * additional wrappers (aptly named __ia32_sys_xyzzy) which decode the |
---|
28 | | - * ia32 regs in the proper order for shared or "common" syscalls. As some |
---|
29 | | - * syscalls may not be implemented, we need to expand COND_SYSCALL in |
---|
30 | | - * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this |
---|
31 | | - * case as well. |
---|
32 | | - */ |
---|
33 | | -#define __IA32_COMPAT_SYS_STUBx(x, name, ...) \ |
---|
34 | | - asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs);\ |
---|
35 | | - ALLOW_ERROR_INJECTION(__ia32_compat_sys##name, ERRNO); \ |
---|
36 | | - asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs)\ |
---|
37 | | - { \ |
---|
38 | | - return __se_compat_sys##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\ |
---|
39 | | - } \ |
---|
40 | | - |
---|
41 | | -#define __IA32_SYS_STUBx(x, name, ...) \ |
---|
42 | | - asmlinkage long __ia32_sys##name(const struct pt_regs *regs); \ |
---|
43 | | - ALLOW_ERROR_INJECTION(__ia32_sys##name, ERRNO); \ |
---|
44 | | - asmlinkage long __ia32_sys##name(const struct pt_regs *regs) \ |
---|
45 | | - { \ |
---|
46 | | - return __se_sys##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\ |
---|
47 | | - } |
---|
| 11 | +extern long __x64_sys_ni_syscall(const struct pt_regs *regs); |
---|
| 12 | +extern long __ia32_sys_ni_syscall(const struct pt_regs *regs); |
---|
48 | 13 | |
---|
49 | 14 | /* |
---|
50 | | - * To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias |
---|
51 | | - * named __ia32_sys_*() |
---|
52 | | - */ |
---|
53 | | - |
---|
54 | | -#define SYSCALL_DEFINE0(sname) \ |
---|
55 | | - SYSCALL_METADATA(_##sname, 0); \ |
---|
56 | | - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\ |
---|
57 | | - ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ |
---|
58 | | - SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \ |
---|
59 | | - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) |
---|
60 | | - |
---|
61 | | -#define COND_SYSCALL(name) \ |
---|
62 | | - asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ |
---|
63 | | - { \ |
---|
64 | | - return sys_ni_syscall(); \ |
---|
65 | | - } \ |
---|
66 | | - asmlinkage __weak long __ia32_sys_##name(const struct pt_regs *__unused)\ |
---|
67 | | - { \ |
---|
68 | | - return sys_ni_syscall(); \ |
---|
69 | | - } |
---|
70 | | - |
---|
71 | | -#define SYS_NI(name) \ |
---|
72 | | - SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); \ |
---|
73 | | - SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers) |
---|
74 | | - |
---|
75 | | -#else /* CONFIG_IA32_EMULATION */ |
---|
76 | | -#define __IA32_COMPAT_SYS_STUBx(x, name, ...) |
---|
77 | | -#define __IA32_SYS_STUBx(x, fullname, name, ...) |
---|
78 | | -#endif /* CONFIG_IA32_EMULATION */ |
---|
79 | | - |
---|
80 | | - |
---|
81 | | -#ifdef CONFIG_X86_X32 |
---|
82 | | -/* |
---|
83 | | - * For the x32 ABI, we need to create a stub for compat_sys_*() which is aware |
---|
84 | | - * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common |
---|
85 | | - * with x86_64 obviously do not need such care. |
---|
86 | | - */ |
---|
87 | | -#define __X32_COMPAT_SYS_STUBx(x, name, ...) \ |
---|
88 | | - asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs);\ |
---|
89 | | - ALLOW_ERROR_INJECTION(__x32_compat_sys##name, ERRNO); \ |
---|
90 | | - asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs)\ |
---|
91 | | - { \ |
---|
92 | | - return __se_compat_sys##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\ |
---|
93 | | - } \ |
---|
94 | | - |
---|
95 | | -#else /* CONFIG_X86_X32 */ |
---|
96 | | -#define __X32_COMPAT_SYS_STUBx(x, name, ...) |
---|
97 | | -#endif /* CONFIG_X86_X32 */ |
---|
98 | | - |
---|
99 | | - |
---|
100 | | -#ifdef CONFIG_COMPAT |
---|
101 | | -/* |
---|
102 | | - * Compat means IA32_EMULATION and/or X86_X32. As they use a different |
---|
103 | | - * mapping of registers to parameters, we need to generate stubs for each |
---|
104 | | - * of them. |
---|
105 | | - */ |
---|
106 | | -#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ |
---|
107 | | - static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ |
---|
108 | | - static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ |
---|
109 | | - __IA32_COMPAT_SYS_STUBx(x, name, __VA_ARGS__) \ |
---|
110 | | - __X32_COMPAT_SYS_STUBx(x, name, __VA_ARGS__) \ |
---|
111 | | - static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ |
---|
112 | | - { \ |
---|
113 | | - return __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));\ |
---|
114 | | - } \ |
---|
115 | | - static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) |
---|
116 | | - |
---|
117 | | -/* |
---|
118 | | - * As some compat syscalls may not be implemented, we need to expand |
---|
119 | | - * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in |
---|
120 | | - * kernel/time/posix-stubs.c to cover this case as well. |
---|
121 | | - */ |
---|
122 | | -#define COND_SYSCALL_COMPAT(name) \ |
---|
123 | | - asmlinkage __weak long __ia32_compat_sys_##name( \ |
---|
124 | | - const struct pt_regs *__unused) \ |
---|
125 | | - { \ |
---|
126 | | - return sys_ni_syscall(); \ |
---|
127 | | - } \ |
---|
128 | | - cond_syscall(__x32_compat_sys_##name) |
---|
129 | | - |
---|
130 | | -#define COMPAT_SYS_NI(name) \ |
---|
131 | | - SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers); \ |
---|
132 | | - SYSCALL_ALIAS(__x32_compat_sys_##name, sys_ni_posix_timers) |
---|
133 | | - |
---|
134 | | -#endif /* CONFIG_COMPAT */ |
---|
135 | | - |
---|
136 | | - |
---|
137 | | -/* |
---|
138 | | - * Instead of the generic __SYSCALL_DEFINEx() definition, this macro takes |
---|
139 | | - * struct pt_regs *regs as the only argument of the syscall stub named |
---|
140 | | - * __x64_sys_*(). It decodes just the registers it needs and passes them on to |
---|
141 | | - * the __se_sys_*() wrapper performing sign extension and then to the |
---|
142 | | - * __do_sys_*() function doing the actual job. These wrappers and functions |
---|
143 | | - * are inlined (at least in very most cases), meaning that the assembly looks |
---|
144 | | - * as follows (slightly re-ordered for better readability): |
---|
| 15 | + * Instead of the generic __SYSCALL_DEFINEx() definition, the x86 version takes |
---|
| 16 | + * struct pt_regs *regs as the only argument of the syscall stub(s) named as: |
---|
| 17 | + * __x64_sys_*() - 64-bit native syscall |
---|
| 18 | + * __ia32_sys_*() - 32-bit native syscall or common compat syscall |
---|
| 19 | + * __ia32_compat_sys_*() - 32-bit compat syscall |
---|
| 20 | + * __x32_compat_sys_*() - 64-bit X32 compat syscall |
---|
| 21 | + * |
---|
| 22 | + * The registers are decoded according to the ABI: |
---|
| 23 | + * 64-bit: RDI, RSI, RDX, R10, R8, R9 |
---|
| 24 | + * 32-bit: EBX, ECX, EDX, ESI, EDI, EBP |
---|
| 25 | + * |
---|
| 26 | + * The stub then passes the decoded arguments to the __se_sys_*() wrapper to |
---|
| 27 | + * perform sign-extension (omitted for zero-argument syscalls). Finally the |
---|
| 28 | + * arguments are passed to the __do_sys_*() function which is the actual |
---|
| 29 | + * syscall. These wrappers are marked as inline so the compiler can optimize |
---|
| 30 | + * the functions where appropriate. |
---|
| 31 | + * |
---|
| 32 | + * Example assembly (slightly re-ordered for better readability): |
---|
145 | 33 | * |
---|
146 | 34 | * <__x64_sys_recv>: <-- syscall with 4 parameters |
---|
147 | 35 | * callq <__fentry__> |
---|
.. | .. |
---|
162 | 50 | * |
---|
163 | 51 | * This approach avoids leaking random user-provided register content down |
---|
164 | 52 | * the call chain. |
---|
165 | | - * |
---|
166 | | - * If IA32_EMULATION is enabled, this macro generates an additional wrapper |
---|
167 | | - * named __ia32_sys_*() which decodes the struct pt_regs *regs according |
---|
168 | | - * to the i386 calling convention (bx, cx, dx, si, di, bp). |
---|
169 | 53 | */ |
---|
| 54 | + |
---|
| 55 | +/* Mapping of registers to parameters for syscalls on x86-64 and x32 */ |
---|
| 56 | +#define SC_X86_64_REGS_TO_ARGS(x, ...) \ |
---|
| 57 | + __MAP(x,__SC_ARGS \ |
---|
| 58 | + ,,regs->di,,regs->si,,regs->dx \ |
---|
| 59 | + ,,regs->r10,,regs->r8,,regs->r9) \ |
---|
| 60 | + |
---|
| 61 | +/* Mapping of registers to parameters for syscalls on i386 */ |
---|
| 62 | +#define SC_IA32_REGS_TO_ARGS(x, ...) \ |
---|
| 63 | + __MAP(x,__SC_ARGS \ |
---|
| 64 | + ,,(unsigned int)regs->bx,,(unsigned int)regs->cx \ |
---|
| 65 | + ,,(unsigned int)regs->dx,,(unsigned int)regs->si \ |
---|
| 66 | + ,,(unsigned int)regs->di,,(unsigned int)regs->bp) |
---|
| 67 | + |
---|
| 68 | +#define __SYS_STUB0(abi, name) \ |
---|
| 69 | + long __##abi##_##name(const struct pt_regs *regs); \ |
---|
| 70 | + ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \ |
---|
| 71 | + long __##abi##_##name(const struct pt_regs *regs) \ |
---|
| 72 | + __alias(__do_##name); |
---|
| 73 | + |
---|
| 74 | +#define __SYS_STUBx(abi, name, ...) \ |
---|
| 75 | + long __##abi##_##name(const struct pt_regs *regs); \ |
---|
| 76 | + ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO); \ |
---|
| 77 | + long __##abi##_##name(const struct pt_regs *regs) \ |
---|
| 78 | + { \ |
---|
| 79 | + return __se_##name(__VA_ARGS__); \ |
---|
| 80 | + } |
---|
| 81 | + |
---|
| 82 | +#define __COND_SYSCALL(abi, name) \ |
---|
| 83 | + __weak long __##abi##_##name(const struct pt_regs *__unused) \ |
---|
| 84 | + { \ |
---|
| 85 | + return sys_ni_syscall(); \ |
---|
| 86 | + } |
---|
| 87 | + |
---|
| 88 | +#define __SYS_NI(abi, name) \ |
---|
| 89 | + SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers); |
---|
| 90 | + |
---|
| 91 | +#ifdef CONFIG_X86_64 |
---|
| 92 | +#define __X64_SYS_STUB0(name) \ |
---|
| 93 | + __SYS_STUB0(x64, sys_##name) |
---|
| 94 | + |
---|
| 95 | +#define __X64_SYS_STUBx(x, name, ...) \ |
---|
| 96 | + __SYS_STUBx(x64, sys##name, \ |
---|
| 97 | + SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__)) |
---|
| 98 | + |
---|
| 99 | +#define __X64_COND_SYSCALL(name) \ |
---|
| 100 | + __COND_SYSCALL(x64, sys_##name) |
---|
| 101 | + |
---|
| 102 | +#define __X64_SYS_NI(name) \ |
---|
| 103 | + __SYS_NI(x64, sys_##name) |
---|
| 104 | +#else /* CONFIG_X86_64 */ |
---|
| 105 | +#define __X64_SYS_STUB0(name) |
---|
| 106 | +#define __X64_SYS_STUBx(x, name, ...) |
---|
| 107 | +#define __X64_COND_SYSCALL(name) |
---|
| 108 | +#define __X64_SYS_NI(name) |
---|
| 109 | +#endif /* CONFIG_X86_64 */ |
---|
| 110 | + |
---|
| 111 | +#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) |
---|
| 112 | +#define __IA32_SYS_STUB0(name) \ |
---|
| 113 | + __SYS_STUB0(ia32, sys_##name) |
---|
| 114 | + |
---|
| 115 | +#define __IA32_SYS_STUBx(x, name, ...) \ |
---|
| 116 | + __SYS_STUBx(ia32, sys##name, \ |
---|
| 117 | + SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__)) |
---|
| 118 | + |
---|
| 119 | +#define __IA32_COND_SYSCALL(name) \ |
---|
| 120 | + __COND_SYSCALL(ia32, sys_##name) |
---|
| 121 | + |
---|
| 122 | +#define __IA32_SYS_NI(name) \ |
---|
| 123 | + __SYS_NI(ia32, sys_##name) |
---|
| 124 | +#else /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */ |
---|
| 125 | +#define __IA32_SYS_STUB0(name) |
---|
| 126 | +#define __IA32_SYS_STUBx(x, name, ...) |
---|
| 127 | +#define __IA32_COND_SYSCALL(name) |
---|
| 128 | +#define __IA32_SYS_NI(name) |
---|
| 129 | +#endif /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */ |
---|
| 130 | + |
---|
| 131 | +#ifdef CONFIG_IA32_EMULATION |
---|
| 132 | +/* |
---|
| 133 | + * For IA32 emulation, we need to handle "compat" syscalls *and* create |
---|
| 134 | + * additional wrappers (aptly named __ia32_sys_xyzzy) which decode the |
---|
| 135 | + * ia32 regs in the proper order for shared or "common" syscalls. As some |
---|
| 136 | + * syscalls may not be implemented, we need to expand COND_SYSCALL in |
---|
| 137 | + * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this |
---|
| 138 | + * case as well. |
---|
| 139 | + */ |
---|
| 140 | +#define __IA32_COMPAT_SYS_STUB0(name) \ |
---|
| 141 | + __SYS_STUB0(ia32, compat_sys_##name) |
---|
| 142 | + |
---|
| 143 | +#define __IA32_COMPAT_SYS_STUBx(x, name, ...) \ |
---|
| 144 | + __SYS_STUBx(ia32, compat_sys##name, \ |
---|
| 145 | + SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__)) |
---|
| 146 | + |
---|
| 147 | +#define __IA32_COMPAT_COND_SYSCALL(name) \ |
---|
| 148 | + __COND_SYSCALL(ia32, compat_sys_##name) |
---|
| 149 | + |
---|
| 150 | +#define __IA32_COMPAT_SYS_NI(name) \ |
---|
| 151 | + __SYS_NI(ia32, compat_sys_##name) |
---|
| 152 | + |
---|
| 153 | +#else /* CONFIG_IA32_EMULATION */ |
---|
| 154 | +#define __IA32_COMPAT_SYS_STUB0(name) |
---|
| 155 | +#define __IA32_COMPAT_SYS_STUBx(x, name, ...) |
---|
| 156 | +#define __IA32_COMPAT_COND_SYSCALL(name) |
---|
| 157 | +#define __IA32_COMPAT_SYS_NI(name) |
---|
| 158 | +#endif /* CONFIG_IA32_EMULATION */ |
---|
| 159 | + |
---|
| 160 | + |
---|
| 161 | +#ifdef CONFIG_X86_X32 |
---|
| 162 | +/* |
---|
| 163 | + * For the x32 ABI, we need to create a stub for compat_sys_*() which is aware |
---|
| 164 | + * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common |
---|
| 165 | + * with x86_64 obviously do not need such care. |
---|
| 166 | + */ |
---|
| 167 | +#define __X32_COMPAT_SYS_STUB0(name) \ |
---|
| 168 | + __SYS_STUB0(x32, compat_sys_##name) |
---|
| 169 | + |
---|
| 170 | +#define __X32_COMPAT_SYS_STUBx(x, name, ...) \ |
---|
| 171 | + __SYS_STUBx(x32, compat_sys##name, \ |
---|
| 172 | + SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__)) |
---|
| 173 | + |
---|
| 174 | +#define __X32_COMPAT_COND_SYSCALL(name) \ |
---|
| 175 | + __COND_SYSCALL(x32, compat_sys_##name) |
---|
| 176 | + |
---|
| 177 | +#define __X32_COMPAT_SYS_NI(name) \ |
---|
| 178 | + __SYS_NI(x32, compat_sys_##name) |
---|
| 179 | +#else /* CONFIG_X86_X32 */ |
---|
| 180 | +#define __X32_COMPAT_SYS_STUB0(name) |
---|
| 181 | +#define __X32_COMPAT_SYS_STUBx(x, name, ...) |
---|
| 182 | +#define __X32_COMPAT_COND_SYSCALL(name) |
---|
| 183 | +#define __X32_COMPAT_SYS_NI(name) |
---|
| 184 | +#endif /* CONFIG_X86_X32 */ |
---|
| 185 | + |
---|
| 186 | + |
---|
| 187 | +#ifdef CONFIG_COMPAT |
---|
| 188 | +/* |
---|
| 189 | + * Compat means IA32_EMULATION and/or X86_X32. As they use a different |
---|
| 190 | + * mapping of registers to parameters, we need to generate stubs for each |
---|
| 191 | + * of them. |
---|
| 192 | + */ |
---|
| 193 | +#define COMPAT_SYSCALL_DEFINE0(name) \ |
---|
| 194 | + static long \ |
---|
| 195 | + __do_compat_sys_##name(const struct pt_regs *__unused); \ |
---|
| 196 | + __IA32_COMPAT_SYS_STUB0(name) \ |
---|
| 197 | + __X32_COMPAT_SYS_STUB0(name) \ |
---|
| 198 | + static long \ |
---|
| 199 | + __do_compat_sys_##name(const struct pt_regs *__unused) |
---|
| 200 | + |
---|
| 201 | +#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ |
---|
| 202 | + static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ |
---|
| 203 | + static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ |
---|
| 204 | + __IA32_COMPAT_SYS_STUBx(x, name, __VA_ARGS__) \ |
---|
| 205 | + __X32_COMPAT_SYS_STUBx(x, name, __VA_ARGS__) \ |
---|
| 206 | + static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ |
---|
| 207 | + { \ |
---|
| 208 | + return __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));\ |
---|
| 209 | + } \ |
---|
| 210 | + static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) |
---|
| 211 | + |
---|
| 212 | +/* |
---|
| 213 | + * As some compat syscalls may not be implemented, we need to expand |
---|
| 214 | + * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in |
---|
| 215 | + * kernel/time/posix-stubs.c to cover this case as well. |
---|
| 216 | + */ |
---|
| 217 | +#define COND_SYSCALL_COMPAT(name) \ |
---|
| 218 | + __IA32_COMPAT_COND_SYSCALL(name) \ |
---|
| 219 | + __X32_COMPAT_COND_SYSCALL(name) |
---|
| 220 | + |
---|
| 221 | +#define COMPAT_SYS_NI(name) \ |
---|
| 222 | + __IA32_COMPAT_SYS_NI(name) \ |
---|
| 223 | + __X32_COMPAT_SYS_NI(name) |
---|
| 224 | + |
---|
| 225 | +#endif /* CONFIG_COMPAT */ |
---|
| 226 | + |
---|
170 | 227 | #define __SYSCALL_DEFINEx(x, name, ...) \ |
---|
171 | | - asmlinkage long __x64_sys##name(const struct pt_regs *regs); \ |
---|
172 | | - ALLOW_ERROR_INJECTION(__x64_sys##name, ERRNO); \ |
---|
173 | 228 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ |
---|
174 | 229 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ |
---|
175 | | - asmlinkage long __x64_sys##name(const struct pt_regs *regs) \ |
---|
176 | | - { \ |
---|
177 | | - return __se_sys##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\ |
---|
178 | | - } \ |
---|
| 230 | + __X64_SYS_STUBx(x, name, __VA_ARGS__) \ |
---|
179 | 231 | __IA32_SYS_STUBx(x, name, __VA_ARGS__) \ |
---|
180 | 232 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ |
---|
181 | 233 | { \ |
---|
.. | .. |
---|
193 | 245 | * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI() |
---|
194 | 246 | * macros to work correctly. |
---|
195 | 247 | */ |
---|
196 | | -#ifndef SYSCALL_DEFINE0 |
---|
197 | | -#define SYSCALL_DEFINE0(sname) \ |
---|
198 | | - SYSCALL_METADATA(_##sname, 0); \ |
---|
199 | | - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\ |
---|
200 | | - ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ |
---|
201 | | - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) |
---|
202 | | -#endif |
---|
| 248 | +#define SYSCALL_DEFINE0(sname) \ |
---|
| 249 | + SYSCALL_METADATA(_##sname, 0); \ |
---|
| 250 | + static long __do_sys_##sname(const struct pt_regs *__unused); \ |
---|
| 251 | + __X64_SYS_STUB0(sname) \ |
---|
| 252 | + __IA32_SYS_STUB0(sname) \ |
---|
| 253 | + static long __do_sys_##sname(const struct pt_regs *__unused) |
---|
203 | 254 | |
---|
204 | | -#ifndef COND_SYSCALL |
---|
205 | | -#define COND_SYSCALL(name) \ |
---|
206 | | - asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ |
---|
207 | | - { \ |
---|
208 | | - return sys_ni_syscall(); \ |
---|
209 | | - } |
---|
210 | | -#endif |
---|
| 255 | +#define COND_SYSCALL(name) \ |
---|
| 256 | + __X64_COND_SYSCALL(name) \ |
---|
| 257 | + __IA32_COND_SYSCALL(name) |
---|
211 | 258 | |
---|
212 | | -#ifndef SYS_NI |
---|
213 | | -#define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); |
---|
214 | | -#endif |
---|
| 259 | +#define SYS_NI(name) \ |
---|
| 260 | + __X64_SYS_NI(name) \ |
---|
| 261 | + __IA32_SYS_NI(name) |
---|
215 | 262 | |
---|
216 | 263 | |
---|
217 | 264 | /* |
---|
218 | 265 | * For VSYSCALLS, we need to declare these three syscalls with the new |
---|
219 | 266 | * pt_regs-based calling convention for in-kernel use. |
---|
220 | 267 | */ |
---|
221 | | -asmlinkage long __x64_sys_getcpu(const struct pt_regs *regs); |
---|
222 | | -asmlinkage long __x64_sys_gettimeofday(const struct pt_regs *regs); |
---|
223 | | -asmlinkage long __x64_sys_time(const struct pt_regs *regs); |
---|
| 268 | +long __x64_sys_getcpu(const struct pt_regs *regs); |
---|
| 269 | +long __x64_sys_gettimeofday(const struct pt_regs *regs); |
---|
| 270 | +long __x64_sys_time(const struct pt_regs *regs); |
---|
224 | 271 | |
---|
225 | 272 | #endif /* _ASM_X86_SYSCALL_WRAPPER_H */ |
---|