]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/truss/syscall.h
Merge ^/head r358075 through r358130.
[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         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         ShmFlags,
126         Shutdown,
127         Signal,
128         Sigprocmask,
129         Sockdomain,
130         Sockoptlevel,
131         Sockoptname,
132         Sockprotocol,
133         Socktype,
134         Sysarch,
135         Sysctl,
136         Umtxop,
137         Waitoptions,
138         Whence,
139
140         /* Pointers to non-structures. */
141         Ptr,
142         BinString,
143         CapRights,
144         ExecArgs,
145         ExecEnv,
146         ExitStatus,
147         Fd_set,
148         IntArray,
149         Iovec,
150         Name,
151         PipeFds,
152         PSig,
153         PQuadHex,
154         PUInt,
155         Readlinkres,
156         ShmName,
157         StringArray,
158
159         /* Pointers to structures. */
160         Itimerval,
161         Kevent,
162         Kevent11,
163         LinuxSockArgs,
164         Msghdr,
165         Pollfd,
166         Rlimit,
167         Rusage,
168         Schedparam,
169         Sctpsndrcvinfo,
170         Sigaction,
171         Siginfo,
172         Sigset,
173         Sockaddr,
174         Stat,
175         Stat11,
176         StatFs,
177         Timespec,
178         Timespec2,
179         Timeval,
180         Timeval2,
181         Utrace,
182
183         CloudABIAdvice,
184         CloudABIClockID,
185         CloudABIFDSFlags,
186         CloudABIFDStat,
187         CloudABIFileStat,
188         CloudABIFileType,
189         CloudABIFSFlags,
190         CloudABILookup,
191         CloudABIMFlags,
192         CloudABIMProt,
193         CloudABIMSFlags,
194         CloudABIOFlags,
195         CloudABISDFlags,
196         CloudABISignal,
197         CloudABISockStat,
198         CloudABISSFlags,
199         CloudABITimestamp,
200         CloudABIULFlags,
201         CloudABIWhence,
202
203         MAX_ARG_TYPE,
204 };
205
206 #define ARG_MASK        0xff
207 #define OUT     0x100
208 #define IN      /*0x20*/0
209
210 _Static_assert(ARG_MASK > MAX_ARG_TYPE,
211     "ARG_MASK overlaps with Argtype values");
212
213 struct syscall_args {
214         enum Argtype type;
215         int offset;
216 };
217
218 struct syscall {
219         STAILQ_ENTRY(syscall) entries;
220         const char *name;
221         u_int ret_type; /* 0, 1, or 2 return values */
222         u_int nargs;    /* actual number of meaningful arguments */
223                         /* Hopefully, no syscalls with > 10 args */
224         struct syscall_args args[10];
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_args *, unsigned long*, register_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(register_t) <= sizeof(t) ? \
257     0 : sizeof(register_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 init_syscalls(void);
276 void print_syscall(struct trussinfo *);
277 void print_syscall_ret(struct trussinfo *, int, register_t *);
278 void print_summary(struct trussinfo *trussinfo);