Refactoring: type description structures
[lttng-modules.git] / include / instrumentation / syscalls / headers / syscalls_pointers_override.h
1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only) */
2
3 #ifndef CREATE_SYSCALL_TABLE
4
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))
14 )
15 )
16
17 /*
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
21 * exit,
22 * 2. clone options: the remaining bytes of the `unsigned long` is used a
23 * bitwise flag for the clone options.
24 */
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)
27
28 SC_LTTNG_TRACEPOINT_ENUM(lttng_clone_exit_signal_flags,
29 TP_ENUM_VALUES(
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)
38 #ifdef SIGEMT
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)
49 #ifdef SIGSTKFLT
50 ctf_enum_value("SIGSTKFLT", SIGSTKFLT)
51 #endif /* #ifdef SIGSTKFLT */
52 ctf_enum_value("SIGCHLD", SIGCHLD)
53 #ifdef SIGCLD
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)
70 #ifdef SIGINFO
71 ctf_enum_value("SIGINFO", SIGINFO)
72 #endif /* #ifdef SIGINFO */
73 #ifdef SIGLOST
74 ctf_enum_value("SIGLOST", SIGLOST)
75 #endif /* #ifdef SIGLOST */
76 ctf_enum_value("SIGSYS", SIGSYS)
77 #ifdef SIGUNUSED
78 ctf_enum_value("SIGUNUSED", SIGUNUSED)
79 #endif /* #ifdef SIGUNUSED */
80 )
81 )
82
83 SC_LTTNG_TRACEPOINT_ENUM(lttng_clone_option_flags,
84 TP_ENUM_VALUES(
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))
116 )
117 )
118
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)), \
124 false, false, false)
125
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)), \
132 false, false, false)
133
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, \
139 )
140 #else
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, \
145 )
146 #endif
147
148
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),
156 TP_FIELDS(
157 sc_exit(ctf_integer(long, ret, ret))
158 sc_in(
159 ctf_custom_field(
160 ctf_custom_type(
161 lttng_kernel_static_type_struct(2, LTTNG_CLONE_FLAGS, lttng_alignof(unsigned long) * CHAR_BIT)
162 ),
163 flags,
164 ctf_custom_code(
165 ctf_integer_type(unsigned long, clone_flags)
166 )
167 )
168 )
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))
172 )
173 )
174
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),
181 TP_FIELDS(
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))
186 )
187 )
188
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))
197 )
198 )
199
200 #define LTTNG_SYSCALL_SELECT_locvar \
201 unsigned long *fds_in, *fds_out, *fds_ex; \
202 unsigned long nr_bytes, nr_ulong; \
203 uint8_t overflow;
204
205 #define LTTNG_SYSCALL_SELECT_code_pre \
206 sc_inout( \
207 { \
208 int err; \
209 unsigned int n_in_bytes; \
210 \
211 tp_locvar->fds_in = NULL; \
212 tp_locvar->fds_out = NULL; \
213 tp_locvar->fds_ex = NULL; \
214 tp_locvar->overflow = 0; \
215 \
216 sc_out( \
217 if (ret <= 0) \
218 goto error; \
219 ) \
220 \
221 if (n <= 0) \
222 goto error; \
223 \
224 /* On error or bogus input, don't copy anything. */ \
225 if (n >__FD_SETSIZE) \
226 goto error; \
227 \
228 n_in_bytes = DIV_ROUND_UP((unsigned int) n, BITS_PER_BYTE); \
229 \
230 /* \
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. \
234 */ \
235 if (n_in_bytes > PAGE_SIZE) { \
236 WARN_ON_ONCE(1); \
237 /* Inform the user that we did not output everything. */ \
238 tp_locvar->overflow = 1; \
239 goto error; \
240 } else { \
241 tp_locvar->nr_bytes = n_in_bytes; \
242 tp_locvar->nr_ulong = DIV_ROUND_UP(n_in_bytes, \
243 sizeof(unsigned long)); \
244 } \
245 \
246 if (inp) { \
247 tp_locvar->fds_in = lttng_tp_mempool_alloc( \
248 tp_locvar->nr_ulong * sizeof(unsigned long)); \
249 if (!tp_locvar->fds_in) \
250 goto error; \
251 \
252 err = lib_ring_buffer_copy_from_user_check_nofault( \
253 tp_locvar->fds_in, inp, \
254 tp_locvar->nr_ulong * sizeof(unsigned long)); \
255 if (err != 0) \
256 goto error; \
257 } \
258 if (outp) { \
259 tp_locvar->fds_out = lttng_tp_mempool_alloc( \
260 tp_locvar->nr_ulong * sizeof(unsigned long)); \
261 if (!tp_locvar->fds_out) \
262 goto error; \
263 \
264 err = lib_ring_buffer_copy_from_user_check_nofault( \
265 tp_locvar->fds_out, outp, \
266 tp_locvar->nr_ulong * sizeof(unsigned long)); \
267 if (err != 0) \
268 goto error; \
269 } \
270 if (exp) { \
271 tp_locvar->fds_ex = lttng_tp_mempool_alloc( \
272 tp_locvar->nr_ulong * sizeof(unsigned long)); \
273 if (!tp_locvar->fds_ex) \
274 goto error; \
275 \
276 err = lib_ring_buffer_copy_from_user_check_nofault( \
277 tp_locvar->fds_ex, exp, \
278 tp_locvar->nr_ulong * sizeof(unsigned long)); \
279 if (err != 0) \
280 goto error; \
281 } \
282 goto end; \
283 \
284 error: \
285 tp_locvar->nr_bytes = 0; \
286 tp_locvar->nr_ulong = 0; \
287 end: ; /* Label at end of compound statement. */ \
288 } \
289 )
290
291 #define LTTNG_SYSCALL_SELECT_fds_field_LE(name, input) \
292 ctf_custom_field( \
293 ctf_custom_type( \
294 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 10) \
295 ), \
296 _ ## name ## _length, \
297 ctf_custom_code( \
298 if (input) { \
299 ctf_integer_type(uint8_t, tp_locvar->nr_bytes) \
300 ctf_align(uint8_t) \
301 } else { \
302 ctf_integer_type(uint8_t, 0) \
303 ctf_align(uint8_t) \
304 } \
305 ) \
306 ) \
307 ctf_custom_field( \
308 ctf_custom_type( \
309 lttng_kernel_static_type_sequence( \
310 "_" #name "_length", \
311 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 16), \
312 0, \
313 none) \
314 ), \
315 name, \
316 ctf_custom_code( \
317 unsigned int src; \
318 unsigned int nr_bytes_out = 0; \
319 \
320 if (!input) \
321 goto skip_##name; \
322 \
323 for (src = 0; src < tp_locvar->nr_ulong; src++) { \
324 int dst; \
325 for (dst = 0; dst < sizeof(long); dst++) { \
326 if (nr_bytes_out++ >= tp_locvar->nr_bytes) { \
327 goto skip_##name; \
328 } \
329 ctf_user_integer_type(uint8_t, \
330 ((uint8_t __user *) (input->fds_bits + src))[dst]); \
331 } \
332 } \
333 skip_##name: ; \
334 ) \
335 )
336
337 #define LTTNG_SYSCALL_SELECT_fds_field_BE(name, input) \
338 ctf_custom_field( \
339 ctf_custom_type( \
340 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 10) \
341 ), \
342 _ ## name ## _length, \
343 ctf_custom_code( \
344 if (input) { \
345 ctf_integer_type(uint8_t, tp_locvar->nr_bytes) \
346 ctf_align(uint8_t) \
347 } else { \
348 ctf_integer_type(uint8_t, 0) \
349 ctf_align(uint8_t) \
350 } \
351 ) \
352 ) \
353 ctf_custom_field( \
354 ctf_custom_type( \
355 lttng_kernel_static_type_sequence("_" #name "_length", \
356 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 16), \
357 0, \
358 none) \
359 ), \
360 name, \
361 ctf_custom_code( \
362 unsigned int src, nr_bytes_out = 0; \
363 \
364 if (!input) \
365 goto skip_##name; \
366 \
367 for (src = 0; src < tp_locvar->nr_ulong; src++) { \
368 int dst; \
369 for (dst = sizeof(long); dst >= 0; dst--) { \
370 if (nr_bytes_out++ >= tp_locvar->nr_bytes) { \
371 goto skip_##name; \
372 } \
373 ctf_user_integer_type(uint8_t, \
374 ((uint8_t __user *) (input->fds_bits + src))[dst]); \
375 } \
376 } \
377 skip_##name: ; \
378 ) \
379 )
380
381 #define LTTNG_SYSCALL_SELECT_code_post \
382 lttng_tp_mempool_free(tp_locvar->fds_in); \
383 lttng_tp_mempool_free(tp_locvar->fds_out); \
384 lttng_tp_mempool_free(tp_locvar->fds_ex);
385
386 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
387 #define OVERRIDE_32_select
388 #define OVERRIDE_64_select
389 SC_LTTNG_TRACEPOINT_EVENT_CODE(select,
390 TP_PROTO(sc_exit(long ret,) int n, fd_set __user *inp, fd_set __user *outp,
391 fd_set __user *exp, struct timeval *tvp),
392 TP_ARGS(sc_exit(ret,) n, inp, outp, exp, tvp),
393 TP_locvar(
394 LTTNG_SYSCALL_SELECT_locvar
395 ),
396 TP_code_pre(
397 LTTNG_SYSCALL_SELECT_code_pre
398 ),
399 TP_FIELDS(
400 sc_exit(ctf_integer(long, ret, ret))
401 sc_in(ctf_integer(int, n, n))
402 sc_inout(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
403 sc_inout(ctf_integer(struct timeval *, tvp, tvp))
404
405 sc_inout(
406 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
407 LTTNG_SYSCALL_SELECT_fds_field_LE(readfds, inp)
408 LTTNG_SYSCALL_SELECT_fds_field_LE(writefds, outp)
409 LTTNG_SYSCALL_SELECT_fds_field_LE(exceptfds, exp)
410 #else
411 LTTNG_SYSCALL_SELECT_fds_field_BE(readfds, inp)
412 LTTNG_SYSCALL_SELECT_fds_field_BE(writefds, outp)
413 LTTNG_SYSCALL_SELECT_fds_field_BE(exceptfds, exp)
414 #endif
415 )
416 ),
417 TP_code_post(
418 LTTNG_SYSCALL_SELECT_code_post
419 )
420 )
421 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
422
423 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
424 #define OVERRIDE_32_pselect6
425 #define OVERRIDE_64_pselect6
426 SC_LTTNG_TRACEPOINT_EVENT_CODE(pselect6,
427 TP_PROTO(sc_exit(long ret,) int n, fd_set __user * inp, fd_set __user * outp,
428 fd_set __user * exp, struct timeval __user * tvp, void __user * sig),
429 TP_ARGS(sc_exit(ret,) n, inp, outp, exp, tvp, sig),
430 TP_locvar(
431 LTTNG_SYSCALL_SELECT_locvar
432 ),
433 TP_code_pre(
434 LTTNG_SYSCALL_SELECT_code_pre
435 ),
436 TP_FIELDS(
437 sc_exit(ctf_integer(long, ret, ret))
438 sc_in(ctf_integer(int, n, n))
439 sc_inout(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
440 sc_inout(ctf_integer(struct timeval *, tvp, tvp))
441 sc_in(ctf_integer_hex(void *, sig, sig))
442
443 sc_inout(
444 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
445 LTTNG_SYSCALL_SELECT_fds_field_LE(readfds, inp)
446 LTTNG_SYSCALL_SELECT_fds_field_LE(writefds, outp)
447 LTTNG_SYSCALL_SELECT_fds_field_LE(exceptfds, exp)
448 #else
449 LTTNG_SYSCALL_SELECT_fds_field_BE(readfds, inp)
450 LTTNG_SYSCALL_SELECT_fds_field_BE(writefds, outp)
451 LTTNG_SYSCALL_SELECT_fds_field_BE(exceptfds, exp)
452 #endif
453 )
454 ),
455 TP_code_post(
456 LTTNG_SYSCALL_SELECT_code_post
457 )
458 )
459 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
460
461 #ifndef ONCE_LTTNG_TRACE_POLL_H
462 #define ONCE_LTTNG_TRACE_POLL_H
463
464 #define LTTNG_POLL_NRFLAGS (POLLNVAL + 1)
465 #define POLL_FLAGS_PADDING_SIZE (sizeof(uint8_t) * BITS_PER_BYTE) - \
466 ilog2(LTTNG_POLL_NRFLAGS - 1)
467
468 /*
469 * Only extract the values specified by iBCS2 for now.
470 */
471 static const struct lttng_kernel_event_field *lttng_pollfd_flag_fields[] = {
472 [ilog2(POLLIN)] = lttng_kernel_static_event_field("POLLIN",
473 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
474 false, false, false),
475 [ilog2(POLLPRI)] = lttng_kernel_static_event_field("POLLPRI",
476 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
477 false, false, false),
478 [ilog2(POLLOUT)] = lttng_kernel_static_event_field("POLLOUT",
479 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
480 false, false, false),
481 [ilog2(POLLERR)] = lttng_kernel_static_event_field("POLLERR",
482 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
483 false, false, false),
484 [ilog2(POLLHUP)] = lttng_kernel_static_event_field("POLLHUP",
485 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
486 false, false, false),
487 [ilog2(POLLNVAL)] = lttng_kernel_static_event_field("POLLNVAL",
488 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
489 false, false, false),
490 [ilog2(LTTNG_POLL_NRFLAGS)] = lttng_kernel_static_event_field("padding",
491 lttng_kernel_static_type_integer(POLL_FLAGS_PADDING_SIZE, 1, 0, __LITTLE_ENDIAN, 10),
492 false, false, false),
493 };
494
495 static const struct lttng_kernel_event_field *lttng_pollfd_fields[] = {
496 [0] = lttng_kernel_static_event_field("fd", lttng_kernel_static_type_integer_from_type(int, __BYTE_ORDER, 10),
497 false, false, false),
498 [1] = lttng_kernel_static_event_field("raw_events", lttng_kernel_static_type_integer_from_type(uint16_t, __BYTE_ORDER, 16),
499 false, false, false),
500 [2] = lttng_kernel_static_event_field("events",
501 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_pollfd_flag_fields),
502 lttng_pollfd_flag_fields, 0),
503 false, false, false),
504 };
505
506 #endif /* ONCE_LTTNG_TRACE_POLL_H */
507
508 #define LTTNG_SYSCALL_POLL_locvar \
509 unsigned int fds_length, fds_max_len, alloc_fds; \
510 struct pollfd *fds; \
511 uint8_t overflow;
512
513 #define LTTNG_SYSCALL_POLL_code_pre \
514 BUILD_BUG_ON(((ARRAY_SIZE(lttng_pollfd_flag_fields) - 1) + \
515 POLL_FLAGS_PADDING_SIZE) != \
516 sizeof(uint8_t) * BITS_PER_BYTE); \
517 tp_locvar->fds = NULL; \
518 tp_locvar->overflow = 0; \
519 \
520 sc_in( \
521 if (nfds > PAGE_SIZE / sizeof(struct pollfd)) { \
522 tp_locvar->fds_length = PAGE_SIZE / sizeof(struct pollfd); \
523 tp_locvar->fds_max_len = PAGE_SIZE / sizeof(struct pollfd); \
524 tp_locvar->overflow = 1; \
525 } else { \
526 tp_locvar->fds_length = nfds; \
527 tp_locvar->fds_max_len = nfds; \
528 } \
529 tp_locvar->alloc_fds = tp_locvar->fds_length * sizeof(struct pollfd); \
530 ) \
531 /* \
532 * On exit, the number of active FDs is determined by ret, \
533 * nfds stays the same as the entry, but we only want to \
534 * output the FDs that are relevant. \
535 */ \
536 sc_out( \
537 if (ret <= 0 || ret > nfds) \
538 goto error; \
539 \
540 if (nfds > PAGE_SIZE / sizeof(struct pollfd)) { \
541 tp_locvar->fds_length = PAGE_SIZE / sizeof(struct pollfd); \
542 tp_locvar->fds_max_len = PAGE_SIZE / sizeof(struct pollfd); \
543 tp_locvar->overflow = 1; \
544 } else { \
545 tp_locvar->fds_length = ret; \
546 tp_locvar->fds_max_len = nfds; \
547 } \
548 tp_locvar->alloc_fds = tp_locvar->fds_max_len * sizeof(struct pollfd); \
549 ) \
550 { \
551 int err; \
552 \
553 tp_locvar->fds = lttng_tp_mempool_alloc(tp_locvar->alloc_fds); \
554 if (!tp_locvar->fds) \
555 goto error; \
556 err = lib_ring_buffer_copy_from_user_check_nofault( \
557 tp_locvar->fds, ufds, tp_locvar->alloc_fds); \
558 if (err != 0) \
559 goto error; \
560 } \
561 goto end; \
562 \
563 error: \
564 tp_locvar->fds_length = 0; \
565 tp_locvar->fds_max_len = 0; \
566 end: \
567 ;
568
569 #define LTTNG_SYSCALL_POLL_fds_field \
570 sc_in( \
571 ctf_custom_field( \
572 ctf_custom_type( \
573 lttng_kernel_static_type_sequence("fds_length", \
574 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_pollfd_fields), lttng_pollfd_fields, 0), \
575 0, \
576 none) \
577 ), \
578 fds, \
579 ctf_custom_code( \
580 uint32_t i; \
581 \
582 ctf_align(int) /* Align on largest field in struct. */ \
583 for (i = 0; i < tp_locvar->fds_length; i++) { \
584 ctf_integer_type(int, tp_locvar->fds[i].fd) \
585 ctf_integer_type(short, tp_locvar->fds[i].events) \
586 ctf_integer_bitfield_type(uint8_t, \
587 (uint8_t) tp_locvar->fds[i].events) \
588 } \
589 ) \
590 ) \
591 ) \
592 sc_out( \
593 ctf_custom_field( \
594 ctf_custom_type( \
595 lttng_kernel_static_type_sequence("fds_length", \
596 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_pollfd_fields), lttng_pollfd_fields, 0), \
597 0, \
598 none) \
599 ), \
600 fds, \
601 ctf_custom_code( \
602 unsigned int i, nr = 0; \
603 \
604 ctf_align(int) /* Align on largest field in struct. */ \
605 /* \
606 * Iterate over the complete array, but only output \
607 * "ret" active FDs. \
608 */ \
609 for (i = 0; i < tp_locvar->fds_max_len; i++) { \
610 if (!tp_locvar->fds[i].revents) \
611 continue; \
612 if (nr++ >= tp_locvar->fds_length) \
613 break; \
614 ctf_integer_type(int, tp_locvar->fds[i].fd) \
615 ctf_integer_type(short, tp_locvar->fds[i].revents) \
616 ctf_integer_bitfield_type(uint8_t, \
617 (uint8_t) tp_locvar->fds[i].revents) \
618 } \
619 /* \
620 * If there is a discrepancy between ret and the \
621 * content of revents (e.g. caused by userspace corrupting \
622 * the array from a concurrent thread), we have to output \
623 * zeros to keep the trace readable. \
624 */ \
625 for (i = nr; i < tp_locvar->fds_length; i++) { \
626 ctf_integer_type(int, 0) \
627 ctf_integer_type(short, 0) \
628 ctf_integer_bitfield_type(uint8_t, 0) \
629 } \
630 ) \
631 ) \
632 )
633
634 #define LTTNG_SYSCALL_POLL_code_post \
635 lttng_tp_mempool_free(tp_locvar->fds);
636
637 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
638 #define OVERRIDE_32_poll
639 #define OVERRIDE_64_poll
640 SC_LTTNG_TRACEPOINT_EVENT_CODE(poll,
641 TP_PROTO(sc_exit(long ret,) struct pollfd __user * ufds,
642 unsigned int nfds, int timeout_msecs),
643 TP_ARGS(sc_exit(ret,) ufds, nfds, timeout_msecs),
644 TP_locvar(
645 LTTNG_SYSCALL_POLL_locvar
646 ),
647 TP_code_pre(
648 LTTNG_SYSCALL_POLL_code_pre
649 ),
650 TP_FIELDS(
651 sc_exit(ctf_integer(long, ret, ret))
652 sc_in(ctf_integer(int, timeout_msecs, timeout_msecs))
653 sc_inout(ctf_integer(unsigned int, nfds, nfds))
654 sc_inout(ctf_integer(unsigned int, fds_length, tp_locvar->fds_length))
655 sc_in(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
656 LTTNG_SYSCALL_POLL_fds_field
657 ),
658 TP_code_post(
659 LTTNG_SYSCALL_POLL_code_post
660 )
661 )
662 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
663
664 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
665 #define OVERRIDE_32_ppoll
666 #define OVERRIDE_64_ppoll
667 SC_LTTNG_TRACEPOINT_EVENT_CODE(ppoll,
668 TP_PROTO(sc_exit(long ret,) struct pollfd __user * ufds,
669 unsigned int nfds, struct timespec * tsp, const sigset_t * sigmask, size_t sigsetsize),
670 TP_ARGS(sc_exit(ret,) ufds, nfds, tsp, sigmask, sigsetsize),
671 TP_locvar(
672 LTTNG_SYSCALL_POLL_locvar
673 ),
674 TP_code_pre(
675 LTTNG_SYSCALL_POLL_code_pre
676 ),
677 TP_FIELDS(
678 sc_exit(ctf_integer(long, ret, ret))
679 sc_in(ctf_integer(struct timespec *, tsp, tsp))
680 sc_in(ctf_integer(const sigset_t *, sigmask, sigmask))
681 sc_in(ctf_integer(size_t, sigsetsize, sigsetsize))
682 sc_inout(ctf_integer(unsigned int, nfds, nfds))
683 sc_inout(ctf_integer(unsigned int, fds_length, tp_locvar->fds_length))
684 sc_inout(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
685 LTTNG_SYSCALL_POLL_fds_field
686 ),
687 TP_code_post(
688 LTTNG_SYSCALL_POLL_code_post
689 )
690 )
691 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
692
693 #include <linux/eventpoll.h>
694
695 SC_LTTNG_TRACEPOINT_ENUM(lttng_epoll_op,
696 TP_ENUM_VALUES(
697 ctf_enum_value("EPOLL_CTL_ADD", EPOLL_CTL_ADD)
698 ctf_enum_value("EPOLL_CTL_DEL", EPOLL_CTL_DEL)
699 ctf_enum_value("EPOLL_CTL_MOD", EPOLL_CTL_MOD)
700 )
701 )
702
703 #ifndef ONCE_LTTNG_TRACE_EPOLL_CTL_H
704 #define ONCE_LTTNG_TRACE_EPOLL_CTL_H
705
706 #define LTTNG_EPOLL_NRFLAGS (POLLHUP + 1)
707 #define EPOLL_FLAGS_PADDING_SIZE (sizeof(uint8_t) * BITS_PER_BYTE) - \
708 ilog2(LTTNG_EPOLL_NRFLAGS - 1)
709
710 /*
711 * Only extract the values specified by iBCS2 for now.
712 */
713 static const struct lttng_kernel_event_field *lttng_epoll_ctl_events_fields[] = {
714 /* 0x0001 */
715 [ilog2(POLLIN)] = lttng_kernel_static_event_field("EPOLLIN",
716 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
717 false, false, false),
718 /* 0x0002 */
719 [ilog2(POLLPRI)] = lttng_kernel_static_event_field("EPOLLPRI",
720 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
721 false, false, false),
722 /* 0x0004 */
723 [ilog2(POLLOUT)] = lttng_kernel_static_event_field("EPOLLOUT",
724 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
725 false, false, false),
726 /* 0x0008 */
727 [ilog2(POLLERR)] = lttng_kernel_static_event_field("EPOLLERR",
728 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
729 false, false, false),
730 /* 0x0010 */
731 [ilog2(POLLHUP)] = lttng_kernel_static_event_field("EPOLLHUP",
732 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10),
733 false, false, false),
734 [ilog2(LTTNG_EPOLL_NRFLAGS)] = lttng_kernel_static_event_field("padding",
735 lttng_kernel_static_type_integer(EPOLL_FLAGS_PADDING_SIZE, 1, 0, __LITTLE_ENDIAN, 10),
736 false, false, false),
737 };
738
739 static const struct lttng_kernel_event_field *lttng_epoll_data_fields[] = {
740 [0] = lttng_kernel_static_event_field("u64",
741 lttng_kernel_static_type_integer_from_type(uint64_t, __BYTE_ORDER, 16),
742 false, false, false),
743 [1] = lttng_kernel_static_event_field("fd",
744 lttng_kernel_static_type_integer_from_type(int, __BYTE_ORDER, 10),
745 false, false, false),
746 };
747
748 static const struct lttng_kernel_event_field *epoll_ctl_fields[] = {
749 [0] = lttng_kernel_static_event_field("data_union",
750 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_data_fields),
751 lttng_epoll_data_fields,
752 0),
753 false, false, false),
754 [1] = lttng_kernel_static_event_field("raw_events",
755 lttng_kernel_static_type_integer_from_type(uint32_t, __BYTE_ORDER, 16),
756 false, false, false),
757 [2] = lttng_kernel_static_event_field("events",
758 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_ctl_events_fields),
759 lttng_epoll_ctl_events_fields,
760 0),
761 false, false, false),
762 };
763 #endif /* ONCE_LTTNG_TRACE_EPOLL_CTL_H */
764
765 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
766 #define OVERRIDE_32_epoll_ctl
767 #define OVERRIDE_64_epoll_ctl
768 SC_LTTNG_TRACEPOINT_EVENT_CODE(epoll_ctl,
769 TP_PROTO(sc_exit(long ret,) int epfd, int op, int fd,
770 struct epoll_event __user * uevent),
771 TP_ARGS(sc_exit(ret,) epfd, op, fd, uevent),
772 TP_locvar(
773 struct epoll_event event;
774 int err;
775 ),
776 TP_code_pre(
777 tp_locvar->err = lib_ring_buffer_copy_from_user_check_nofault(
778 &tp_locvar->event, uevent, sizeof(struct epoll_event));
779 ),
780 TP_FIELDS(
781 sc_exit(ctf_integer(long, ret, ret))
782 sc_in(ctf_integer(int, epfd, epfd))
783 sc_in(ctf_enum(lttng_epoll_op, int, op_enum, op))
784 sc_in(ctf_integer(int, fd, fd))
785 sc_in(
786 ctf_custom_field(
787 ctf_custom_type(
788 lttng_kernel_static_type_struct(ARRAY_SIZE(epoll_ctl_fields), epoll_ctl_fields, 0)
789 ),
790 event,
791 ctf_custom_code(
792 ctf_align(uint64_t)
793 if (!tp_locvar->err) {
794 ctf_integer_type(uint64_t, tp_locvar->event.data)
795 ctf_integer_type(int, tp_locvar->event.data)
796 ctf_integer_bitfield_type(uint32_t,
797 tp_locvar->event.events)
798 ctf_integer_bitfield_type(uint8_t,
799 (uint8_t) tp_locvar->event.events)
800 } else {
801 ctf_integer_type(uint64_t, 0)
802 ctf_integer_type(int, 0)
803 ctf_integer_bitfield_type(uint32_t, 0)
804 ctf_integer_bitfield_type(uint8_t, 0)
805 }
806 )
807 )
808 )
809 ),
810 TP_code_post()
811 )
812 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
813
814 #ifndef ONCE_LTTNG_TRACE_EPOLL_H
815 #define ONCE_LTTNG_TRACE_EPOLL_H
816
817 static const struct lttng_kernel_event_field *lttng_epoll_wait_fields[] = lttng_kernel_static_event_field_array(
818 [0] = lttng_kernel_static_event_field("data_union",
819 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_data_fields), lttng_epoll_data_fields, 0),
820 false, false, false),
821 [1] = lttng_kernel_static_event_field("raw_events", lttng_kernel_static_type_integer_from_type(uint32_t, __BYTE_ORDER, 16),
822 false, false, false),
823 [2] = lttng_kernel_static_event_field("events",
824 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_ctl_events_fields), lttng_epoll_ctl_events_fields, 0),
825 false, false, false),
826 );
827
828 #endif /* ONCE_LTTNG_TRACE_EPOLL_H */
829
830 #define LTTNG_SYSCALL_EPOLL_WAIT_locvar \
831 sc_out( \
832 unsigned int fds_length; \
833 uint8_t overflow; \
834 struct epoll_event *events; \
835 )
836
837 #define LTTNG_SYSCALL_EPOLL_WAIT_code_pre \
838 BUILD_BUG_ON(((ARRAY_SIZE(lttng_epoll_ctl_events_fields) - 1) + \
839 EPOLL_FLAGS_PADDING_SIZE) != \
840 sizeof(uint8_t) * BITS_PER_BYTE); \
841 sc_out({ \
842 int err; \
843 unsigned long maxalloc; \
844 \
845 tp_locvar->fds_length = 0; \
846 tp_locvar->events = NULL; \
847 tp_locvar->overflow = 0; \
848 \
849 if (maxevents <= 0 || ret <= 0 || ret > maxevents) \
850 goto skip_code; \
851 \
852 if (maxevents > PAGE_SIZE / sizeof(struct epoll_event)) { \
853 maxalloc = PAGE_SIZE / sizeof(struct epoll_event); \
854 } else { \
855 maxalloc = maxevents; \
856 } \
857 \
858 if (ret > maxalloc) { \
859 tp_locvar->fds_length = maxalloc; \
860 tp_locvar->overflow = 1; \
861 } else { \
862 tp_locvar->fds_length = ret; \
863 } \
864 \
865 tp_locvar->events = lttng_tp_mempool_alloc( \
866 maxalloc * sizeof(struct epoll_event)); \
867 if (!tp_locvar->events) { \
868 tp_locvar->fds_length = 0; \
869 goto skip_code; \
870 } \
871 \
872 err = lib_ring_buffer_copy_from_user_check_nofault( \
873 tp_locvar->events, uevents, \
874 maxalloc * sizeof(struct epoll_event)); \
875 if (err != 0) \
876 tp_locvar->fds_length = 0; \
877 } \
878 skip_code: \
879 )
880
881 #define LTTNG_SYSCALL_EPOLL_WAIT_fds_field \
882 ctf_custom_field( \
883 ctf_custom_type( \
884 lttng_kernel_static_type_sequence("fds_length", \
885 lttng_kernel_static_type_struct(ARRAY_SIZE(lttng_epoll_wait_fields), lttng_epoll_wait_fields, 0), \
886 0, \
887 none) \
888 ), \
889 fds, \
890 ctf_custom_code( \
891 uint32_t i; \
892 \
893 ctf_align(uint64_t) \
894 for (i = 0; i < tp_locvar->fds_length; i++) { \
895 ctf_integer_type(uint64_t, tp_locvar->events[i].data) \
896 ctf_integer_type(int, tp_locvar->events[i].data) \
897 ctf_integer_bitfield_type(uint32_t, \
898 tp_locvar->events[i].events) \
899 ctf_integer_bitfield_type(uint8_t, \
900 (uint8_t) tp_locvar->events[i].events) \
901 } \
902 ) \
903 )
904
905 #define LTTNG_SYSCALL_EPOLL_WAIT_code_post \
906 sc_out( \
907 lttng_tp_mempool_free(tp_locvar->events); \
908 )
909
910
911 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
912 #define OVERRIDE_32_epoll_wait
913 #define OVERRIDE_64_epoll_wait
914 SC_LTTNG_TRACEPOINT_EVENT_CODE(epoll_wait,
915 TP_PROTO(sc_exit(long ret,) int epfd, struct epoll_event __user * uevents,
916 int maxevents, int timeout),
917 TP_ARGS(sc_exit(ret,) epfd, uevents, maxevents, timeout),
918 TP_locvar(
919 LTTNG_SYSCALL_EPOLL_WAIT_locvar
920 ),
921 TP_code_pre(
922 LTTNG_SYSCALL_EPOLL_WAIT_code_pre
923 ),
924 TP_FIELDS(
925 sc_exit(ctf_integer(long, ret, ret))
926 sc_in(ctf_integer(int, epfd, epfd))
927 sc_in(ctf_integer(int, maxevents, maxevents))
928 sc_in(ctf_integer(int, timeout, timeout))
929 sc_out(ctf_integer(unsigned int, fds_length, tp_locvar->fds_length))
930 sc_out(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
931 sc_out(
932 LTTNG_SYSCALL_EPOLL_WAIT_fds_field
933 )
934 ),
935 TP_code_post(
936 LTTNG_SYSCALL_EPOLL_WAIT_code_post
937 )
938 )
939 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
940
941 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
942 #define OVERRIDE_32_epoll_pwait
943 #define OVERRIDE_64_epoll_pwait
944 SC_LTTNG_TRACEPOINT_EVENT_CODE(epoll_pwait,
945 TP_PROTO(sc_exit(long ret,) int epfd, struct epoll_event __user * uevents,
946 int maxevents, int timeout, const sigset_t __user * sigmask, size_t sigsetsize),
947 TP_ARGS(sc_exit(ret,) epfd, uevents, maxevents, timeout, sigmask, sigsetsize),
948 TP_locvar(
949 LTTNG_SYSCALL_EPOLL_WAIT_locvar
950 ),
951 TP_code_pre(
952 LTTNG_SYSCALL_EPOLL_WAIT_code_pre
953 ),
954 TP_FIELDS(
955 sc_exit(ctf_integer(long, ret, ret))
956 sc_in(ctf_integer(int, epfd, epfd))
957 sc_in(ctf_integer(int, maxevents, maxevents))
958 sc_in(ctf_integer(int, timeout, timeout))
959 sc_in(ctf_integer_hex(const sigset_t *, sigmask, sigmask))
960 sc_in(ctf_integer(size_t, sigsetsize, sigsetsize))
961 sc_out(ctf_integer(unsigned int, fds_length, tp_locvar->fds_length))
962 sc_out(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
963 sc_out(
964 LTTNG_SYSCALL_EPOLL_WAIT_fds_field
965 )
966 ),
967 TP_code_post(
968 LTTNG_SYSCALL_EPOLL_WAIT_code_post
969 )
970 )
971 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
972
973 #if (defined(CONFIG_X86_64) && !defined(LTTNG_SC_COMPAT)) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
974 #define OVERRIDE_32_socketpair
975 #define OVERRIDE_64_socketpair
976 SC_LTTNG_TRACEPOINT_EVENT(socketpair,
977 TP_PROTO(sc_exit(long ret,) int family, int type, int protocol, int *usockvec),
978 TP_ARGS(sc_exit(ret,) family, type, protocol, usockvec),
979 TP_FIELDS(
980 sc_exit(ctf_integer(long, ret, ret))
981 sc_in(ctf_integer(int, family, family))
982 sc_in(ctf_integer(int, type, type))
983 sc_in(ctf_integer(int, protocol, protocol))
984 sc_out(ctf_user_array(int, socket, usockvec, 2))
985 )
986 )
987 #endif /* (defined(CONFIG_X86_64) && !defined(LTTNG_SC_COMPAT)) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
988
989 /*
990 * Enumeration of the open flags, as described in the 'open'
991 * system call man page.
992 */
993 SC_LTTNG_TRACEPOINT_ENUM(lttng_file_status_flags,
994 TP_ENUM_VALUES(
995 ctf_enum_value("O_RDONLY", O_RDONLY)
996 ctf_enum_value("O_WRONLY", O_WRONLY)
997 ctf_enum_value("O_RDWR", O_RDWR)
998 ctf_enum_value("O_CREAT", O_CREAT)
999 ctf_enum_value("O_EXCL", O_EXCL)
1000 ctf_enum_value("O_NOCTTY", O_NOCTTY)
1001 ctf_enum_value("O_TRUNC", O_TRUNC)
1002 ctf_enum_value("O_APPEND", O_APPEND)
1003 ctf_enum_value("O_NONBLOCK", O_NONBLOCK)
1004 ctf_enum_value("O_DSYNC", O_DSYNC)
1005 ctf_enum_value("FASYNC", FASYNC)
1006 ctf_enum_value("O_DIRECT", O_DIRECT)
1007 ctf_enum_value("O_LARGEFILE", O_LARGEFILE)
1008 ctf_enum_value("O_DIRECTORY", O_DIRECTORY)
1009 ctf_enum_value("O_NOFOLLOW", O_NOFOLLOW)
1010 ctf_enum_value("O_NOATIME", O_NOATIME)
1011 ctf_enum_value("O_CLOEXEC", O_CLOEXEC)
1012 ctf_enum_value("O_SYNC", __O_SYNC)
1013 ctf_enum_value("O_PATH", O_PATH)
1014 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,11,0))
1015 ctf_enum_value("O_TMPFILE", __O_TMPFILE)
1016 #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,11,0)) */
1017 )
1018 )
1019
1020 /*
1021 * Enumeration of the open flags, as described in the 'open'
1022 * system call man page.
1023 */
1024 SC_LTTNG_TRACEPOINT_ENUM(lttng_file_mode,
1025 TP_ENUM_VALUES(
1026 ctf_enum_value("S_IRWXU", S_IRWXU)
1027 ctf_enum_value("S_IRUSR", S_IRUSR)
1028 ctf_enum_value("S_IWUSR", S_IWUSR)
1029 ctf_enum_value("S_IXUSR", S_IXUSR)
1030 ctf_enum_value("S_IRWXG", S_IRWXG)
1031 ctf_enum_value("S_IRGRP", S_IRGRP)
1032 ctf_enum_value("S_IWGRP", S_IWGRP)
1033 ctf_enum_value("S_IXGRP", S_IXGRP)
1034 ctf_enum_value("S_IRWXO", S_IRWXO)
1035 ctf_enum_value("S_IROTH", S_IROTH)
1036 ctf_enum_value("S_IWOTH", S_IWOTH)
1037 ctf_enum_value("S_IXOTH", S_IXOTH)
1038 ctf_enum_value("S_ISUID", S_ISUID)
1039 ctf_enum_value("S_ISGID", S_ISGID)
1040 ctf_enum_value("S_ISVTX", S_ISVTX)
1041 )
1042 )
1043
1044 #define OVERRIDE_32_openat
1045 #define OVERRIDE_64_openat
1046 SC_LTTNG_TRACEPOINT_EVENT(openat,
1047 TP_PROTO(sc_exit(long ret,) int dfd, const char * filename, int flags, umode_t mode),
1048 TP_ARGS(sc_exit(ret,) dfd, filename, flags, mode),
1049 TP_FIELDS(
1050 sc_exit(ctf_integer(long, ret, ret))
1051 sc_in(ctf_integer(int, dfd, dfd))
1052 sc_in(ctf_user_string(filename, filename))
1053 sc_in(ctf_enum(lttng_file_status_flags, int, flags, flags))
1054 sc_in(ctf_enum(lttng_file_mode, umode_t, mode, mode))
1055 )
1056 )
1057
1058 #define OVERRIDE_32_open
1059 #define OVERRIDE_64_open
1060 SC_LTTNG_TRACEPOINT_EVENT(open,
1061 TP_PROTO(sc_exit(long ret,) const char * filename, int flags, umode_t mode),
1062 TP_ARGS(sc_exit(ret,) filename, flags, mode),
1063 TP_FIELDS(
1064 sc_exit(ctf_integer(long, ret, ret))
1065 sc_in(ctf_user_string(filename, filename))
1066 sc_in(ctf_enum(lttng_file_status_flags, int, flags, flags))
1067 sc_in(ctf_enum(lttng_file_mode, umode_t, mode, mode))
1068 )
1069 )
1070
1071 #endif /* CREATE_SYSCALL_TABLE */
This page took 0.051658 seconds and 4 git commands to generate.