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 Sendfileflags, 121 Sendfilehdtr, 122 Quotactlcmd, 123 Reboothowto, 124 Resource, 125 Rforkflags, 126 Rtpriofunc, 127 RusageWho, 128 Schedpolicy, 129 ShmFlags, 130 Shutdown, 131 Signal, 132 Sigprocmask, 133 Sockdomain, 134 Sockoptlevel, 135 Sockoptname, 136 Sockprotocol, 137 Socktype, 138 Sysarch, 139 Sysctl, 140 Umtxop, 141 Waitoptions, 142 Whence, 143 144 /* Pointers to non-structures. */ 145 Ptr, 146 AiocbArray, 147 AiocbPointer, 148 BinString, 149 CapRights, 150 ExecArgs, 151 ExecEnv, 152 ExitStatus, 153 Fd_set, 154 IntArray, 155 Iovec, 156 Name, 157 PipeFds, 158 PSig, 159 PQuadHex, 160 PUInt, 161 Readlinkres, 162 ShmName, 163 StringArray, 164 165 /* Pointers to structures. */ 166 Aiocb, 167 Itimerval, 168 Kevent, 169 Kevent11, 170 LinuxSockArgs, 171 Msghdr, 172 Pollfd, 173 Rlimit, 174 Rusage, 175 Schedparam, 176 Sctpsndrcvinfo, 177 Sigaction, 178 Sigevent, 179 Siginfo, 180 Sigset, 181 Sockaddr, 182 Stat, 183 Stat11, 184 StatFs, 185 Timespec, 186 Timespec2, 187 Timeval, 188 Timeval2, 189 Utrace, 190 191 CloudABIAdvice, 192 CloudABIClockID, 193 CloudABIFDSFlags, 194 CloudABIFDStat, 195 CloudABIFileStat, 196 CloudABIFileType, 197 CloudABIFSFlags, 198 CloudABILookup, 199 CloudABIMFlags, 200 CloudABIMProt, 201 CloudABIMSFlags, 202 CloudABIOFlags, 203 CloudABISDFlags, 204 CloudABISignal, 205 CloudABISockStat, 206 CloudABISSFlags, 207 CloudABITimestamp, 208 CloudABIULFlags, 209 CloudABIWhence, 210 211 MAX_ARG_TYPE, 212 }; 213 214 #define ARG_MASK 0xff 215 #define OUT 0x100 216 #define IN /*0x20*/0 217 218 _Static_assert(ARG_MASK > MAX_ARG_TYPE, 219 "ARG_MASK overlaps with Argtype values"); 220 221 struct syscall_arg { 222 enum Argtype type; 223 int offset; 224 }; 225 226 struct syscall_decode { 227 const char *name; /* Name for calling convention lookup. */ 228 /* 229 * Syscall return type: 230 * 0: no return value (e.g. exit) 231 * 1: normal return value (a single int/long/pointer) 232 * 2: off_t return value (two values for 32-bit ABIs) 233 */ 234 u_int ret_type; 235 u_int nargs; /* number of meaningful arguments */ 236 struct syscall_arg args[10]; /* Hopefully no syscalls with > 10 args */ 237 }; 238 239 struct syscall { 240 STAILQ_ENTRY(syscall) entries; 241 const char *name; /* Name to be displayed, might be malloc()'d */ 242 struct syscall_decode decode; 243 struct timespec time; /* Time spent for this call */ 244 int ncalls; /* Number of calls */ 245 int nerror; /* Number of calls that returned with error */ 246 bool unknown; /* Unknown system call */ 247 }; 248 249 struct syscall *get_syscall(struct threadinfo *, u_int, u_int); 250 char *print_arg(struct syscall_arg *, unsigned long *, register_t *, 251 struct trussinfo *); 252 253 /* 254 * Linux Socket defines 255 */ 256 #define LINUX_SOCKET 1 257 #define LINUX_BIND 2 258 #define LINUX_CONNECT 3 259 #define LINUX_LISTEN 4 260 #define LINUX_ACCEPT 5 261 #define LINUX_GETSOCKNAME 6 262 #define LINUX_GETPEERNAME 7 263 #define LINUX_SOCKETPAIR 8 264 #define LINUX_SEND 9 265 #define LINUX_RECV 10 266 #define LINUX_SENDTO 11 267 #define LINUX_RECVFROM 12 268 #define LINUX_SHUTDOWN 13 269 #define LINUX_SETSOCKOPT 14 270 #define LINUX_GETSOCKOPT 15 271 #define LINUX_SENDMSG 16 272 #define LINUX_RECVMSG 17 273 274 #define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \ 275 0 : sizeof(register_t) - sizeof(t)) 276 277 #if BYTE_ORDER == LITTLE_ENDIAN 278 #define PADL_(t) 0 279 #define PADR_(t) PAD_(t) 280 #else 281 #define PADL_(t) PAD_(t) 282 #define PADR_(t) 0 283 #endif 284 285 typedef int l_int; 286 typedef uint32_t l_ulong; 287 288 struct linux_socketcall_args { 289 char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)]; 290 char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)]; 291 }; 292 293 void print_syscall(struct trussinfo *); 294 void print_syscall_ret(struct trussinfo *, int, register_t *); 295 void print_summary(struct trussinfo *trussinfo); 296