1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only) */
3 #ifndef CREATE_SYSCALL_TABLE
5 #define OVERRIDE_32_execve
6 #define OVERRIDE_64_execve
7 SC_LTTNG_TRACEPOINT_EVENT(execve
,
8 TP_PROTO(sc_exit(long ret
,) const char *filename
, char *const *argv
, char *const *envp
),
9 TP_ARGS(sc_exit(ret
,) filename
, argv
, envp
),
10 TP_FIELDS(sc_exit(ctf_integer(long, ret
, ret
))
11 sc_in(ctf_user_string(filename
, filename
))
12 sc_in(ctf_integer_hex(char *const *, argv
, argv
))
13 sc_in(ctf_integer_hex(char *const *, envp
, envp
))
18 * Clone()'s `flags` field has two parts:
19 * 1. exit signal: the least significant byte of the `unsigned long` is
20 * the signal the kernel must send to the parent process on child
22 * 2. clone options: the remaining bytes of the `unsigned long` is used a
23 * bitwise flag for the clone options.
25 #define CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS 8
26 #define LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(x) ((x) >> CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS)
28 SC_LTTNG_TRACEPOINT_ENUM(lttng_clone_exit_signal_flags
,
30 ctf_enum_value("SIGHUP", SIGHUP
)
31 ctf_enum_value("SIGINT", SIGINT
)
32 ctf_enum_value("SIGQUIT", SIGQUIT
)
33 ctf_enum_value("SIGILL", SIGILL
)
34 ctf_enum_value("SIGTRAP", SIGTRAP
)
35 ctf_enum_value("SIGABRT", SIGABRT
)
36 ctf_enum_value("SIGIOT", SIGIOT
)
37 ctf_enum_value("SIGBUS", SIGBUS
)
39 ctf_enum_value("SIGEMT", SIGEMT
)
40 #endif /* #ifdef SIGEMT */
41 ctf_enum_value("SIGFPE", SIGFPE
)
42 ctf_enum_value("SIGKILL", SIGKILL
)
43 ctf_enum_value("SIGUSR1", SIGUSR1
)
44 ctf_enum_value("SIGSEGV", SIGSEGV
)
45 ctf_enum_value("SIGUSR2", SIGUSR2
)
46 ctf_enum_value("SIGPIPE", SIGPIPE
)
47 ctf_enum_value("SIGALRM", SIGALRM
)
48 ctf_enum_value("SIGTERM", SIGTERM
)
50 ctf_enum_value("SIGSTKFLT", SIGSTKFLT
)
51 #endif /* #ifdef SIGSTKFLT */
52 ctf_enum_value("SIGCHLD", SIGCHLD
)
54 ctf_enum_value("SIGCLD", SIGCLD
)
55 #endif /* #ifdef SIGCLD */
56 ctf_enum_value("SIGCONT", SIGCONT
)
57 ctf_enum_value("SIGSTOP", SIGSTOP
)
58 ctf_enum_value("SIGTSTP", SIGTSTP
)
59 ctf_enum_value("SIGTTIN", SIGTTIN
)
60 ctf_enum_value("SIGTTOU", SIGTTOU
)
61 ctf_enum_value("SIGURG", SIGURG
)
62 ctf_enum_value("SIGXCPU", SIGXCPU
)
63 ctf_enum_value("SIGXFSZ", SIGXFSZ
)
64 ctf_enum_value("SIGVTALR", SIGVTALRM
)
65 ctf_enum_value("SIGPROF", SIGPROF
)
66 ctf_enum_value("SIGWINCH", SIGWINCH
)
67 ctf_enum_value("SIGIO", SIGIO
)
68 ctf_enum_value("SIGPOLL", SIGPOLL
)
69 ctf_enum_value("SIGPWR", SIGPWR
)
71 ctf_enum_value("SIGINFO", SIGINFO
)
72 #endif /* #ifdef SIGINFO */
74 ctf_enum_value("SIGLOST", SIGLOST
)
75 #endif /* #ifdef SIGLOST */
76 ctf_enum_value("SIGSYS", SIGSYS
)
78 ctf_enum_value("SIGUNUSED", SIGUNUSED
)
79 #endif /* #ifdef SIGUNUSED */
83 SC_LTTNG_TRACEPOINT_ENUM(lttng_clone_option_flags
,
85 ctf_enum_value("CLONE_CHILD_CLEARTID", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_CHILD_CLEARTID
))
86 ctf_enum_value("CLONE_CHILD_SETTID", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_CHILD_SETTID
))
87 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,5,0))
88 ctf_enum_value("CLONE_CLEAR_SIGHAND", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_CLEAR_SIGHAND
))
89 #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,5,0)) */
90 ctf_enum_value("CLONE_DETACHED", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_DETACHED
))
91 ctf_enum_value("CLONE_FILES", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_FILES
))
92 ctf_enum_value("CLONE_FS", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_FS
))
93 ctf_enum_value("CLONE_IO", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_IO
))
94 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,6,0))
95 ctf_enum_value("CLONE_NEWCGROUP", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWCGROUP
))
96 #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,6,0)) */
97 ctf_enum_value("CLONE_NEWIPC", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWIPC
))
98 ctf_enum_value("CLONE_NEWNET", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWNET
))
99 ctf_enum_value("CLONE_NEWNS", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWNS
))
100 ctf_enum_value("CLONE_NEWPID", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWPID
))
101 ctf_enum_value("CLONE_NEWUSER", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWUSER
))
102 ctf_enum_value("CLONE_NEWUTS", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_NEWUTS
))
103 ctf_enum_value("CLONE_PARENT", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_PARENT
))
104 ctf_enum_value("CLONE_PARENT_SETTID", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_PARENT_SETTID
))
105 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,2,0))
106 ctf_enum_value("CLONE_PIDFD", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_PIDFD
))
107 #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,2,0)) */
108 ctf_enum_value("CLONE_PTRACE", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_PTRACE
))
109 ctf_enum_value("CLONE_SETTLS", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_SETTLS
))
110 ctf_enum_value("CLONE_SIGHAND", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_SIGHAND
))
111 ctf_enum_value("CLONE_SYSVSEM", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_SYSVSEM
))
112 ctf_enum_value("CLONE_THREAD", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_THREAD
))
113 ctf_enum_value("CLONE_UNTRACED", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_UNTRACED
))
114 ctf_enum_value("CLONE_VFORK", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_VFORK
))
115 ctf_enum_value("CLONE_VM", LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF(CLONE_VM
))
119 #define LTTNG_CLONE_FLAGS_EXIT_SIGNAL \
120 lttng_kernel_static_event_field("exit_signal", \
121 lttng_kernel_static_type_enum(&__enum_lttng_clone_exit_signal_flags, \
122 lttng_kernel_static_type_integer(CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS, \
123 1, 0, __BYTE_ORDER, 16)), \
126 #define LTTNG_CLONE_FLAGS_OPTIONS \
127 lttng_kernel_static_event_field("options", \
128 lttng_kernel_static_type_enum(&__enum_lttng_clone_option_flags, \
129 lttng_kernel_static_type_integer( \
130 sizeof(unsigned long) * CHAR_BIT - CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS, \
131 1, 0, __BYTE_ORDER, 16)), \
134 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
135 #define LTTNG_CLONE_FLAGS \
136 lttng_kernel_static_event_field_array( \
137 [0] = LTTNG_CLONE_FLAGS_EXIT_SIGNAL, \
138 [1] = LTTNG_CLONE_FLAGS_OPTIONS, \
141 #define LTTNG_CLONE_FLAGS \
142 lttng_kernel_static_event_field_array( \
143 [0] = LTTNG_CLONE_FLAGS_OPTIONS, \
144 [1] = LTTNG_CLONE_FLAGS_EXIT_SIGNAL, \
149 #define OVERRIDE_32_clone
150 #define OVERRIDE_64_clone
151 SC_LTTNG_TRACEPOINT_EVENT(clone
,
152 TP_PROTO(sc_exit(long ret
,) unsigned long clone_flags
, unsigned long newsp
,
153 void __user
*parent_tid
,
154 void __user
*child_tid
),
155 TP_ARGS(sc_exit(ret
,) clone_flags
, newsp
, parent_tid
, child_tid
),
157 sc_exit(ctf_integer(long, ret
, ret
))
161 lttng_kernel_static_type_struct(2, LTTNG_CLONE_FLAGS
, lttng_alignof(unsigned long) * CHAR_BIT
)
165 ctf_integer_type(unsigned long, clone_flags
)
169 sc_in(ctf_integer_hex(unsigned long, newsp
, newsp
))
170 sc_in(ctf_integer_hex(void *, parent_tid
, parent_tid
))
171 sc_in(ctf_integer_hex(void *, child_tid
, child_tid
))
175 /* present in 32, missing in 64 due to old kernel headers */
176 #define OVERRIDE_32_getcpu
177 #define OVERRIDE_64_getcpu
178 SC_LTTNG_TRACEPOINT_EVENT(getcpu
,
179 TP_PROTO(sc_exit(long ret
,) unsigned __user
*cpup
, unsigned __user
*nodep
, void *tcache
),
180 TP_ARGS(sc_exit(ret
,) cpup
, nodep
, tcache
),
182 sc_exit(ctf_integer(long, ret
, ret
))
183 sc_out(ctf_integer_hex(unsigned *, cpup
, cpup
))
184 sc_out(ctf_integer_hex(unsigned *, nodep
, nodep
))
185 sc_inout(ctf_integer_hex(void *, tcache
, tcache
))
189 #define OVERRIDE_32_pipe2
190 #define OVERRIDE_64_pipe2
191 SC_LTTNG_TRACEPOINT_EVENT(pipe2
,
192 TP_PROTO(sc_exit(long ret
,) int * fildes
, int flags
),
193 TP_ARGS(sc_exit(ret
,) fildes
, flags
),
194 TP_FIELDS(sc_exit(ctf_integer(long, ret
, ret
))
195 sc_out(ctf_user_array(int, fildes
, fildes
, 2))
196 sc_in(ctf_integer(int, flags
, flags
))
200 #define LTTNG_SYSCALL_SELECT_locvar \
201 unsigned long *fds_in, *fds_out, *fds_ex; \
202 unsigned long nr_bytes, nr_ulong; \
205 #define LTTNG_SYSCALL_SELECT_code_pre \
209 unsigned int n_in_bytes; \
211 tp_locvar->fds_in = NULL; \
212 tp_locvar->fds_out = NULL; \
213 tp_locvar->fds_ex = NULL; \
214 tp_locvar->overflow = 0; \
224 /* On error or bogus input, don't copy anything. */ \
225 if (n >__FD_SETSIZE) \
228 n_in_bytes = DIV_ROUND_UP((unsigned int) n, BITS_PER_BYTE); \
231 * Limit atomic memory allocation to one page, since n \
232 * is limited to 1024 and the smallest page size on Linux \
233 * is 4k, this should not happen, don't try to make it work. \
235 if (n_in_bytes > PAGE_SIZE) { \
237 /* Inform the user that we did not output everything. */ \
238 tp_locvar->overflow = 1; \
241 tp_locvar->nr_bytes = n_in_bytes; \
242 tp_locvar->nr_ulong = DIV_ROUND_UP(n_in_bytes, \
243 sizeof(unsigned long)); \
247 tp_locvar->fds_in = lttng_tp_mempool_alloc( \
248 tp_locvar->nr_ulong * sizeof(unsigned long)); \
249 if (!tp_locvar->fds_in) \
252 err = lib_ring_buffer_copy_from_user_check_nofault( \
253 tp_locvar->fds_in, inp, \
254 tp_locvar->nr_ulong * sizeof(unsigned long)); \
259 tp_locvar->fds_out = lttng_tp_mempool_alloc( \
260 tp_locvar->nr_ulong * sizeof(unsigned long)); \
261 if (!tp_locvar->fds_out) \
264 err = lib_ring_buffer_copy_from_user_check_nofault( \
265 tp_locvar->fds_out, outp, \
266 tp_locvar->nr_ulong * sizeof(unsigned long)); \
271 tp_locvar->fds_ex = lttng_tp_mempool_alloc( \
272 tp_locvar->nr_ulong * sizeof(unsigned long)); \
273 if (!tp_locvar->fds_ex) \
276 err = lib_ring_buffer_copy_from_user_check_nofault( \
277 tp_locvar->fds_ex, exp, \
278 tp_locvar->nr_ulong * sizeof(unsigned long)); \
285 tp_locvar->nr_bytes = 0; \
286 tp_locvar->nr_ulong = 0; \
287 end: ; /* Label at end of compound statement. */ \
291 #define LTTNG_SYSCALL_SELECT_fds_field_LE(name, input) \
294 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 10) \
296 _ ## name ## _length, \
299 ctf_integer_type(uint8_t, tp_locvar->nr_bytes) \
302 ctf_integer_type(uint8_t, 0) \
309 lttng_kernel_static_type_sequence(NULL, \
310 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 16), \
317 unsigned int nr_bytes_out = 0; \
322 for (src = 0; src < tp_locvar->nr_ulong; src++) { \
324 for (dst = 0; dst < sizeof(long); dst++) { \
325 if (nr_bytes_out++ >= tp_locvar->nr_bytes) { \
328 ctf_user_integer_type(uint8_t, \
329 ((uint8_t __user *) (input->fds_bits + src))[dst]); \
336 #define LTTNG_SYSCALL_SELECT_fds_field_BE(name, input) \
339 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 10) \
341 _ ## name ## _length, \
344 ctf_integer_type(uint8_t, tp_locvar->nr_bytes) \
347 ctf_integer_type(uint8_t, 0) \
354 lttng_kernel_static_type_sequence(NULL, \
355 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 16), \
361 unsigned int src, nr_bytes_out = 0; \
366 for (src = 0; src < tp_locvar->nr_ulong; src++) { \
368 for (dst = sizeof(long); dst >= 0; dst--) { \
369 if (nr_bytes_out++ >= tp_locvar->nr_bytes) { \
372 ctf_user_integer_type(uint8_t, \
373 ((uint8_t __user *) (input->fds_bits + src))[dst]); \
380 #define LTTNG_SYSCALL_SELECT_code_post \
381 lttng_tp_mempool_free(tp_locvar->fds_in); \
382 lttng_tp_mempool_free(tp_locvar->fds_out); \
383 lttng_tp_mempool_free(tp_locvar->fds_ex);
385 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
386 #define OVERRIDE_32_select
387 #define OVERRIDE_64_select
388 SC_LTTNG_TRACEPOINT_EVENT_CODE(select
,
389 TP_PROTO(sc_exit(long ret
,) int n
, fd_set __user
*inp
, fd_set __user
*outp
,
390 fd_set __user
*exp
, struct timeval
*tvp
),
391 TP_ARGS(sc_exit(ret
,) n
, inp
, outp
, exp
, tvp
),
393 LTTNG_SYSCALL_SELECT_locvar
396 LTTNG_SYSCALL_SELECT_code_pre
399 sc_exit(ctf_integer(long, ret
, ret
))
400 sc_in(ctf_integer(int, n
, n
))
401 sc_inout(ctf_integer(uint8_t, overflow
, tp_locvar
->overflow
))
402 sc_inout(ctf_integer(struct timeval
*, tvp
, tvp
))
405 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
406 LTTNG_SYSCALL_SELECT_fds_field_LE(readfds
, inp
)
407 LTTNG_SYSCALL_SELECT_fds_field_LE(writefds
, outp
)
408 LTTNG_SYSCALL_SELECT_fds_field_LE(exceptfds
, exp
)
410 LTTNG_SYSCALL_SELECT_fds_field_BE(readfds
, inp
)
411 LTTNG_SYSCALL_SELECT_fds_field_BE(writefds
, outp
)
412 LTTNG_SYSCALL_SELECT_fds_field_BE(exceptfds
, exp
)
417 LTTNG_SYSCALL_SELECT_code_post
420 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
422 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
423 #define OVERRIDE_32_pselect6
424 #define OVERRIDE_64_pselect6
425 SC_LTTNG_TRACEPOINT_EVENT_CODE(pselect6
,
426 TP_PROTO(sc_exit(long ret
,) int n
, fd_set __user
* inp
, fd_set __user
* outp
,
427 fd_set __user
* exp
, struct timeval __user
* tvp
, void __user
* sig
),
428 TP_ARGS(sc_exit(ret
,) n
, inp
, outp
, exp
, tvp
, sig
),
430 LTTNG_SYSCALL_SELECT_locvar
433 LTTNG_SYSCALL_SELECT_code_pre
436 sc_exit(ctf_integer(long, ret
, ret
))
437 sc_in(ctf_integer(int, n
, n
))
438 sc_inout(ctf_integer(uint8_t, overflow
, tp_locvar
->overflow
))
439 sc_inout(ctf_integer(struct timeval
*, tvp
, tvp
))
440 sc_in(ctf_integer_hex(void *, sig
, sig
))
443 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
444 LTTNG_SYSCALL_SELECT_fds_field_LE(readfds
, inp
)
445 LTTNG_SYSCALL_SELECT_fds_field_LE(writefds
, outp
)
446 LTTNG_SYSCALL_SELECT_fds_field_LE(exceptfds
, exp
)
448 LTTNG_SYSCALL_SELECT_fds_field_BE(readfds
, inp
)
449 LTTNG_SYSCALL_SELECT_fds_field_BE(writefds
, outp
)
450 LTTNG_SYSCALL_SELECT_fds_field_BE(exceptfds
, exp
)
455 LTTNG_SYSCALL_SELECT_code_post
458 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
460 #ifndef ONCE_LTTNG_TRACE_POLL_H
461 #define ONCE_LTTNG_TRACE_POLL_H
463 #define LTTNG_POLL_NRFLAGS (POLLNVAL + 1)
464 #define POLL_FLAGS_PADDING_SIZE (sizeof(uint8_t) * BITS_PER_BYTE) - \
465 ilog2(LTTNG_POLL_NRFLAGS - 1)
468 * Only extract the values specified by iBCS2 for now.
470 static const struct lttng_kernel_event_field
*lttng_pollfd_flag_fields
[] = {
471 [ilog2(POLLIN
)] = lttng_kernel_static_event_field("POLLIN",
472 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
473 false, false, false),
474 [ilog2(POLLPRI
)] = lttng_kernel_static_event_field("POLLPRI",
475 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
476 false, false, false),
477 [ilog2(POLLOUT
)] = lttng_kernel_static_event_field("POLLOUT",
478 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
479 false, false, false),
480 [ilog2(POLLERR
)] = lttng_kernel_static_event_field("POLLERR",
481 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
482 false, false, false),
483 [ilog2(POLLHUP
)] = lttng_kernel_static_event_field("POLLHUP",
484 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
485 false, false, false),
486 [ilog2(POLLNVAL
)] = lttng_kernel_static_event_field("POLLNVAL",
487 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
488 false, false, false),
489 [ilog2(LTTNG_POLL_NRFLAGS
)] = lttng_kernel_static_event_field("padding",
490 lttng_kernel_static_type_integer(POLL_FLAGS_PADDING_SIZE
, 1, 0, __LITTLE_ENDIAN
, 10),
491 false, false, false),
494 static const struct lttng_kernel_event_field
*lttng_pollfd_fields
[] = {
495 [0] = lttng_kernel_static_event_field("fd", lttng_kernel_static_type_integer_from_type(int, __BYTE_ORDER
, 10),
496 false, false, false),
497 [1] = lttng_kernel_static_event_field("raw_events", lttng_kernel_static_type_integer_from_type(uint16_t, __BYTE_ORDER
, 16),
498 false, false, false),
499 [2] = lttng_kernel_static_event_field("events",
500 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_pollfd_flag_fields
),
501 lttng_pollfd_flag_fields
, 0),
502 false, false, false),
505 #endif /* ONCE_LTTNG_TRACE_POLL_H */
507 #define LTTNG_SYSCALL_POLL_locvar \
508 unsigned int fds_length, fds_max_len, alloc_fds; \
509 struct pollfd *fds; \
512 #define LTTNG_SYSCALL_POLL_code_pre \
513 BUILD_BUG_ON(((ARRAY_SIZE(lttng_pollfd_flag_fields) - 1) + \
514 POLL_FLAGS_PADDING_SIZE) != \
515 sizeof(uint8_t) * BITS_PER_BYTE); \
516 tp_locvar->fds = NULL; \
517 tp_locvar->overflow = 0; \
520 if (nfds > PAGE_SIZE / sizeof(struct pollfd)) { \
521 tp_locvar->fds_length = PAGE_SIZE / sizeof(struct pollfd); \
522 tp_locvar->fds_max_len = PAGE_SIZE / sizeof(struct pollfd); \
523 tp_locvar->overflow = 1; \
525 tp_locvar->fds_length = nfds; \
526 tp_locvar->fds_max_len = nfds; \
528 tp_locvar->alloc_fds = tp_locvar->fds_length * sizeof(struct pollfd); \
531 * On exit, the number of active FDs is determined by ret, \
532 * nfds stays the same as the entry, but we only want to \
533 * output the FDs that are relevant. \
536 if (ret <= 0 || ret > nfds) \
539 if (nfds > PAGE_SIZE / sizeof(struct pollfd)) { \
540 tp_locvar->fds_length = PAGE_SIZE / sizeof(struct pollfd); \
541 tp_locvar->fds_max_len = PAGE_SIZE / sizeof(struct pollfd); \
542 tp_locvar->overflow = 1; \
544 tp_locvar->fds_length = ret; \
545 tp_locvar->fds_max_len = nfds; \
547 tp_locvar->alloc_fds = tp_locvar->fds_max_len * sizeof(struct pollfd); \
552 tp_locvar->fds = lttng_tp_mempool_alloc(tp_locvar->alloc_fds); \
553 if (!tp_locvar->fds) \
555 err = lib_ring_buffer_copy_from_user_check_nofault( \
556 tp_locvar->fds, ufds, tp_locvar->alloc_fds); \
563 tp_locvar->fds_length = 0; \
564 tp_locvar->fds_max_len = 0; \
568 #define LTTNG_SYSCALL_POLL_fds_field \
572 lttng_kernel_static_type_sequence("fds_length", \
573 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_pollfd_fields), lttng_pollfd_fields, 0), \
581 ctf_align(int) /* Align on largest field in struct. */ \
582 for (i = 0; i < tp_locvar->fds_length; i++) { \
583 ctf_integer_type(int, tp_locvar->fds[i].fd) \
584 ctf_integer_type(short, tp_locvar->fds[i].events) \
585 ctf_integer_bitfield_type(uint8_t, \
586 (uint8_t) tp_locvar->fds[i].events) \
594 lttng_kernel_static_type_sequence("fds_length", \
595 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_pollfd_fields), lttng_pollfd_fields, 0), \
601 unsigned int i, nr = 0; \
603 ctf_align(int) /* Align on largest field in struct. */ \
605 * Iterate over the complete array, but only output \
606 * "ret" active FDs. \
608 for (i = 0; i < tp_locvar->fds_max_len; i++) { \
609 if (!tp_locvar->fds[i].revents) \
611 if (nr++ >= tp_locvar->fds_length) \
613 ctf_integer_type(int, tp_locvar->fds[i].fd) \
614 ctf_integer_type(short, tp_locvar->fds[i].revents) \
615 ctf_integer_bitfield_type(uint8_t, \
616 (uint8_t) tp_locvar->fds[i].revents) \
619 * If there is a discrepancy between ret and the \
620 * content of revents (e.g. caused by userspace corrupting \
621 * the array from a concurrent thread), we have to output \
622 * zeros to keep the trace readable. \
624 for (i = nr; i < tp_locvar->fds_length; i++) { \
625 ctf_integer_type(int, 0) \
626 ctf_integer_type(short, 0) \
627 ctf_integer_bitfield_type(uint8_t, 0) \
633 #define LTTNG_SYSCALL_POLL_code_post \
634 lttng_tp_mempool_free(tp_locvar->fds);
636 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
637 #define OVERRIDE_32_poll
638 #define OVERRIDE_64_poll
639 SC_LTTNG_TRACEPOINT_EVENT_CODE(poll
,
640 TP_PROTO(sc_exit(long ret
,) struct pollfd __user
* ufds
,
641 unsigned int nfds
, int timeout_msecs
),
642 TP_ARGS(sc_exit(ret
,) ufds
, nfds
, timeout_msecs
),
644 LTTNG_SYSCALL_POLL_locvar
647 LTTNG_SYSCALL_POLL_code_pre
650 sc_exit(ctf_integer(long, ret
, ret
))
651 sc_in(ctf_integer(int, timeout_msecs
, timeout_msecs
))
652 sc_inout(ctf_integer(unsigned int, nfds
, nfds
))
653 sc_inout(ctf_integer(unsigned int, fds_length
, tp_locvar
->fds_length
))
654 sc_in(ctf_integer(uint8_t, overflow
, tp_locvar
->overflow
))
655 LTTNG_SYSCALL_POLL_fds_field
658 LTTNG_SYSCALL_POLL_code_post
661 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
663 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
664 #define OVERRIDE_32_ppoll
665 #define OVERRIDE_64_ppoll
666 SC_LTTNG_TRACEPOINT_EVENT_CODE(ppoll
,
667 TP_PROTO(sc_exit(long ret
,) struct pollfd __user
* ufds
,
668 unsigned int nfds
, struct timespec
* tsp
, const sigset_t
* sigmask
, size_t sigsetsize
),
669 TP_ARGS(sc_exit(ret
,) ufds
, nfds
, tsp
, sigmask
, sigsetsize
),
671 LTTNG_SYSCALL_POLL_locvar
674 LTTNG_SYSCALL_POLL_code_pre
677 sc_exit(ctf_integer(long, ret
, ret
))
678 sc_in(ctf_integer(struct timespec
*, tsp
, tsp
))
679 sc_in(ctf_integer(const sigset_t
*, sigmask
, sigmask
))
680 sc_in(ctf_integer(size_t, sigsetsize
, sigsetsize
))
681 sc_inout(ctf_integer(unsigned int, nfds
, nfds
))
682 sc_inout(ctf_integer(unsigned int, fds_length
, tp_locvar
->fds_length
))
683 sc_inout(ctf_integer(uint8_t, overflow
, tp_locvar
->overflow
))
684 LTTNG_SYSCALL_POLL_fds_field
687 LTTNG_SYSCALL_POLL_code_post
690 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
692 #include <linux/eventpoll.h>
694 SC_LTTNG_TRACEPOINT_ENUM(lttng_epoll_op
,
696 ctf_enum_value("EPOLL_CTL_ADD", EPOLL_CTL_ADD
)
697 ctf_enum_value("EPOLL_CTL_DEL", EPOLL_CTL_DEL
)
698 ctf_enum_value("EPOLL_CTL_MOD", EPOLL_CTL_MOD
)
702 #ifndef ONCE_LTTNG_TRACE_EPOLL_CTL_H
703 #define ONCE_LTTNG_TRACE_EPOLL_CTL_H
705 #define LTTNG_EPOLL_NRFLAGS (POLLHUP + 1)
706 #define EPOLL_FLAGS_PADDING_SIZE (sizeof(uint8_t) * BITS_PER_BYTE) - \
707 ilog2(LTTNG_EPOLL_NRFLAGS - 1)
710 * Only extract the values specified by iBCS2 for now.
712 static const struct lttng_kernel_event_field
*lttng_epoll_ctl_events_fields
[] = {
714 [ilog2(POLLIN
)] = lttng_kernel_static_event_field("EPOLLIN",
715 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
716 false, false, false),
718 [ilog2(POLLPRI
)] = lttng_kernel_static_event_field("EPOLLPRI",
719 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
720 false, false, false),
722 [ilog2(POLLOUT
)] = lttng_kernel_static_event_field("EPOLLOUT",
723 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
724 false, false, false),
726 [ilog2(POLLERR
)] = lttng_kernel_static_event_field("EPOLLERR",
727 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
728 false, false, false),
730 [ilog2(POLLHUP
)] = lttng_kernel_static_event_field("EPOLLHUP",
731 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN
, 10),
732 false, false, false),
733 [ilog2(LTTNG_EPOLL_NRFLAGS
)] = lttng_kernel_static_event_field("padding",
734 lttng_kernel_static_type_integer(EPOLL_FLAGS_PADDING_SIZE
, 1, 0, __LITTLE_ENDIAN
, 10),
735 false, false, false),
738 static const struct lttng_kernel_event_field
*lttng_epoll_data_fields
[] = {
739 [0] = lttng_kernel_static_event_field("u64",
740 lttng_kernel_static_type_integer_from_type(uint64_t, __BYTE_ORDER
, 16),
741 false, false, false),
742 [1] = lttng_kernel_static_event_field("fd",
743 lttng_kernel_static_type_integer_from_type(int, __BYTE_ORDER
, 10),
744 false, false, false),
747 static const struct lttng_kernel_event_field
*epoll_ctl_fields
[] = {
748 [0] = lttng_kernel_static_event_field("data_union",
749 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_data_fields
),
750 lttng_epoll_data_fields
,
752 false, false, false),
753 [1] = lttng_kernel_static_event_field("raw_events",
754 lttng_kernel_static_type_integer_from_type(uint32_t, __BYTE_ORDER
, 16),
755 false, false, false),
756 [2] = lttng_kernel_static_event_field("events",
757 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_ctl_events_fields
),
758 lttng_epoll_ctl_events_fields
,
760 false, false, false),
762 #endif /* ONCE_LTTNG_TRACE_EPOLL_CTL_H */
764 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
765 #define OVERRIDE_32_epoll_ctl
766 #define OVERRIDE_64_epoll_ctl
767 SC_LTTNG_TRACEPOINT_EVENT_CODE(epoll_ctl
,
768 TP_PROTO(sc_exit(long ret
,) int epfd
, int op
, int fd
,
769 struct epoll_event __user
* uevent
),
770 TP_ARGS(sc_exit(ret
,) epfd
, op
, fd
, uevent
),
772 struct epoll_event event
;
776 tp_locvar
->err
= lib_ring_buffer_copy_from_user_check_nofault(
777 &tp_locvar
->event
, uevent
, sizeof(struct epoll_event
));
780 sc_exit(ctf_integer(long, ret
, ret
))
781 sc_in(ctf_integer(int, epfd
, epfd
))
782 sc_in(ctf_enum(lttng_epoll_op
, int, op_enum
, op
))
783 sc_in(ctf_integer(int, fd
, fd
))
787 lttng_kernel_static_type_struct(ARRAY_SIZE(epoll_ctl_fields
), epoll_ctl_fields
, 0)
792 if (!tp_locvar
->err
) {
793 ctf_integer_type(uint64_t, tp_locvar
->event
.data
)
794 ctf_integer_type(int, tp_locvar
->event
.data
)
795 ctf_integer_bitfield_type(uint32_t,
796 tp_locvar
->event
.events
)
797 ctf_integer_bitfield_type(uint8_t,
798 (uint8_t) tp_locvar
->event
.events
)
800 ctf_integer_type(uint64_t, 0)
801 ctf_integer_type(int, 0)
802 ctf_integer_bitfield_type(uint32_t, 0)
803 ctf_integer_bitfield_type(uint8_t, 0)
811 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
813 #ifndef ONCE_LTTNG_TRACE_EPOLL_H
814 #define ONCE_LTTNG_TRACE_EPOLL_H
816 static const struct lttng_kernel_event_field
*lttng_epoll_wait_fields
[] = lttng_kernel_static_event_field_array(
817 [0] = lttng_kernel_static_event_field("data_union",
818 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_data_fields
), lttng_epoll_data_fields
, 0),
819 false, false, false),
820 [1] = lttng_kernel_static_event_field("raw_events", lttng_kernel_static_type_integer_from_type(uint32_t, __BYTE_ORDER
, 16),
821 false, false, false),
822 [2] = lttng_kernel_static_event_field("events",
823 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_ctl_events_fields
), lttng_epoll_ctl_events_fields
, 0),
824 false, false, false),
827 #endif /* ONCE_LTTNG_TRACE_EPOLL_H */
829 #define LTTNG_SYSCALL_EPOLL_WAIT_locvar \
831 unsigned int fds_length; \
833 struct epoll_event *events; \
836 #define LTTNG_SYSCALL_EPOLL_WAIT_code_pre \
837 BUILD_BUG_ON(((ARRAY_SIZE(lttng_epoll_ctl_events_fields) - 1) + \
838 EPOLL_FLAGS_PADDING_SIZE) != \
839 sizeof(uint8_t) * BITS_PER_BYTE); \
842 unsigned long maxalloc; \
844 tp_locvar->fds_length = 0; \
845 tp_locvar->events = NULL; \
846 tp_locvar->overflow = 0; \
848 if (maxevents <= 0 || ret <= 0 || ret > maxevents) \
851 if (maxevents > PAGE_SIZE / sizeof(struct epoll_event)) { \
852 maxalloc = PAGE_SIZE / sizeof(struct epoll_event); \
854 maxalloc = maxevents; \
857 if (ret > maxalloc) { \
858 tp_locvar->fds_length = maxalloc; \
859 tp_locvar->overflow = 1; \
861 tp_locvar->fds_length = ret; \
864 tp_locvar->events = lttng_tp_mempool_alloc( \
865 maxalloc * sizeof(struct epoll_event)); \
866 if (!tp_locvar->events) { \
867 tp_locvar->fds_length = 0; \
871 err = lib_ring_buffer_copy_from_user_check_nofault( \
872 tp_locvar->events, uevents, \
873 maxalloc * sizeof(struct epoll_event)); \
875 tp_locvar->fds_length = 0; \
880 #define LTTNG_SYSCALL_EPOLL_WAIT_fds_field \
883 lttng_kernel_static_type_sequence("fds_length", \
884 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_wait_fields), lttng_epoll_wait_fields, 0), \
892 ctf_align(uint64_t) \
893 for (i = 0; i < tp_locvar->fds_length; i++) { \
894 ctf_integer_type(uint64_t, tp_locvar->events[i].data) \
895 ctf_integer_type(int, tp_locvar->events[i].data) \
896 ctf_integer_bitfield_type(uint32_t, \
897 tp_locvar->events[i].events) \
898 ctf_integer_bitfield_type(uint8_t, \
899 (uint8_t) tp_locvar->events[i].events) \
904 #define LTTNG_SYSCALL_EPOLL_WAIT_code_post \
906 lttng_tp_mempool_free(tp_locvar->events); \
910 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
911 #define OVERRIDE_32_epoll_wait
912 #define OVERRIDE_64_epoll_wait
913 SC_LTTNG_TRACEPOINT_EVENT_CODE(epoll_wait
,
914 TP_PROTO(sc_exit(long ret
,) int epfd
, struct epoll_event __user
* uevents
,
915 int maxevents
, int timeout
),
916 TP_ARGS(sc_exit(ret
,) epfd
, uevents
, maxevents
, timeout
),
918 LTTNG_SYSCALL_EPOLL_WAIT_locvar
921 LTTNG_SYSCALL_EPOLL_WAIT_code_pre
924 sc_exit(ctf_integer(long, ret
, ret
))
925 sc_in(ctf_integer(int, epfd
, epfd
))
926 sc_in(ctf_integer(int, maxevents
, maxevents
))
927 sc_in(ctf_integer(int, timeout
, timeout
))
928 sc_out(ctf_integer(unsigned int, fds_length
, tp_locvar
->fds_length
))
929 sc_out(ctf_integer(uint8_t, overflow
, tp_locvar
->overflow
))
931 LTTNG_SYSCALL_EPOLL_WAIT_fds_field
935 LTTNG_SYSCALL_EPOLL_WAIT_code_post
938 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
940 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
941 #define OVERRIDE_32_epoll_pwait
942 #define OVERRIDE_64_epoll_pwait
943 SC_LTTNG_TRACEPOINT_EVENT_CODE(epoll_pwait
,
944 TP_PROTO(sc_exit(long ret
,) int epfd
, struct epoll_event __user
* uevents
,
945 int maxevents
, int timeout
, const sigset_t __user
* sigmask
, size_t sigsetsize
),
946 TP_ARGS(sc_exit(ret
,) epfd
, uevents
, maxevents
, timeout
, sigmask
, sigsetsize
),
948 LTTNG_SYSCALL_EPOLL_WAIT_locvar
951 LTTNG_SYSCALL_EPOLL_WAIT_code_pre
954 sc_exit(ctf_integer(long, ret
, ret
))
955 sc_in(ctf_integer(int, epfd
, epfd
))
956 sc_in(ctf_integer(int, maxevents
, maxevents
))
957 sc_in(ctf_integer(int, timeout
, timeout
))
958 sc_in(ctf_integer_hex(const sigset_t
*, sigmask
, sigmask
))
959 sc_in(ctf_integer(size_t, sigsetsize
, sigsetsize
))
960 sc_out(ctf_integer(unsigned int, fds_length
, tp_locvar
->fds_length
))
961 sc_out(ctf_integer(uint8_t, overflow
, tp_locvar
->overflow
))
963 LTTNG_SYSCALL_EPOLL_WAIT_fds_field
967 LTTNG_SYSCALL_EPOLL_WAIT_code_post
970 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
972 #if (defined(CONFIG_X86_64) && !defined(LTTNG_SC_COMPAT)) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
973 #define OVERRIDE_32_socketpair
974 #define OVERRIDE_64_socketpair
975 SC_LTTNG_TRACEPOINT_EVENT(socketpair
,
976 TP_PROTO(sc_exit(long ret
,) int family
, int type
, int protocol
, int *usockvec
),
977 TP_ARGS(sc_exit(ret
,) family
, type
, protocol
, usockvec
),
979 sc_exit(ctf_integer(long, ret
, ret
))
980 sc_in(ctf_integer(int, family
, family
))
981 sc_in(ctf_integer(int, type
, type
))
982 sc_in(ctf_integer(int, protocol
, protocol
))
983 sc_out(ctf_user_array(int, socket
, usockvec
, 2))
986 #endif /* (defined(CONFIG_X86_64) && !defined(LTTNG_SC_COMPAT)) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
989 * Enumeration of the open flags, as described in the 'open'
990 * system call man page.
992 SC_LTTNG_TRACEPOINT_ENUM(lttng_file_status_flags
,
994 ctf_enum_value("O_RDONLY", O_RDONLY
)
995 ctf_enum_value("O_WRONLY", O_WRONLY
)
996 ctf_enum_value("O_RDWR", O_RDWR
)
997 ctf_enum_value("O_CREAT", O_CREAT
)
998 ctf_enum_value("O_EXCL", O_EXCL
)
999 ctf_enum_value("O_NOCTTY", O_NOCTTY
)
1000 ctf_enum_value("O_TRUNC", O_TRUNC
)
1001 ctf_enum_value("O_APPEND", O_APPEND
)
1002 ctf_enum_value("O_NONBLOCK", O_NONBLOCK
)
1003 ctf_enum_value("O_DSYNC", O_DSYNC
)
1004 ctf_enum_value("FASYNC", FASYNC
)
1005 ctf_enum_value("O_DIRECT", O_DIRECT
)
1006 ctf_enum_value("O_LARGEFILE", O_LARGEFILE
)
1007 ctf_enum_value("O_DIRECTORY", O_DIRECTORY
)
1008 ctf_enum_value("O_NOFOLLOW", O_NOFOLLOW
)
1009 ctf_enum_value("O_NOATIME", O_NOATIME
)
1010 ctf_enum_value("O_CLOEXEC", O_CLOEXEC
)
1011 ctf_enum_value("O_SYNC", __O_SYNC
)
1012 ctf_enum_value("O_PATH", O_PATH
)
1013 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,11,0))
1014 ctf_enum_value("O_TMPFILE", __O_TMPFILE
)
1015 #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,11,0)) */
1020 * Enumeration of the open flags, as described in the 'open'
1021 * system call man page.
1023 SC_LTTNG_TRACEPOINT_ENUM(lttng_file_mode
,
1025 ctf_enum_value("S_IRWXU", S_IRWXU
)
1026 ctf_enum_value("S_IRUSR", S_IRUSR
)
1027 ctf_enum_value("S_IWUSR", S_IWUSR
)
1028 ctf_enum_value("S_IXUSR", S_IXUSR
)
1029 ctf_enum_value("S_IRWXG", S_IRWXG
)
1030 ctf_enum_value("S_IRGRP", S_IRGRP
)
1031 ctf_enum_value("S_IWGRP", S_IWGRP
)
1032 ctf_enum_value("S_IXGRP", S_IXGRP
)
1033 ctf_enum_value("S_IRWXO", S_IRWXO
)
1034 ctf_enum_value("S_IROTH", S_IROTH
)
1035 ctf_enum_value("S_IWOTH", S_IWOTH
)
1036 ctf_enum_value("S_IXOTH", S_IXOTH
)
1037 ctf_enum_value("S_ISUID", S_ISUID
)
1038 ctf_enum_value("S_ISGID", S_ISGID
)
1039 ctf_enum_value("S_ISVTX", S_ISVTX
)
1043 #define OVERRIDE_32_openat
1044 #define OVERRIDE_64_openat
1045 SC_LTTNG_TRACEPOINT_EVENT(openat
,
1046 TP_PROTO(sc_exit(long ret
,) int dfd
, const char * filename
, int flags
, umode_t mode
),
1047 TP_ARGS(sc_exit(ret
,) dfd
, filename
, flags
, mode
),
1049 sc_exit(ctf_integer(long, ret
, ret
))
1050 sc_in(ctf_integer(int, dfd
, dfd
))
1051 sc_in(ctf_user_string(filename
, filename
))
1052 sc_in(ctf_enum(lttng_file_status_flags
, int, flags
, flags
))
1053 sc_in(ctf_enum(lttng_file_mode
, umode_t
, mode
, mode
))
1057 #define OVERRIDE_32_open
1058 #define OVERRIDE_64_open
1059 SC_LTTNG_TRACEPOINT_EVENT(open
,
1060 TP_PROTO(sc_exit(long ret
,) const char * filename
, int flags
, umode_t mode
),
1061 TP_ARGS(sc_exit(ret
,) filename
, flags
, mode
),
1063 sc_exit(ctf_integer(long, ret
, ret
))
1064 sc_in(ctf_user_string(filename
, filename
))
1065 sc_in(ctf_enum(lttng_file_status_flags
, int, flags
, flags
))
1066 sc_in(ctf_enum(lttng_file_mode
, umode_t
, mode
, mode
))
1070 #endif /* CREATE_SYSCALL_TABLE */