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