Lines Matching +full:name +full:-
1 /* SPDX-License-Identifier: GPL-2.0 */
3 * syscall_wrapper.h - x86 specific wrappers to syscall definitions
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 * __x64_compat_sys_*() - 64-bit X32 compat syscall
23 * 64-bit: RDI, RSI, RDX, R10, R8, R9
24 * 32-bit: EBX, ECX, EDX, ESI, EDI, EBP
27 * perform sign-extension (omitted for zero-argument syscalls). Finally the
32 * Example assembly (slightly re-ordered for better readability):
34 * <__x64_sys_recv>: <-- syscall with 4 parameters
37 * mov 0x70(%rdi),%rdi <-- decode regs->di
38 * mov 0x68(%rdi),%rsi <-- decode regs->si
39 * mov 0x60(%rdi),%rdx <-- decode regs->dx
40 * mov 0x38(%rdi),%rcx <-- decode regs->r10
42 * xor %r9d,%r9d <-- clear %r9
43 * xor %r8d,%r8d <-- clear %r8
45 * callq __sys_recvfrom <-- do the actual work in __sys_recvfrom()
48 * cltq <-- extend return value to 64-bit
49 * retq <-- return
51 * This approach avoids leaking random user-provided register content down
55 /* Mapping of registers to parameters for syscalls on x86-64 and x32 */
58 ,,regs->di,,regs->si,,regs->dx \
59 ,,regs->r10,,regs->r8,,regs->r9) \
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)
68 #define __SYS_STUB0(abi, name) \ argument
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);
74 #define __SYS_STUBx(abi, name, ...) \ argument
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) \
79 return __se_##name(__VA_ARGS__); \
82 #define __COND_SYSCALL(abi, name) \ argument
83 __weak long __##abi##_##name(const struct pt_regs *__unused); \
84 __weak long __##abi##_##name(const struct pt_regs *__unused) \
89 #define __SYS_NI(abi, name) \ argument
90 SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers);
93 #define __X64_SYS_STUB0(name) \ argument
94 __SYS_STUB0(x64, sys_##name)
96 #define __X64_SYS_STUBx(x, name, ...) \ argument
97 __SYS_STUBx(x64, sys##name, \
100 #define __X64_COND_SYSCALL(name) \ argument
101 __COND_SYSCALL(x64, sys_##name)
103 #define __X64_SYS_NI(name) \ argument
104 __SYS_NI(x64, sys_##name)
106 #define __X64_SYS_STUB0(name) argument
107 #define __X64_SYS_STUBx(x, name, ...) argument
108 #define __X64_COND_SYSCALL(name) argument
109 #define __X64_SYS_NI(name) argument
113 #define __IA32_SYS_STUB0(name) \ argument
114 __SYS_STUB0(ia32, sys_##name)
116 #define __IA32_SYS_STUBx(x, name, ...) \ argument
117 __SYS_STUBx(ia32, sys##name, \
120 #define __IA32_COND_SYSCALL(name) \ argument
121 __COND_SYSCALL(ia32, sys_##name)
123 #define __IA32_SYS_NI(name) \ argument
124 __SYS_NI(ia32, sys_##name)
126 #define __IA32_SYS_STUB0(name) argument
127 #define __IA32_SYS_STUBx(x, name, ...) argument
128 #define __IA32_COND_SYSCALL(name) argument
129 #define __IA32_SYS_NI(name) argument
138 * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this
141 #define __IA32_COMPAT_SYS_STUB0(name) \ argument
142 __SYS_STUB0(ia32, compat_sys_##name)
144 #define __IA32_COMPAT_SYS_STUBx(x, name, ...) \ argument
145 __SYS_STUBx(ia32, compat_sys##name, \
148 #define __IA32_COMPAT_COND_SYSCALL(name) \ argument
149 __COND_SYSCALL(ia32, compat_sys_##name)
151 #define __IA32_COMPAT_SYS_NI(name) \ argument
152 __SYS_NI(ia32, compat_sys_##name)
155 #define __IA32_COMPAT_SYS_STUB0(name) argument
156 #define __IA32_COMPAT_SYS_STUBx(x, name, ...) argument
157 #define __IA32_COMPAT_COND_SYSCALL(name) argument
158 #define __IA32_COMPAT_SYS_NI(name) argument
165 * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
168 #define __X32_COMPAT_SYS_STUB0(name) \ argument
169 __SYS_STUB0(x64, compat_sys_##name)
171 #define __X32_COMPAT_SYS_STUBx(x, name, ...) \ argument
172 __SYS_STUBx(x64, compat_sys##name, \
175 #define __X32_COMPAT_COND_SYSCALL(name) \ argument
176 __COND_SYSCALL(x64, compat_sys_##name)
178 #define __X32_COMPAT_SYS_NI(name) \ argument
179 __SYS_NI(x64, compat_sys_##name)
181 #define __X32_COMPAT_SYS_STUB0(name) argument
182 #define __X32_COMPAT_SYS_STUBx(x, name, ...) argument
183 #define __X32_COMPAT_COND_SYSCALL(name) argument
184 #define __X32_COMPAT_SYS_NI(name) argument
194 #define COMPAT_SYSCALL_DEFINE0(name) \ argument
196 __do_compat_sys_##name(const struct pt_regs *__unused); \
197 __IA32_COMPAT_SYS_STUB0(name) \
198 __X32_COMPAT_SYS_STUB0(name) \
200 __do_compat_sys_##name(const struct pt_regs *__unused)
202 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ argument
203 static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
204 static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
205 __IA32_COMPAT_SYS_STUBx(x, name, __VA_ARGS__) \
206 __X32_COMPAT_SYS_STUBx(x, name, __VA_ARGS__) \
207 static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
209 return __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));\
211 static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
216 * kernel/time/posix-stubs.c to cover this case as well.
218 #define COND_SYSCALL_COMPAT(name) \ argument
219 __IA32_COMPAT_COND_SYSCALL(name) \
220 __X32_COMPAT_COND_SYSCALL(name)
222 #define COMPAT_SYS_NI(name) \ argument
223 __IA32_COMPAT_SYS_NI(name) \
224 __X32_COMPAT_SYS_NI(name)
228 #define __SYSCALL_DEFINEx(x, name, ...) \ argument
229 static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
230 static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
231 __X64_SYS_STUBx(x, name, __VA_ARGS__) \
232 __IA32_SYS_STUBx(x, name, __VA_ARGS__) \
233 static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
235 long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__));\
240 static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
245 * hurt, we only need to re-define it here to keep the naming congruent to
246 * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI()
256 #define COND_SYSCALL(name) \ argument
257 __X64_COND_SYSCALL(name) \
258 __IA32_COND_SYSCALL(name)
260 #define SYS_NI(name) \ argument
261 __X64_SYS_NI(name) \
262 __IA32_SYS_NI(name)
267 * pt_regs-based calling convention for in-kernel use.