xref: /freebsd/usr.bin/truss/syscall.h (revision d4eeb02986980bf33dd56c41ceb9fc5f180c0d47)
1 /*-
2  * SPDX-License-Identifier: BSD-4-Clause
3  *
4  * Copyright 1997 Sean Eric Fagan
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Sean Eric Fagan
17  * 4. Neither the name of the author may be used to endorse or promote
18  *    products derived from this software without specific prior written
19  *    permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * $FreeBSD$
34  */
35 
36 /*
37  * System call arguments come in several flavours:
38  * Hex -- values that should be printed in hex (addresses)
39  * Octal -- Same as above, but octal
40  * Int -- normal integer values (file descriptors, for example)
41  * LongHex -- long value that should be printed in hex
42  * Name -- pointer to a NULL-terminated string.
43  * BinString -- pointer to an array of chars, printed via strvisx().
44  * Ptr -- pointer to some unspecified structure.  Just print as hex for now.
45  * Stat -- a pointer to a stat buffer.  Prints a couple fields.
46  * Stat11 -- a pointer to a freebsd 11 stat buffer.  Prints a couple fields.
47  * StatFs -- a pointer to a statfs buffer.  Prints a few fields.
48  * Ioctl -- an ioctl command.  Woefully limited.
49  * Quad -- a double-word value.  e.g., lseek(int, offset_t, int)
50  * Signal -- a signal number.  Prints the signal name (SIGxxx)
51  * Sockaddr -- a pointer to a struct sockaddr.  Prints symbolic AF, and IP:Port
52  * StringArray -- a pointer to an array of string pointers.
53  * Timespec -- a pointer to a struct timespec.  Prints both elements.
54  * Timeval -- a pointer to a struct timeval.  Prints both elements.
55  * Timeval2 -- a pointer to two struct timevals.  Prints both elements of both.
56  * Itimerval -- a pointer to a struct itimerval.  Prints all elements.
57  * Pollfd -- a pointer to an array of struct pollfd.  Prints .fd and .events.
58  * Fd_set -- a pointer to an array of fd_set.  Prints the fds that are set.
59  * Sigaction -- a pointer to a struct sigaction.  Prints all elements.
60  * Sigset -- a pointer to a sigset_t.  Prints the signals that are set.
61  * Sigprocmask -- the first argument to sigprocmask().  Prints the name.
62  * Kevent -- a pointer to an array of struct kevents.  Prints all elements.
63  * Pathconf -- the 2nd argument of pathconf().
64  * Utrace -- utrace(2) buffer.
65  * CapRights -- a pointer to a cap_rights_t.  Prints all set capabilities.
66  *
67  * In addition, the pointer types (String, Ptr) may have OUT masked in --
68  * this means that the data is set on *return* from the system call -- or
69  * IN (meaning that the data is passed *into* the system call).
70  */
71 
72 enum Argtype {
73 	None = 1,
74 
75 	/* Scalar integers. */
76 	Socklent,
77 	Octal,
78 	Int,
79 	UInt,
80 	Hex,
81 	Long,
82 	LongHex,
83 	Sizet,
84 	Quad,
85 	QuadHex,
86 
87 	/* Encoded scalar values. */
88 	Accessmode,
89 	Acltype,
90 	AiofsyncOp,
91 	Atfd,
92 	Atflags,
93 	CapFcntlRights,
94 	Closerangeflags,
95 	Extattrnamespace,
96 	Fadvice,
97 	Fcntl,
98 	Fcntlflag,
99 	FileFlags,
100 	Flockop,
101 	Getfsstatmode,
102 	Idtype,
103 	Ioctl,
104 	Itimerwhich,
105 	Kldsymcmd,
106 	Kldunloadflags,
107 	LioMode,
108 	Madvice,
109 	Minherit,
110 	Msgflags,
111 	Mlockall,
112 	Mmapflags,
113 	Mountflags,
114 	Mprot,
115 	Msync,
116 	Open,
117 	Pathconf,
118 	Pipe2,
119 	Procctl,
120 	Priowhich,
121 	Ptraceop,
122 	Sendfileflags,
123 	Sendfilehdtr,
124 	Quotactlcmd,
125 	Reboothowto,
126 	Resource,
127 	Rforkflags,
128 	Rtpriofunc,
129 	RusageWho,
130 	Schedpolicy,
131 	ShmFlags,
132 	Shutdown,
133 	Signal,
134 	Sigprocmask,
135 	Sockdomain,
136 	Sockoptlevel,
137 	Sockoptname,
138 	Sockprotocol,
139 	Socktype,
140 	Sysarch,
141 	Sysctl,
142 	Umtxop,
143 	Waitoptions,
144 	Whence,
145 
146 	/* Pointers to non-structures. */
147 	Ptr,
148 	AiocbArray,
149 	AiocbPointer,
150 	BinString,
151 	CapRights,
152 	ExecArgs,
153 	ExecEnv,
154 	ExitStatus,
155 	Fd_set,
156 	IntArray,
157 	Iovec,
158 	Name,
159 	PipeFds,
160 	PSig,
161 	PQuadHex,
162 	PUInt,
163 	Readlinkres,
164 	ShmName,
165 	StringArray,
166 
167 	/* Pointers to structures. */
168 	Aiocb,
169 	Itimerval,
170 	Kevent,
171 	Kevent11,
172 	LinuxSockArgs,
173 	Msghdr,
174 	Pollfd,
175 	Rlimit,
176 	Rusage,
177 	Schedparam,
178 	Sctpsndrcvinfo,
179 	Sigaction,
180 	Sigevent,
181 	Siginfo,
182 	Sigset,
183 	Sockaddr,
184 	Stat,
185 	Stat11,
186 	StatFs,
187 	Timespec,
188 	Timespec2,
189 	Timeval,
190 	Timeval2,
191 	Utrace,
192 
193 	MAX_ARG_TYPE,
194 };
195 
196 #define	ARG_MASK	0xff
197 #define	OUT	0x100
198 #define	IN	/*0x20*/0
199 
200 _Static_assert(ARG_MASK > MAX_ARG_TYPE,
201     "ARG_MASK overlaps with Argtype values");
202 
203 struct syscall_arg {
204 	enum Argtype type;
205 	int offset;
206 };
207 
208 struct syscall_decode {
209 	const char *name; /* Name for calling convention lookup. */
210 	/*
211 	 * Syscall return type:
212 	 * 0: no return value (e.g. exit)
213 	 * 1: normal return value (a single int/long/pointer)
214 	 * 2: off_t return value (two values for 32-bit ABIs)
215 	 */
216 	u_int ret_type;
217 	u_int nargs;		     /* number of meaningful arguments */
218 	struct syscall_arg args[10]; /* Hopefully no syscalls with > 10 args */
219 };
220 
221 struct syscall {
222 	STAILQ_ENTRY(syscall) entries;
223 	const char *name;	/* Name to be displayed, might be malloc()'d */
224 	struct syscall_decode decode;
225 	struct timespec time; /* Time spent for this call */
226 	int ncalls;	/* Number of calls */
227 	int nerror;	/* Number of calls that returned with error */
228 	bool unknown;	/* Unknown system call */
229 };
230 
231 struct syscall *get_syscall(struct threadinfo *, u_int, u_int);
232 char *print_arg(struct syscall_arg *, syscallarg_t *, syscallarg_t *,
233     struct trussinfo *);
234 
235 /*
236  * Linux Socket defines
237  */
238 #define LINUX_SOCKET		1
239 #define LINUX_BIND		2
240 #define LINUX_CONNECT		3
241 #define LINUX_LISTEN		4
242 #define LINUX_ACCEPT		5
243 #define LINUX_GETSOCKNAME	6
244 #define LINUX_GETPEERNAME	7
245 #define LINUX_SOCKETPAIR	8
246 #define LINUX_SEND		9
247 #define LINUX_RECV		10
248 #define LINUX_SENDTO		11
249 #define LINUX_RECVFROM		12
250 #define LINUX_SHUTDOWN		13
251 #define LINUX_SETSOCKOPT	14
252 #define LINUX_GETSOCKOPT	15
253 #define LINUX_SENDMSG		16
254 #define LINUX_RECVMSG		17
255 
256 #define PAD_(t) (sizeof(syscallarg_t) <= sizeof(t) ? \
257     0 : sizeof(syscallarg_t) - sizeof(t))
258 
259 #if BYTE_ORDER == LITTLE_ENDIAN
260 #define PADL_(t)	0
261 #define PADR_(t)	PAD_(t)
262 #else
263 #define PADL_(t)	PAD_(t)
264 #define PADR_(t)	0
265 #endif
266 
267 typedef int     l_int;
268 typedef uint32_t    l_ulong;
269 
270 struct linux_socketcall_args {
271     char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)];
272     char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)];
273 };
274 
275 void print_syscall(struct trussinfo *);
276 void print_syscall_ret(struct trussinfo *, int, syscallarg_t *);
277 void print_summary(struct trussinfo *trussinfo);
278