xref: /freebsd/usr.bin/kdump/linux.c (revision 4d496ab44a09a3a20dbec8968d1b4ef837ab10bb)
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__
44*4d496ab4SDmitry Chagin #include <amd64/linux/linux.h>
458a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h>
468a0f6d8cSDmitry Chagin #elif __aarch64__
47*4d496ab4SDmitry Chagin #include <arm64/linux/linux.h>
488a0f6d8cSDmitry Chagin #elif __i386__
49*4d496ab4SDmitry Chagin #include <i386/linux/linux.h>
508a0f6d8cSDmitry Chagin #endif
518a0f6d8cSDmitry Chagin 
523606a213SDmitry Chagin #include <compat/linux/linux.h>
53*4d496ab4SDmitry 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) {
81*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
82*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
83*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
84*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
85*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
86*4d496ab4SDmitry Chagin #endif
87*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
88*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
89*4d496ab4SDmitry Chagin #endif
90*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_futimesat
91*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_futimesat:
92*4d496ab4SDmitry Chagin #endif
93*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
94*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdirat:
95*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mknodat:
96*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
97*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_readlinkat:
98*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_renameat:
99*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
100*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
101*4d496ab4SDmitry Chagin 		putchar('(');
102*4d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
103*4d496ab4SDmitry Chagin 		c = ',';
104*4d496ab4SDmitry Chagin 		ip++;
105*4d496ab4SDmitry Chagin 		narg--;
106*4d496ab4SDmitry Chagin 		break;
107*4d496ab4SDmitry Chagin 	}
108*4d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
109*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_access
110*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_access:
111*4d496ab4SDmitry Chagin #endif
112*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
113*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
114*4d496ab4SDmitry Chagin 		putchar(',');
115*4d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
116*4d496ab4SDmitry Chagin 		ip++;
117*4d496ab4SDmitry Chagin 		narg--;
118*4d496ab4SDmitry Chagin 		break;
119*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_chmod
120*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_chmod:
121*4d496ab4SDmitry Chagin #endif
122*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
123*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
124*4d496ab4SDmitry Chagin 		putchar(',');
125*4d496ab4SDmitry Chagin 		decode_filemode(*ip);
126*4d496ab4SDmitry Chagin 		ip++;
127*4d496ab4SDmitry Chagin 		narg--;
128*4d496ab4SDmitry Chagin 		break;
129*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mknodat:
130*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
131*4d496ab4SDmitry Chagin 		putchar(',');
132*4d496ab4SDmitry Chagin 		decode_filemode(*ip);
133*4d496ab4SDmitry Chagin 		ip++;
134*4d496ab4SDmitry Chagin 		narg--;
135*4d496ab4SDmitry Chagin 		break;
136*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_mkdir
137*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdir:
138*4d496ab4SDmitry Chagin #endif
139*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_mkdirat:
140*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
141*4d496ab4SDmitry Chagin 		putchar(',');
142*4d496ab4SDmitry Chagin 		decode_filemode(*ip);
143*4d496ab4SDmitry Chagin 		ip++;
144*4d496ab4SDmitry Chagin 		narg--;
145*4d496ab4SDmitry Chagin 		break;
146*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
147*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_renameat:
148*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_symlinkat:
149*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
150*4d496ab4SDmitry Chagin 		putchar(',');
151*4d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
152*4d496ab4SDmitry Chagin 		ip++;
153*4d496ab4SDmitry Chagin 		narg--;
154*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
155*4d496ab4SDmitry Chagin 		break;
156*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
157*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
158*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
159*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
160*4d496ab4SDmitry Chagin 		break;
161*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
162*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
163*4d496ab4SDmitry Chagin #endif
164*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
165*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
166*4d496ab4SDmitry Chagin #endif
167*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
168*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
169*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
170*4d496ab4SDmitry Chagin 		break;
171*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
172*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
173*4d496ab4SDmitry 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;
213*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_open
214*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_open:
215*4d496ab4SDmitry Chagin #endif
216*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_openat:
217*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
218*4d496ab4SDmitry Chagin 		putchar(',');
219*4d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
220*4d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
221*4d496ab4SDmitry Chagin 			putchar(',');
222*4d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
223*4d496ab4SDmitry Chagin 		}
224*4d496ab4SDmitry Chagin 		ip += 2;
225*4d496ab4SDmitry Chagin 		narg -= 2;
226*4d496ab4SDmitry 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 	}
258*4d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
259*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchownat:
260*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_faccessat:
261*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fchmodat:
262*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat
263*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_newfstatat:
264*4d496ab4SDmitry Chagin #endif
265*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64
266*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_fstatat64:
267*4d496ab4SDmitry Chagin #endif
268*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_linkat:
269*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_unlinkat:
270*4d496ab4SDmitry Chagin 	case LINUX_SYS_linux_utimensat:
271*4d496ab4SDmitry Chagin 		putchar(',');
272*4d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
273*4d496ab4SDmitry Chagin 		ip++;
274*4d496ab4SDmitry Chagin 		narg--;
275*4d496ab4SDmitry Chagin 		break;
276*4d496ab4SDmitry 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) {
297*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
298*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
299*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
300*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
301*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_futimesat:
302*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
303*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
304*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
305*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
306*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_readlinkat:
307*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
308*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
309*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
310*4d496ab4SDmitry Chagin 		putchar('(');
311*4d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
312*4d496ab4SDmitry Chagin 		c = ',';
313*4d496ab4SDmitry Chagin 		ip++;
314*4d496ab4SDmitry Chagin 		narg--;
315*4d496ab4SDmitry Chagin 		break;
316*4d496ab4SDmitry Chagin 	}
317*4d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
318*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_access:
319*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
320*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
321*4d496ab4SDmitry Chagin 		putchar(',');
322*4d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_access_mode, *ip);
323*4d496ab4SDmitry Chagin 		ip++;
324*4d496ab4SDmitry Chagin 		narg--;
325*4d496ab4SDmitry Chagin 		break;
326*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_chmod:
327*4d496ab4SDmitry Chagin 	case LINUX32_SYS_fchmod:
328*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
329*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
330*4d496ab4SDmitry Chagin 		putchar(',');
331*4d496ab4SDmitry Chagin 		decode_filemode(*ip);
332*4d496ab4SDmitry Chagin 		ip++;
333*4d496ab4SDmitry Chagin 		narg--;
334*4d496ab4SDmitry Chagin 		break;
335*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mknodat:
336*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
337*4d496ab4SDmitry Chagin 		putchar(',');
338*4d496ab4SDmitry Chagin 		decode_filemode(*ip);
339*4d496ab4SDmitry Chagin 		ip++;
340*4d496ab4SDmitry Chagin 		narg--;
341*4d496ab4SDmitry Chagin 		break;
342*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdir:
343*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_mkdirat:
344*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
345*4d496ab4SDmitry Chagin 		putchar(',');
346*4d496ab4SDmitry Chagin 		decode_filemode(*ip);
347*4d496ab4SDmitry Chagin 		ip++;
348*4d496ab4SDmitry Chagin 		narg--;
349*4d496ab4SDmitry Chagin 		break;
350*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
351*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_renameat:
352*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_symlinkat:
353*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
354*4d496ab4SDmitry Chagin 		putchar(',');
355*4d496ab4SDmitry Chagin 		print_integer_arg_valid(sysdecode_atfd, *ip);
356*4d496ab4SDmitry Chagin 		ip++;
357*4d496ab4SDmitry Chagin 		narg--;
358*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
359*4d496ab4SDmitry Chagin 		break;
360*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
361*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
362*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
363*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
364*4d496ab4SDmitry Chagin 		break;
365*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
366*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
367*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
368*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
369*4d496ab4SDmitry Chagin 		break;
370*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
371*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
372*4d496ab4SDmitry 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;
415*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_open:
416*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_openat:
417*4d496ab4SDmitry Chagin 		print_number(ip, narg, c);
418*4d496ab4SDmitry Chagin 		putchar(',');
419*4d496ab4SDmitry Chagin 		print_mask_arg(sysdecode_linux_open_flags, ip[0]);
420*4d496ab4SDmitry Chagin 		if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) {
421*4d496ab4SDmitry Chagin 			putchar(',');
422*4d496ab4SDmitry Chagin 			decode_filemode(ip[1]);
423*4d496ab4SDmitry Chagin 		}
424*4d496ab4SDmitry Chagin 		ip += 2;
425*4d496ab4SDmitry Chagin 		narg -= 2;
426*4d496ab4SDmitry 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 	}
458*4d496ab4SDmitry Chagin 	switch (ktr->ktr_code) {
459*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchownat:
460*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_faccessat:
461*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fchmodat:
462*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_fstatat64:
463*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_linkat:
464*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_unlinkat:
465*4d496ab4SDmitry Chagin 	case LINUX32_SYS_linux_utimensat:
466*4d496ab4SDmitry Chagin 		putchar(',');
467*4d496ab4SDmitry Chagin 		print_mask_arg0(sysdecode_linux_atflags, *ip);
468*4d496ab4SDmitry Chagin 		ip++;
469*4d496ab4SDmitry Chagin 		narg--;
470*4d496ab4SDmitry Chagin 		break;
471*4d496ab4SDmitry 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