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