this repo has no description
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};