this repo has no description
at fixPythonPipStalling 1821 lines 78 kB view raw
1#include <darling/emulation/common/simple.h> 2#include <unistd.h> 3#include <fcntl.h> 4#include <sys/mman.h> 5#include <pthread.h> 6#include <limits.h> 7 8#define PRIVATE 1 9#include <spawn_private.h> 10#include <sys/event.h> 11 12#include "xtracelib.h" 13#include "bsd_trace.h" 14#include "tls.h" 15 16static void print_errno(xtrace::String* log, int nr, uintptr_t rv); 17static void print_errno_num(xtrace::String* log, int nr, uintptr_t rv); 18static void print_errno_ptr(xtrace::String* log, int nr, uintptr_t rv); 19 20static void print_args(xtrace::String* log, int nr, void* args[]); 21 22static void print_kevent_return(xtrace::String* log, int nr, uintptr_t rv); 23static void print_kevent_args(xtrace::String* log, int nr, void* args[]); 24static void print_kevent64_return(xtrace::String* log, int nr, uintptr_t rv); 25static void print_kevent64_args(xtrace::String* log, int nr, void* args[]); 26static void print_kevent_qos_return(xtrace::String* log, int nr, uintptr_t rv); 27static void print_kevent_qos_args(xtrace::String* log, int nr, void* args[]); 28 29static void print_select_return(xtrace::String* log, int nr, uintptr_t rv); 30static void print_select_args(xtrace::String* log, int nr, void* args[]); 31 32static void print_timespec(xtrace::String* log, const struct timespec* timespec); 33 34// awk '/^[0-9]/ { if ($6 !~ "nosys") { split($6, a, "("); print "[" $1 "] = { \"" a[1] "\", print_args, print_errno }," } }' 35 36static const struct calldef bsd_defs[600] = { 37 [1] = { "exit", print_args, print_errno_num }, 38 [2] = { "fork", print_args, print_errno_num }, 39 [3] = { "read", print_args, print_errno_num }, 40 [4] = { "write", print_args, print_errno_num }, 41 [5] = { "open", print_args, print_errno_num }, 42 [6] = { "close", print_args, print_errno_num }, 43 [7] = { "wait4", print_args, print_errno_num }, 44 [9] = { "link", print_args, print_errno_num }, 45 [10] = { "unlink", print_args, print_errno_num }, 46 [12] = { "chdir", print_args, print_errno_num }, 47 [13] = { "fchdir", print_args, print_errno_num }, 48 [14] = { "mknod", print_args, print_errno_num }, 49 [15] = { "chmod", print_args, print_errno_num }, 50 [16] = { "chown", print_args, print_errno_num }, 51 [18] = { "getfsstat", print_args, print_errno_num }, 52 [20] = { "getpid", print_args, print_errno_num }, 53 [23] = { "setuid", print_args, print_errno_num }, 54 [24] = { "getuid", print_args, print_errno_num }, 55 [25] = { "geteuid", print_args, print_errno_num }, 56 [26] = { "ptrace", print_args, print_errno_num }, 57 [27] = { "recvmsg", print_args, print_errno_num }, 58 [28] = { "sendmsg", print_args, print_errno_num }, 59 [29] = { "recvfrom", print_args, print_errno_num }, 60 [30] = { "accept", print_args, print_errno_num }, 61 [31] = { "getpeername", print_args, print_errno_num }, 62 [32] = { "getsockname", print_args, print_errno_num }, 63 [33] = { "access", print_args, print_errno_num }, 64 [34] = { "chflags", print_args, print_errno_num }, 65 [35] = { "fchflags", print_args, print_errno_num }, 66 [36] = { "sync", print_args, print_errno_num }, 67 [37] = { "kill", print_args, print_errno_num }, 68 [39] = { "getppid", print_args, print_errno_num }, 69 [41] = { "dup", print_args, print_errno_num }, 70 [42] = { "pipe", print_args, print_errno_num }, 71 [43] = { "getegid", print_args, print_errno_num }, 72 [46] = { "sigaction", print_args, print_errno_num }, 73 [47] = { "getgid", print_args, print_errno_num }, 74 [48] = { "sigprocmask", print_args, print_errno_num }, 75 [49] = { "getlogin", print_args, print_errno_num }, 76 [50] = { "setlogin", print_args, print_errno_num }, 77 [51] = { "acct", print_args, print_errno_num }, 78 [52] = { "sigpending", print_args, print_errno_num }, 79 [53] = { "sigaltstack", print_args, print_errno_num }, 80 [54] = { "ioctl", print_args, print_errno_num }, 81 [55] = { "reboot", print_args, print_errno_num }, 82 [56] = { "revoke", print_args, print_errno_num }, 83 [57] = { "symlink", print_args, print_errno_num }, 84 [58] = { "readlink", print_args, print_errno_num }, 85 [59] = { "execve", print_args, print_errno_num }, 86 [60] = { "umask", print_args, print_errno_num }, 87 [61] = { "chroot", print_args, print_errno_num }, 88 [65] = { "msync", print_args, print_errno_num }, 89 [66] = { "vfork", print_args, print_errno_num }, 90 [73] = { "munmap", print_args, print_errno_num }, 91 [74] = { "mprotect", print_args, print_errno_num }, 92 [75] = { "madvise", print_args, print_errno_num }, 93 [78] = { "mincore", print_args, print_errno_num }, 94 [79] = { "getgroups", print_args, print_errno_num }, 95 [80] = { "setgroups", print_args, print_errno_num }, 96 [81] = { "getpgrp", print_args, print_errno_num }, 97 [82] = { "setpgid", print_args, print_errno_num }, 98 [83] = { "setitimer", print_args, print_errno_num }, 99 [85] = { "swapon", print_args, print_errno_num }, 100 [86] = { "getitimer", print_args, print_errno_num }, 101 [89] = { "getdtablesize", print_args, print_errno_num }, 102 [90] = { "dup2", print_args, print_errno_num }, 103 [92] = { "fcntl", print_args, print_errno_num }, 104 [93] = { "select", print_select_args, print_select_return }, 105 [95] = { "fsync", print_args, print_errno_num }, 106 [96] = { "setpriority", print_args, print_errno_num }, 107 [97] = { "socket", print_args, print_errno_num }, 108 [98] = { "connect", print_args, print_errno_num }, 109 [100] = { "getpriority", print_args, print_errno_num }, 110 [104] = { "bind", print_args, print_errno_num }, 111 [105] = { "setsockopt", print_args, print_errno_num }, 112 [106] = { "listen", print_args, print_errno_num }, 113 [111] = { "sigsuspend", print_args, print_errno_num }, 114 [116] = { "gettimeofday", print_args, print_errno_num }, 115 [117] = { "getrusage", print_args, print_errno_num }, 116 [118] = { "getsockopt", print_args, print_errno_num }, 117 [120] = { "readv", print_args, print_errno_num }, 118 [121] = { "writev", print_args, print_errno_num }, 119 [122] = { "settimeofday", print_args, print_errno_num }, 120 [123] = { "fchown", print_args, print_errno_num }, 121 [124] = { "fchmod", print_args, print_errno_num }, 122 [126] = { "setreuid", print_args, print_errno_num }, 123 [127] = { "setregid", print_args, print_errno_num }, 124 [128] = { "rename", print_args, print_errno_num }, 125 [131] = { "flock", print_args, print_errno_num }, 126 [132] = { "mkfifo", print_args, print_errno_num }, 127 [133] = { "sendto", print_args, print_errno_num }, 128 [134] = { "shutdown", print_args, print_errno_num }, 129 [135] = { "socketpair", print_args, print_errno_num }, 130 [136] = { "mkdir", print_args, print_errno_num }, 131 [137] = { "rmdir", print_args, print_errno_num }, 132 [138] = { "utimes", print_args, print_errno_num }, 133 [139] = { "futimes", print_args, print_errno_num }, 134 [140] = { "adjtime", print_args, print_errno_num }, 135 [142] = { "gethostuuid", print_args, print_errno_num }, 136 [147] = { "setsid", print_args, print_errno_num }, 137 [151] = { "getpgid", print_args, print_errno_num }, 138 [152] = { "setprivexec", print_args, print_errno_num }, 139 [153] = { "pread", print_args, print_errno_num }, 140 [154] = { "pwrite", print_args, print_errno_num }, 141 [155] = { "nfssvc", print_args, print_errno_num }, 142 [157] = { "statfs", print_args, print_errno_num }, 143 [158] = { "fstatfs", print_args, print_errno_num }, 144 [159] = { "unmount", print_args, print_errno_num }, 145 [161] = { "getfh", print_args, print_errno_num }, 146 [165] = { "quotactl", print_args, print_errno_num }, 147 [167] = { "mount", print_args, print_errno_num }, 148 [169] = { "csops", print_args, print_errno_num }, 149 [170] = { "csops_audittoken", print_args, print_errno_num }, 150 [173] = { "waitid", print_args, print_errno_num }, 151 [177] = { "kdebug_typefilter", print_args, print_errno_num }, 152 [178] = { "kdebug_trace_string", print_args, print_errno_num }, 153 [179] = { "kdebug_trace64", print_args, print_errno_num }, 154 [180] = { "kdebug_trace", print_args, print_errno_num }, 155 [181] = { "setgid", print_args, print_errno_num }, 156 [182] = { "setegid", print_args, print_errno_num }, 157 [183] = { "seteuid", print_args, print_errno_num }, 158 [184] = { "sigreturn", print_args, print_errno_num }, 159 [187] = { "fdatasync", print_args, print_errno_num }, 160 [188] = { "stat", print_args, print_errno_num }, 161 [189] = { "fstat", print_args, print_errno_num }, 162 [190] = { "lstat", print_args, print_errno_num }, 163 [191] = { "pathconf", print_args, print_errno_num }, 164 [192] = { "fpathconf", print_args, print_errno_num }, 165 [194] = { "getrlimit", print_args, print_errno_num }, 166 [195] = { "setrlimit", print_args, print_errno_num }, 167 [196] = { "getdirentries", print_args, print_errno_num }, 168 [197] = { "mmap", print_args, print_errno_ptr }, 169 [199] = { "lseek", print_args, print_errno_num }, 170 [200] = { "truncate", print_args, print_errno_num }, 171 [201] = { "ftruncate", print_args, print_errno_num }, 172 [202] = { "sysctl", print_args, print_errno_num }, 173 [203] = { "mlock", print_args, print_errno_num }, 174 [204] = { "munlock", print_args, print_errno_num }, 175 [205] = { "undelete", print_args, print_errno_num }, 176 [216] = { "open_dprotected_np", print_args, print_errno_num }, 177 [220] = { "getattrlist", print_args, print_errno_num }, 178 [221] = { "setattrlist", print_args, print_errno_num }, 179 [222] = { "getdirentriesattr", print_args, print_errno_num }, 180 [223] = { "exchangedata", print_args, print_errno_num }, 181 [225] = { "searchfs", print_args, print_errno_num }, 182 [226] = { "delete", print_args, print_errno_num }, 183 [227] = { "copyfile", print_args, print_errno_num }, 184 [228] = { "fgetattrlist", print_args, print_errno_num }, 185 [229] = { "fsetattrlist", print_args, print_errno_num }, 186 [230] = { "poll", print_args, print_errno_num }, 187 [231] = { "watchevent", print_args, print_errno_num }, 188 [232] = { "waitevent", print_args, print_errno_num }, 189 [233] = { "modwatch", print_args, print_errno_num }, 190 [234] = { "getxattr", print_args, print_errno_num }, 191 [235] = { "fgetxattr", print_args, print_errno_num }, 192 [236] = { "setxattr", print_args, print_errno_num }, 193 [237] = { "fsetxattr", print_args, print_errno_num }, 194 [238] = { "removexattr", print_args, print_errno_num }, 195 [239] = { "fremovexattr", print_args, print_errno_num }, 196 [240] = { "listxattr", print_args, print_errno_num }, 197 [241] = { "flistxattr", print_args, print_errno_num }, 198 [242] = { "fsctl", print_args, print_errno_num }, 199 [243] = { "initgroups", print_args, print_errno_num }, 200 [244] = { "posix_spawn", print_args, print_errno_num }, 201 [245] = { "ffsctl", print_args, print_errno_num }, 202 [247] = { "nfsclnt", print_args, print_errno_num }, 203 [248] = { "fhopen", print_args, print_errno_num }, 204 [250] = { "minherit", print_args, print_errno_num }, 205 [251] = { "semsys", print_args, print_errno_num }, 206 [252] = { "msgsys", print_args, print_errno_num }, 207 [253] = { "shmsys", print_args, print_errno_num }, 208 [254] = { "semctl", print_args, print_errno_num }, 209 [255] = { "semget", print_args, print_errno_num }, 210 [256] = { "semop", print_args, print_errno_num }, 211 [258] = { "msgctl", print_args, print_errno_num }, 212 [259] = { "msgget", print_args, print_errno_num }, 213 [260] = { "msgsnd", print_args, print_errno_num }, 214 [261] = { "msgrcv", print_args, print_errno_num }, 215 [262] = { "shmat", print_args, print_errno_num }, 216 [263] = { "shmctl", print_args, print_errno_num }, 217 [264] = { "shmdt", print_args, print_errno_num }, 218 [265] = { "shmget", print_args, print_errno_num }, 219 [266] = { "shm_open", print_args, print_errno_num }, 220 [267] = { "shm_unlink", print_args, print_errno_num }, 221 [268] = { "sem_open", print_args, print_errno_num }, 222 [269] = { "sem_close", print_args, print_errno_num }, 223 [270] = { "sem_unlink", print_args, print_errno_num }, 224 [271] = { "sem_wait", print_args, print_errno_num }, 225 [272] = { "sem_trywait", print_args, print_errno_num }, 226 [273] = { "sem_post", print_args, print_errno_num }, 227 [274] = { "sysctlbyname", print_args, print_errno_num }, 228 [277] = { "open_extended", print_args, print_errno_num }, 229 [278] = { "umask_extended", print_args, print_errno_num }, 230 [279] = { "stat_extended", print_args, print_errno_num }, 231 [280] = { "lstat_extended", print_args, print_errno_num }, 232 [281] = { "fstat_extended", print_args, print_errno_num }, 233 [282] = { "chmod_extended", print_args, print_errno_num }, 234 [283] = { "fchmod_extended", print_args, print_errno_num }, 235 [284] = { "access_extended", print_args, print_errno_num }, 236 [285] = { "settid", print_args, print_errno_num }, 237 [286] = { "gettid", print_args, print_errno_num }, 238 [287] = { "setsgroups", print_args, print_errno_num }, 239 [288] = { "getsgroups", print_args, print_errno_num }, 240 [289] = { "setwgroups", print_args, print_errno_num }, 241 [290] = { "getwgroups", print_args, print_errno_num }, 242 [291] = { "mkfifo_extended", print_args, print_errno_num }, 243 [292] = { "mkdir_extended", print_args, print_errno_num }, 244 [293] = { "identitysvc", print_args, print_errno_num }, 245 [294] = { "shared_region_check_np", print_args, print_errno_num }, 246 [296] = { "vm_pressure_monitor", print_args, print_errno_num }, 247 [297] = { "psynch_rw_longrdlock", print_args, print_errno_num }, 248 [298] = { "psynch_rw_yieldwrlock", print_args, print_errno_num }, 249 [299] = { "psynch_rw_downgrade", print_args, print_errno_num }, 250 [300] = { "psynch_rw_upgrade", print_args, print_errno_num }, 251 [301] = { "psynch_mutexwait", print_args, print_errno_num }, 252 [302] = { "psynch_mutexdrop", print_args, print_errno_num }, 253 [303] = { "psynch_cvbroad", print_args, print_errno_num }, 254 [304] = { "psynch_cvsignal", print_args, print_errno_num }, 255 [305] = { "psynch_cvwait", print_args, print_errno_num }, 256 [306] = { "psynch_rw_rdlock", print_args, print_errno_num }, 257 [307] = { "psynch_rw_wrlock", print_args, print_errno_num }, 258 [308] = { "psynch_rw_unlock", print_args, print_errno_num }, 259 [309] = { "psynch_rw_unlock2", print_args, print_errno_num }, 260 [310] = { "getsid", print_args, print_errno_num }, 261 [311] = { "settid_with_pid", print_args, print_errno_num }, 262 [312] = { "psynch_cvclrprepost", print_args, print_errno_num }, 263 [313] = { "aio_fsync", print_args, print_errno_num }, 264 [314] = { "aio_return", print_args, print_errno_num }, 265 [315] = { "aio_suspend", print_args, print_errno_num }, 266 [316] = { "aio_cancel", print_args, print_errno_num }, 267 [317] = { "aio_error", print_args, print_errno_num }, 268 [318] = { "aio_read", print_args, print_errno_num }, 269 [319] = { "aio_write", print_args, print_errno_num }, 270 [320] = { "lio_listio", print_args, print_errno_num }, 271 [322] = { "iopolicysys", print_args, print_errno_num }, 272 [323] = { "process_policy", print_args, print_errno_num }, 273 [324] = { "mlockall", print_args, print_errno_num }, 274 [325] = { "munlockall", print_args, print_errno_num }, 275 [327] = { "issetugid", print_args, print_errno_num }, 276 [328] = { "__pthread_kill", print_args, print_errno_num }, 277 [329] = { "__pthread_sigmask", print_args, print_errno_num }, 278 [330] = { "__sigwait", print_args, print_errno_num }, 279 [331] = { "__disable_threadsignal", print_args, print_errno_num }, 280 [332] = { "__pthread_markcancel", print_args, print_errno_num }, 281 [333] = { "__pthread_canceled", print_args, print_errno_num }, 282 [334] = { "__semwait_signal", print_args, print_errno_num }, 283 [336] = { "proc_info", print_args, print_errno_num }, 284 [337] = { "sendfile", print_args, print_errno_num }, 285 [338] = { "stat64", print_args, print_errno_num }, 286 [339] = { "fstat64", print_args, print_errno_num }, 287 [340] = { "lstat64", print_args, print_errno_num }, 288 [341] = { "stat64_extended", print_args, print_errno_num }, 289 [342] = { "lstat64_extended", print_args, print_errno_num }, 290 [343] = { "fstat64_extended", print_args, print_errno_num }, 291 [344] = { "getdirentries64", print_args, print_errno_num }, 292 [345] = { "statfs64", print_args, print_errno_num }, 293 [346] = { "fstatfs64", print_args, print_errno_num }, 294 [347] = { "getfsstat64", print_args, print_errno_num }, 295 [348] = { "__pthread_chdir", print_args, print_errno_num }, 296 [349] = { "__pthread_fchdir", print_args, print_errno_num }, 297 [350] = { "audit", print_args, print_errno_num }, 298 [351] = { "auditon", print_args, print_errno_num }, 299 [353] = { "getauid", print_args, print_errno_num }, 300 [354] = { "setauid", print_args, print_errno_num }, 301 [357] = { "getaudit_addr", print_args, print_errno_num }, 302 [358] = { "setaudit_addr", print_args, print_errno_num }, 303 [359] = { "auditctl", print_args, print_errno_num }, 304 [360] = { "bsdthread_create", print_args, print_errno_num }, 305 [361] = { "bsdthread_terminate", print_args, print_errno_num }, 306 [362] = { "kqueue", print_args, print_errno_num }, 307 308 // kevent is special 309 [363] = { "kevent", print_kevent_args, print_kevent_return }, 310 311 [364] = { "lchown", print_args, print_errno_num }, 312 [366] = { "bsdthread_register", print_args, print_errno_num }, 313 [367] = { "workq_open", print_args, print_errno_num }, 314 [368] = { "workq_kernreturn", print_args, print_errno_num }, 315 316 // kevent64 is special 317 [369] = { "kevent64", print_kevent64_args, print_kevent64_return }, 318 319 [370] = { "__old_semwait_signal", print_args, print_errno_num }, 320 [371] = { "__old_semwait_signal_nocancel", print_args, print_errno_num }, 321 [372] = { "thread_selfid", print_args, print_errno_num }, 322 [373] = { "ledger", print_args, print_errno_num }, 323 324 // kevent_qos is special 325 [374] = { "kevent_qos", print_kevent_qos_args, print_kevent_qos_return }, 326 327 [380] = { "__mac_execve", print_args, print_errno_num }, 328 [381] = { "__mac_syscall", print_args, print_errno_num }, 329 [382] = { "__mac_get_file", print_args, print_errno_num }, 330 [383] = { "__mac_set_file", print_args, print_errno_num }, 331 [384] = { "__mac_get_link", print_args, print_errno_num }, 332 [385] = { "__mac_set_link", print_args, print_errno_num }, 333 [386] = { "__mac_get_proc", print_args, print_errno_num }, 334 [387] = { "__mac_set_proc", print_args, print_errno_num }, 335 [388] = { "__mac_get_fd", print_args, print_errno_num }, 336 [389] = { "__mac_set_fd", print_args, print_errno_num }, 337 [390] = { "__mac_get_pid", print_args, print_errno_num }, 338 [394] = { "pselect", print_args, print_errno_num }, 339 [395] = { "pselect_nocancel", print_args, print_errno_num }, 340 [396] = { "read_nocancel", print_args, print_errno_num }, 341 [397] = { "write_nocancel", print_args, print_errno_num }, 342 [398] = { "open_nocancel", print_args, print_errno_num }, 343 [399] = { "close_nocancel", print_args, print_errno_num }, 344 [400] = { "wait4_nocancel", print_args, print_errno_num }, 345 [401] = { "recvmsg_nocancel", print_args, print_errno_num }, 346 [402] = { "sendmsg_nocancel", print_args, print_errno_num }, 347 [403] = { "recvfrom_nocancel", print_args, print_errno_num }, 348 [404] = { "accept_nocancel", print_args, print_errno_num }, 349 [405] = { "msync_nocancel", print_args, print_errno_num }, 350 [406] = { "fcntl_nocancel", print_args, print_errno_num }, 351 [407] = { "select_nocancel", print_args, print_errno_num }, 352 [408] = { "fsync_nocancel", print_args, print_errno_num }, 353 [409] = { "connect_nocancel", print_args, print_errno_num }, 354 [410] = { "sigsuspend_nocancel", print_args, print_errno_num }, 355 [411] = { "readv_nocancel", print_args, print_errno_num }, 356 [412] = { "writev_nocancel", print_args, print_errno_num }, 357 [413] = { "sendto_nocancel", print_args, print_errno_num }, 358 [414] = { "pread_nocancel", print_args, print_errno_num }, 359 [415] = { "pwrite_nocancel", print_args, print_errno_num }, 360 [416] = { "waitid_nocancel", print_args, print_errno_num }, 361 [417] = { "poll_nocancel", print_args, print_errno_num }, 362 [418] = { "msgsnd_nocancel", print_args, print_errno_num }, 363 [419] = { "msgrcv_nocancel", print_args, print_errno_num }, 364 [420] = { "sem_wait_nocancel", print_args, print_errno_num }, 365 [421] = { "aio_suspend_nocancel", print_args, print_errno_num }, 366 [422] = { "__sigwait_nocancel", print_args, print_errno_num }, 367 [423] = { "__semwait_signal_nocancel", print_args, print_errno_num }, 368 [424] = { "__mac_mount", print_args, print_errno_num }, 369 [425] = { "__mac_get_mount", print_args, print_errno_num }, 370 [426] = { "__mac_getfsstat", print_args, print_errno_num }, 371 [427] = { "fsgetpath", print_args, print_errno_num }, 372 [428] = { "audit_session_self", print_args, print_errno_num }, 373 [429] = { "audit_session_join", print_args, print_errno_num }, 374 [430] = { "fileport_makeport", print_args, print_errno_num }, 375 [431] = { "fileport_makefd", print_args, print_errno_num }, 376 [432] = { "audit_session_port", print_args, print_errno_num }, 377 [433] = { "pid_suspend", print_args, print_errno_num }, 378 [434] = { "pid_resume", print_args, print_errno_num }, 379 [438] = { "shared_region_map_and_slide_np", print_args, print_errno_num }, 380 [439] = { "kas_info", print_args, print_errno_num }, 381 [440] = { "memorystatus_control", print_args, print_errno_num }, 382 [441] = { "guarded_open_np", print_args, print_errno_num }, 383 [442] = { "guarded_close_np", print_args, print_errno_num }, 384 [443] = { "guarded_kqueue_np", print_args, print_errno_num }, 385 [444] = { "change_fdguard_np", print_args, print_errno_num }, 386 [445] = { "usrctl", print_args, print_errno_num }, 387 [446] = { "proc_rlimit_control", print_args, print_errno_num }, 388 [447] = { "connectx", print_args, print_errno_num }, 389 [448] = { "disconnectx", print_args, print_errno_num }, 390 [449] = { "peeloff", print_args, print_errno_num }, 391 [450] = { "socket_delegate", print_args, print_errno_num }, 392 [451] = { "telemetry", print_args, print_errno_num }, 393 [452] = { "proc_uuid_policy", print_args, print_errno_num }, 394 [453] = { "memorystatus_get_level", print_args, print_errno_num }, 395 [454] = { "system_override", print_args, print_errno_num }, 396 [455] = { "vfs_purge", print_args, print_errno_num }, 397 [456] = { "sfi_ctl", print_args, print_errno_num }, 398 [457] = { "sfi_pidctl", print_args, print_errno_num }, 399 [458] = { "coalition", print_args, print_errno_num }, 400 [459] = { "coalition_info", print_args, print_errno_num }, 401 [460] = { "necp_match_policy", print_args, print_errno_num }, 402 [461] = { "getattrlistbulk", print_args, print_errno_num }, 403 [462] = { "clonefileat", print_args, print_errno_num }, 404 [463] = { "openat", print_args, print_errno_num }, 405 [464] = { "openat_nocancel", print_args, print_errno_num }, 406 [465] = { "renameat", print_args, print_errno_num }, 407 [466] = { "faccessat", print_args, print_errno_num }, 408 [467] = { "fchmodat", print_args, print_errno_num }, 409 [468] = { "fchownat", print_args, print_errno_num }, 410 [469] = { "fstatat", print_args, print_errno_num }, 411 [470] = { "fstatat64", print_args, print_errno_num }, 412 [471] = { "linkat", print_args, print_errno_num }, 413 [472] = { "unlinkat", print_args, print_errno_num }, 414 [473] = { "readlinkat", print_args, print_errno_num }, 415 [474] = { "symlinkat", print_args, print_errno_num }, 416 [475] = { "mkdirat", print_args, print_errno_num }, 417 [476] = { "getattrlistat", print_args, print_errno_num }, 418 [477] = { "proc_trace_log", print_args, print_errno_num }, 419 [478] = { "bsdthread_ctl", print_args, print_errno_num }, 420 [479] = { "openbyid_np", print_args, print_errno_num }, 421 [480] = { "recvmsg_x", print_args, print_errno_num }, 422 [481] = { "sendmsg_x", print_args, print_errno_num }, 423 [482] = { "thread_selfusage", print_args, print_errno_num }, 424 [483] = { "csrctl", print_args, print_errno_num }, 425 [484] = { "guarded_open_dprotected_np", print_args, print_errno_num }, 426 [485] = { "guarded_write_np", print_args, print_errno_num }, 427 [486] = { "guarded_pwrite_np", print_args, print_errno_num }, 428 [487] = { "guarded_writev_np", print_args, print_errno_num }, 429 [488] = { "renameatx_np", print_args, print_errno_num }, 430 [489] = { "mremap_encrypted", print_args, print_errno_num }, 431 [490] = { "netagent_trigger", print_args, print_errno_num }, 432 [491] = { "stack_snapshot_with_config", print_args, print_errno_num }, 433 [492] = { "microstackshot", print_args, print_errno_num }, 434 [493] = { "grab_pgo_data", print_args, print_errno_num }, 435 [494] = { "persona", print_args, print_errno_num }, 436 [499] = { "work_interval_ctl", print_args, print_errno_num }, 437 [500] = { "getentropy", print_args, print_errno_num }, 438 [501] = { "necp_open", print_args, print_errno_num }, 439 [502] = { "necp_client_action", print_args, print_errno_num }, 440 [515] = { "ulock_wait", print_args, print_errno_num }, 441 [516] = { "ulock_wake", print_args, print_errno_num }, 442 [517] = { "fclonefileat", print_args, print_errno_num }, 443 [518] = { "fs_snapshot", print_args, print_errno_num }, 444 [520] = { "terminate_with_payload", print_args, print_errno_num }, 445 [521] = { "abort_with_payload", print_args, print_errno_num }, 446}; 447 448static void print_arg_int(xtrace::String* log, void* arg) 449{ 450 log->append_format("%d", (int) (long) arg); 451} 452 453static void print_arg_ptr(xtrace::String* log, void* arg) 454{ 455 if (arg == NULL) 456 log->append("NULL"); 457 else 458 log->append_format("%p", arg); 459} 460 461void xtrace_print_string_literal(xtrace::String* log, const char* str) { 462 if (str == NULL) { 463 log->append("NULL"); 464 return; 465 } 466 467 if (!xtrace_no_color) 468 log->append("\033[;1m"); // bold 469 470 log->append("\""); 471 472 for (; *str; str++) 473 { 474 switch (*str) 475 { 476 case '\\': 477 log->append("\\\\"); 478 break; 479 case '\n': 480 log->append("\\n"); 481 break; 482 case '\t': 483 log->append("\\t"); 484 break; 485 default: 486 log->append_format("%c", *str); 487 break; 488 } 489 } 490 491 log->append("\""); 492 493 if (!xtrace_no_color) 494 log->append("\033[0m"); // reset 495} 496 497static void print_arg_str(xtrace::String* log, void* arg) 498{ 499 const char* str = (const char*) arg; 500 xtrace_print_string_literal(log, str); 501} 502 503static void print_arg_prot(xtrace::String* log, void* arg) 504{ 505 int cnt = 0; 506 int prot = (int)(long)arg; 507 508 if (prot & PROT_READ) 509 { 510 log->append("PROT_READ"); 511 cnt++; 512 } 513 if (prot & PROT_WRITE) 514 { 515 if (cnt > 0) 516 log->append("|"); 517 log->append("PROT_WRITE"); 518 cnt++; 519 } 520 if (prot & PROT_EXEC) 521 { 522 if (cnt > 0) 523 log->append("|"); 524 log->append("PROT_EXEC"); 525 cnt++; 526 } 527 if (cnt == 0) 528 { 529 log->append("PROT_NONE"); 530 } 531} 532 533static void print_mmap_flags(xtrace::String* log, void* arg) 534{ 535 int cnt = 0; 536 int flags = (int) (long) arg; 537 538 static const struct { 539 int flag; 540 const char* name; 541 } all_flags[] = { 542 { MAP_ANON, "MAP_ANON" }, 543 { MAP_FIXED, "MAP_FIXED" }, 544 { MAP_HASSEMAPHORE, "MAP_HASSEMAPHORE" }, 545 { MAP_PRIVATE, "MAP_PRIVATE" }, 546 { MAP_SHARED, "MAP_SHARED" }, 547 { MAP_NOCACHE, "MAP_NOCACHE" }, 548 { 0, NULL } 549 }; 550 551 for (int i = 0; all_flags[i].name != NULL; i++) 552 { 553 if (flags & all_flags[i].flag) 554 { 555 if (cnt > 0) 556 log->append("|"); 557 log->append_format("%s", all_flags[i].name); 558 cnt++; 559 } 560 } 561 562 if (cnt == 0) 563 { 564 log->append("MAP_FILE"); 565 } 566} 567 568void print_open_flags(xtrace::String* log, void* arg) 569{ 570 int cnt = 0; 571 int flags = (int) (long) arg; 572 573 struct { 574 int flag; 575 const char* name; 576 } all_flags[] = { 577 { O_WRONLY, "O_WRONLY" }, 578 { O_RDWR, "O_RDWR" }, 579 { O_NONBLOCK, "O_NONBLOCK" }, 580 { O_APPEND, "O_APPEND" }, 581 { O_CREAT, "O_CREAT" }, 582 { O_TRUNC, "O_TRUNC" }, 583 { O_EXCL, "O_EXCL" }, 584 { O_SHLOCK, "O_SHLOCK" }, 585 { O_EXLOCK, "O_EXLOCK" }, 586 { O_NOFOLLOW, "O_NOFOLLOW" }, 587 { O_SYMLINK, "O_SYMLINK" }, 588 { O_DIRECTORY, "O_DIRECTORY" }, 589 { O_EVTONLY, "O_EVTONLY" }, 590 { O_CLOEXEC, "O_CLOEXEC" }, 591 { O_NOCTTY, "O_NOCTTY" }, 592 { 0, NULL } 593 }; 594 595 for (int i = 0; all_flags[i].name != NULL; i++) 596 { 597 if (flags & all_flags[i].flag) 598 { 599 if (cnt > 0) 600 log->append("|"); 601 log->append_format("%s", all_flags[i].name); 602 cnt++; 603 } 604 } 605 606 if (cnt == 0) 607 { 608 log->append("O_RDONLY"); 609 } 610} 611 612extern void print_arg_posix_spawn_args(xtrace::String* log, void* arg); 613 614static void print_arg_string_array(xtrace::String* log, void* arg) { 615 const char* const* array = (const char* const*)arg; 616 bool is_first = true; 617 618 log->append("{"); 619 620 if (array) { 621 for (const char* const* ptr = array; *ptr != NULL; ++ptr) { 622 if (is_first) { 623 is_first = false; 624 } else { 625 log->append(", "); 626 } 627 628 xtrace_print_string_literal(log, *ptr); 629 } 630 } 631 632 log->append("}"); 633}; 634 635// TODO: output more specific information for more calls 636 637static const struct { 638 int args_cnt; 639 void (*print_arg[8])(xtrace::String* log, void* arg); 640} args_info[] = { 641 [1] = { 1, { print_arg_int } }, // exit 642 [2] = { 0, { } }, // fork 643 [3] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // read 644 [4] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // write 645 [5] = { 3, { print_arg_str, print_open_flags, print_arg_int } }, // open 646 [6] = { 1, { print_arg_int } }, // close 647 [7] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // wait4 648 [9] = { 2, { print_arg_str, print_arg_str } }, // link 649 [10] = { 1, { print_arg_str } }, // unlink 650 [12] = { 1, { print_arg_str } }, // chdir 651 [13] = { 1, { print_arg_int } }, // fchdir 652 [14] = { 3, { print_arg_str, print_arg_int, print_arg_int } }, // mknod 653 [15] = { 2, { print_arg_str, print_arg_int } }, // chmod 654 [16] = { 3, { print_arg_str, print_arg_int, print_arg_int } }, // chown 655 [18] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // getfsstat 656 [20] = { 0, { } }, // getpid 657 [23] = { 1, { print_arg_int } }, // setuid 658 [24] = { 0, { } }, // getuid 659 [25] = { 0, { } }, // geteuid 660 [26] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // ptrace 661 [27] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // recvmsg 662 [28] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // sendmsg 663 [29] = { 6, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr, print_arg_ptr } }, // recvfrom 664 [30] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // accept 665 [31] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // getpeername 666 [32] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // getsockname 667 [33] = { 2, { print_arg_str, print_arg_int } }, // access 668 [34] = { 2, { print_arg_str, print_arg_int } }, // chflags 669 [35] = { 2, { print_arg_int, print_arg_int } }, // fchflags 670 [36] = { 0, { } }, // sync 671 [37] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // kill 672 [39] = { 0, { } }, // getppid 673 [41] = { 1, { print_arg_int } }, // dup 674 [42] = { 0, { } }, // pipe 675 [43] = { 0, { } }, // getegid 676 [46] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // sigaction 677 [47] = { 0, { } }, // getgid 678 [48] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // sigprocmask 679 [49] = { 2, { print_arg_ptr, print_arg_int } }, // getlogin 680 [50] = { 1, { print_arg_ptr } }, // setlogin 681 [51] = { 1, { print_arg_str } }, // acct 682 [52] = { 1, { print_arg_ptr } }, // sigpending 683 [53] = { 2, { print_arg_ptr, print_arg_ptr } }, // sigaltstack 684 [54] = { 3, { print_arg_int, print_arg_int, print_arg_ptr } }, // ioctl 685 [55] = { 2, { print_arg_int, print_arg_ptr } }, // reboot 686 [56] = { 1, { print_arg_str } }, // revoke 687 [57] = { 2, { print_arg_str, print_arg_str } }, // symlink 688 [58] = { 3, { print_arg_str, print_arg_ptr, print_arg_int } }, // readlink 689 [59] = { 3, { print_arg_str, print_arg_string_array, print_arg_string_array } }, // execve 690 [60] = { 1, { print_arg_int } }, // umask 691 [61] = { 1, { print_arg_str } }, // chroot 692 [65] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // msync 693 [66] = { 0, { } }, // vfork 694 [73] = { 2, { print_arg_ptr, print_arg_int } }, // munmap 695 [74] = { 3, { print_arg_ptr, print_arg_int, print_arg_prot } }, // mprotect 696 [75] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // madvise 697 [78] = { 3, { print_arg_ptr, print_arg_int, print_arg_ptr } }, // mincore 698 [79] = { 2, { print_arg_int, print_arg_ptr } }, // getgroups 699 [80] = { 2, { print_arg_int, print_arg_ptr } }, // setgroups 700 [81] = { 0, { } }, // getpgrp 701 [82] = { 2, { print_arg_int, print_arg_int } }, // setpgid 702 [83] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // setitimer 703 [85] = { 0, { } }, // swapon 704 [86] = { 2, { print_arg_int, print_arg_ptr } }, // getitimer 705 [89] = { 0, { } }, // getdtablesize 706 [90] = { 2, { print_arg_int, print_arg_int } }, // dup2 707 [92] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // fcntl 708 // select is special 709 [95] = { 1, { print_arg_int } }, // fsync 710 [96] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // setpriority 711 [97] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // socket 712 [98] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // connect 713 [100] = { 2, { print_arg_int, print_arg_int } }, // getpriority 714 [104] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // bind 715 [105] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // setsockopt 716 [106] = { 2, { print_arg_int, print_arg_int } }, // listen 717 [111] = { 1, { print_arg_int } }, // sigsuspend 718 [116] = { 3, { print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // gettimeofday 719 [117] = { 2, { print_arg_int, print_arg_ptr } }, // getrusage 720 [118] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_ptr } }, // getsockopt 721 [120] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // readv 722 [121] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // writev 723 [122] = { 2, { print_arg_ptr, print_arg_ptr } }, // settimeofday 724 [123] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // fchown 725 [124] = { 2, { print_arg_int, print_arg_int } }, // fchmod 726 [126] = { 2, { print_arg_int, print_arg_int } }, // setreuid 727 [127] = { 2, { print_arg_int, print_arg_int } }, // setregid 728 [128] = { 2, { print_arg_str, print_arg_str } }, // rename 729 [131] = { 2, { print_arg_int, print_arg_int } }, // flock 730 [132] = { 2, { print_arg_str, print_arg_int } }, // mkfifo 731 [133] = { 6, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // sendto 732 [134] = { 2, { print_arg_int, print_arg_int } }, // shutdown 733 [135] = { 4, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // socketpair 734 [136] = { 2, { print_arg_str, print_arg_int } }, // mkdir 735 [137] = { 1, { print_arg_str } }, // rmdir 736 [138] = { 2, { print_arg_str, print_arg_ptr } }, // utimes 737 [139] = { 2, { print_arg_int, print_arg_ptr } }, // futimes 738 [140] = { 2, { print_arg_ptr, print_arg_ptr } }, // adjtime 739 [142] = { 3, { print_arg_ptr, print_arg_ptr, print_arg_int } }, // gethostuuid 740 [147] = { 0, { } }, // setsid 741 [151] = { 1, { print_arg_int } }, // getpgid 742 [152] = { 1, { print_arg_int } }, // setprivexec 743 [153] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // pread 744 [154] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // pwrite 745 [155] = { 2, { print_arg_int, print_arg_ptr } }, // nfssvc 746 [157] = { 2, { print_arg_str, print_arg_ptr } }, // statfs 747 [158] = { 2, { print_arg_int, print_arg_ptr } }, // fstatfs 748 [159] = { 2, { print_arg_str, print_arg_int } }, // unmount 749 [161] = { 2, { print_arg_ptr, print_arg_ptr } }, // getfh 750 [165] = { 4, { print_arg_str, print_arg_int, print_arg_int, print_arg_ptr } }, // quotactl 751 [167] = { 4, { print_arg_str, print_arg_str, print_arg_int, print_arg_ptr } }, // mount 752 [169] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // csops 753 [170] = { 5, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // csops_audittoken 754 [173] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // waitid 755 [177] = { 2, { print_arg_ptr, print_arg_ptr } }, // kdebug_typefilter 756 [178] = { 3, { print_arg_int, print_arg_int, print_arg_str } }, // kdebug_trace_string 757 [179] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // kdebug_trace64 758 [180] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // kdebug_trace 759 [181] = { 1, { print_arg_int } }, // setgid 760 [182] = { 1, { print_arg_int } }, // setegid 761 [183] = { 1, { print_arg_int } }, // seteuid 762 [184] = { 2, { print_arg_ptr, print_arg_int } }, // sigreturn 763 [187] = { 1, { print_arg_int } }, // fdatasync 764 [188] = { 2, { print_arg_str, print_arg_ptr } }, // stat 765 [189] = { 2, { print_arg_int, print_arg_ptr } }, // fstat 766 [190] = { 2, { print_arg_str, print_arg_ptr } }, // lstat 767 [191] = { 2, { print_arg_str, print_arg_int } }, // pathconf 768 [192] = { 2, { print_arg_int, print_arg_int } }, // fpathconf 769 [194] = { 2, { print_arg_int, print_arg_ptr } }, // getrlimit 770 [195] = { 2, { print_arg_int, print_arg_ptr } }, // setrlimit 771 [196] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // getdirentries 772 [197] = { 6, { print_arg_ptr, print_arg_int, print_arg_prot, print_mmap_flags, print_arg_int, print_arg_int } }, // mmap 773 [199] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // lseek 774 [200] = { 2, { print_arg_str, print_arg_int } }, // truncate 775 [201] = { 2, { print_arg_int, print_arg_int } }, // ftruncate 776 [202] = { 6, { print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_int } }, // sysctl 777 [203] = { 2, { print_arg_ptr, print_arg_int } }, // mlock 778 [204] = { 2, { print_arg_ptr, print_arg_int } }, // munlock 779 [205] = { 1, { print_arg_str } }, // undelete 780 [216] = { 5, { print_arg_str, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // open_dprotected_np 781 [220] = { 5, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // getattrlist 782 [221] = { 5, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // setattrlist 783 [222] = { 8, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_int } }, // getdirentriesattr 784 [223] = { 3, { print_arg_str, print_arg_str, print_arg_int } }, // exchangedata 785 [225] = { 6, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr } }, // searchfs 786 [226] = { 1, { print_arg_str } }, // delete 787 [227] = { 4, { print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // copyfile 788 [228] = { 5, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // fgetattrlist 789 [229] = { 5, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // fsetattrlist 790 [230] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // poll 791 [231] = { 2, { print_arg_ptr, print_arg_int } }, // watchevent 792 [232] = { 2, { print_arg_ptr, print_arg_ptr } }, // waitevent 793 [233] = { 2, { print_arg_ptr, print_arg_int } }, // modwatch 794 [234] = { 6, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // getxattr 795 [235] = { 6, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // fgetxattr 796 [236] = { 6, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // setxattr 797 [237] = { 6, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // fsetxattr 798 [238] = { 3, { print_arg_str, print_arg_ptr, print_arg_int } }, // removexattr 799 [239] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // fremovexattr 800 [240] = { 4, { print_arg_str, print_arg_ptr, print_arg_int, print_arg_int } }, // listxattr 801 [241] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // flistxattr 802 [242] = { 4, { print_arg_str, print_arg_int, print_arg_ptr, print_arg_int } }, // fsctl 803 [243] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // initgroups 804 [244] = { 5, { print_arg_ptr, print_arg_str, print_arg_posix_spawn_args, print_arg_string_array, print_arg_string_array } }, // posix_spawn 805 [245] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // ffsctl 806 [247] = { 2, { print_arg_int, print_arg_ptr } }, // nfsclnt 807 [248] = { 2, { print_arg_ptr, print_arg_int } }, // fhopen 808 [250] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // minherit 809 [251] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // semsys 810 [252] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // msgsys 811 [253] = { 4, { print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // shmsys 812 [254] = { 4, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // semctl 813 [255] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // semget 814 [256] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // semop 815 [258] = { 3, { print_arg_int, print_arg_int, print_arg_ptr } }, // msgctl 816 [259] = { 2, { print_arg_int, print_arg_int } }, // msgget 817 [260] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // msgsnd 818 [261] = { 5, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // msgrcv 819 [262] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // shmat 820 [263] = { 3, { print_arg_int, print_arg_int, print_arg_ptr } }, // shmctl 821 [264] = { 1, { print_arg_ptr } }, // shmdt 822 [265] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // shmget 823 [266] = { 3, { print_arg_str, print_arg_int, print_arg_int } }, // shm_open 824 [267] = { 1, { print_arg_str } }, // shm_unlink 825 [268] = { 4, { print_arg_str, print_arg_int, print_arg_int, print_arg_int } }, // sem_open 826 [269] = { 1, { print_arg_ptr } }, // sem_close 827 [270] = { 1, { print_arg_str } }, // sem_unlink 828 [271] = { 1, { print_arg_ptr } }, // sem_wait 829 [272] = { 1, { print_arg_ptr } }, // sem_trywait 830 [273] = { 1, { print_arg_ptr } }, // sem_post 831 [274] = { 6, { print_arg_str, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_int } }, // sysctlbyname 832 [277] = { 6, { print_arg_str, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // open_extended 833 [278] = { 2, { print_arg_int, print_arg_ptr } }, // umask_extended 834 [279] = { 4, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // stat_extended 835 [280] = { 4, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // lstat_extended 836 [281] = { 4, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // fstat_extended 837 [282] = { 5, { print_arg_str, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // chmod_extended 838 [283] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // fchmod_extended 839 [284] = { 4, { print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // access_extended 840 [285] = { 2, { print_arg_int, print_arg_int } }, // settid 841 [286] = { 2, { print_arg_ptr, print_arg_ptr } }, // gettid 842 [287] = { 2, { print_arg_int, print_arg_ptr } }, // setsgroups 843 [288] = { 2, { print_arg_ptr, print_arg_ptr } }, // getsgroups 844 [289] = { 2, { print_arg_int, print_arg_ptr } }, // setwgroups 845 [290] = { 2, { print_arg_ptr, print_arg_ptr } }, // getwgroups 846 [291] = { 5, { print_arg_str, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // mkfifo_extended 847 [292] = { 5, { print_arg_str, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // mkdir_extended 848 [293] = { 2, { print_arg_int, print_arg_ptr } }, // identitysvc 849 [294] = { 1, { print_arg_ptr } }, // shared_region_check_np 850 [296] = { 3, { print_arg_int, print_arg_int, print_arg_ptr } }, // vm_pressure_monitor 851 [297] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_longrdlock 852 [298] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_yieldwrlock 853 [299] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_downgrade 854 [300] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_upgrade 855 [301] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_mutexwait 856 [302] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_mutexdrop 857 [303] = { 7, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // psynch_cvbroad 858 [304] = { 8, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // psynch_cvsignal 859 [305] = { 8, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_cvwait 860 [306] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_rdlock 861 [307] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_wrlock 862 [308] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_unlock 863 [309] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_rw_unlock2 864 [310] = { 1, { print_arg_int } }, // getsid 865 [311] = { 2, { print_arg_int, print_arg_int } }, // settid_with_pid 866 [312] = { 7, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // psynch_cvclrprepost 867 [313] = { 2, { print_arg_int, print_arg_ptr } }, // aio_fsync 868 [314] = { 1, { print_arg_ptr } }, // aio_return 869 [315] = { 3, { print_arg_ptr, print_arg_int, print_arg_ptr } }, // aio_suspend 870 [316] = { 2, { print_arg_int, print_arg_ptr } }, // aio_cancel 871 [317] = { 1, { print_arg_ptr } }, // aio_error 872 [318] = { 1, { print_arg_ptr } }, // aio_read 873 [319] = { 1, { print_arg_ptr } }, // aio_write 874 [320] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // lio_listio 875 [322] = { 2, { print_arg_int, print_arg_ptr } }, // iopolicysys 876 [323] = { 7, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // process_policy 877 [324] = { 1, { print_arg_int } }, // mlockall 878 [325] = { 1, { print_arg_int } }, // munlockall 879 [327] = { 0, { } }, // issetugid 880 [328] = { 2, { print_arg_int, print_arg_int } }, // __pthread_kill 881 [329] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // __pthread_sigmask 882 [330] = { 2, { print_arg_ptr, print_arg_ptr } }, // __sigwait 883 [331] = { 1, { print_arg_int } }, // __disable_threadsignal 884 [332] = { 1, { print_arg_int } }, // __pthread_markcancel 885 [333] = { 1, { print_arg_int } }, // __pthread_canceled 886 [334] = { 6, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // __semwait_signal 887 [336] = { 6, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // proc_info 888 [337] = { 6, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int } }, // sendfile 889 [338] = { 2, { print_arg_str, print_arg_ptr } }, // stat64 890 [339] = { 2, { print_arg_int, print_arg_ptr } }, // fstat64 891 [340] = { 2, { print_arg_str, print_arg_ptr } }, // lstat64 892 [341] = { 4, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // stat64_extended 893 [342] = { 4, { print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // lstat64_extended 894 [343] = { 4, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // fstat64_extended 895 [344] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // getdirentries64 896 [345] = { 2, { print_arg_str, print_arg_ptr } }, // statfs64 897 [346] = { 2, { print_arg_int, print_arg_ptr } }, // fstatfs64 898 [347] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // getfsstat64 899 [348] = { 1, { print_arg_str } }, // __pthread_chdir 900 [349] = { 1, { print_arg_int } }, // __pthread_fchdir 901 [350] = { 2, { print_arg_ptr, print_arg_int } }, // audit 902 [351] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // auditon 903 [353] = { 1, { print_arg_ptr } }, // getauid 904 [354] = { 1, { print_arg_ptr } }, // setauid 905 [357] = { 2, { print_arg_ptr, print_arg_int } }, // getaudit_addr 906 [358] = { 2, { print_arg_ptr, print_arg_int } }, // setaudit_addr 907 [359] = { 1, { print_arg_str } }, // auditctl 908 [360] = { 5, { print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_int } }, // bsdthread_create 909 [361] = { 4, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // bsdthread_terminate 910 [362] = { 0, { } }, // kqueue 911 // kevent is special 912 [364] = { 3, { print_arg_str, print_arg_int, print_arg_int } }, // lchown 913 [366] = { 7, { print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // bsdthread_register 914 [367] = { 0, { } }, // workq_open 915 [368] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // workq_kernreturn 916 // kevent64 is special 917 [370] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // __old_semwait_signal 918 [371] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // __old_semwait_signal_nocancel 919 [372] = { 0, { } }, // thread_selfid 920 [373] = { 4, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // ledger 921 // kevent_qos is special 922 [380] = { 4, { print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // __mac_execve 923 [381] = { 3, { print_arg_ptr, print_arg_int, print_arg_ptr } }, // __mac_syscall 924 [382] = { 2, { print_arg_ptr, print_arg_ptr } }, // __mac_get_file 925 [383] = { 2, { print_arg_ptr, print_arg_ptr } }, // __mac_set_file 926 [384] = { 2, { print_arg_ptr, print_arg_ptr } }, // __mac_get_link 927 [385] = { 2, { print_arg_ptr, print_arg_ptr } }, // __mac_set_link 928 [386] = { 1, { print_arg_ptr } }, // __mac_get_proc 929 [387] = { 1, { print_arg_ptr } }, // __mac_set_proc 930 [388] = { 2, { print_arg_int, print_arg_ptr } }, // __mac_get_fd 931 [389] = { 2, { print_arg_int, print_arg_ptr } }, // __mac_set_fd 932 [390] = { 2, { print_arg_int, print_arg_ptr } }, // __mac_get_pid 933 [394] = { 6, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // pselect 934 [395] = { 6, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // pselect_nocancel 935 [396] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // read_nocancel 936 [397] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // write_nocancel 937 [398] = { 3, { print_arg_str, print_open_flags, print_arg_int } }, // open_nocancel 938 [399] = { 1, { print_arg_int } }, // close_nocancel 939 [400] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // wait4_nocancel 940 [401] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // recvmsg_nocancel 941 [402] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // sendmsg_nocancel 942 [403] = { 6, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr, print_arg_ptr } }, // recvfrom_nocancel 943 [404] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // accept_nocancel 944 [405] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // msync_nocancel 945 [406] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // fcntl_nocancel 946 [407] = { 5, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // select_nocancel 947 [408] = { 1, { print_arg_int } }, // fsync_nocancel 948 [409] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // connect_nocancel 949 [410] = { 1, { print_arg_int } }, // sigsuspend_nocancel 950 [411] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // readv_nocancel 951 [412] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // writev_nocancel 952 [413] = { 6, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // sendto_nocancel 953 [414] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // pread_nocancel 954 [415] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // pwrite_nocancel 955 [416] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // waitid_nocancel 956 [417] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // poll_nocancel 957 [418] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // msgsnd_nocancel 958 [419] = { 5, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // msgrcv_nocancel 959 [420] = { 1, { print_arg_ptr } }, // sem_wait_nocancel 960 [421] = { 3, { print_arg_ptr, print_arg_int, print_arg_ptr } }, // aio_suspend_nocancel 961 [422] = { 2, { print_arg_ptr, print_arg_ptr } }, // __sigwait_nocancel 962 [423] = { 6, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // __semwait_signal_nocancel 963 [424] = { 5, { print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_ptr } }, // __mac_mount 964 [425] = { 2, { print_arg_ptr, print_arg_ptr } }, // __mac_get_mount 965 [426] = { 5, { print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // __mac_getfsstat 966 [427] = { 4, { print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // fsgetpath 967 [428] = { 0, { } }, // audit_session_self 968 [429] = { 1, { print_arg_int } }, // audit_session_join 969 [430] = { 2, { print_arg_int, print_arg_ptr } }, // fileport_makeport 970 [431] = { 1, { print_arg_int } }, // fileport_makefd 971 [432] = { 2, { print_arg_int, print_arg_ptr } }, // audit_session_port 972 [433] = { 1, { print_arg_int } }, // pid_suspend 973 [434] = { 1, { print_arg_int } }, // pid_resume 974 [438] = { 6, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // shared_region_map_and_slide_np 975 [439] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // kas_info 976 [440] = { 5, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // memorystatus_control 977 [441] = { 5, { print_arg_str, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int } }, // guarded_open_np 978 [442] = { 2, { print_arg_int, print_arg_ptr } }, // guarded_close_np 979 [443] = { 2, { print_arg_ptr, print_arg_int } }, // guarded_kqueue_np 980 [444] = { 6, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr } }, // change_fdguard_np 981 [445] = { 1, { print_arg_int } }, // usrctl 982 [446] = { 3, { print_arg_int, print_arg_int, print_arg_ptr } }, // proc_rlimit_control 983 [447] = { 8, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_ptr } }, // connectx 984 [448] = { 3, { print_arg_int, print_arg_int, print_arg_int } }, // disconnectx 985 [449] = { 2, { print_arg_int, print_arg_int } }, // peeloff 986 [450] = { 4, { print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // socket_delegate 987 [451] = { 6, { print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // telemetry 988 [452] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // proc_uuid_policy 989 [453] = { 1, { print_arg_ptr } }, // memorystatus_get_level 990 [454] = { 2, { print_arg_int, print_arg_int } }, // system_override 991 [455] = { 0, { } }, // vfs_purge 992 [456] = { 4, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // sfi_ctl 993 [457] = { 4, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr } }, // sfi_pidctl 994 [458] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // coalition 995 [459] = { 4, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // coalition_info 996 [460] = { 3, { print_arg_ptr, print_arg_int, print_arg_ptr } }, // necp_match_policy 997 [461] = { 5, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // getattrlistbulk 998 [462] = { 5, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // clonefileat 999 [463] = { 4, { print_arg_int, print_arg_str, print_open_flags, print_arg_int } }, // openat 1000 [464] = { 4, { print_arg_int, print_arg_str, print_open_flags, print_arg_int } }, // openat_nocancel 1001 [465] = { 4, { print_arg_int, print_arg_str, print_arg_int, print_arg_str } }, // renameat 1002 [466] = { 4, { print_arg_int, print_arg_str, print_arg_int, print_arg_int } }, // faccessat 1003 [467] = { 4, { print_arg_int, print_arg_str, print_arg_int, print_arg_int } }, // fchmodat 1004 [468] = { 5, { print_arg_int, print_arg_str, print_arg_int, print_arg_int, print_arg_int } }, // fchownat 1005 [469] = { 4, { print_arg_int, print_arg_str, print_arg_ptr, print_arg_int } }, // fstatat 1006 [470] = { 4, { print_arg_int, print_arg_str, print_arg_ptr, print_arg_int } }, // fstatat64 1007 [471] = { 5, { print_arg_int, print_arg_str, print_arg_int, print_arg_str, print_arg_int } }, // linkat 1008 [472] = { 3, { print_arg_int, print_arg_str, print_arg_int } }, // unlinkat 1009 [473] = { 4, { print_arg_int, print_arg_str, print_arg_ptr, print_arg_int } }, // readlinkat 1010 [474] = { 3, { print_arg_str, print_arg_int, print_arg_str } }, // symlinkat 1011 [475] = { 3, { print_arg_int, print_arg_str, print_arg_int } }, // mkdirat 1012 [476] = { 6, { print_arg_int, print_arg_str, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // getattrlistat 1013 [477] = { 2, { print_arg_int, print_arg_int } }, // proc_trace_log 1014 [478] = { 4, { print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // bsdthread_ctl 1015 [479] = { 3, { print_arg_ptr, print_arg_ptr, print_arg_int } }, // openbyid_np 1016 [480] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // recvmsg_x 1017 [481] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // sendmsg_x 1018 [482] = { 0, { } }, // thread_selfusage 1019 [483] = { 3, { print_arg_int, print_arg_ptr, print_arg_ptr } }, // csrctl 1020 [484] = { 7, { print_arg_str, print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // guarded_open_dprotected_np 1021 [485] = { 4, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int } }, // guarded_write_np 1022 [486] = { 5, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int, print_arg_int } }, // guarded_pwrite_np 1023 [487] = { 4, { print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_int } }, // guarded_writev_np 1024 [488] = { 5, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // renameatx_np 1025 [489] = { 5, { print_arg_ptr, print_arg_int, print_arg_int, print_arg_int, print_arg_int } }, // mremap_encrypted 1026 [490] = { 2, { print_arg_ptr, print_arg_int } }, // netagent_trigger 1027 [491] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // stack_snapshot_with_config 1028 [492] = { 3, { print_arg_ptr, print_arg_int, print_arg_int } }, // microstackshot 1029 [493] = { 4, { print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // grab_pgo_data 1030 [494] = { 5, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr } }, // persona 1031 [499] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // work_interval_ctl 1032 [500] = { 2, { print_arg_ptr, print_arg_int } }, // getentropy 1033 [501] = { 1, { print_arg_int } }, // necp_open 1034 [502] = { 6, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_ptr, print_arg_int } }, // necp_client_action 1035 [515] = { 4, { print_arg_int, print_arg_ptr, print_arg_int, print_arg_int } }, // ulock_wait 1036 [516] = { 3, { print_arg_int, print_arg_ptr, print_arg_int } }, // ulock_wake 1037 [517] = { 4, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int } }, // fclonefileat 1038 [518] = { 6, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_ptr, print_arg_ptr, print_arg_int } }, // fs_snapshot 1039 [520] = { 7, { print_arg_int, print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_str, print_arg_int } }, // terminate_with_payload 1040 [521] = { 6, { print_arg_int, print_arg_int, print_arg_ptr, print_arg_int, print_arg_str, print_arg_int } }, // abort_with_payload 1041}; 1042 1043static void print_args(xtrace::String* log, int nr, void* args[]) 1044{ 1045 int cnt = args_info[nr].args_cnt; 1046 for (int i = 0; i < cnt; i++) 1047 { 1048 if (i > 0) 1049 log->append(", "); 1050 (*args_info[nr].print_arg[i])(log, args[i]); 1051 } 1052} 1053 1054 1055extern "C" 1056void darling_bsd_syscall_entry_print(int nr, void* args[]) 1057{ 1058 xtrace::String log; 1059#if __i386__ 1060 // get rid of some info in the upper bytes that we don't need 1061 nr = (int)((unsigned int)nr & 0xffff); 1062#endif 1063 1064 handle_generic_entry(&log, bsd_defs, "bsd", nr, args); 1065 1066 if (nr == 1 || nr == 59) 1067 { 1068 // For exit() or execve(), print an extra newline, 1069 // as we're likely not going to see the return. 1070 log.append("\n"); 1071 } 1072 1073 if (log.size() > 0) { 1074 xtrace_log("%s", log.c_str()); 1075 log.clear(); 1076 } 1077} 1078 1079extern "C" 1080void darling_bsd_syscall_exit_print(uintptr_t retval) 1081{ 1082 xtrace::String log; 1083 handle_generic_exit(&log, bsd_defs, "bsd", retval, 0); 1084 1085 if (log.size() > 0) { 1086 xtrace_log("%s", log.c_str()); 1087 log.clear(); 1088 } 1089} 1090 1091const char* error_strings[128] = { 1092 [1] = "EPERM", 1093 [2] = "ENOENT", 1094 [3] = "ESRCH", 1095 [4] = "EINTR", 1096 [5] = "EIO", 1097 [6] = "ENXIO", 1098 [7] = "E2BIG", 1099 [8] = "ENOEXEC", 1100 [9] = "EBADF", 1101 [10] = "ECHILD", 1102 [11] = "EDEADLK", 1103 [12] = "ENOMEM", 1104 [13] = "EACCES", 1105 [14] = "EFAULT", 1106 [15] = "ENOTBLK", 1107 [16] = "EBUSY", 1108 [17] = "EEXIST", 1109 [18] = "EXDEV", 1110 [19] = "ENODEV", 1111 [20] = "ENOTDIR", 1112 [21] = "EISDIR", 1113 [22] = "EINVAL", 1114 [23] = "ENFILE", 1115 [24] = "EMFILE", 1116 [25] = "ENOTTY", 1117 [26] = "ETXTBSY", 1118 [27] = "EFBIG", 1119 [28] = "ENOSPC", 1120 [29] = "ESPIPE", 1121 [30] = "EROFS", 1122 [31] = "EMLINK", 1123 [32] = "EPIPE", 1124 [33] = "EDOM", 1125 [34] = "ERANGE", 1126 [35] = "EAGAIN", 1127 [36] = "EINPROGRESS", 1128 [37] = "EALREADY", 1129 [38] = "ENOTSOCK", 1130 [39] = "EDESTADDRREQ", 1131 [40] = "EMSGSIZE", 1132 [41] = "EPROTOTYPE", 1133 [42] = "ENOPROTOOPT", 1134 [43] = "EPROTONOSUPPORT", 1135 [44] = "ESOCKTNOSUPPORT", 1136 [45] = "ENOTSUP", 1137 [46] = "EPFNOSUPPORT", 1138 [47] = "EAFNOSUPPORT", 1139 [48] = "EADDRINUSE", 1140 [49] = "EADDRNOTAVAIL", 1141 [50] = "ENETDOWN", 1142 [51] = "ENETUNREACH", 1143 [52] = "ENETRESET", 1144 [53] = "ECONNABORTED", 1145 [54] = "ECONNRESET", 1146 [55] = "ENOBUFS", 1147 [56] = "EISCONN", 1148 [57] = "ENOTCONN", 1149 [58] = "ESHUTDOWN", 1150 [59] = "ETOOMANYREFS", 1151 [60] = "ETIMEDOUT", 1152 [61] = "ECONNREFUSED", 1153 [62] = "ELOOP", 1154 [63] = "ENAMETOOLONG", 1155 [64] = "EHOSTDOWN", 1156 [65] = "EHOSTUNREACH", 1157 [66] = "ENOTEMPTY", 1158 [67] = "EPROCLIM", 1159 [68] = "EUSERS", 1160 [69] = "EDQUOT", 1161 [70] = "ESTALE", 1162 [71] = "EREMOTE", 1163 [72] = "EBADRPC", 1164 [73] = "ERPCMISMATCH", 1165 [74] = "EPROGUNAVAIL", 1166 [75] = "EPROGMISMATCH", 1167 [76] = "EPROCUNAVAIL", 1168 [77] = "ENOLCK", 1169 [78] = "ENOSYS", 1170 [79] = "EFTYPE", 1171 [80] = "EAUTH", 1172 [81] = "ENEEDAUTH", 1173 [82] = "EPWROFF", 1174 [83] = "EDEVERR", 1175 [84] = "EOVERFLOW", 1176 [85] = "EBADEXEC", 1177 [86] = "EBADARCH", 1178 [87] = "ESHLIBVERS", 1179 [88] = "EBADMACHO", 1180 [89] = "ECANCELED", 1181 [90] = "EIDRM", 1182 [91] = "ENOMSG", 1183 [92] = "EILSEQ", 1184 [93] = "ENOATTR", 1185 [94] = "EBADMSG", 1186 [95] = "EMULTIHOP", 1187 [96] = "ENODATA", 1188 [97] = "ENOLINK", 1189 [98] = "ENOSR", 1190 [99] = "ENOSTR", 1191 [100] = "EPROTO", 1192 [101] = "ETIME", 1193 [102] = "EOPNOTSUPP", 1194 [103] = "ENOPOLICY", 1195 [104] = "ENOTRECOVERABLE", 1196 [105] = "EOWNERDEAD", 1197 [106] = "EQFULL", 1198}; 1199 1200static void print_errno_num(xtrace::String* log, int nr, uintptr_t rv) 1201{ 1202 intptr_t v = (intptr_t)rv; 1203 if (v >= 0 || v < -4095) 1204 { 1205 log->append_format("%ld", rv); 1206 } 1207 else 1208 print_errno(log, nr, rv); 1209} 1210 1211static void print_errno_ptr(xtrace::String* log, int nr, uintptr_t rv) 1212{ 1213 intptr_t v = (intptr_t)rv; 1214 if (v >= 0 || v < -4095) 1215 { 1216 log->append_format("%p", (void*) rv); 1217 } 1218 else 1219 print_errno(log, nr, rv); 1220} 1221 1222static void print_errno(xtrace::String* log, int nr, uintptr_t rv) 1223{ 1224 const char* error = NULL; 1225 intptr_t v = (intptr_t) rv; 1226 if (-v < 128) 1227 error = error_strings[-v]; 1228 if (error != NULL) 1229 log->append_format("%s", error); 1230 else 1231 log->append_format("%ld", v); 1232} 1233 1234static const char* const filter_names[] = { 1235 "EVFILT_READ", 1236 "EVFILT_WRITE", 1237 "EVFILT_AIO", 1238 "EVFILT_VNODE", 1239 "EVFILT_PROC", 1240 "EVFILT_SIGNAL", 1241 "EVFILT_TIMER", 1242 "EVFILT_MACHPORT", 1243 "EVFILT_FS", 1244 "EVFILT_USER", 1245 NULL, 1246 "EVFILT_VM", 1247 "EVFILT_SOCK", 1248 "EVFILT_MEMORYSTATUS", 1249 "EVFILT_EXCEPT", 1250 NULL, 1251 "EVFILT_WORKLOOP", 1252}; 1253 1254static const char* const signal_names[] = { 1255 "SIGHUP", 1256 "SIGINT", 1257 "SIGQUIT", 1258 "SIGILL", 1259 "SIGTRAP", 1260 "SIGABRT", 1261 "SIGEMT", 1262 "SIGFPE", 1263 "SIGKILL", 1264 "SIGBUS", 1265 "SIGSEGV", 1266 "SIGSYS", 1267 "SIGPIPE", 1268 "SIGALRM", 1269 "SIGTERM", 1270 "SIGURG", 1271 "SIGSTOP", 1272 "SIGTSTP", 1273 "SIGCONT", 1274 "SIGCHLD", 1275 "SIGTTIN", 1276 "SIGTTOU", 1277 "SIGIO", 1278 "SIGXCPU", 1279 "SIGXFSZ", 1280 "SIGVTALR", 1281 "SIGPROF", 1282 "SIGWINCH", 1283 "SIGINFO", 1284 "SIGUSR1", 1285 "SIGUSR2", 1286}; 1287 1288static const struct { 1289 uint16_t flag; 1290 const char* name; 1291} kevent_flag_names[] = { 1292#define FLAG(_name) { _name, #_name } 1293 FLAG(EV_ADD), 1294 FLAG(EV_ENABLE), 1295 FLAG(EV_DISABLE), 1296 FLAG(EV_DELETE), 1297 FLAG(EV_RECEIPT), 1298 FLAG(EV_ONESHOT), 1299 FLAG(EV_CLEAR), 1300 FLAG(EV_DISPATCH), 1301 FLAG(EV_UDATA_SPECIFIC), 1302 FLAG(EV_FLAG0), 1303 FLAG(EV_FLAG1), 1304 FLAG(EV_EOF), 1305 FLAG(EV_ERROR), 1306#undef KEVENT_FLAG 1307}; 1308 1309static const struct { 1310 uint32_t flag; 1311 const char* name; 1312} kevent_filter_flag_names[][16] = { 1313#define FLAG(_name) { _name, #_name } 1314 [~EVFILT_READ] = { 1315 FLAG(NOTE_LOWAT), 1316 }, 1317 [~EVFILT_EXCEPT] = { 1318 FLAG(NOTE_OOB), 1319 }, 1320 [~EVFILT_VNODE] = { 1321 FLAG(NOTE_DELETE), 1322 FLAG(NOTE_WRITE), 1323 FLAG(NOTE_EXTEND), 1324 FLAG(NOTE_ATTRIB), 1325 FLAG(NOTE_LINK), 1326 FLAG(NOTE_RENAME), 1327 FLAG(NOTE_REVOKE), 1328 FLAG(NOTE_NONE), 1329 FLAG(NOTE_FUNLOCK), 1330 }, 1331 [~EVFILT_PROC] = { 1332 FLAG(NOTE_EXIT), 1333 FLAG(NOTE_FORK), 1334 FLAG(NOTE_EXEC), 1335 FLAG(NOTE_REAP), 1336 FLAG(NOTE_SIGNAL), 1337 FLAG(NOTE_EXITSTATUS), 1338 FLAG(NOTE_EXIT_DETAIL), 1339 }, 1340 [~EVFILT_TIMER] = { 1341 FLAG(NOTE_SECONDS), 1342 FLAG(NOTE_USECONDS), 1343 FLAG(NOTE_NSECONDS), 1344 FLAG(NOTE_MACHTIME), 1345 FLAG(NOTE_ABSOLUTE), 1346 FLAG(NOTE_MACH_CONTINUOUS_TIME), 1347 FLAG(NOTE_CRITICAL), 1348 FLAG(NOTE_BACKGROUND), 1349 FLAG(NOTE_LEEWAY), 1350 FLAG(NOTE_TRACK), 1351 FLAG(NOTE_TRACKERR), 1352 FLAG(NOTE_CHILD), 1353 }, 1354 [~EVFILT_SOCK] = { 1355 FLAG(NOTE_CONNRESET), 1356 FLAG(NOTE_READCLOSED), 1357 FLAG(NOTE_WRITECLOSED), 1358 FLAG(NOTE_TIMEOUT), 1359 FLAG(NOTE_NOSRCADDR), 1360 FLAG(NOTE_IFDENIED), 1361 FLAG(NOTE_SUSPEND), 1362 FLAG(NOTE_RESUME), 1363 FLAG(NOTE_KEEPALIVE), 1364 FLAG(NOTE_ADAPTIVE_WTIMO), 1365 FLAG(NOTE_ADAPTIVE_RTIMO), 1366 FLAG(NOTE_CONNECTED), 1367 FLAG(NOTE_DISCONNECTED), 1368 FLAG(NOTE_CONNINFO_UPDATED), 1369 FLAG(NOTE_NOTIFY_ACK), 1370 }, 1371 [~EVFILT_MACHPORT] = { 1372 FLAG(MACH_RCV_MSG), 1373 }, 1374#undef FLAG 1375}; 1376 1377static void print_kevent_common(xtrace::String* log, int16_t filter, uintptr_t ident, uint16_t flags, uint32_t fflags, intptr_t data, void* udata) { 1378 int filt_index = ~filter; 1379 bool printed_something = false; 1380 1381 log->append_format("%s { ident = ", (filt_index < 0 || filt_index >= sizeof(filter_names) / sizeof(*filter_names)) ? "EVFILT_UNKNOWN" : filter_names[filt_index]); 1382 1383 switch (filter) { 1384 case EVFILT_READ: 1385 case EVFILT_WRITE: 1386 case EVFILT_EXCEPT: 1387 case EVFILT_VNODE: 1388 case EVFILT_SOCK: 1389 log->append_format("fd %lu", ident); 1390 break; 1391 1392 case EVFILT_PROC: 1393 log->append_format("pid %lu", ident); 1394 break; 1395 1396 case EVFILT_SIGNAL: 1397 log->append_format("signal %s (%lu)", (ident < sizeof(signal_names) / sizeof(*signal_names)) ? signal_names[ident] : "SIGUNKNOWN", ident); 1398 break; 1399 1400 case EVFILT_TIMER: 1401 log->append_format("timer %lu", ident); 1402 break; 1403 1404 case EVFILT_MACHPORT: 1405 // officially, only portsets can be used with EVFILT_MACHPORT. however, Apple introduced support for single ports in 10.13 or something around that time. 1406 log->append_format("port/portset %lu", ident); 1407 break; 1408 1409 case EVFILT_FS: 1410 case EVFILT_USER: 1411 case EVFILT_VM: 1412 case EVFILT_MEMORYSTATUS: 1413 case EVFILT_WORKLOOP: 1414 // notes: 1415 // * EVFILT_VM is unsupported on macOS. 1416 // * do EVFILT_FS, EVFILT_MEMORYSTATUS, and EVFILT_WORKLOOP even use `ident`? 1417 log->append_format("%lu", ident); 1418 break; 1419 1420 default: 1421 log->append_format("%lu", ident); 1422 break; 1423 } 1424 1425 log->append(", flags = "); 1426 1427 for (size_t i = 0; i < sizeof(kevent_flag_names) / sizeof(*kevent_flag_names); ++i) { 1428 if ((flags & kevent_flag_names[i].flag) == 0) { 1429 continue; 1430 } 1431 1432 if (!printed_something) { 1433 printed_something = true; 1434 } else { 1435 log->append("|"); 1436 } 1437 1438 log->append_format("%s", kevent_flag_names[i].name); 1439 } 1440 1441 log->append_format("%s(0x%x), fflags = ", printed_something ? " " : "", flags); 1442 1443 printed_something = false; 1444 1445 if (filt_index < sizeof(kevent_filter_flag_names) / sizeof(*kevent_filter_flag_names)) { 1446 for (size_t i = 0; i < sizeof(*kevent_filter_flag_names) / sizeof(**kevent_filter_flag_names); ++i) { 1447 if (!kevent_filter_flag_names[filt_index][i].name) { 1448 break; 1449 } 1450 1451 if ((fflags & kevent_filter_flag_names[filt_index][i].flag) == 0) { 1452 continue; 1453 } 1454 1455 if (!printed_something) { 1456 printed_something = true; 1457 } else { 1458 log->append("|"); 1459 } 1460 1461 log->append_format("%s", kevent_filter_flag_names[filt_index][i].name); 1462 } 1463 } 1464 1465 log->append_format("%s(0x%x), udata = %p, data = 0x%lx", printed_something ? " " : "", fflags, udata, data); 1466}; 1467 1468static void print_kevent_structure(xtrace::String* log, const struct kevent* event) { 1469 print_kevent_common(log, event->filter, event->ident, event->flags, event->fflags, event->data, event->udata); 1470 log->append(" }"); 1471}; 1472 1473static void print_kevent64_structure(xtrace::String* log, const struct kevent64_s* event) { 1474 print_kevent_common(log, event->filter, event->ident, event->flags, event->fflags, event->data, (void*)(uintptr_t)event->udata); 1475 log->append_format(", ext[0] = 0x%llx, ext[1] = 0x%llx }", event->ext[0], event->ext[1]); 1476}; 1477 1478static void print_kevent_qos_structure(xtrace::String* log, const struct kevent_qos_s* event) { 1479 print_kevent_common(log, event->filter, event->ident, event->flags, event->fflags, event->data, (void*)(uintptr_t)event->udata); 1480 log->append_format(", ext[0] = 0x%llx, ext[1] = 0x%llx, ext[2] = 0x%llx, ext[3] = 0x%llx, qos = %d, xflags = 0x%x }", event->ext[0], event->ext[1], event->ext[2], event->ext[3], event->qos, event->xflags); 1481}; 1482 1483DEFINE_XTRACE_TLS_VAR(void*, kevent_stored_list, NULL, NULL); 1484DEFINE_XTRACE_TLS_VAR(void*, kevent64_stored_list, NULL, NULL); 1485DEFINE_XTRACE_TLS_VAR(void*, kevent_qos_stored_list, NULL, NULL); 1486 1487enum class kevent_type { 1488 kevent, 1489 kevent64, 1490 kevent_qos, 1491}; 1492 1493static void print_kevent_return_common(xtrace::String* log, int nr, uintptr_t rv, kevent_type type) { 1494 void* event_list; 1495 int ret = (intptr_t)rv; 1496 1497 switch (type) { 1498 case kevent_type::kevent: 1499 event_list = get_kevent_stored_list(); 1500 set_kevent_stored_list(NULL); 1501 break; 1502 case kevent_type::kevent64: 1503 event_list = get_kevent64_stored_list(); 1504 set_kevent64_stored_list(NULL); 1505 break; 1506 case kevent_type::kevent_qos: 1507 event_list = get_kevent_qos_stored_list(); 1508 set_kevent_qos_stored_list(NULL); 1509 break; 1510 } 1511 1512 if (ret < 0) { 1513 print_errno(log, nr, rv); 1514 return; 1515 } 1516 1517 log->append_format("%d events {", ret); 1518 1519 for (int i = 0; i < ret; ++i) { 1520 if (i == 0) { 1521 log->append(" "); 1522 } else { 1523 log->append(", "); 1524 } 1525 1526 switch (type) { 1527 case kevent_type::kevent: 1528 print_kevent_structure(log, &((struct kevent*)event_list)[i]); 1529 break; 1530 case kevent_type::kevent64: 1531 print_kevent64_structure(log, &((struct kevent64_s*)event_list)[i]); 1532 break; 1533 case kevent_type::kevent_qos: 1534 print_kevent_qos_structure(log, &((struct kevent_qos_s*)event_list)[i]); 1535 break; 1536 } 1537 } 1538 1539 log->append_format("%s}", ret > 0 ? " " : ""); 1540}; 1541 1542static void print_kevent_return(xtrace::String* log, int nr, uintptr_t rv) { 1543 print_kevent_return_common(log, nr, rv, kevent_type::kevent); 1544}; 1545 1546static void print_kevent_args(xtrace::String* log, int nr, void* args[]) { 1547 int kq = (intptr_t)args[0]; 1548 const struct kevent* change_list = (const struct kevent*)args[1]; 1549 int nchanges = (intptr_t)args[2]; 1550 struct kevent* event_list = (struct kevent*)args[3]; 1551 int nevents = (intptr_t)args[4]; 1552 const struct timespec* timeout = (const struct timespec*)args[5]; 1553 1554 set_kevent_stored_list(event_list); 1555 1556 log->append_format("%d, change_list = {", kq); 1557 1558 for (int i = 0; i < nchanges; ++i) { 1559 if (i == 0) { 1560 log->append(" "); 1561 } else { 1562 log->append(", "); 1563 } 1564 print_kevent_structure(log, &change_list[i]); 1565 } 1566 1567 log->append_format("%s}, nchanges = %d, event_list = %p, nevents = %d, timeout = ", nchanges > 0 ? " " : "", nchanges, event_list, nevents); 1568 1569 print_timespec(log, timeout); 1570}; 1571 1572static void print_kevent64_return(xtrace::String* log, int nr, uintptr_t rv) { 1573 print_kevent_return_common(log, nr, rv, kevent_type::kevent64); 1574}; 1575 1576static struct { 1577 unsigned int flag; 1578 const char* name; 1579} kevent_call_flags[] = { 1580#define FLAG(_name) { _name, #_name } 1581 FLAG(KEVENT_FLAG_NONE), 1582 FLAG(KEVENT_FLAG_IMMEDIATE), 1583 FLAG(KEVENT_FLAG_ERROR_EVENTS), 1584 FLAG(KEVENT_FLAG_STACK_DATA), 1585 FLAG(KEVENT_FLAG_WORKQ), 1586 FLAG(KEVENT_FLAG_WORKQ_MANAGER), 1587 FLAG(KEVENT_FLAG_WORKLOOP), 1588 FLAG(KEVENT_FLAG_PARKING), 1589 FLAG(KEVENT_FLAG_WORKLOOP_SERVICER_ATTACH), 1590 FLAG(KEVENT_FLAG_WORKLOOP_SERVICER_DETACH), 1591 FLAG(KEVENT_FLAG_DYNAMIC_KQ_MUST_EXIST), 1592 FLAG(KEVENT_FLAG_DYNAMIC_KQ_MUST_NOT_EXIST), 1593 FLAG(KEVENT_FLAG_WORKLOOP_NO_WQ_THREAD), 1594#undef FLAG 1595}; 1596 1597static void print_kevent64_args(xtrace::String* log, int nr, void* args[]) { 1598 int kq = (intptr_t)args[0]; 1599 const struct kevent64_s* change_list = (const struct kevent64_s*)args[1]; 1600 int nchanges = (intptr_t)args[2]; 1601 struct kevent64_s* event_list = (struct kevent64_s*)args[3]; 1602 int nevents = (intptr_t)args[4]; 1603 unsigned int flags = (uintptr_t)args[5]; 1604 const struct timespec* timeout = (const struct timespec*)args[6]; 1605 bool printed_something = false; 1606 1607 set_kevent64_stored_list(event_list); 1608 1609 log->append_format("%d, change_list = {", kq); 1610 1611 for (int i = 0; i < nchanges; ++i) { 1612 if (i == 0) { 1613 log->append(" "); 1614 } else { 1615 log->append(", "); 1616 } 1617 print_kevent64_structure(log, &change_list[i]); 1618 } 1619 1620 log->append_format("%s}, nchanges = %d, event_list = %p, nevents = %d, flags = ", nchanges > 0 ? " " : "", nchanges, event_list, nevents); 1621 1622 for (size_t i = 0; i < sizeof(kevent_call_flags) / sizeof(*kevent_call_flags); ++i) { 1623 if ((flags & kevent_call_flags[i].flag) == 0) { 1624 continue; 1625 } 1626 1627 if (!printed_something) { 1628 printed_something = true; 1629 } else { 1630 log->append("|"); 1631 } 1632 1633 log->append_format("%s", kevent_call_flags[i].name); 1634 } 1635 1636 if (!printed_something) { 1637 log->append("0"); 1638 } 1639 1640 log->append(", timeout = "); 1641 1642 print_timespec(log, timeout); 1643}; 1644 1645static void print_kevent_qos_return(xtrace::String* log, int nr, uintptr_t rv) { 1646 print_kevent_return_common(log, nr, rv, kevent_type::kevent_qos); 1647}; 1648 1649static void print_kevent_qos_args(xtrace::String* log, int nr, void* args[]) { 1650 int kq = (intptr_t)args[0]; 1651 const struct kevent_qos_s* change_list = (const struct kevent_qos_s*)args[1]; 1652 int nchanges = (intptr_t)args[2]; 1653 struct kevent_qos_s* event_list = (struct kevent_qos_s*)args[3]; 1654 int nevents = (intptr_t)args[4]; 1655 void* data_out = args[5]; 1656 size_t* data_available = (size_t*)args[6]; 1657 unsigned int flags = (uintptr_t)args[7]; 1658 bool printed_something = false; 1659 1660 set_kevent_qos_stored_list(event_list); 1661 1662 log->append_format("%d, change_list = {", kq); 1663 1664 for (int i = 0; i < nchanges; ++i) { 1665 if (i == 0) { 1666 log->append(" "); 1667 } else { 1668 log->append(", "); 1669 } 1670 print_kevent_qos_structure(log, &change_list[i]); 1671 } 1672 1673 log->append_format("%s}, nchanges = %d, event_list = %p, nevents = %d, data_out = %p, data_available = %p (%ld), flags = ", nchanges > 0 ? " " : "", nchanges, event_list, nevents, data_out, data_available, data_available ? *data_available : 0); 1674 1675 for (size_t i = 0; i < sizeof(kevent_call_flags) / sizeof(*kevent_call_flags); ++i) { 1676 if ((flags & kevent_call_flags[i].flag) == 0) { 1677 continue; 1678 } 1679 1680 if (!printed_something) { 1681 printed_something = true; 1682 } else { 1683 log->append("|"); 1684 } 1685 1686 log->append_format("%s", kevent_call_flags[i].name); 1687 } 1688 1689 if (!printed_something) { 1690 log->append("0"); 1691 } 1692}; 1693 1694static void print_timespec(xtrace::String* log, const struct timespec* timespec) { 1695 if (timespec) { 1696 log->append_format("(%ld s, %ld ns)", timespec->tv_sec, timespec->tv_nsec); 1697 } else { 1698 log->append("NULL"); 1699 } 1700}; 1701 1702static void print_timeval(xtrace::String* log, struct timeval* timeval) { 1703 if (timeval) { 1704 log->append_format("(%ld s, %d ns)", timeval->tv_sec, timeval->tv_usec); 1705 } else { 1706 log->append("NULL"); 1707 } 1708}; 1709 1710struct select_fdsets { 1711 fd_set* readfds; 1712 fd_set* writefds; 1713 fd_set* exceptfds; 1714 int max_fd; 1715}; 1716 1717DEFINE_XTRACE_TLS_VAR(select_fdsets, stored_select_fdsets, ((struct select_fdsets){NULL, NULL, NULL, -1}), NULL); 1718 1719static void print_fdset(xtrace::String* log, const fd_set* set, int max_fd) { 1720 bool isFirst = true; 1721 log->append("{"); 1722 if (set) { 1723 for (size_t index = 0; index < sizeof(set->fds_bits) / sizeof(*set->fds_bits); ++index) { 1724 bool shouldBreak = false; 1725 for (size_t bit = 0; bit < sizeof(*set->fds_bits) * 8; ++bit) { 1726 int fd = (index * sizeof(*set->fds_bits) * 8) + bit; 1727 if (fd >= max_fd) { 1728 shouldBreak = true; 1729 break; 1730 } 1731 if ((set->fds_bits[index] & (1U << bit)) != 0) { 1732 if (isFirst) { 1733 isFirst = false; 1734 log->append(" "); 1735 } else { 1736 log->append(", "); 1737 } 1738 log->append_format("%d", fd); 1739 } 1740 } 1741 if (shouldBreak) { 1742 break; 1743 } 1744 } 1745 } 1746 if (!isFirst) { 1747 log->append(" "); 1748 } 1749 log->append("}"); 1750}; 1751 1752static void print_select_return(xtrace::String* log, int nr, uintptr_t rv) { 1753 auto stored = get_ptr_stored_select_fdsets(); 1754 int ret = (int)rv; 1755 bool isFirst = true; 1756 1757 if (ret < 0) { 1758 print_errno(log, nr, rv); 1759 } else { 1760 log->append_format("%d descriptors: ", ret); 1761 1762 if (stored->readfds) { 1763 if (isFirst) { 1764 isFirst = false; 1765 } else { 1766 log->append(", "); 1767 } 1768 log->append("read "); 1769 print_fdset(log, stored->readfds, stored->max_fd); 1770 } 1771 1772 if (stored->writefds) { 1773 if (isFirst) { 1774 isFirst = false; 1775 } else { 1776 log->append(", "); 1777 } 1778 log->append("write "); 1779 print_fdset(log, stored->writefds, stored->max_fd); 1780 } 1781 1782 if (stored->exceptfds) { 1783 if (isFirst) { 1784 isFirst = false; 1785 } else { 1786 log->append(", "); 1787 } 1788 log->append("except "); 1789 print_fdset(log, stored->exceptfds, stored->max_fd); 1790 } 1791 } 1792 1793 stored->readfds = NULL; 1794 stored->writefds = NULL; 1795 stored->exceptfds = NULL; 1796 stored->max_fd = -1; 1797}; 1798 1799static void print_select_args(xtrace::String* log, int nr, void* args[]) { 1800 auto stored = get_ptr_stored_select_fdsets(); 1801 1802 int nfds = (intptr_t)args[0]; 1803 fd_set* readfds = (fd_set*)args[1]; 1804 fd_set* writefds = (fd_set*)args[2]; 1805 fd_set* exceptfds = (fd_set*)args[3]; 1806 struct timeval* timeout = (struct timeval*)args[4]; 1807 1808 log->append_format("nfds = %d, readfds = ", nfds); 1809 print_fdset(log, readfds, nfds); 1810 log->append(", writefds = "); 1811 print_fdset(log, writefds, nfds); 1812 log->append(", exceptfds = "); 1813 print_fdset(log, exceptfds, nfds); 1814 log->append(", timeout = "); 1815 print_timeval(log, timeout); 1816 1817 stored->readfds = readfds; 1818 stored->writefds = writefds; 1819 stored->exceptfds = exceptfds; 1820 stored->max_fd = nfds; 1821};