xref: /freebsd/usr.bin/truss/syscall.h (revision cfd6422a5217410fbd66f7a7a8a64d9d85e61229)
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 	Extattrnamespace,
95 	Fadvice,
96 	Fcntl,
97 	Fcntlflag,
98 	FileFlags,
99 	Flockop,
100 	Getfsstatmode,
101 	Idtype,
102 	Ioctl,
103 	Kldsymcmd,
104 	Kldunloadflags,
105 	LioMode,
106 	Madvice,
107 	Minherit,
108 	Msgflags,
109 	Mlockall,
110 	Mmapflags,
111 	Mountflags,
112 	Mprot,
113 	Msync,
114 	Open,
115 	Pathconf,
116 	Pipe2,
117 	Procctl,
118 	Priowhich,
119 	Ptraceop,
120 	Quotactlcmd,
121 	Reboothowto,
122 	Resource,
123 	Rforkflags,
124 	Rtpriofunc,
125 	RusageWho,
126 	Schedpolicy,
127 	ShmFlags,
128 	Shutdown,
129 	Signal,
130 	Sigprocmask,
131 	Sockdomain,
132 	Sockoptlevel,
133 	Sockoptname,
134 	Sockprotocol,
135 	Socktype,
136 	Sysarch,
137 	Sysctl,
138 	Umtxop,
139 	Waitoptions,
140 	Whence,
141 
142 	/* Pointers to non-structures. */
143 	Ptr,
144 	AiocbArray,
145 	AiocbPointer,
146 	BinString,
147 	CapRights,
148 	ExecArgs,
149 	ExecEnv,
150 	ExitStatus,
151 	Fd_set,
152 	IntArray,
153 	Iovec,
154 	Name,
155 	PipeFds,
156 	PSig,
157 	PQuadHex,
158 	PUInt,
159 	Readlinkres,
160 	ShmName,
161 	StringArray,
162 
163 	/* Pointers to structures. */
164 	Aiocb,
165 	Itimerval,
166 	Kevent,
167 	Kevent11,
168 	LinuxSockArgs,
169 	Msghdr,
170 	Pollfd,
171 	Rlimit,
172 	Rusage,
173 	Schedparam,
174 	Sctpsndrcvinfo,
175 	Sigaction,
176 	Sigevent,
177 	Siginfo,
178 	Sigset,
179 	Sockaddr,
180 	Stat,
181 	Stat11,
182 	StatFs,
183 	Timespec,
184 	Timespec2,
185 	Timeval,
186 	Timeval2,
187 	Utrace,
188 
189 	CloudABIAdvice,
190 	CloudABIClockID,
191 	CloudABIFDSFlags,
192 	CloudABIFDStat,
193 	CloudABIFileStat,
194 	CloudABIFileType,
195 	CloudABIFSFlags,
196 	CloudABILookup,
197 	CloudABIMFlags,
198 	CloudABIMProt,
199 	CloudABIMSFlags,
200 	CloudABIOFlags,
201 	CloudABISDFlags,
202 	CloudABISignal,
203 	CloudABISockStat,
204 	CloudABISSFlags,
205 	CloudABITimestamp,
206 	CloudABIULFlags,
207 	CloudABIWhence,
208 
209 	MAX_ARG_TYPE,
210 };
211 
212 #define	ARG_MASK	0xff
213 #define	OUT	0x100
214 #define	IN	/*0x20*/0
215 
216 _Static_assert(ARG_MASK > MAX_ARG_TYPE,
217     "ARG_MASK overlaps with Argtype values");
218 
219 struct syscall_args {
220 	enum Argtype type;
221 	int offset;
222 };
223 
224 struct syscall {
225 	STAILQ_ENTRY(syscall) entries;
226 	const char *name;
227 	u_int ret_type;	/* 0, 1, or 2 return values */
228 	u_int nargs;	/* actual number of meaningful arguments */
229 			/* Hopefully, no syscalls with > 10 args */
230 	struct syscall_args args[10];
231 	struct timespec time; /* Time spent for this call */
232 	int ncalls;	/* Number of calls */
233 	int nerror;	/* Number of calls that returned with error */
234 	bool unknown;	/* Unknown system call */
235 };
236 
237 struct syscall *get_syscall(struct threadinfo *, u_int, u_int);
238 char *print_arg(struct syscall_args *, unsigned long*, register_t *,
239     struct trussinfo *);
240 
241 /*
242  * Linux Socket defines
243  */
244 #define LINUX_SOCKET		1
245 #define LINUX_BIND		2
246 #define LINUX_CONNECT		3
247 #define LINUX_LISTEN		4
248 #define LINUX_ACCEPT		5
249 #define LINUX_GETSOCKNAME	6
250 #define LINUX_GETPEERNAME	7
251 #define LINUX_SOCKETPAIR	8
252 #define LINUX_SEND		9
253 #define LINUX_RECV		10
254 #define LINUX_SENDTO		11
255 #define LINUX_RECVFROM		12
256 #define LINUX_SHUTDOWN		13
257 #define LINUX_SETSOCKOPT	14
258 #define LINUX_GETSOCKOPT	15
259 #define LINUX_SENDMSG		16
260 #define LINUX_RECVMSG		17
261 
262 #define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
263     0 : sizeof(register_t) - sizeof(t))
264 
265 #if BYTE_ORDER == LITTLE_ENDIAN
266 #define PADL_(t)	0
267 #define PADR_(t)	PAD_(t)
268 #else
269 #define PADL_(t)	PAD_(t)
270 #define PADR_(t)	0
271 #endif
272 
273 typedef int     l_int;
274 typedef uint32_t    l_ulong;
275 
276 struct linux_socketcall_args {
277     char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)];
278     char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)];
279 };
280 
281 void init_syscalls(void);
282 void print_syscall(struct trussinfo *);
283 void print_syscall_ret(struct trussinfo *, int, register_t *);
284 void print_summary(struct trussinfo *trussinfo);
285