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
72enum 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	StringArray,
156
157	/* Pointers to structures. */
158	Itimerval,
159	Kevent,
160	Kevent11,
161	LinuxSockArgs,
162	Msghdr,
163	Pollfd,
164	Rlimit,
165	Rusage,
166	Schedparam,
167	Sctpsndrcvinfo,
168	Sigaction,
169	Siginfo,
170	Sigset,
171	Sockaddr,
172	Stat,
173	Stat11,
174	StatFs,
175	Timespec,
176	Timespec2,
177	Timeval,
178	Timeval2,
179	Utrace,
180
181	CloudABIAdvice,
182	CloudABIClockID,
183	CloudABIFDSFlags,
184	CloudABIFDStat,
185	CloudABIFileStat,
186	CloudABIFileType,
187	CloudABIFSFlags,
188	CloudABILookup,
189	CloudABIMFlags,
190	CloudABIMProt,
191	CloudABIMSFlags,
192	CloudABIOFlags,
193	CloudABISDFlags,
194	CloudABISignal,
195	CloudABISockStat,
196	CloudABISSFlags,
197	CloudABITimestamp,
198	CloudABIULFlags,
199	CloudABIWhence,
200
201	MAX_ARG_TYPE,
202};
203
204#define	ARG_MASK	0xff
205#define	OUT	0x100
206#define	IN	/*0x20*/0
207
208_Static_assert(ARG_MASK > MAX_ARG_TYPE,
209    "ARG_MASK overlaps with Argtype values");
210
211struct syscall_args {
212	enum Argtype type;
213	int offset;
214};
215
216struct syscall {
217	STAILQ_ENTRY(syscall) entries;
218	const char *name;
219	u_int ret_type;	/* 0, 1, or 2 return values */
220	u_int nargs;	/* actual number of meaningful arguments */
221			/* Hopefully, no syscalls with > 10 args */
222	struct syscall_args args[10];
223	struct timespec time; /* Time spent for this call */
224	int ncalls;	/* Number of calls */
225	int nerror;	/* Number of calls that returned with error */
226	bool unknown;	/* Unknown system call */
227};
228
229struct syscall *get_syscall(struct threadinfo *, u_int, u_int);
230char *print_arg(struct syscall_args *, unsigned long*, register_t *,
231    struct trussinfo *);
232
233/*
234 * Linux Socket defines
235 */
236#define LINUX_SOCKET		1
237#define LINUX_BIND		2
238#define LINUX_CONNECT		3
239#define LINUX_LISTEN		4
240#define LINUX_ACCEPT		5
241#define LINUX_GETSOCKNAME	6
242#define LINUX_GETPEERNAME	7
243#define LINUX_SOCKETPAIR	8
244#define LINUX_SEND		9
245#define LINUX_RECV		10
246#define LINUX_SENDTO		11
247#define LINUX_RECVFROM		12
248#define LINUX_SHUTDOWN		13
249#define LINUX_SETSOCKOPT	14
250#define LINUX_GETSOCKOPT	15
251#define LINUX_SENDMSG		16
252#define LINUX_RECVMSG		17
253
254#define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
255    0 : sizeof(register_t) - sizeof(t))
256
257#if BYTE_ORDER == LITTLE_ENDIAN
258#define PADL_(t)	0
259#define PADR_(t)	PAD_(t)
260#else
261#define PADL_(t)	PAD_(t)
262#define PADR_(t)	0
263#endif
264
265typedef int     l_int;
266typedef uint32_t    l_ulong;
267
268struct linux_socketcall_args {
269    char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)];
270    char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)];
271};
272
273void init_syscalls(void);
274void print_syscall(struct trussinfo *);
275void print_syscall_ret(struct trussinfo *, int, register_t *);
276void print_summary(struct trussinfo *trussinfo);
277