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); 285