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