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/cdefs.h>
29 __FBSDID("$FreeBSD$");
31 #include <sys/param.h>
33 #include <sys/ktrace.h>
39 #include <sysdecode.h>
44 #include <amd64/linux/linux.h>
45 #include <amd64/linux32/linux32_syscall.h>
47 #include <arm64/linux/linux.h>
49 #include <i386/linux/linux.h>
52 #include <compat/linux/linux.h>
53 #include <compat/linux/linux_file.h>
56 print_linux_signal(int signo)
60 signame = sysdecode_linux_signal(signo);
62 printf("%s", signame);
64 printf("SIG %d", signo);
68 ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip,
69 int *resnarg, char *resc)
71 int narg = ktr->ktr_narg;
72 register_t *ip, *first;
73 int quad_align, quad_slots;
76 ip = first = &ktr->ktr_args[0];
80 switch (ktr->ktr_code) {
81 case LINUX_SYS_linux_faccessat:
82 case LINUX_SYS_linux_fchmodat:
83 case LINUX_SYS_linux_fchownat:
84 #ifdef LINUX_SYS_linux_newfstatat
85 case LINUX_SYS_linux_newfstatat:
87 #ifdef LINUX_SYS_linux_fstatat64
88 case LINUX_SYS_linux_fstatat64:
90 #ifdef LINUX_SYS_linux_futimesat
91 case LINUX_SYS_linux_futimesat:
93 case LINUX_SYS_linux_linkat:
94 case LINUX_SYS_linux_mkdirat:
95 case LINUX_SYS_linux_mknodat:
96 case LINUX_SYS_linux_openat:
97 case LINUX_SYS_linux_readlinkat:
98 case LINUX_SYS_linux_renameat:
99 case LINUX_SYS_linux_unlinkat:
100 case LINUX_SYS_linux_utimensat:
102 print_integer_arg_valid(sysdecode_atfd, *ip);
108 switch (ktr->ktr_code) {
109 #ifdef LINUX_SYS_linux_access
110 case LINUX_SYS_linux_access:
112 case LINUX_SYS_linux_faccessat:
113 print_number(ip, narg, c);
115 print_mask_arg(sysdecode_access_mode, *ip);
119 #ifdef LINUX_SYS_linux_chmod
120 case LINUX_SYS_linux_chmod:
122 case LINUX_SYS_linux_fchmodat:
123 print_number(ip, narg, c);
125 decode_filemode(*ip);
129 case LINUX_SYS_linux_mknodat:
130 print_number(ip, narg, c);
132 decode_filemode(*ip);
136 #ifdef LINUX_SYS_linux_mkdir
137 case LINUX_SYS_linux_mkdir:
139 case LINUX_SYS_linux_mkdirat:
140 print_number(ip, narg, c);
142 decode_filemode(*ip);
146 case LINUX_SYS_linux_linkat:
147 case LINUX_SYS_linux_renameat:
148 case LINUX_SYS_linux_symlinkat:
149 print_number(ip, narg, c);
151 print_integer_arg_valid(sysdecode_atfd, *ip);
154 print_number(ip, narg, c);
156 case LINUX_SYS_linux_fchownat:
157 print_number(ip, narg, c);
158 print_number(ip, narg, c);
159 print_number(ip, narg, c);
161 #ifdef LINUX_SYS_linux_newfstatat
162 case LINUX_SYS_linux_newfstatat:
164 #ifdef LINUX_SYS_linux_fstatat64
165 case LINUX_SYS_linux_fstatat64:
167 case LINUX_SYS_linux_utimensat:
168 print_number(ip, narg, c);
169 print_number(ip, narg, c);
171 case LINUX_SYS_linux_unlinkat:
172 print_number(ip, narg, c);
174 case LINUX_SYS_linux_clock_gettime:
175 case LINUX_SYS_linux_clock_settime:
176 case LINUX_SYS_linux_clock_getres:
177 case LINUX_SYS_linux_timer_create:
179 sysdecode_linux_clockid(stdout, *ip);
184 case LINUX_SYS_linux_clock_nanosleep:
186 sysdecode_linux_clockid(stdout, *ip);
190 print_mask_arg0(sysdecode_linux_clock_flags, *ip);
195 case LINUX_SYS_linux_clone:
197 print_mask_arg(sysdecode_linux_clone_flags, *ip);
202 case LINUX_SYS_linux_kill:
203 case LINUX_SYS_linux_tkill:
204 case LINUX_SYS_linux_rt_sigqueueinfo:
205 print_decimal_number(ip, narg, c);
207 print_linux_signal(*ip);
211 case LINUX_SYS_linux_tgkill:
212 case LINUX_SYS_linux_rt_tgsigqueueinfo:
213 print_decimal_number(ip, narg, c);
214 print_decimal_number(ip, narg, c);
216 print_linux_signal(*ip);
220 #ifdef LINUX_SYS_linux_open
221 case LINUX_SYS_linux_open:
223 case LINUX_SYS_linux_openat:
224 print_number(ip, narg, c);
226 print_mask_arg(sysdecode_linux_open_flags, ip[0]);
227 if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
229 decode_filemode(ip[1]);
234 case LINUX_SYS_linux_rt_sigaction:
236 print_linux_signal(*ip);
241 case LINUX_SYS_linux_ftruncate:
242 case LINUX_SYS_linux_truncate:
243 print_number(ip, narg, c);
244 print_number64(first, ip, narg, c);
246 case LINUX_SYS_linux_getitimer:
247 case LINUX_SYS_linux_setitimer:
249 print_integer_arg(sysdecode_itimer, *ip);
254 case LINUX_SYS_linux_rt_sigprocmask:
255 #ifdef LINUX_SYS_linux_sigprocmask
256 case LINUX_SYS_linux_sigprocmask:
259 print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
265 switch (ktr->ktr_code) {
266 case LINUX_SYS_linux_fchownat:
267 case LINUX_SYS_linux_faccessat:
268 case LINUX_SYS_linux_fchmodat:
269 #ifdef LINUX_SYS_linux_newfstatat
270 case LINUX_SYS_linux_newfstatat:
272 #ifdef LINUX_SYS_linux_fstatat64
273 case LINUX_SYS_linux_fstatat64:
275 case LINUX_SYS_linux_linkat:
276 case LINUX_SYS_linux_unlinkat:
277 case LINUX_SYS_linux_utimensat:
279 print_mask_arg0(sysdecode_linux_atflags, *ip);
289 #if defined(__amd64__)
291 ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip,
292 int *resnarg, char *resc)
294 int narg = ktr->ktr_narg;
295 register_t *ip, *first;
296 int quad_align, quad_slots;
299 ip = first = &ktr->ktr_args[0];
303 switch (ktr->ktr_code) {
304 case LINUX32_SYS_linux_faccessat:
305 case LINUX32_SYS_linux_fchmodat:
306 case LINUX32_SYS_linux_fchownat:
307 case LINUX32_SYS_linux_fstatat64:
308 case LINUX32_SYS_linux_futimesat:
309 case LINUX32_SYS_linux_linkat:
310 case LINUX32_SYS_linux_mkdirat:
311 case LINUX32_SYS_linux_mknodat:
312 case LINUX32_SYS_linux_openat:
313 case LINUX32_SYS_linux_readlinkat:
314 case LINUX32_SYS_linux_renameat:
315 case LINUX32_SYS_linux_unlinkat:
316 case LINUX32_SYS_linux_utimensat:
318 print_integer_arg_valid(sysdecode_atfd, *ip);
324 switch (ktr->ktr_code) {
325 case LINUX32_SYS_linux_access:
326 case LINUX32_SYS_linux_faccessat:
327 print_number(ip, narg, c);
329 print_mask_arg(sysdecode_access_mode, *ip);
333 case LINUX32_SYS_linux_chmod:
334 case LINUX32_SYS_fchmod:
335 case LINUX32_SYS_linux_fchmodat:
336 print_number(ip, narg, c);
338 decode_filemode(*ip);
342 case LINUX32_SYS_linux_mknodat:
343 print_number(ip, narg, c);
345 decode_filemode(*ip);
349 case LINUX32_SYS_linux_mkdir:
350 case LINUX32_SYS_linux_mkdirat:
351 print_number(ip, narg, c);
353 decode_filemode(*ip);
357 case LINUX32_SYS_linux_linkat:
358 case LINUX32_SYS_linux_renameat:
359 case LINUX32_SYS_linux_symlinkat:
360 print_number(ip, narg, c);
362 print_integer_arg_valid(sysdecode_atfd, *ip);
365 print_number(ip, narg, c);
367 case LINUX32_SYS_linux_fchownat:
368 print_number(ip, narg, c);
369 print_number(ip, narg, c);
370 print_number(ip, narg, c);
372 case LINUX32_SYS_linux_fstatat64:
373 case LINUX32_SYS_linux_utimensat:
374 print_number(ip, narg, c);
375 print_number(ip, narg, c);
377 case LINUX32_SYS_linux_unlinkat:
378 print_number(ip, narg, c);
380 case LINUX32_SYS_linux_clock_gettime:
381 case LINUX32_SYS_linux_clock_settime:
382 case LINUX32_SYS_linux_clock_getres:
383 case LINUX32_SYS_linux_timer_create:
384 case LINUX32_SYS_linux_clock_gettime64:
385 case LINUX32_SYS_linux_clock_settime64:
386 case LINUX32_SYS_linux_clock_getres_time64:
388 sysdecode_linux_clockid(stdout, *ip);
393 case LINUX32_SYS_linux_clock_nanosleep:
395 sysdecode_linux_clockid(stdout, *ip);
399 print_mask_arg0(sysdecode_linux_clock_flags, *ip);
404 case LINUX32_SYS_linux_clone:
406 print_mask_arg(sysdecode_linux_clone_flags, *ip);
411 case LINUX32_SYS_linux_kill:
412 case LINUX32_SYS_linux_tkill:
413 case LINUX32_SYS_linux_rt_sigqueueinfo:
414 print_decimal_number(ip, narg, c);
416 print_linux_signal(*ip);
420 case LINUX32_SYS_linux_tgkill:
421 case LINUX32_SYS_linux_rt_tgsigqueueinfo:
422 print_decimal_number(ip, narg, c);
423 print_decimal_number(ip, narg, c);
425 print_linux_signal(*ip);
429 case LINUX32_SYS_linux_open:
430 case LINUX32_SYS_linux_openat:
431 print_number(ip, narg, c);
433 print_mask_arg(sysdecode_linux_open_flags, ip[0]);
434 if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
436 decode_filemode(ip[1]);
441 case LINUX32_SYS_linux_signal:
442 case LINUX32_SYS_linux_sigaction:
443 case LINUX32_SYS_linux_rt_sigaction:
445 print_linux_signal(*ip);
450 case LINUX32_SYS_linux_ftruncate:
451 case LINUX32_SYS_linux_truncate:
452 print_number(ip, narg, c);
453 print_number64(first, ip, narg, c);
455 case LINUX32_SYS_linux_getitimer:
456 case LINUX32_SYS_linux_setitimer:
458 print_integer_arg(sysdecode_itimer, *ip);
463 case LINUX32_SYS_linux_rt_sigprocmask:
464 case LINUX32_SYS_linux_sigprocmask:
466 print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
472 switch (ktr->ktr_code) {
473 case LINUX32_SYS_linux_fchownat:
474 case LINUX32_SYS_linux_faccessat:
475 case LINUX32_SYS_linux_fchmodat:
476 case LINUX32_SYS_linux_fstatat64:
477 case LINUX32_SYS_linux_linkat:
478 case LINUX32_SYS_linux_unlinkat:
479 case LINUX32_SYS_linux_utimensat:
481 print_mask_arg0(sysdecode_linux_atflags, *ip);
490 #endif /* __amd64__ */
493 ktrsigset(const char *name, const l_sigset_t *mask, size_t sz)
497 printf("%s [ ", name);
499 for (i = 1; i <= sz * CHAR_BIT; i++) {
500 if (!LINUX_SIGISMEMBER(*mask, i))
504 printf("%s", sysdecode_linux_signal(i));
514 ktrstruct_linux(const char *name, const char *data, size_t datalen)
518 if (strcmp(name, "l_sigset_t") == 0) {
519 /* Old Linux sigset_t is one word size. */
520 if (datalen < sizeof(int) || datalen > sizeof(l_sigset_t))
522 memcpy(&mask, data, datalen);
523 ktrsigset(name, &mask, datalen);