]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/truss/syscall.h
Fix whitespace in comment modified by r368697
[FreeBSD/FreeBSD.git] / usr.bin / truss / syscall.h
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);