2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #include <sys/param.h>
30 #include <sys/ktrace.h>
36 #include <sysdecode.h>
41 #include <amd64/linux/linux.h>
42 #include <amd64/linux32/linux32_syscall.h>
44 #include <arm64/linux/linux.h>
46 #include <i386/linux/linux.h>
49 #include <compat/linux/linux.h>
50 #include <compat/linux/linux_file.h>
53 print_linux_signal(int signo)
57 signame = sysdecode_linux_signal(signo);
59 printf("%s", signame);
61 printf("SIG %d", signo);
65 ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip,
66 int *resnarg, char *resc)
68 int narg = ktr->ktr_narg;
69 register_t *ip, *first;
70 int quad_align, quad_slots;
73 ip = first = &ktr->ktr_args[0];
77 switch (ktr->ktr_code) {
78 case LINUX_SYS_linux_faccessat:
79 case LINUX_SYS_linux_fchmodat:
80 case LINUX_SYS_linux_fchownat:
81 #ifdef LINUX_SYS_linux_newfstatat
82 case LINUX_SYS_linux_newfstatat:
84 #ifdef LINUX_SYS_linux_fstatat64
85 case LINUX_SYS_linux_fstatat64:
87 #ifdef LINUX_SYS_linux_futimesat
88 case LINUX_SYS_linux_futimesat:
90 case LINUX_SYS_linux_linkat:
91 case LINUX_SYS_linux_mkdirat:
92 case LINUX_SYS_linux_mknodat:
93 case LINUX_SYS_linux_openat:
94 case LINUX_SYS_linux_readlinkat:
95 case LINUX_SYS_linux_renameat:
96 case LINUX_SYS_linux_unlinkat:
97 case LINUX_SYS_linux_utimensat:
99 print_integer_arg_valid(sysdecode_atfd, *ip);
105 switch (ktr->ktr_code) {
106 #ifdef LINUX_SYS_linux_access
107 case LINUX_SYS_linux_access:
109 case LINUX_SYS_linux_faccessat:
110 print_number(ip, narg, c);
112 print_mask_arg(sysdecode_access_mode, *ip);
116 #ifdef LINUX_SYS_linux_chmod
117 case LINUX_SYS_linux_chmod:
119 case LINUX_SYS_linux_fchmodat:
120 print_number(ip, narg, c);
122 decode_filemode(*ip);
126 case LINUX_SYS_linux_mknodat:
127 print_number(ip, narg, c);
129 decode_filemode(*ip);
133 #ifdef LINUX_SYS_linux_mkdir
134 case LINUX_SYS_linux_mkdir:
136 case LINUX_SYS_linux_mkdirat:
137 print_number(ip, narg, c);
139 decode_filemode(*ip);
143 case LINUX_SYS_linux_linkat:
144 case LINUX_SYS_linux_renameat:
145 case LINUX_SYS_linux_symlinkat:
146 print_number(ip, narg, c);
148 print_integer_arg_valid(sysdecode_atfd, *ip);
151 print_number(ip, narg, c);
153 case LINUX_SYS_linux_fchownat:
154 print_number(ip, narg, c);
155 print_number(ip, narg, c);
156 print_number(ip, narg, c);
158 #ifdef LINUX_SYS_linux_newfstatat
159 case LINUX_SYS_linux_newfstatat:
161 #ifdef LINUX_SYS_linux_fstatat64
162 case LINUX_SYS_linux_fstatat64:
164 case LINUX_SYS_linux_utimensat:
165 print_number(ip, narg, c);
166 print_number(ip, narg, c);
168 case LINUX_SYS_linux_unlinkat:
169 print_number(ip, narg, c);
171 case LINUX_SYS_linux_clock_gettime:
172 case LINUX_SYS_linux_clock_settime:
173 case LINUX_SYS_linux_clock_getres:
174 case LINUX_SYS_linux_timer_create:
176 sysdecode_linux_clockid(stdout, *ip);
181 case LINUX_SYS_linux_clock_nanosleep:
183 sysdecode_linux_clockid(stdout, *ip);
187 print_mask_arg0(sysdecode_linux_clock_flags, *ip);
192 case LINUX_SYS_linux_clone:
194 print_mask_arg(sysdecode_linux_clone_flags, *ip);
199 case LINUX_SYS_linux_kill:
200 case LINUX_SYS_linux_tkill:
201 case LINUX_SYS_linux_rt_sigqueueinfo:
202 print_decimal_number(ip, narg, c);
204 print_linux_signal(*ip);
208 case LINUX_SYS_linux_tgkill:
209 case LINUX_SYS_linux_rt_tgsigqueueinfo:
210 print_decimal_number(ip, narg, c);
211 print_decimal_number(ip, narg, c);
213 print_linux_signal(*ip);
217 #ifdef LINUX_SYS_linux_open
218 case LINUX_SYS_linux_open:
220 case LINUX_SYS_linux_openat:
221 print_number(ip, narg, c);
223 print_mask_arg(sysdecode_linux_open_flags, ip[0]);
224 if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
226 decode_filemode(ip[1]);
231 case LINUX_SYS_linux_rt_sigaction:
233 print_linux_signal(*ip);
238 case LINUX_SYS_linux_ftruncate:
239 case LINUX_SYS_linux_truncate:
240 print_number(ip, narg, c);
241 print_number64(first, ip, narg, c);
243 case LINUX_SYS_linux_getitimer:
244 case LINUX_SYS_linux_setitimer:
246 print_integer_arg(sysdecode_itimer, *ip);
251 case LINUX_SYS_linux_rt_sigprocmask:
252 #ifdef LINUX_SYS_linux_sigprocmask
253 case LINUX_SYS_linux_sigprocmask:
256 print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
262 switch (ktr->ktr_code) {
263 case LINUX_SYS_linux_fchownat:
264 case LINUX_SYS_linux_faccessat:
265 case LINUX_SYS_linux_fchmodat:
266 #ifdef LINUX_SYS_linux_newfstatat
267 case LINUX_SYS_linux_newfstatat:
269 #ifdef LINUX_SYS_linux_fstatat64
270 case LINUX_SYS_linux_fstatat64:
272 case LINUX_SYS_linux_linkat:
273 case LINUX_SYS_linux_unlinkat:
274 case LINUX_SYS_linux_utimensat:
276 print_mask_arg0(sysdecode_linux_atflags, *ip);
286 #if defined(__amd64__)
288 ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip,
289 int *resnarg, char *resc)
291 int narg = ktr->ktr_narg;
292 register_t *ip, *first;
293 int quad_align, quad_slots;
296 ip = first = &ktr->ktr_args[0];
300 switch (ktr->ktr_code) {
301 case LINUX32_SYS_linux_faccessat:
302 case LINUX32_SYS_linux_fchmodat:
303 case LINUX32_SYS_linux_fchownat:
304 case LINUX32_SYS_linux_fstatat64:
305 case LINUX32_SYS_linux_futimesat:
306 case LINUX32_SYS_linux_linkat:
307 case LINUX32_SYS_linux_mkdirat:
308 case LINUX32_SYS_linux_mknodat:
309 case LINUX32_SYS_linux_openat:
310 case LINUX32_SYS_linux_readlinkat:
311 case LINUX32_SYS_linux_renameat:
312 case LINUX32_SYS_linux_unlinkat:
313 case LINUX32_SYS_linux_utimensat:
315 print_integer_arg_valid(sysdecode_atfd, *ip);
321 switch (ktr->ktr_code) {
322 case LINUX32_SYS_linux_access:
323 case LINUX32_SYS_linux_faccessat:
324 print_number(ip, narg, c);
326 print_mask_arg(sysdecode_access_mode, *ip);
330 case LINUX32_SYS_linux_chmod:
331 case LINUX32_SYS_fchmod:
332 case LINUX32_SYS_linux_fchmodat:
333 print_number(ip, narg, c);
335 decode_filemode(*ip);
339 case LINUX32_SYS_linux_mknodat:
340 print_number(ip, narg, c);
342 decode_filemode(*ip);
346 case LINUX32_SYS_linux_mkdir:
347 case LINUX32_SYS_linux_mkdirat:
348 print_number(ip, narg, c);
350 decode_filemode(*ip);
354 case LINUX32_SYS_linux_linkat:
355 case LINUX32_SYS_linux_renameat:
356 case LINUX32_SYS_linux_symlinkat:
357 print_number(ip, narg, c);
359 print_integer_arg_valid(sysdecode_atfd, *ip);
362 print_number(ip, narg, c);
364 case LINUX32_SYS_linux_fchownat:
365 print_number(ip, narg, c);
366 print_number(ip, narg, c);
367 print_number(ip, narg, c);
369 case LINUX32_SYS_linux_fstatat64:
370 case LINUX32_SYS_linux_utimensat:
371 print_number(ip, narg, c);
372 print_number(ip, narg, c);
374 case LINUX32_SYS_linux_unlinkat:
375 print_number(ip, narg, c);
377 case LINUX32_SYS_linux_clock_gettime:
378 case LINUX32_SYS_linux_clock_settime:
379 case LINUX32_SYS_linux_clock_getres:
380 case LINUX32_SYS_linux_timer_create:
381 case LINUX32_SYS_linux_clock_gettime64:
382 case LINUX32_SYS_linux_clock_settime64:
383 case LINUX32_SYS_linux_clock_getres_time64:
385 sysdecode_linux_clockid(stdout, *ip);
390 case LINUX32_SYS_linux_clock_nanosleep:
392 sysdecode_linux_clockid(stdout, *ip);
396 print_mask_arg0(sysdecode_linux_clock_flags, *ip);
401 case LINUX32_SYS_linux_clone:
403 print_mask_arg(sysdecode_linux_clone_flags, *ip);
408 case LINUX32_SYS_linux_kill:
409 case LINUX32_SYS_linux_tkill:
410 case LINUX32_SYS_linux_rt_sigqueueinfo:
411 print_decimal_number(ip, narg, c);
413 print_linux_signal(*ip);
417 case LINUX32_SYS_linux_tgkill:
418 case LINUX32_SYS_linux_rt_tgsigqueueinfo:
419 print_decimal_number(ip, narg, c);
420 print_decimal_number(ip, narg, c);
422 print_linux_signal(*ip);
426 case LINUX32_SYS_linux_open:
427 case LINUX32_SYS_linux_openat:
428 print_number(ip, narg, c);
430 print_mask_arg(sysdecode_linux_open_flags, ip[0]);
431 if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
433 decode_filemode(ip[1]);
438 case LINUX32_SYS_linux_signal:
439 case LINUX32_SYS_linux_sigaction:
440 case LINUX32_SYS_linux_rt_sigaction:
442 print_linux_signal(*ip);
447 case LINUX32_SYS_linux_ftruncate:
448 case LINUX32_SYS_linux_truncate:
449 print_number(ip, narg, c);
450 print_number64(first, ip, narg, c);
452 case LINUX32_SYS_linux_getitimer:
453 case LINUX32_SYS_linux_setitimer:
455 print_integer_arg(sysdecode_itimer, *ip);
460 case LINUX32_SYS_linux_rt_sigprocmask:
461 case LINUX32_SYS_linux_sigprocmask:
463 print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
469 switch (ktr->ktr_code) {
470 case LINUX32_SYS_linux_fchownat:
471 case LINUX32_SYS_linux_faccessat:
472 case LINUX32_SYS_linux_fchmodat:
473 case LINUX32_SYS_linux_fstatat64:
474 case LINUX32_SYS_linux_linkat:
475 case LINUX32_SYS_linux_unlinkat:
476 case LINUX32_SYS_linux_utimensat:
478 print_mask_arg0(sysdecode_linux_atflags, *ip);
487 #endif /* __amd64__ */
490 ktrsigset(const char *name, const l_sigset_t *mask, size_t sz)
494 printf("%s [ ", name);
496 for (i = 1; i <= sz * CHAR_BIT; i++) {
497 if (!LINUX_SIGISMEMBER(*mask, i))
501 printf("%s", sysdecode_linux_signal(i));
511 ktrstruct_linux(const char *name, const char *data, size_t datalen)
515 if (strcmp(name, "l_sigset_t") == 0) {
516 /* Old Linux sigset_t is one word size. */
517 if (datalen < sizeof(int) || datalen > sizeof(l_sigset_t))
519 memcpy(&mask, data, datalen);
520 ktrsigset(name, &mask, datalen);