xref: /freebsd/usr.bin/kdump/linux.c (revision 829f3d7d2640490ea3dc4180aa96041f440fd743)
18a0f6d8cSDmitry Chagin /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
38a0f6d8cSDmitry Chagin  *
48a0f6d8cSDmitry Chagin  * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org>
58a0f6d8cSDmitry Chagin  *
68a0f6d8cSDmitry Chagin  * Redistribution and use in source and binary forms, with or without
78a0f6d8cSDmitry Chagin  * modification, are permitted provided that the following conditions
88a0f6d8cSDmitry Chagin  * are met:
98a0f6d8cSDmitry Chagin  * 1. Redistributions of source code must retain the above copyright
108a0f6d8cSDmitry Chagin  *    notice, this list of conditions and the following disclaimer.
118a0f6d8cSDmitry Chagin  * 2. Redistributions in binary form must reproduce the above copyright
128a0f6d8cSDmitry Chagin  *    notice, this list of conditions and the following disclaimer in the
138a0f6d8cSDmitry Chagin  *    documentation and/or other materials provided with the distribution.
148a0f6d8cSDmitry Chagin  *
158a0f6d8cSDmitry Chagin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
168a0f6d8cSDmitry Chagin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178a0f6d8cSDmitry Chagin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
188a0f6d8cSDmitry Chagin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
198a0f6d8cSDmitry Chagin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
208a0f6d8cSDmitry Chagin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
218a0f6d8cSDmitry Chagin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
228a0f6d8cSDmitry Chagin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
238a0f6d8cSDmitry Chagin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
248a0f6d8cSDmitry Chagin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
258a0f6d8cSDmitry Chagin  * SUCH DAMAGE.
268a0f6d8cSDmitry Chagin  */
278a0f6d8cSDmitry Chagin 
288a0f6d8cSDmitry Chagin #include <sys/cdefs.h>
298a0f6d8cSDmitry Chagin __FBSDID("$FreeBSD$");
308a0f6d8cSDmitry Chagin 
318a0f6d8cSDmitry Chagin #include <sys/param.h>
328a0f6d8cSDmitry Chagin #include <sys/uio.h>
338a0f6d8cSDmitry Chagin #include <sys/ktrace.h>
343606a213SDmitry Chagin #include <err.h>
353606a213SDmitry Chagin #include <errno.h>
368a0f6d8cSDmitry Chagin #include <stddef.h>
373606a213SDmitry Chagin #include <stdlib.h>
383606a213SDmitry Chagin #include <string.h>
398a0f6d8cSDmitry Chagin #include <sysdecode.h>
408a0f6d8cSDmitry Chagin 
418a0f6d8cSDmitry Chagin #include "kdump.h"
428a0f6d8cSDmitry Chagin 
438a0f6d8cSDmitry Chagin #ifdef __amd64__
444d496ab4SDmitry Chagin #include <amd64/linux/linux.h>
458a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h>
468a0f6d8cSDmitry Chagin #elif __aarch64__
474d496ab4SDmitry Chagin #include <arm64/linux/linux.h>
488a0f6d8cSDmitry Chagin #elif __i386__
494d496ab4SDmitry Chagin #include <i386/linux/linux.h>
508a0f6d8cSDmitry Chagin #endif
518a0f6d8cSDmitry Chagin 
523606a213SDmitry Chagin #include <compat/linux/linux.h>
534d496ab4SDmitry Chagin #include <compat/linux/linux_file.h>
543606a213SDmitry Chagin 
558a0f6d8cSDmitry Chagin static void
568a0f6d8cSDmitry Chagin print_linux_signal(int signo)
578a0f6d8cSDmitry Chagin {
588a0f6d8cSDmitry Chagin 	const char *signame;
598a0f6d8cSDmitry Chagin 
608a0f6d8cSDmitry Chagin 	signame = sysdecode_linux_signal(signo);
618a0f6d8cSDmitry Chagin 	if (signame != NULL)
628a0f6d8cSDmitry Chagin 		printf("%s", signame);
638a0f6d8cSDmitry Chagin 	else
648a0f6d8cSDmitry Chagin 		printf("SIG %d", signo);
658a0f6d8cSDmitry Chagin }
668a0f6d8cSDmitry Chagin 
678a0f6d8cSDmitry Chagin void
688a0f6d8cSDmitry Chagin ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip,
698a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
708a0f6d8cSDmitry Chagin {
718a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
728a0f6d8cSDmitry Chagin 	register_t *ip, *first;
738a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
748a0f6d8cSDmitry Chagin 	char c;
758a0f6d8cSDmitry Chagin 
768a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
778a0f6d8cSDmitry Chagin 	c = *resc;
788a0f6d8cSDmitry Chagin 	quad_align = 0;
798a0f6d8cSDmitry Chagin 	quad_slots = 1;
808a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
814d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
824d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
834d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
844d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
854d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
864d496ab4SDmitry Chagin #endif
874d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
884d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
894d496ab4SDmitry Chagin #endif
904d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_futimesat
914d496ab4SDmitry Chagin 	case LINUX_SYS_linux_futimesat:
924d496ab4SDmitry Chagin #endif
934d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
944d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdirat:
954d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mknodat:
964d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
974d496ab4SDmitry Chagin 	case LINUX_SYS_linux_readlinkat:
984d496ab4SDmitry Chagin 	case LINUX_SYS_linux_renameat:
994d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
1004d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
1014d496ab4SDmitry Chagin 		putchar('(');
1024d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
1034d496ab4SDmitry Chagin 		c = ',';
1044d496ab4SDmitry Chagin 		ip++;
1054d496ab4SDmitry Chagin 		narg--;
1064d496ab4SDmitry Chagin 		break;
1074d496ab4SDmitry Chagin 	}
1084d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
1094d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_access
1104d496ab4SDmitry Chagin 	case LINUX_SYS_linux_access:
1114d496ab4SDmitry Chagin #endif
1124d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
1134d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1144d496ab4SDmitry Chagin 		putchar(',');
1154d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
1164d496ab4SDmitry Chagin 		ip++;
1174d496ab4SDmitry Chagin 		narg--;
1184d496ab4SDmitry Chagin 		break;
1194d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_chmod
1204d496ab4SDmitry Chagin 	case LINUX_SYS_linux_chmod:
1214d496ab4SDmitry Chagin #endif
1224d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
1234d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1244d496ab4SDmitry Chagin 		putchar(',');
1254d496ab4SDmitry Chagin 		decode_filemode(*ip);
1264d496ab4SDmitry Chagin 		ip++;
1274d496ab4SDmitry Chagin 		narg--;
1284d496ab4SDmitry Chagin 		break;
1294d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mknodat:
1304d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1314d496ab4SDmitry Chagin 		putchar(',');
1324d496ab4SDmitry Chagin 		decode_filemode(*ip);
1334d496ab4SDmitry Chagin 		ip++;
1344d496ab4SDmitry Chagin 		narg--;
1354d496ab4SDmitry Chagin 		break;
1364d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_mkdir
1374d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdir:
1384d496ab4SDmitry Chagin #endif
1394d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdirat:
1404d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1414d496ab4SDmitry Chagin 		putchar(',');
1424d496ab4SDmitry Chagin 		decode_filemode(*ip);
1434d496ab4SDmitry Chagin 		ip++;
1444d496ab4SDmitry Chagin 		narg--;
1454d496ab4SDmitry Chagin 		break;
1464d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
1474d496ab4SDmitry Chagin 	case LINUX_SYS_linux_renameat:
1484d496ab4SDmitry Chagin 	case LINUX_SYS_linux_symlinkat:
1494d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1504d496ab4SDmitry Chagin 		putchar(',');
1514d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
1524d496ab4SDmitry Chagin 		ip++;
1534d496ab4SDmitry Chagin 		narg--;
1544d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1554d496ab4SDmitry Chagin 		break;
1564d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
1574d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1584d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1594d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1604d496ab4SDmitry Chagin 		break;
1614d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
1624d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
1634d496ab4SDmitry Chagin #endif
1644d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
1654d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
1664d496ab4SDmitry Chagin #endif
1674d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
1684d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1694d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1704d496ab4SDmitry Chagin 		break;
1714d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
1724d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1734d496ab4SDmitry Chagin 		break;
1748a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_gettime:
1758a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_settime:
1768a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_getres:
1778a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_timer_create:
1788a0f6d8cSDmitry Chagin 		putchar('(');
1798a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
1808a0f6d8cSDmitry Chagin 		c = ',';
1818a0f6d8cSDmitry Chagin 		ip++;
1828a0f6d8cSDmitry Chagin 		narg--;
1838a0f6d8cSDmitry Chagin 		break;
18439de84b6SDmitry Chagin 	case LINUX_SYS_linux_clock_nanosleep:
18539de84b6SDmitry Chagin 		putchar('(');
18639de84b6SDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
18739de84b6SDmitry Chagin 		putchar(',');
18839de84b6SDmitry Chagin 		ip++;
18939de84b6SDmitry Chagin 		narg--;
19039de84b6SDmitry Chagin 		print_mask_arg0(sysdecode_linux_clock_flags, *ip);
19139de84b6SDmitry Chagin 		c = ',';
19239de84b6SDmitry Chagin 		ip++;
19339de84b6SDmitry Chagin 		narg--;
19439de84b6SDmitry Chagin 		break;
195*829f3d7dSDmitry Chagin 	case LINUX_SYS_linux_clone:
196*829f3d7dSDmitry Chagin 		putchar('(');
197*829f3d7dSDmitry Chagin 		print_mask_arg(sysdecode_linux_clone_flags, *ip);
198*829f3d7dSDmitry Chagin 		ip++;
199*829f3d7dSDmitry Chagin 		narg--;
200*829f3d7dSDmitry Chagin 		c = ',';
201*829f3d7dSDmitry Chagin 		break;
2028a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_kill:
2038a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tkill:
2048a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigqueueinfo:
2058a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2068a0f6d8cSDmitry Chagin 		putchar(',');
2078a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2088a0f6d8cSDmitry Chagin 		ip++;
2098a0f6d8cSDmitry Chagin 		narg--;
2108a0f6d8cSDmitry Chagin 		break;
2118a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tgkill:
2128a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_tgsigqueueinfo:
2138a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2148a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2158a0f6d8cSDmitry Chagin 		putchar(',');
2168a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2178a0f6d8cSDmitry Chagin 		ip++;
2188a0f6d8cSDmitry Chagin 		narg--;
2198a0f6d8cSDmitry Chagin 		break;
2204d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_open
2214d496ab4SDmitry Chagin 	case LINUX_SYS_linux_open:
2224d496ab4SDmitry Chagin #endif
2234d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
2244d496ab4SDmitry Chagin 		print_number(ip, narg, c);
2254d496ab4SDmitry Chagin 		putchar(',');
2264d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
2274d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
2284d496ab4SDmitry Chagin 			putchar(',');
2294d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
2304d496ab4SDmitry Chagin 		}
2314d496ab4SDmitry Chagin 		ip += 2;
2324d496ab4SDmitry Chagin 		narg -= 2;
2334d496ab4SDmitry Chagin 		break;
2348a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigaction:
2358a0f6d8cSDmitry Chagin 		putchar('(');
2368a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2378a0f6d8cSDmitry Chagin 		ip++;
2388a0f6d8cSDmitry Chagin 		narg--;
2398a0f6d8cSDmitry Chagin 		c = ',';
2408a0f6d8cSDmitry Chagin 		break;
2418a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_ftruncate:
2428a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_truncate:
2438a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2448a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
2458a0f6d8cSDmitry Chagin 		break;
246b9b86b67SDmitry Chagin 	case LINUX_SYS_linux_getitimer:
247b9b86b67SDmitry Chagin 	case LINUX_SYS_linux_setitimer:
248b9b86b67SDmitry Chagin 		putchar('(');
249b9b86b67SDmitry Chagin 		print_integer_arg(sysdecode_itimer, *ip);
250b9b86b67SDmitry Chagin 		ip++;
251b9b86b67SDmitry Chagin 		narg--;
252b9b86b67SDmitry Chagin 		c = ',';
253b9b86b67SDmitry Chagin 		break;
254f587a2a7SDmitry Chagin 	case LINUX_SYS_linux_rt_sigprocmask:
255f587a2a7SDmitry Chagin #ifdef LINUX_SYS_linux_sigprocmask
256f587a2a7SDmitry Chagin 	case LINUX_SYS_linux_sigprocmask:
257f587a2a7SDmitry Chagin #endif
258f587a2a7SDmitry Chagin 		putchar('(');
259f587a2a7SDmitry Chagin 		print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
260f587a2a7SDmitry Chagin 		ip++;
261f587a2a7SDmitry Chagin 		narg--;
262f587a2a7SDmitry Chagin 		c = ',';
263f587a2a7SDmitry Chagin 		break;
2648a0f6d8cSDmitry Chagin 	}
2654d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
2664d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
2674d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
2684d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
2694d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
2704d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
2714d496ab4SDmitry Chagin #endif
2724d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
2734d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
2744d496ab4SDmitry Chagin #endif
2754d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
2764d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
2774d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
2784d496ab4SDmitry Chagin 		putchar(',');
2794d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
2804d496ab4SDmitry Chagin 		ip++;
2814d496ab4SDmitry Chagin 		narg--;
2824d496ab4SDmitry Chagin 		break;
2834d496ab4SDmitry Chagin 	}
2848a0f6d8cSDmitry Chagin 	*resc = c;
2858a0f6d8cSDmitry Chagin 	*resip = ip;
2868a0f6d8cSDmitry Chagin 	*resnarg = narg;
2878a0f6d8cSDmitry Chagin }
2888a0f6d8cSDmitry Chagin 
2898a0f6d8cSDmitry Chagin #if defined(__amd64__)
2908a0f6d8cSDmitry Chagin void
2918a0f6d8cSDmitry Chagin ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip,
2928a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
2938a0f6d8cSDmitry Chagin {
2948a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
2958a0f6d8cSDmitry Chagin 	register_t *ip, *first;
2968a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
2978a0f6d8cSDmitry Chagin 	char c;
2988a0f6d8cSDmitry Chagin 
2998a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
3008a0f6d8cSDmitry Chagin 	c = *resc;
3018a0f6d8cSDmitry Chagin 	quad_align = 0;
3028a0f6d8cSDmitry Chagin 	quad_slots = 2;
3038a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
3044d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
3054d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
3064d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
3074d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
3084d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_futimesat:
3094d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
3104d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
3114d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
3124d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
3134d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_readlinkat:
3144d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
3154d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
3164d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
3174d496ab4SDmitry Chagin 		putchar('(');
3184d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
3194d496ab4SDmitry Chagin 		c = ',';
3204d496ab4SDmitry Chagin 		ip++;
3214d496ab4SDmitry Chagin 		narg--;
3224d496ab4SDmitry Chagin 		break;
3234d496ab4SDmitry Chagin 	}
3244d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
3254d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_access:
3264d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
3274d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3284d496ab4SDmitry Chagin 		putchar(',');
3294d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
3304d496ab4SDmitry Chagin 		ip++;
3314d496ab4SDmitry Chagin 		narg--;
3324d496ab4SDmitry Chagin 		break;
3334d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_chmod:
3344d496ab4SDmitry Chagin 	case LINUX32_SYS_fchmod:
3354d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
3364d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3374d496ab4SDmitry Chagin 		putchar(',');
3384d496ab4SDmitry Chagin 		decode_filemode(*ip);
3394d496ab4SDmitry Chagin 		ip++;
3404d496ab4SDmitry Chagin 		narg--;
3414d496ab4SDmitry Chagin 		break;
3424d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
3434d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3444d496ab4SDmitry Chagin 		putchar(',');
3454d496ab4SDmitry Chagin 		decode_filemode(*ip);
3464d496ab4SDmitry Chagin 		ip++;
3474d496ab4SDmitry Chagin 		narg--;
3484d496ab4SDmitry Chagin 		break;
3494d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdir:
3504d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
3514d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3524d496ab4SDmitry Chagin 		putchar(',');
3534d496ab4SDmitry Chagin 		decode_filemode(*ip);
3544d496ab4SDmitry Chagin 		ip++;
3554d496ab4SDmitry Chagin 		narg--;
3564d496ab4SDmitry Chagin 		break;
3574d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
3584d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
3594d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_symlinkat:
3604d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3614d496ab4SDmitry Chagin 		putchar(',');
3624d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
3634d496ab4SDmitry Chagin 		ip++;
3644d496ab4SDmitry Chagin 		narg--;
3654d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3664d496ab4SDmitry Chagin 		break;
3674d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
3684d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3694d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3704d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3714d496ab4SDmitry Chagin 		break;
3724d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
3734d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
3744d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3754d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3764d496ab4SDmitry Chagin 		break;
3774d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
3784d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3794d496ab4SDmitry Chagin 		break;
3808a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime:
3818a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime:
3828a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres:
3838a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_timer_create:
3848a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime64:
3858a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime64:
3868a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres_time64:
3878a0f6d8cSDmitry Chagin 		putchar('(');
3888a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
3898a0f6d8cSDmitry Chagin 		c = ',';
3908a0f6d8cSDmitry Chagin 		ip++;
3918a0f6d8cSDmitry Chagin 		narg--;
3928a0f6d8cSDmitry Chagin 		break;
39339de84b6SDmitry Chagin 	case LINUX32_SYS_linux_clock_nanosleep:
39439de84b6SDmitry Chagin 		putchar('(');
39539de84b6SDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
39639de84b6SDmitry Chagin 		putchar(',');
39739de84b6SDmitry Chagin 		ip++;
39839de84b6SDmitry Chagin 		narg--;
39939de84b6SDmitry Chagin 		print_mask_arg0(sysdecode_linux_clock_flags, *ip);
40039de84b6SDmitry Chagin 		c = ',';
40139de84b6SDmitry Chagin 		ip++;
40239de84b6SDmitry Chagin 		narg--;
40339de84b6SDmitry Chagin 		break;
404*829f3d7dSDmitry Chagin 	case LINUX32_SYS_linux_clone:
405*829f3d7dSDmitry Chagin 		putchar('(');
406*829f3d7dSDmitry Chagin 		print_mask_arg(sysdecode_linux_clone_flags, *ip);
407*829f3d7dSDmitry Chagin 		ip++;
408*829f3d7dSDmitry Chagin 		narg--;
409*829f3d7dSDmitry Chagin 		c = ',';
410*829f3d7dSDmitry Chagin 		break;
4118a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_kill:
4128a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tkill:
4138a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigqueueinfo:
4148a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4158a0f6d8cSDmitry Chagin 		putchar(',');
4168a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4178a0f6d8cSDmitry Chagin 		ip++;
4188a0f6d8cSDmitry Chagin 		narg--;
4198a0f6d8cSDmitry Chagin 		break;
4208a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tgkill:
4218a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_tgsigqueueinfo:
4228a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4238a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4248a0f6d8cSDmitry Chagin 		putchar(',');
4258a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4268a0f6d8cSDmitry Chagin 		ip++;
4278a0f6d8cSDmitry Chagin 		narg--;
4288a0f6d8cSDmitry Chagin 		break;
4294d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_open:
4304d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
4314d496ab4SDmitry Chagin 		print_number(ip, narg, c);
4324d496ab4SDmitry Chagin 		putchar(',');
4334d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
4344d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
4354d496ab4SDmitry Chagin 			putchar(',');
4364d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
4374d496ab4SDmitry Chagin 		}
4384d496ab4SDmitry Chagin 		ip += 2;
4394d496ab4SDmitry Chagin 		narg -= 2;
4404d496ab4SDmitry Chagin 		break;
4418a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_signal:
4428a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_sigaction:
4438a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigaction:
4448a0f6d8cSDmitry Chagin 		putchar('(');
4458a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4468a0f6d8cSDmitry Chagin 		ip++;
4478a0f6d8cSDmitry Chagin 		narg--;
4488a0f6d8cSDmitry Chagin 		c = ',';
4498a0f6d8cSDmitry Chagin 		break;
4508a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_ftruncate:
4518a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_truncate:
4528a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4538a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
4548a0f6d8cSDmitry Chagin 		break;
455b9b86b67SDmitry Chagin 	case LINUX32_SYS_linux_getitimer:
456b9b86b67SDmitry Chagin 	case LINUX32_SYS_linux_setitimer:
457b9b86b67SDmitry Chagin 		putchar('(');
458b9b86b67SDmitry Chagin 		print_integer_arg(sysdecode_itimer, *ip);
459b9b86b67SDmitry Chagin 		ip++;
460b9b86b67SDmitry Chagin 		narg--;
461b9b86b67SDmitry Chagin 		c = ',';
462b9b86b67SDmitry Chagin 		break;
463f587a2a7SDmitry Chagin 	case LINUX32_SYS_linux_rt_sigprocmask:
464f587a2a7SDmitry Chagin 	case LINUX32_SYS_linux_sigprocmask:
465f587a2a7SDmitry Chagin 		putchar('(');
466f587a2a7SDmitry Chagin 		print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
467f587a2a7SDmitry Chagin 		ip++;
468f587a2a7SDmitry Chagin 		narg--;
469f587a2a7SDmitry Chagin 		c = ',';
470f587a2a7SDmitry Chagin 		break;
4718a0f6d8cSDmitry Chagin 	}
4724d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
4734d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
4744d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
4754d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
4764d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
4774d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
4784d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
4794d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
4804d496ab4SDmitry Chagin 		putchar(',');
4814d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
4824d496ab4SDmitry Chagin 		ip++;
4834d496ab4SDmitry Chagin 		narg--;
4844d496ab4SDmitry Chagin 		break;
4854d496ab4SDmitry Chagin 	}
4868a0f6d8cSDmitry Chagin 	*resc = c;
4878a0f6d8cSDmitry Chagin 	*resip = ip;
4888a0f6d8cSDmitry Chagin 	*resnarg = narg;
4898a0f6d8cSDmitry Chagin }
4908a0f6d8cSDmitry Chagin #endif /* __amd64__ */
4913606a213SDmitry Chagin 
4923606a213SDmitry Chagin static void
4933606a213SDmitry Chagin ktrsigset(const char *name, const l_sigset_t *mask, size_t sz)
4943606a213SDmitry Chagin {
4953606a213SDmitry Chagin 	unsigned long i, c;
4963606a213SDmitry Chagin 
4973606a213SDmitry Chagin 	printf("%s [ ", name);
4983606a213SDmitry Chagin 	c = 0;
4993606a213SDmitry Chagin 	for (i = 1; i <= sz * CHAR_BIT; i++) {
5003606a213SDmitry Chagin 		if (!LINUX_SIGISMEMBER(*mask, i))
5013606a213SDmitry Chagin 			continue;
5023606a213SDmitry Chagin 		if (c != 0)
5033606a213SDmitry Chagin 			printf(", ");
5043606a213SDmitry Chagin 		printf("%s", sysdecode_linux_signal(i));
5053606a213SDmitry Chagin 		c++;
5063606a213SDmitry Chagin 	}
5073606a213SDmitry Chagin 	if (c == 0)
5083606a213SDmitry Chagin 		printf("empty ]\n");
5093606a213SDmitry Chagin 	else
5103606a213SDmitry Chagin 		printf(" ]\n");
5113606a213SDmitry Chagin }
5123606a213SDmitry Chagin 
5133606a213SDmitry Chagin bool
5143606a213SDmitry Chagin ktrstruct_linux(const char *name, const char *data, size_t datalen)
5153606a213SDmitry Chagin {
5163606a213SDmitry Chagin 	l_sigset_t mask;
5173606a213SDmitry Chagin 
5183606a213SDmitry Chagin 	if (strcmp(name, "l_sigset_t") == 0) {
5193606a213SDmitry Chagin 		/* Old Linux sigset_t is one word size. */
5203606a213SDmitry Chagin 		if (datalen < sizeof(int) || datalen > sizeof(l_sigset_t))
5213606a213SDmitry Chagin 			return (false);
5223606a213SDmitry Chagin 		memcpy(&mask, data, datalen);
5233606a213SDmitry Chagin 		ktrsigset(name, &mask, datalen);
5243606a213SDmitry Chagin 	} else
5253606a213SDmitry Chagin 		return (false);
5263606a213SDmitry Chagin 
5273606a213SDmitry Chagin 	return (true);
5283606a213SDmitry Chagin }
529