xref: /freebsd/usr.bin/kdump/linux.c (revision 8a0f6d8cfdb75a9484c456984ff55192f8b16886)
1*8a0f6d8cSDmitry Chagin /*-
2*8a0f6d8cSDmitry Chagin  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*8a0f6d8cSDmitry Chagin  *
4*8a0f6d8cSDmitry Chagin  * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org>
5*8a0f6d8cSDmitry Chagin  *
6*8a0f6d8cSDmitry Chagin  * Redistribution and use in source and binary forms, with or without
7*8a0f6d8cSDmitry Chagin  * modification, are permitted provided that the following conditions
8*8a0f6d8cSDmitry Chagin  * are met:
9*8a0f6d8cSDmitry Chagin  * 1. Redistributions of source code must retain the above copyright
10*8a0f6d8cSDmitry Chagin  *    notice, this list of conditions and the following disclaimer.
11*8a0f6d8cSDmitry Chagin  * 2. Redistributions in binary form must reproduce the above copyright
12*8a0f6d8cSDmitry Chagin  *    notice, this list of conditions and the following disclaimer in the
13*8a0f6d8cSDmitry Chagin  *    documentation and/or other materials provided with the distribution.
14*8a0f6d8cSDmitry Chagin  *
15*8a0f6d8cSDmitry Chagin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*8a0f6d8cSDmitry Chagin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*8a0f6d8cSDmitry Chagin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*8a0f6d8cSDmitry Chagin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*8a0f6d8cSDmitry Chagin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*8a0f6d8cSDmitry Chagin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*8a0f6d8cSDmitry Chagin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*8a0f6d8cSDmitry Chagin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*8a0f6d8cSDmitry Chagin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*8a0f6d8cSDmitry Chagin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*8a0f6d8cSDmitry Chagin  * SUCH DAMAGE.
26*8a0f6d8cSDmitry Chagin  */
27*8a0f6d8cSDmitry Chagin 
28*8a0f6d8cSDmitry Chagin #include <sys/cdefs.h>
29*8a0f6d8cSDmitry Chagin __FBSDID("$FreeBSD$");
30*8a0f6d8cSDmitry Chagin 
31*8a0f6d8cSDmitry Chagin #include <sys/param.h>
32*8a0f6d8cSDmitry Chagin #include <sys/uio.h>
33*8a0f6d8cSDmitry Chagin #include <sys/ktrace.h>
34*8a0f6d8cSDmitry Chagin #include <stddef.h>
35*8a0f6d8cSDmitry Chagin #include <sysdecode.h>
36*8a0f6d8cSDmitry Chagin 
37*8a0f6d8cSDmitry Chagin #include "kdump.h"
38*8a0f6d8cSDmitry Chagin 
39*8a0f6d8cSDmitry Chagin #ifdef __amd64__
40*8a0f6d8cSDmitry Chagin #include <amd64/linux/linux_syscall.h>
41*8a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h>
42*8a0f6d8cSDmitry Chagin #elif __aarch64__
43*8a0f6d8cSDmitry Chagin #include <arm64/linux/linux_syscall.h>
44*8a0f6d8cSDmitry Chagin #elif __i386__
45*8a0f6d8cSDmitry Chagin #include <i386/linux/linux_syscall.h>
46*8a0f6d8cSDmitry Chagin #endif
47*8a0f6d8cSDmitry Chagin 
48*8a0f6d8cSDmitry Chagin static void
49*8a0f6d8cSDmitry Chagin print_linux_signal(int signo)
50*8a0f6d8cSDmitry Chagin {
51*8a0f6d8cSDmitry Chagin 	const char *signame;
52*8a0f6d8cSDmitry Chagin 
53*8a0f6d8cSDmitry Chagin 	signame = sysdecode_linux_signal(signo);
54*8a0f6d8cSDmitry Chagin 	if (signame != NULL)
55*8a0f6d8cSDmitry Chagin 		printf("%s", signame);
56*8a0f6d8cSDmitry Chagin 	else
57*8a0f6d8cSDmitry Chagin 		printf("SIG %d", signo);
58*8a0f6d8cSDmitry Chagin }
59*8a0f6d8cSDmitry Chagin 
60*8a0f6d8cSDmitry Chagin void
61*8a0f6d8cSDmitry Chagin ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip,
62*8a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
63*8a0f6d8cSDmitry Chagin {
64*8a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
65*8a0f6d8cSDmitry Chagin 	register_t *ip, *first;
66*8a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
67*8a0f6d8cSDmitry Chagin 	char c;
68*8a0f6d8cSDmitry Chagin 
69*8a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
70*8a0f6d8cSDmitry Chagin 	c = *resc;
71*8a0f6d8cSDmitry Chagin 	quad_align = 0;
72*8a0f6d8cSDmitry Chagin 	quad_slots = 1;
73*8a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
74*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_gettime:
75*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_settime:
76*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_clock_getres:
77*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_timer_create:
78*8a0f6d8cSDmitry Chagin 		putchar('(');
79*8a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
80*8a0f6d8cSDmitry Chagin 		c = ',';
81*8a0f6d8cSDmitry Chagin 		ip++;
82*8a0f6d8cSDmitry Chagin 		narg--;
83*8a0f6d8cSDmitry Chagin 		break;
84*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_kill:
85*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tkill:
86*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigqueueinfo:
87*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
88*8a0f6d8cSDmitry Chagin 		putchar(',');
89*8a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
90*8a0f6d8cSDmitry Chagin 		ip++;
91*8a0f6d8cSDmitry Chagin 		narg--;
92*8a0f6d8cSDmitry Chagin 		break;
93*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_tgkill:
94*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_tgsigqueueinfo:
95*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
96*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
97*8a0f6d8cSDmitry Chagin 		putchar(',');
98*8a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
99*8a0f6d8cSDmitry Chagin 		ip++;
100*8a0f6d8cSDmitry Chagin 		narg--;
101*8a0f6d8cSDmitry Chagin 		break;
102*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_rt_sigaction:
103*8a0f6d8cSDmitry Chagin 		putchar('(');
104*8a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
105*8a0f6d8cSDmitry Chagin 		ip++;
106*8a0f6d8cSDmitry Chagin 		narg--;
107*8a0f6d8cSDmitry Chagin 		c = ',';
108*8a0f6d8cSDmitry Chagin 		break;
109*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_ftruncate:
110*8a0f6d8cSDmitry Chagin 	case LINUX_SYS_linux_truncate:
111*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
112*8a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
113*8a0f6d8cSDmitry Chagin 		break;
114*8a0f6d8cSDmitry Chagin 	}
115*8a0f6d8cSDmitry Chagin 	*resc = c;
116*8a0f6d8cSDmitry Chagin 	*resip = ip;
117*8a0f6d8cSDmitry Chagin 	*resnarg = narg;
118*8a0f6d8cSDmitry Chagin }
119*8a0f6d8cSDmitry Chagin 
120*8a0f6d8cSDmitry Chagin #if defined(__amd64__)
121*8a0f6d8cSDmitry Chagin void
122*8a0f6d8cSDmitry Chagin ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip,
123*8a0f6d8cSDmitry Chagin     int *resnarg, char *resc)
124*8a0f6d8cSDmitry Chagin {
125*8a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
126*8a0f6d8cSDmitry Chagin 	register_t *ip, *first;
127*8a0f6d8cSDmitry Chagin 	int quad_align, quad_slots;
128*8a0f6d8cSDmitry Chagin 	char c;
129*8a0f6d8cSDmitry Chagin 
130*8a0f6d8cSDmitry Chagin 	ip = first = &ktr->ktr_args[0];
131*8a0f6d8cSDmitry Chagin 	c = *resc;
132*8a0f6d8cSDmitry Chagin 	quad_align = 0;
133*8a0f6d8cSDmitry Chagin 	quad_slots = 2;
134*8a0f6d8cSDmitry Chagin 	switch (ktr->ktr_code) {
135*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime:
136*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime:
137*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres:
138*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_timer_create:
139*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_gettime64:
140*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_settime64:
141*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_clock_getres_time64:
142*8a0f6d8cSDmitry Chagin 		putchar('(');
143*8a0f6d8cSDmitry Chagin 		sysdecode_linux_clockid(stdout, *ip);
144*8a0f6d8cSDmitry Chagin 		c = ',';
145*8a0f6d8cSDmitry Chagin 		ip++;
146*8a0f6d8cSDmitry Chagin 		narg--;
147*8a0f6d8cSDmitry Chagin 		break;
148*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_kill:
149*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tkill:
150*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigqueueinfo:
151*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
152*8a0f6d8cSDmitry Chagin 		putchar(',');
153*8a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
154*8a0f6d8cSDmitry Chagin 		ip++;
155*8a0f6d8cSDmitry Chagin 		narg--;
156*8a0f6d8cSDmitry Chagin 		break;
157*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_tgkill:
158*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_tgsigqueueinfo:
159*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
160*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
161*8a0f6d8cSDmitry Chagin 		putchar(',');
162*8a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
163*8a0f6d8cSDmitry Chagin 		ip++;
164*8a0f6d8cSDmitry Chagin 		narg--;
165*8a0f6d8cSDmitry Chagin 		break;
166*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_signal:
167*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_sigaction:
168*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_rt_sigaction:
169*8a0f6d8cSDmitry Chagin 		putchar('(');
170*8a0f6d8cSDmitry Chagin 		print_linux_signal(*ip);
171*8a0f6d8cSDmitry Chagin 		ip++;
172*8a0f6d8cSDmitry Chagin 		narg--;
173*8a0f6d8cSDmitry Chagin 		c = ',';
174*8a0f6d8cSDmitry Chagin 		break;
175*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_ftruncate:
176*8a0f6d8cSDmitry Chagin 	case LINUX32_SYS_linux_truncate:
177*8a0f6d8cSDmitry Chagin 		print_number(ip, narg, c);
178*8a0f6d8cSDmitry Chagin 		print_number64(first, ip, narg, c);
179*8a0f6d8cSDmitry Chagin 		break;
180*8a0f6d8cSDmitry Chagin 	}
181*8a0f6d8cSDmitry Chagin 	*resc = c;
182*8a0f6d8cSDmitry Chagin 	*resip = ip;
183*8a0f6d8cSDmitry Chagin 	*resnarg = narg;
184*8a0f6d8cSDmitry Chagin }
185*8a0f6d8cSDmitry Chagin #endif /* __amd64__ */
186