xref: /freebsd/usr.bin/kdump/linux.c (revision 4d496ab4)
18a0f6d8cSDmitry Chagin /*-
28a0f6d8cSDmitry Chagin  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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;
1958a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_kill:
1968a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tkill:
1978a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigqueueinfo:
1988a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
1998a0f6d8cSDmitry Chagin 		putchar(',');
2008a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2018a0f6d8cSDmitry Chagin 		ip++;
2028a0f6d8cSDmitry Chagin 		narg--;
2038a0f6d8cSDmitry Chagin 		break;
2048a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tgkill:
2058a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_tgsigqueueinfo:
2068a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2078a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2088a0f6d8cSDmitry Chagin 		putchar(',');
2098a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2108a0f6d8cSDmitry Chagin 		ip++;
2118a0f6d8cSDmitry Chagin 		narg--;
2128a0f6d8cSDmitry Chagin 		break;
2134d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_open
2144d496ab4SDmitry Chagin 	case LINUX_SYS_linux_open:
2154d496ab4SDmitry Chagin #endif
2164d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
2174d496ab4SDmitry Chagin 		print_number(ip, narg, c);
2184d496ab4SDmitry Chagin 		putchar(',');
2194d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
2204d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
2214d496ab4SDmitry Chagin 			putchar(',');
2224d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
2234d496ab4SDmitry Chagin 		}
2244d496ab4SDmitry Chagin 		ip += 2;
2254d496ab4SDmitry Chagin 		narg -= 2;
2264d496ab4SDmitry Chagin 		break;
2278a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigaction:
2288a0f6d8cSDmitry Chagin 		putchar('(');
2298a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2308a0f6d8cSDmitry Chagin 		ip++;
2318a0f6d8cSDmitry Chagin 		narg--;
2328a0f6d8cSDmitry Chagin 		c = ',';
2338a0f6d8cSDmitry Chagin 		break;
2348a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_ftruncate:
2358a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_truncate:
2368a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2378a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
2388a0f6d8cSDmitry Chagin 		break;
239b9b86b67SDmitry Chagin 	case LINUX_SYS_linux_getitimer:
240b9b86b67SDmitry Chagin 	case LINUX_SYS_linux_setitimer:
241b9b86b67SDmitry Chagin 		putchar('(');
242b9b86b67SDmitry Chagin 		print_integer_arg(sysdecode_itimer, *ip);
243b9b86b67SDmitry Chagin 		ip++;
244b9b86b67SDmitry Chagin 		narg--;
245b9b86b67SDmitry Chagin 		c = ',';
246b9b86b67SDmitry Chagin 		break;
247f587a2a7SDmitry Chagin 	case LINUX_SYS_linux_rt_sigprocmask:
248f587a2a7SDmitry Chagin #ifdef LINUX_SYS_linux_sigprocmask
249f587a2a7SDmitry Chagin 	case LINUX_SYS_linux_sigprocmask:
250f587a2a7SDmitry Chagin #endif
251f587a2a7SDmitry Chagin 		putchar('(');
252f587a2a7SDmitry Chagin 		print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
253f587a2a7SDmitry Chagin 		ip++;
254f587a2a7SDmitry Chagin 		narg--;
255f587a2a7SDmitry Chagin 		c = ',';
256f587a2a7SDmitry Chagin 		break;
2578a0f6d8cSDmitry Chagin 	}
2584d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
2594d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
2604d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
2614d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
2624d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
2634d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
2644d496ab4SDmitry Chagin #endif
2654d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
2664d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
2674d496ab4SDmitry Chagin #endif
2684d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
2694d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
2704d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
2714d496ab4SDmitry Chagin 		putchar(',');
2724d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
2734d496ab4SDmitry Chagin 		ip++;
2744d496ab4SDmitry Chagin 		narg--;
2754d496ab4SDmitry Chagin 		break;
2764d496ab4SDmitry Chagin 	}
2778a0f6d8cSDmitry Chagin 	*resc = c;
2788a0f6d8cSDmitry Chagin 	*resip = ip;
2798a0f6d8cSDmitry Chagin 	*resnarg = narg;
2808a0f6d8cSDmitry Chagin }
2818a0f6d8cSDmitry Chagin 
2828a0f6d8cSDmitry Chagin #if defined(__amd64__)
2838a0f6d8cSDmitry Chagin void
2848a0f6d8cSDmitry Chagin ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip,
2858a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
2868a0f6d8cSDmitry Chagin {
2878a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
2888a0f6d8cSDmitry Chagin 	register_t *ip, *first;
2898a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
2908a0f6d8cSDmitry Chagin 	char c;
2918a0f6d8cSDmitry Chagin 
2928a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
2938a0f6d8cSDmitry Chagin 	c = *resc;
2948a0f6d8cSDmitry Chagin 	quad_align = 0;
2958a0f6d8cSDmitry Chagin 	quad_slots = 2;
2968a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
2974d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
2984d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
2994d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
3004d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
3014d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_futimesat:
3024d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
3034d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
3044d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
3054d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
3064d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_readlinkat:
3074d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
3084d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
3094d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
3104d496ab4SDmitry Chagin 		putchar('(');
3114d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
3124d496ab4SDmitry Chagin 		c = ',';
3134d496ab4SDmitry Chagin 		ip++;
3144d496ab4SDmitry Chagin 		narg--;
3154d496ab4SDmitry Chagin 		break;
3164d496ab4SDmitry Chagin 	}
3174d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
3184d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_access:
3194d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
3204d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3214d496ab4SDmitry Chagin 		putchar(',');
3224d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
3234d496ab4SDmitry Chagin 		ip++;
3244d496ab4SDmitry Chagin 		narg--;
3254d496ab4SDmitry Chagin 		break;
3264d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_chmod:
3274d496ab4SDmitry Chagin 	case LINUX32_SYS_fchmod:
3284d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
3294d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3304d496ab4SDmitry Chagin 		putchar(',');
3314d496ab4SDmitry Chagin 		decode_filemode(*ip);
3324d496ab4SDmitry Chagin 		ip++;
3334d496ab4SDmitry Chagin 		narg--;
3344d496ab4SDmitry Chagin 		break;
3354d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
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_mkdir:
3434d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
3444d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3454d496ab4SDmitry Chagin 		putchar(',');
3464d496ab4SDmitry Chagin 		decode_filemode(*ip);
3474d496ab4SDmitry Chagin 		ip++;
3484d496ab4SDmitry Chagin 		narg--;
3494d496ab4SDmitry Chagin 		break;
3504d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
3514d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
3524d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_symlinkat:
3534d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3544d496ab4SDmitry Chagin 		putchar(',');
3554d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
3564d496ab4SDmitry Chagin 		ip++;
3574d496ab4SDmitry Chagin 		narg--;
3584d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3594d496ab4SDmitry Chagin 		break;
3604d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
3614d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3624d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3634d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3644d496ab4SDmitry Chagin 		break;
3654d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
3664d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
3674d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3684d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3694d496ab4SDmitry Chagin 		break;
3704d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
3714d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3724d496ab4SDmitry Chagin 		break;
3738a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime:
3748a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime:
3758a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres:
3768a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_timer_create:
3778a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime64:
3788a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime64:
3798a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres_time64:
3808a0f6d8cSDmitry Chagin 		putchar('(');
3818a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
3828a0f6d8cSDmitry Chagin 		c = ',';
3838a0f6d8cSDmitry Chagin 		ip++;
3848a0f6d8cSDmitry Chagin 		narg--;
3858a0f6d8cSDmitry Chagin 		break;
38639de84b6SDmitry Chagin 	case LINUX32_SYS_linux_clock_nanosleep:
38739de84b6SDmitry Chagin 		putchar('(');
38839de84b6SDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
38939de84b6SDmitry Chagin 		putchar(',');
39039de84b6SDmitry Chagin 		ip++;
39139de84b6SDmitry Chagin 		narg--;
39239de84b6SDmitry Chagin 		print_mask_arg0(sysdecode_linux_clock_flags, *ip);
39339de84b6SDmitry Chagin 		c = ',';
39439de84b6SDmitry Chagin 		ip++;
39539de84b6SDmitry Chagin 		narg--;
39639de84b6SDmitry Chagin 		break;
3978a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_kill:
3988a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tkill:
3998a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigqueueinfo:
4008a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4018a0f6d8cSDmitry Chagin 		putchar(',');
4028a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4038a0f6d8cSDmitry Chagin 		ip++;
4048a0f6d8cSDmitry Chagin 		narg--;
4058a0f6d8cSDmitry Chagin 		break;
4068a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tgkill:
4078a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_tgsigqueueinfo:
4088a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4098a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4108a0f6d8cSDmitry Chagin 		putchar(',');
4118a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4128a0f6d8cSDmitry Chagin 		ip++;
4138a0f6d8cSDmitry Chagin 		narg--;
4148a0f6d8cSDmitry Chagin 		break;
4154d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_open:
4164d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
4174d496ab4SDmitry Chagin 		print_number(ip, narg, c);
4184d496ab4SDmitry Chagin 		putchar(',');
4194d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
4204d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
4214d496ab4SDmitry Chagin 			putchar(',');
4224d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
4234d496ab4SDmitry Chagin 		}
4244d496ab4SDmitry Chagin 		ip += 2;
4254d496ab4SDmitry Chagin 		narg -= 2;
4264d496ab4SDmitry Chagin 		break;
4278a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_signal:
4288a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_sigaction:
4298a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigaction:
4308a0f6d8cSDmitry Chagin 		putchar('(');
4318a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4328a0f6d8cSDmitry Chagin 		ip++;
4338a0f6d8cSDmitry Chagin 		narg--;
4348a0f6d8cSDmitry Chagin 		c = ',';
4358a0f6d8cSDmitry Chagin 		break;
4368a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_ftruncate:
4378a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_truncate:
4388a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4398a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
4408a0f6d8cSDmitry Chagin 		break;
441b9b86b67SDmitry Chagin 	case LINUX32_SYS_linux_getitimer:
442b9b86b67SDmitry Chagin 	case LINUX32_SYS_linux_setitimer:
443b9b86b67SDmitry Chagin 		putchar('(');
444b9b86b67SDmitry Chagin 		print_integer_arg(sysdecode_itimer, *ip);
445b9b86b67SDmitry Chagin 		ip++;
446b9b86b67SDmitry Chagin 		narg--;
447b9b86b67SDmitry Chagin 		c = ',';
448b9b86b67SDmitry Chagin 		break;
449f587a2a7SDmitry Chagin 	case LINUX32_SYS_linux_rt_sigprocmask:
450f587a2a7SDmitry Chagin 	case LINUX32_SYS_linux_sigprocmask:
451f587a2a7SDmitry Chagin 		putchar('(');
452f587a2a7SDmitry Chagin 		print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
453f587a2a7SDmitry Chagin 		ip++;
454f587a2a7SDmitry Chagin 		narg--;
455f587a2a7SDmitry Chagin 		c = ',';
456f587a2a7SDmitry Chagin 		break;
4578a0f6d8cSDmitry Chagin 	}
4584d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
4594d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
4604d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
4614d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
4624d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
4634d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
4644d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
4654d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
4664d496ab4SDmitry Chagin 		putchar(',');
4674d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
4684d496ab4SDmitry Chagin 		ip++;
4694d496ab4SDmitry Chagin 		narg--;
4704d496ab4SDmitry Chagin 		break;
4714d496ab4SDmitry Chagin 	}
4728a0f6d8cSDmitry Chagin 	*resc = c;
4738a0f6d8cSDmitry Chagin 	*resip = ip;
4748a0f6d8cSDmitry Chagin 	*resnarg = narg;
4758a0f6d8cSDmitry Chagin }
4768a0f6d8cSDmitry Chagin #endif /* __amd64__ */
4773606a213SDmitry Chagin 
4783606a213SDmitry Chagin static void
4793606a213SDmitry Chagin ktrsigset(const char *name, const l_sigset_t *mask, size_t sz)
4803606a213SDmitry Chagin {
4813606a213SDmitry Chagin 	unsigned long i, c;
4823606a213SDmitry Chagin 
4833606a213SDmitry Chagin 	printf("%s [ ", name);
4843606a213SDmitry Chagin 	c = 0;
4853606a213SDmitry Chagin 	for (i = 1; i <= sz * CHAR_BIT; i++) {
4863606a213SDmitry Chagin 		if (!LINUX_SIGISMEMBER(*mask, i))
4873606a213SDmitry Chagin 			continue;
4883606a213SDmitry Chagin 		if (c != 0)
4893606a213SDmitry Chagin 			printf(", ");
4903606a213SDmitry Chagin 		printf("%s", sysdecode_linux_signal(i));
4913606a213SDmitry Chagin 		c++;
4923606a213SDmitry Chagin 	}
4933606a213SDmitry Chagin 	if (c == 0)
4943606a213SDmitry Chagin 		printf("empty ]\n");
4953606a213SDmitry Chagin 	else
4963606a213SDmitry Chagin 		printf(" ]\n");
4973606a213SDmitry Chagin }
4983606a213SDmitry Chagin 
4993606a213SDmitry Chagin bool
5003606a213SDmitry Chagin ktrstruct_linux(const char *name, const char *data, size_t datalen)
5013606a213SDmitry Chagin {
5023606a213SDmitry Chagin 	l_sigset_t mask;
5033606a213SDmitry Chagin 
5043606a213SDmitry Chagin 	if (strcmp(name, "l_sigset_t") == 0) {
5053606a213SDmitry Chagin 		/* Old Linux sigset_t is one word size. */
5063606a213SDmitry Chagin 		if (datalen < sizeof(int) || datalen > sizeof(l_sigset_t))
5073606a213SDmitry Chagin 			return (false);
5083606a213SDmitry Chagin 		memcpy(&mask, data, datalen);
5093606a213SDmitry Chagin 		ktrsigset(name, &mask, datalen);
5103606a213SDmitry Chagin 	} else
5113606a213SDmitry Chagin 		return (false);
5123606a213SDmitry Chagin 
5133606a213SDmitry Chagin 	return (true);
5143606a213SDmitry Chagin }
515