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 Closerangeflags, 95 Extattrnamespace, 96 Fadvice, 97 Fcntl, 98 Fcntlflag, 99 FileFlags, 100 Flockop, 101 Getfsstatmode, 102 Idtype, 103 Ioctl, 104 Itimerwhich, 105 Kldsymcmd, 106 Kldunloadflags, 107 LioMode, 108 Madvice, 109 Minherit, 110 Msgflags, 111 Mlockall, 112 Mmapflags, 113 Mountflags, 114 Mprot, 115 Msync, 116 Open, 117 Pathconf, 118 Pipe2, 119 Procctl, 120 Priowhich, 121 Ptraceop, 122 Sendfileflags, 123 Sendfilehdtr, 124 Quotactlcmd, 125 Reboothowto, 126 Resource, 127 Rforkflags, 128 Rtpriofunc, 129 RusageWho, 130 Schedpolicy, 131 ShmFlags, 132 Shutdown, 133 Signal, 134 Sigprocmask, 135 Sockdomain, 136 Sockoptlevel, 137 Sockoptname, 138 Sockprotocol, 139 Socktype, 140 Sysarch, 141 Sysctl, 142 Umtxop, 143 Waitoptions, 144 Whence, 145 146 /* Pointers to non-structures. */ 147 Ptr, 148 AiocbArray, 149 AiocbPointer, 150 BinString, 151 CapRights, 152 ExecArgs, 153 ExecEnv, 154 ExitStatus, 155 Fd_set, 156 IntArray, 157 Iovec, 158 Name, 159 PipeFds, 160 PSig, 161 PQuadHex, 162 PUInt, 163 Readlinkres, 164 ShmName, 165 StringArray, 166 167 /* Pointers to structures. */ 168 Aiocb, 169 Itimerval, 170 Kevent, 171 Kevent11, 172 LinuxSockArgs, 173 Msghdr, 174 Pollfd, 175 Rlimit, 176 Rusage, 177 Schedparam, 178 Sctpsndrcvinfo, 179 Sigaction, 180 Sigevent, 181 Siginfo, 182 Sigset, 183 Sockaddr, 184 Stat, 185 Stat11, 186 StatFs, 187 Timespec, 188 Timespec2, 189 Timeval, 190 Timeval2, 191 Utrace, 192 193 MAX_ARG_TYPE, 194 }; 195 196 #define ARG_MASK 0xff 197 #define OUT 0x100 198 #define IN /*0x20*/0 199 200 _Static_assert(ARG_MASK > MAX_ARG_TYPE, 201 "ARG_MASK overlaps with Argtype values"); 202 203 struct syscall_arg { 204 enum Argtype type; 205 int offset; 206 }; 207 208 struct syscall_decode { 209 const char *name; /* Name for calling convention lookup. */ 210 /* 211 * Syscall return type: 212 * 0: no return value (e.g. exit) 213 * 1: normal return value (a single int/long/pointer) 214 * 2: off_t return value (two values for 32-bit ABIs) 215 */ 216 u_int ret_type; 217 u_int nargs; /* number of meaningful arguments */ 218 struct syscall_arg args[10]; /* Hopefully no syscalls with > 10 args */ 219 }; 220 221 struct syscall { 222 STAILQ_ENTRY(syscall) entries; 223 const char *name; /* Name to be displayed, might be malloc()'d */ 224 struct syscall_decode decode; 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_arg *, syscallarg_t *, syscallarg_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(syscallarg_t) <= sizeof(t) ? \ 257 0 : sizeof(syscallarg_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 print_syscall(struct trussinfo *); 276 void print_syscall_ret(struct trussinfo *, int, syscallarg_t *); 277 void print_summary(struct trussinfo *trussinfo); 278