xref: /freebsd/usr.bin/kdump/linux.c (revision 5e3934b1)
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/param.h>
298a0f6d8cSDmitry Chagin #include <sys/uio.h>
308a0f6d8cSDmitry Chagin #include <sys/ktrace.h>
313606a213SDmitry Chagin #include <err.h>
323606a213SDmitry Chagin #include <errno.h>
338a0f6d8cSDmitry Chagin #include <stddef.h>
343606a213SDmitry Chagin #include <stdlib.h>
353606a213SDmitry Chagin #include <string.h>
368a0f6d8cSDmitry Chagin #include <sysdecode.h>
378a0f6d8cSDmitry Chagin 
388a0f6d8cSDmitry Chagin #include "kdump.h"
398a0f6d8cSDmitry Chagin 
408a0f6d8cSDmitry Chagin #ifdef __amd64__
414d496ab4SDmitry Chagin #include <amd64/linux/linux.h>
428a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h>
438a0f6d8cSDmitry Chagin #elif __aarch64__
444d496ab4SDmitry Chagin #include <arm64/linux/linux.h>
458a0f6d8cSDmitry Chagin #elif __i386__
464d496ab4SDmitry Chagin #include <i386/linux/linux.h>
478a0f6d8cSDmitry Chagin #endif
488a0f6d8cSDmitry Chagin 
493606a213SDmitry Chagin #include <compat/linux/linux.h>
504d496ab4SDmitry Chagin #include <compat/linux/linux_file.h>
513606a213SDmitry Chagin 
528a0f6d8cSDmitry Chagin static void
print_linux_signal(int signo)538a0f6d8cSDmitry Chagin print_linux_signal(int signo)
548a0f6d8cSDmitry Chagin {
558a0f6d8cSDmitry Chagin 	const char *signame;
568a0f6d8cSDmitry Chagin 
578a0f6d8cSDmitry Chagin 	signame = sysdecode_linux_signal(signo);
588a0f6d8cSDmitry Chagin 	if (signame != NULL)
598a0f6d8cSDmitry Chagin 		printf("%s", signame);
608a0f6d8cSDmitry Chagin 	else
618a0f6d8cSDmitry Chagin 		printf("SIG %d", signo);
628a0f6d8cSDmitry Chagin }
638a0f6d8cSDmitry Chagin 
648a0f6d8cSDmitry Chagin void
ktrsyscall_linux(struct ktr_syscall * ktr,register_t ** resip,int * resnarg,char * resc)658a0f6d8cSDmitry Chagin ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip,
668a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
678a0f6d8cSDmitry Chagin {
688a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
698a0f6d8cSDmitry Chagin 	register_t *ip, *first;
708a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
718a0f6d8cSDmitry Chagin 	char c;
728a0f6d8cSDmitry Chagin 
738a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
748a0f6d8cSDmitry Chagin 	c = *resc;
758a0f6d8cSDmitry Chagin 	quad_align = 0;
768a0f6d8cSDmitry Chagin 	quad_slots = 1;
778a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
784d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
794d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
804d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
814d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
824d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
834d496ab4SDmitry Chagin #endif
844d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
854d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
864d496ab4SDmitry Chagin #endif
874d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_futimesat
884d496ab4SDmitry Chagin 	case LINUX_SYS_linux_futimesat:
894d496ab4SDmitry Chagin #endif
904d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
914d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdirat:
924d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mknodat:
934d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
944d496ab4SDmitry Chagin 	case LINUX_SYS_linux_readlinkat:
954d496ab4SDmitry Chagin 	case LINUX_SYS_linux_renameat:
964d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
974d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
984d496ab4SDmitry Chagin 		putchar('(');
994d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
1004d496ab4SDmitry Chagin 		c = ',';
1014d496ab4SDmitry Chagin 		ip++;
1024d496ab4SDmitry Chagin 		narg--;
1034d496ab4SDmitry Chagin 		break;
1044d496ab4SDmitry Chagin 	}
1054d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
1064d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_access
1074d496ab4SDmitry Chagin 	case LINUX_SYS_linux_access:
1084d496ab4SDmitry Chagin #endif
1094d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
1104d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1114d496ab4SDmitry Chagin 		putchar(',');
1124d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
1134d496ab4SDmitry Chagin 		ip++;
1144d496ab4SDmitry Chagin 		narg--;
1154d496ab4SDmitry Chagin 		break;
1164d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_chmod
1174d496ab4SDmitry Chagin 	case LINUX_SYS_linux_chmod:
1184d496ab4SDmitry Chagin #endif
1194d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
1204d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1214d496ab4SDmitry Chagin 		putchar(',');
1224d496ab4SDmitry Chagin 		decode_filemode(*ip);
1234d496ab4SDmitry Chagin 		ip++;
1244d496ab4SDmitry Chagin 		narg--;
1254d496ab4SDmitry Chagin 		break;
1264d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mknodat:
1274d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1284d496ab4SDmitry Chagin 		putchar(',');
1294d496ab4SDmitry Chagin 		decode_filemode(*ip);
1304d496ab4SDmitry Chagin 		ip++;
1314d496ab4SDmitry Chagin 		narg--;
1324d496ab4SDmitry Chagin 		break;
1334d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_mkdir
1344d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdir:
1354d496ab4SDmitry Chagin #endif
1364d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdirat:
1374d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1384d496ab4SDmitry Chagin 		putchar(',');
1394d496ab4SDmitry Chagin 		decode_filemode(*ip);
1404d496ab4SDmitry Chagin 		ip++;
1414d496ab4SDmitry Chagin 		narg--;
1424d496ab4SDmitry Chagin 		break;
1434d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
1444d496ab4SDmitry Chagin 	case LINUX_SYS_linux_renameat:
1454d496ab4SDmitry Chagin 	case LINUX_SYS_linux_symlinkat:
1464d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1474d496ab4SDmitry Chagin 		putchar(',');
1484d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
1494d496ab4SDmitry Chagin 		ip++;
1504d496ab4SDmitry Chagin 		narg--;
1514d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1524d496ab4SDmitry Chagin 		break;
1534d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
1544d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1554d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1564d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1574d496ab4SDmitry Chagin 		break;
1584d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
1594d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
1604d496ab4SDmitry Chagin #endif
1614d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
1624d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
1634d496ab4SDmitry Chagin #endif
1644d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
1654d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1664d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1674d496ab4SDmitry Chagin 		break;
1684d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
1694d496ab4SDmitry Chagin 		print_number(ip, narg, c);
1704d496ab4SDmitry Chagin 		break;
1718a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_gettime:
1728a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_settime:
1738a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_getres:
1748a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_timer_create:
1758a0f6d8cSDmitry Chagin 		putchar('(');
1768a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
1778a0f6d8cSDmitry Chagin 		c = ',';
1788a0f6d8cSDmitry Chagin 		ip++;
1798a0f6d8cSDmitry Chagin 		narg--;
1808a0f6d8cSDmitry Chagin 		break;
18139de84b6SDmitry Chagin 	case LINUX_SYS_linux_clock_nanosleep:
18239de84b6SDmitry Chagin 		putchar('(');
18339de84b6SDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
18439de84b6SDmitry Chagin 		putchar(',');
18539de84b6SDmitry Chagin 		ip++;
18639de84b6SDmitry Chagin 		narg--;
18739de84b6SDmitry Chagin 		print_mask_arg0(sysdecode_linux_clock_flags, *ip);
18839de84b6SDmitry Chagin 		c = ',';
18939de84b6SDmitry Chagin 		ip++;
19039de84b6SDmitry Chagin 		narg--;
19139de84b6SDmitry Chagin 		break;
192829f3d7dSDmitry Chagin 	case LINUX_SYS_linux_clone:
193829f3d7dSDmitry Chagin 		putchar('(');
194829f3d7dSDmitry Chagin 		print_mask_arg(sysdecode_linux_clone_flags, *ip);
195829f3d7dSDmitry Chagin 		ip++;
196829f3d7dSDmitry Chagin 		narg--;
197829f3d7dSDmitry Chagin 		c = ',';
198829f3d7dSDmitry Chagin 		break;
1998a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_kill:
2008a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tkill:
2018a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigqueueinfo:
202c2c9ac88SDmitry Chagin 		print_decimal_number(ip, narg, c);
2038a0f6d8cSDmitry Chagin 		putchar(',');
2048a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2058a0f6d8cSDmitry Chagin 		ip++;
2068a0f6d8cSDmitry Chagin 		narg--;
2078a0f6d8cSDmitry Chagin 		break;
2088a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tgkill:
2098a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_tgsigqueueinfo:
210c2c9ac88SDmitry Chagin 		print_decimal_number(ip, narg, c);
211c2c9ac88SDmitry Chagin 		print_decimal_number(ip, narg, c);
2128a0f6d8cSDmitry Chagin 		putchar(',');
2138a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2148a0f6d8cSDmitry Chagin 		ip++;
2158a0f6d8cSDmitry Chagin 		narg--;
2168a0f6d8cSDmitry Chagin 		break;
2174d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_open
2184d496ab4SDmitry Chagin 	case LINUX_SYS_linux_open:
2194d496ab4SDmitry Chagin #endif
2204d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
2214d496ab4SDmitry Chagin 		print_number(ip, narg, c);
2224d496ab4SDmitry Chagin 		putchar(',');
2234d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
2244d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
2254d496ab4SDmitry Chagin 			putchar(',');
2264d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
2274d496ab4SDmitry Chagin 		}
2284d496ab4SDmitry Chagin 		ip += 2;
2294d496ab4SDmitry Chagin 		narg -= 2;
2304d496ab4SDmitry Chagin 		break;
2318a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigaction:
2328a0f6d8cSDmitry Chagin 		putchar('(');
2338a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
2348a0f6d8cSDmitry Chagin 		ip++;
2358a0f6d8cSDmitry Chagin 		narg--;
2368a0f6d8cSDmitry Chagin 		c = ',';
2378a0f6d8cSDmitry Chagin 		break;
2388a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_ftruncate:
2398a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_truncate:
2408a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
2418a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
2428a0f6d8cSDmitry Chagin 		break;
243b9b86b67SDmitry Chagin 	case LINUX_SYS_linux_getitimer:
244b9b86b67SDmitry Chagin 	case LINUX_SYS_linux_setitimer:
245b9b86b67SDmitry Chagin 		putchar('(');
246b9b86b67SDmitry Chagin 		print_integer_arg(sysdecode_itimer, *ip);
247b9b86b67SDmitry Chagin 		ip++;
248b9b86b67SDmitry Chagin 		narg--;
249b9b86b67SDmitry Chagin 		c = ',';
250b9b86b67SDmitry Chagin 		break;
251f587a2a7SDmitry Chagin 	case LINUX_SYS_linux_rt_sigprocmask:
252f587a2a7SDmitry Chagin #ifdef LINUX_SYS_linux_sigprocmask
253f587a2a7SDmitry Chagin 	case LINUX_SYS_linux_sigprocmask:
254f587a2a7SDmitry Chagin #endif
255f587a2a7SDmitry Chagin 		putchar('(');
256f587a2a7SDmitry Chagin 		print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
257f587a2a7SDmitry Chagin 		ip++;
258f587a2a7SDmitry Chagin 		narg--;
259f587a2a7SDmitry Chagin 		c = ',';
260f587a2a7SDmitry Chagin 		break;
2618a0f6d8cSDmitry Chagin 	}
2624d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
2634d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
2644d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
2654d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
2664d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
2674d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
2684d496ab4SDmitry Chagin #endif
2694d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
2704d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
2714d496ab4SDmitry Chagin #endif
2724d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
2734d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
2744d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
2754d496ab4SDmitry Chagin 		putchar(',');
2764d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
2774d496ab4SDmitry Chagin 		ip++;
2784d496ab4SDmitry Chagin 		narg--;
2794d496ab4SDmitry Chagin 		break;
2804d496ab4SDmitry Chagin 	}
2818a0f6d8cSDmitry Chagin 	*resc = c;
2828a0f6d8cSDmitry Chagin 	*resip = ip;
2838a0f6d8cSDmitry Chagin 	*resnarg = narg;
2848a0f6d8cSDmitry Chagin }
2858a0f6d8cSDmitry Chagin 
2868a0f6d8cSDmitry Chagin #if defined(__amd64__)
2878a0f6d8cSDmitry Chagin void
ktrsyscall_linux32(struct ktr_syscall * ktr,register_t ** resip,int * resnarg,char * resc)2888a0f6d8cSDmitry Chagin ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip,
2898a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
2908a0f6d8cSDmitry Chagin {
2918a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
2928a0f6d8cSDmitry Chagin 	register_t *ip, *first;
2938a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
2948a0f6d8cSDmitry Chagin 	char c;
2958a0f6d8cSDmitry Chagin 
2968a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
2978a0f6d8cSDmitry Chagin 	c = *resc;
2988a0f6d8cSDmitry Chagin 	quad_align = 0;
2998a0f6d8cSDmitry Chagin 	quad_slots = 2;
3008a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
3014d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
3024d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
3034d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
3044d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
3054d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_futimesat:
3064d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
3074d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
3084d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
3094d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
3104d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_readlinkat:
3114d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
3124d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
3134d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
3144d496ab4SDmitry Chagin 		putchar('(');
3154d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
3164d496ab4SDmitry Chagin 		c = ',';
3174d496ab4SDmitry Chagin 		ip++;
3184d496ab4SDmitry Chagin 		narg--;
3194d496ab4SDmitry Chagin 		break;
3204d496ab4SDmitry Chagin 	}
3214d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
3224d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_access:
3234d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
3244d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3254d496ab4SDmitry Chagin 		putchar(',');
3264d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
3274d496ab4SDmitry Chagin 		ip++;
3284d496ab4SDmitry Chagin 		narg--;
3294d496ab4SDmitry Chagin 		break;
3304d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_chmod:
3314d496ab4SDmitry Chagin 	case LINUX32_SYS_fchmod:
3324d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
3334d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3344d496ab4SDmitry Chagin 		putchar(',');
3354d496ab4SDmitry Chagin 		decode_filemode(*ip);
3364d496ab4SDmitry Chagin 		ip++;
3374d496ab4SDmitry Chagin 		narg--;
3384d496ab4SDmitry Chagin 		break;
3394d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
3404d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3414d496ab4SDmitry Chagin 		putchar(',');
3424d496ab4SDmitry Chagin 		decode_filemode(*ip);
3434d496ab4SDmitry Chagin 		ip++;
3444d496ab4SDmitry Chagin 		narg--;
3454d496ab4SDmitry Chagin 		break;
3464d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdir:
3474d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
3484d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3494d496ab4SDmitry Chagin 		putchar(',');
3504d496ab4SDmitry Chagin 		decode_filemode(*ip);
3514d496ab4SDmitry Chagin 		ip++;
3524d496ab4SDmitry Chagin 		narg--;
3534d496ab4SDmitry Chagin 		break;
3544d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
3554d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
3564d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_symlinkat:
3574d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3584d496ab4SDmitry Chagin 		putchar(',');
3594d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
3604d496ab4SDmitry Chagin 		ip++;
3614d496ab4SDmitry Chagin 		narg--;
3624d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3634d496ab4SDmitry Chagin 		break;
3644d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
3654d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3664d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3674d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3684d496ab4SDmitry Chagin 		break;
3694d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
3704d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
3714d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3724d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3734d496ab4SDmitry Chagin 		break;
3744d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
3754d496ab4SDmitry Chagin 		print_number(ip, narg, c);
3764d496ab4SDmitry Chagin 		break;
3778a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime:
3788a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime:
3798a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres:
3808a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_timer_create:
3818a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime64:
3828a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime64:
3838a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres_time64:
3848a0f6d8cSDmitry Chagin 		putchar('(');
3858a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
3868a0f6d8cSDmitry Chagin 		c = ',';
3878a0f6d8cSDmitry Chagin 		ip++;
3888a0f6d8cSDmitry Chagin 		narg--;
3898a0f6d8cSDmitry Chagin 		break;
39039de84b6SDmitry Chagin 	case LINUX32_SYS_linux_clock_nanosleep:
39139de84b6SDmitry Chagin 		putchar('(');
39239de84b6SDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
39339de84b6SDmitry Chagin 		putchar(',');
39439de84b6SDmitry Chagin 		ip++;
39539de84b6SDmitry Chagin 		narg--;
39639de84b6SDmitry Chagin 		print_mask_arg0(sysdecode_linux_clock_flags, *ip);
39739de84b6SDmitry Chagin 		c = ',';
39839de84b6SDmitry Chagin 		ip++;
39939de84b6SDmitry Chagin 		narg--;
40039de84b6SDmitry Chagin 		break;
401829f3d7dSDmitry Chagin 	case LINUX32_SYS_linux_clone:
402829f3d7dSDmitry Chagin 		putchar('(');
403829f3d7dSDmitry Chagin 		print_mask_arg(sysdecode_linux_clone_flags, *ip);
404829f3d7dSDmitry Chagin 		ip++;
405829f3d7dSDmitry Chagin 		narg--;
406829f3d7dSDmitry Chagin 		c = ',';
407829f3d7dSDmitry Chagin 		break;
4088a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_kill:
4098a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tkill:
4108a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigqueueinfo:
411c2c9ac88SDmitry Chagin 		print_decimal_number(ip, narg, c);
4128a0f6d8cSDmitry Chagin 		putchar(',');
4138a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4148a0f6d8cSDmitry Chagin 		ip++;
4158a0f6d8cSDmitry Chagin 		narg--;
4168a0f6d8cSDmitry Chagin 		break;
4178a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tgkill:
4188a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_tgsigqueueinfo:
419c2c9ac88SDmitry Chagin 		print_decimal_number(ip, narg, c);
420c2c9ac88SDmitry Chagin 		print_decimal_number(ip, narg, c);
4218a0f6d8cSDmitry Chagin 		putchar(',');
4228a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4238a0f6d8cSDmitry Chagin 		ip++;
4248a0f6d8cSDmitry Chagin 		narg--;
4258a0f6d8cSDmitry Chagin 		break;
4264d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_open:
4274d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
4284d496ab4SDmitry Chagin 		print_number(ip, narg, c);
4294d496ab4SDmitry Chagin 		putchar(',');
4304d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
4314d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
4324d496ab4SDmitry Chagin 			putchar(',');
4334d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
4344d496ab4SDmitry Chagin 		}
4354d496ab4SDmitry Chagin 		ip += 2;
4364d496ab4SDmitry Chagin 		narg -= 2;
4374d496ab4SDmitry Chagin 		break;
4388a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_signal:
4398a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_sigaction:
4408a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigaction:
4418a0f6d8cSDmitry Chagin 		putchar('(');
4428a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
4438a0f6d8cSDmitry Chagin 		ip++;
4448a0f6d8cSDmitry Chagin 		narg--;
4458a0f6d8cSDmitry Chagin 		c = ',';
4468a0f6d8cSDmitry Chagin 		break;
4478a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_ftruncate:
4488a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_truncate:
4498a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
4508a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
4518a0f6d8cSDmitry Chagin 		break;
452b9b86b67SDmitry Chagin 	case LINUX32_SYS_linux_getitimer:
453b9b86b67SDmitry Chagin 	case LINUX32_SYS_linux_setitimer:
454b9b86b67SDmitry Chagin 		putchar('(');
455b9b86b67SDmitry Chagin 		print_integer_arg(sysdecode_itimer, *ip);
456b9b86b67SDmitry Chagin 		ip++;
457b9b86b67SDmitry Chagin 		narg--;
458b9b86b67SDmitry Chagin 		c = ',';
459b9b86b67SDmitry Chagin 		break;
460f587a2a7SDmitry Chagin 	case LINUX32_SYS_linux_rt_sigprocmask:
461f587a2a7SDmitry Chagin 	case LINUX32_SYS_linux_sigprocmask:
462f587a2a7SDmitry Chagin 		putchar('(');
463f587a2a7SDmitry Chagin 		print_integer_arg(sysdecode_linux_sigprocmask_how, *ip);
464f587a2a7SDmitry Chagin 		ip++;
465f587a2a7SDmitry Chagin 		narg--;
466f587a2a7SDmitry Chagin 		c = ',';
467f587a2a7SDmitry Chagin 		break;
4688a0f6d8cSDmitry Chagin 	}
4694d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
4704d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
4714d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
4724d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
4734d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
4744d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
4754d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
4764d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
4774d496ab4SDmitry Chagin 		putchar(',');
4784d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
4794d496ab4SDmitry Chagin 		ip++;
4804d496ab4SDmitry Chagin 		narg--;
4814d496ab4SDmitry Chagin 		break;
4824d496ab4SDmitry Chagin 	}
4838a0f6d8cSDmitry Chagin 	*resc = c;
4848a0f6d8cSDmitry Chagin 	*resip = ip;
4858a0f6d8cSDmitry Chagin 	*resnarg = narg;
4868a0f6d8cSDmitry Chagin }
4878a0f6d8cSDmitry Chagin #endif /* __amd64__ */
4883606a213SDmitry Chagin 
4893606a213SDmitry Chagin static void
ktrsigset(const char * name,const l_sigset_t * mask,size_t sz)4903606a213SDmitry Chagin ktrsigset(const char *name, const l_sigset_t *mask, size_t sz)
4913606a213SDmitry Chagin {
4923606a213SDmitry Chagin 	unsigned long i, c;
4933606a213SDmitry Chagin 
4943606a213SDmitry Chagin 	printf("%s [ ", name);
4953606a213SDmitry Chagin 	c = 0;
4963606a213SDmitry Chagin 	for (i = 1; i <= sz * CHAR_BIT; i++) {
4973606a213SDmitry Chagin 		if (!LINUX_SIGISMEMBER(*mask, i))
4983606a213SDmitry Chagin 			continue;
4993606a213SDmitry Chagin 		if (c != 0)
5003606a213SDmitry Chagin 			printf(", ");
5013606a213SDmitry Chagin 		printf("%s", sysdecode_linux_signal(i));
5023606a213SDmitry Chagin 		c++;
5033606a213SDmitry Chagin 	}
5043606a213SDmitry Chagin 	if (c == 0)
5053606a213SDmitry Chagin 		printf("empty ]\n");
5063606a213SDmitry Chagin 	else
5073606a213SDmitry Chagin 		printf(" ]\n");
5083606a213SDmitry Chagin }
5093606a213SDmitry Chagin 
5103606a213SDmitry Chagin bool
ktrstruct_linux(const char * name,const char * data,size_t datalen)5113606a213SDmitry Chagin ktrstruct_linux(const char *name, const char *data, size_t datalen)
5123606a213SDmitry Chagin {
5133606a213SDmitry Chagin 	l_sigset_t mask;
5143606a213SDmitry Chagin 
5153606a213SDmitry Chagin 	if (strcmp(name, "l_sigset_t") == 0) {
5163606a213SDmitry Chagin 		/* Old Linux sigset_t is one word size. */
5173606a213SDmitry Chagin 		if (datalen < sizeof(int) || datalen > sizeof(l_sigset_t))
5183606a213SDmitry Chagin 			return (false);
5193606a213SDmitry Chagin 		memcpy(&mask, data, datalen);
5203606a213SDmitry Chagin 		ktrsigset(name, &mask, datalen);
5213606a213SDmitry Chagin 	} else
5223606a213SDmitry Chagin 		return (false);
5233606a213SDmitry Chagin 
5243606a213SDmitry Chagin 	return (true);
5253606a213SDmitry Chagin }
526