xref: /freebsd/usr.bin/truss/setup.c (revision 151a8512bdeced5a4e84f4d9a36c16cd8b99e977)
1 /*-
2  * SPDX-License-Identifier: BSD-4-Clause
3  *
4  * Copyright 1997 Sean Eric Fagan
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Sean Eric Fagan
17  * 4. Neither the name of the author may be used to endorse or promote
18  *    products derived from this software without specific prior written
19  *    permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 /*
35  * Various setup functions for truss.  Not the cleanest-written code,
36  * I'm afraid.
37  */
38 
39 #include <sys/capsicum.h>
40 #include <sys/event.h>
41 #include <sys/ptrace.h>
42 #include <sys/procdesc.h>
43 #include <sys/syscall.h>
44 #include <sys/sysctl.h>
45 #include <sys/time.h>
46 #include <sys/wait.h>
47 
48 #include <assert.h>
49 #include <capsicum_helpers.h>
50 #include <err.h>
51 #include <errno.h>
52 #include <signal.h>
53 #include <stdbool.h>
54 #include <stdint.h>
55 #include <stdio.h>
56 #include <stdlib.h>
57 #include <string.h>
58 #include <sysdecode.h>
59 #include <time.h>
60 #include <unistd.h>
61 
62 #include "truss.h"
63 #include "syscall.h"
64 #include "extern.h"
65 
66 #define	WFLAGS	(WTRAPPED | WEXITED | WCONTINUED | WUNTRACED)
67 
68 struct procabi_table {
69 	const char *name;
70 	struct procabi *abi;
71 };
72 
73 static sig_atomic_t detaching;
74 
75 static void	enter_syscall(struct trussinfo *, struct threadinfo *,
76 		    struct ptrace_lwpinfo *);
77 static bool	new_proc(struct trussinfo *, pid_t, lwpid_t, int, bool, bool);
78 static void	new_proc_register_kev(struct trussinfo *info, int pfd);
79 static struct procinfo *find_proc(struct trussinfo *info, pid_t pid);
80 
81 static struct procabi freebsd = {
82 	.type = "FreeBSD",
83 	.abi = SYSDECODE_ABI_FREEBSD,
84 	.pointer_size = sizeof(void *),
85 	.extra_syscalls = STAILQ_HEAD_INITIALIZER(freebsd.extra_syscalls),
86 	.syscalls = { NULL }
87 };
88 
89 #if !defined(__SIZEOF_POINTER__)
90 #error "Use a modern compiler."
91 #endif
92 
93 #if __SIZEOF_POINTER__ > 4
94 static struct procabi freebsd32 = {
95 	.type = "FreeBSD32",
96 	.abi = SYSDECODE_ABI_FREEBSD32,
97 	.pointer_size = sizeof(uint32_t),
98 	.compat_prefix = "freebsd32_",
99 	.extra_syscalls = STAILQ_HEAD_INITIALIZER(freebsd32.extra_syscalls),
100 	.syscalls = { NULL }
101 };
102 #endif
103 
104 static struct procabi linux = {
105 	.type = "Linux",
106 	.abi = SYSDECODE_ABI_LINUX,
107 	.pointer_size = sizeof(void *),
108 	.extra_syscalls = STAILQ_HEAD_INITIALIZER(linux.extra_syscalls),
109 	.syscalls = { NULL }
110 };
111 
112 #if __SIZEOF_POINTER__ > 4
113 static struct procabi linux32 = {
114 	.type = "Linux32",
115 	.abi = SYSDECODE_ABI_LINUX32,
116 	.pointer_size = sizeof(uint32_t),
117 	.extra_syscalls = STAILQ_HEAD_INITIALIZER(linux32.extra_syscalls),
118 	.syscalls = { NULL }
119 };
120 #endif
121 
122 static struct procabi_table abis[] = {
123 #if __SIZEOF_POINTER__ == 4
124 	{ "FreeBSD ELF32", &freebsd },
125 #elif __SIZEOF_POINTER__ == 8
126 	{ "FreeBSD ELF64", &freebsd },
127 	{ "FreeBSD ELF32", &freebsd32 },
128 #else
129 #error "Unsupported pointer size"
130 #endif
131 #if defined(__powerpc64__)
132 	{ "FreeBSD ELF64 V2", &freebsd },
133 #endif
134 #if defined(__amd64__)
135 	{ "FreeBSD a.out", &freebsd32 },
136 #endif
137 #if defined(__i386__)
138 	{ "FreeBSD a.out", &freebsd },
139 #endif
140 #if __SIZEOF_POINTER__ >= 8
141 	{ "Linux ELF64", &linux },
142 	{ "Linux ELF32", &linux32 },
143 #else
144 	{ "Linux ELF32", &linux },
145 #endif
146 };
147 
148 int
149 truss_ptrace(struct trussinfo *info, int req, struct procinfo *p, void *addr,
150     int data)
151 {
152 	if (info->cap_mode)
153 		return (pdptrace(req, p->pfd, -1, addr, data));
154 	return (ptrace(req, p->pid, addr, data));
155 }
156 
157 static int
158 truss_ptrace_lwp(struct trussinfo *info, int req, struct procinfo *p,
159     lwpid_t lwpid, void *addr, int data)
160 {
161 	if (info->cap_mode)
162 		return (pdptrace(req, p->pfd, lwpid, addr, data));
163 	return (ptrace(req, lwpid, addr, data));
164 }
165 
166 static int
167 t_wait(struct trussinfo *info, int pid, int *status, int wflags)
168 {
169 	if (info->cap_mode)
170 		return (pdwait(pid, status, wflags, NULL, NULL));
171 	return (waitpid(pid, status, wflags));
172 }
173 
174 static int
175 truss_wait(struct trussinfo *info, struct procinfo *p, int *status,
176     int wflags)
177 {
178 	if (info->cap_mode)
179 		return (pdwait(p->pfd, status, wflags, NULL, NULL));
180 	return (waitpid(p->pid, status, wflags));
181 }
182 
183 int
184 truss_kill(struct trussinfo *info, struct procinfo *p, int sig)
185 {
186 	if (info->cap_mode)
187 		return (pdkill(p->pfd, sig));
188 	return (kill(p->pid, sig));
189 }
190 
191 /*
192  * setup_and_wait() is called to start a process.  All it really does
193  * is fork(), enable tracing in the child, and then exec the given
194  * command.  At that point, the child process stops, and the parent
195  * can wake up and deal with it.
196  */
197 void
198 setup_and_wait(struct trussinfo *info, char *command[])
199 {
200 	pid_t pid;
201 	int fd, res;
202 
203 	if (info->cap_mode) {
204 		pid = pdfork(&fd, PD_DAEMON | PD_CLOEXEC | PD_PTRACE_CAP);
205 		if (pid == -1)
206 			err(1, "fork failed");
207 	} else {
208 		pid = vfork();
209 		fd = -1;
210 	}
211 	if (pid == 0) {	/* Child */
212 		ptrace(PT_TRACE_ME, 0, 0, 0);
213 		execvp(command[0], command);
214 		err(1, "execvp %s", command[0]);
215 	}
216 
217 	if (info->cap_mode) {
218 		if (caph_enter() == -1)
219 			err(1, "cap_enter");
220 		new_proc_register_kev(info, fd);
221 	}
222 
223 	/* Only in the parent here */
224 	res = t_wait(info, info->cap_mode ? fd : pid, NULL, WFLAGS);
225 	if (res < 0)
226 		err(1, "unexpected stop in waitpid");
227 
228 	new_proc(info, pid, 0, fd, false, false);
229 }
230 
231 /*
232  * start_tracing is called to attach to an existing process.
233  */
234 void
235 start_tracing(struct trussinfo *info, pid_t pid)
236 {
237 	int fd, ret, retry;
238 
239 	if (info->cap_mode) {
240 		fd = pdopenpid(pid, PD_DAEMON | PD_CLOEXEC | PD_PTRACE_CAP);
241 		if (fd == -1)
242 			err(1, "Cannot open the target process");
243 		if (caph_enter() == -1)
244 			err(1, "cap_enter");
245 		new_proc_register_kev(info, fd);
246 	} else {
247 		fd = -1;
248 	}
249 
250 	retry = 10;
251 	do {
252 		ret = info->cap_mode ? pdptrace(PT_ATTACH, fd, -1,
253 		    NULL, 0) : ptrace(PT_ATTACH, pid, NULL, 0);
254 		usleep(200);
255 	} while (ret && retry-- > 0);
256 	if (ret)
257 		err(1, "Cannot attach to target process");
258 
259 	ret = t_wait(info, info->cap_mode ? fd : pid, NULL, WFLAGS);
260 	if (ret < 0)
261 		err(1, "Unexpected stop in waitpid");
262 
263 	new_proc(info, pid, 0, fd, false, false);
264 }
265 
266 /*
267  * Restore a process back to it's pre-truss state.
268  * Called for SIGINT, SIGTERM, SIGQUIT.  This only
269  * applies if truss was told to monitor an already-existing
270  * process.
271  */
272 void
273 restore_proc(int signo __unused)
274 {
275 
276 	detaching = 1;
277 }
278 
279 static void
280 detach_proc(struct trussinfo *info, struct procinfo *p)
281 {
282 	int error, sig, status;
283 
284 	/*
285 	 * Stop the child so that we can detach.  Filter out possible
286 	 * lingering SIGTRAP events buffered in the threads.
287 	 */
288 	truss_kill(info, p, SIGSTOP);
289 	for (;;) {
290 		error = truss_wait(info, p, &status, WFLAGS);
291 		if (error < 0)
292 			err(1, "Unexpected error in waitpid");
293 		sig = WIFSTOPPED(status) ? WSTOPSIG(status) : 0;
294 		if (sig == SIGSTOP)
295 			break;
296 		if (sig == SIGTRAP)
297 			sig = 0;
298 		if (truss_ptrace(info, PT_CONTINUE, p, (caddr_t)1, sig) < 0)
299 			err(1, "Can not continue for detach");
300 	}
301 
302 	if (truss_ptrace(info, PT_DETACH, p, (caddr_t)1, 0) < 0)
303 		err(1, "Can not detach the process");
304 
305 	truss_kill(info, p, SIGCONT);
306 }
307 
308 /*
309  * Determine the ABI.  This is called after every exec, and when
310  * a process is first monitored.
311  */
312 static struct procabi *
313 find_abi(struct trussinfo *info, struct procinfo *p)
314 {
315 	unsigned i;
316 	char progt[32];
317 
318 	if (truss_ptrace(info, PT_GET_ABI_NAME, p, progt,
319 	    sizeof(progt)) == -1) {
320 		warn("cannot get ABI for proc %ld", (long)p->pid);
321 		return (NULL);
322 	}
323 
324 	for (i = 0; i < nitems(abis); i++) {
325 		if (strcmp(abis[i].name, progt) == 0)
326 			return (abis[i].abi);
327 	}
328 	warnx("ABI %s for pid %ld is not supported", progt, (long)p->pid);
329 	return (NULL);
330 }
331 
332 static struct threadinfo *
333 new_thread(struct procinfo *p, lwpid_t lwpid)
334 {
335 	struct threadinfo *nt;
336 
337 	/*
338 	 * If this happens it means there is a bug in truss.  Unfortunately
339 	 * this will kill any processes truss is attached to.
340 	 */
341 	LIST_FOREACH(nt, &p->threadlist, entries) {
342 		if (nt->tid == lwpid)
343 			errx(1, "Duplicate thread for LWP %ld", (long)lwpid);
344 	}
345 
346 	nt = calloc(1, sizeof(struct threadinfo));
347 	if (nt == NULL)
348 		err(1, "calloc() failed");
349 	nt->proc = p;
350 	nt->tid = lwpid;
351 	LIST_INSERT_HEAD(&p->threadlist, nt, entries);
352 	return (nt);
353 }
354 
355 static void
356 free_thread(struct threadinfo *t)
357 {
358 
359 	LIST_REMOVE(t, entries);
360 	free(t);
361 }
362 
363 static void
364 add_threads(struct trussinfo *info, struct procinfo *p)
365 {
366 	struct ptrace_lwpinfo pl;
367 	struct threadinfo *t;
368 	lwpid_t *lwps;
369 	int i, nlwps;
370 
371 	nlwps = truss_ptrace(info, PT_GETNUMLWPS, p, NULL, 0);
372 	if (nlwps == -1)
373 		err(1, "Unable to fetch number of LWPs");
374 	assert(nlwps > 0);
375 	lwps = calloc(nlwps, sizeof(*lwps));
376 	nlwps = truss_ptrace(info, PT_GETLWPLIST, p, lwps, nlwps);
377 	if (nlwps == -1)
378 		err(1, "Unable to fetch LWP list");
379 	for (i = 0; i < nlwps; i++) {
380 		t = new_thread(p, lwps[i]);
381 		if (truss_ptrace_lwp(info, PT_LWPINFO, p, lwps[i], &pl,
382 		    sizeof(pl)) == -1)
383 			err(1, "ptrace(PT_LWPINFO)");
384 		if (pl.pl_flags & PL_FLAG_SCE) {
385 			info->curthread = t;
386 			enter_syscall(info, t, &pl);
387 		}
388 	}
389 	free(lwps);
390 }
391 
392 static void
393 new_proc_register_kev(struct trussinfo *info, int pfd)
394 {
395 	struct kevent ev[1];
396 	int error;
397 
398 	if (!info->cap_mode)
399 		return;
400 	EV_SET(&ev[0], pfd, EVFILT_PROCDESC, EV_ADD, NOTE_EXIT |
401 	    NOTE_PDSIGCHLD | NOTE_FORK, 0, 0);
402 	error = kevent(info->pdkq, ev, nitems(ev), NULL, 0, NULL);
403 	if (error == -1)
404 		err(1, "Unable to register pfd %d for notifications", pfd);
405 }
406 
407 static bool
408 new_proc(struct trussinfo *info, pid_t pid, lwpid_t lwpid, int pfd,
409     bool allow_known, bool wait_for)
410 {
411 	struct procinfo *np;
412 
413 	if (find_proc(info, pid) != NULL) {
414 		if (allow_known)
415 			return (false);
416 
417 		/*
418 		 * If this happens it means there is a bug in truss.
419 		 * Unfortunately this will kill any processes truss is
420 		 * attached to.
421 		 */
422 		errx(1, "Duplicate process for pid %ld", (long)pid);
423 	}
424 	if (pfd == -1 && info->cap_mode) {
425 		pfd = pdopenpid(pid, PD_DAEMON | PD_CLOEXEC | PD_PTRACE_CAP);
426 		if (pfd == -1)
427 			err(1, "pdopenpid %d", pid);
428 		if (wait_for && t_wait(info, pfd, NULL, WFLAGS) < 0)
429 			err(1, "waitpid on attach to %d", pid);
430 		new_proc_register_kev(info, pfd);
431 	}
432 
433 	np = calloc(1, sizeof(struct procinfo));
434 	np->pid = pid;
435 	np->pfd = pfd;
436 	np->abi = find_abi(info, np);
437 	np->herald_printed = false;
438 	if ((info->flags & FOLLOWFORKS) != 0 && truss_ptrace(info,
439 	    PT_FOLLOW_FORK, np, NULL, 1) == -1)
440 		err(1, "Unable to follow forks for pid %ld", (long)pid);
441 	if (truss_ptrace(info, PT_LWP_EVENTS, np, NULL, 1) == -1)
442 		err(1, "Unable to enable LWP events for pid %ld", (long)pid);
443 	LIST_INIT(&np->threadlist);
444 	LIST_INIT(&np->fdlist);
445 	LIST_INSERT_HEAD(&info->proclist, np, entries);
446 
447 	if (lwpid != 0)
448 		new_thread(np, lwpid);
449 	else
450 		add_threads(info, np);
451 	return (true);
452 }
453 
454 static void
455 free_proc(struct trussinfo *info, struct procinfo *p)
456 {
457 	struct threadinfo *t, *t2;
458 	struct fd_domain *f, *f2;
459 	struct kevent ev[1];
460 
461 	if (info->cap_mode) {
462 		EV_SET(&ev[0], p->pfd, EVFILT_PROCDESC, EV_DELETE, 0, 0, 0);
463 		(void)kevent(info->pdkq, ev, nitems(ev), NULL, 0, 0);
464 		close(p->pfd);
465 	}
466 
467 	LIST_FOREACH_SAFE(t, &p->threadlist, entries, t2) {
468 		free(t);
469 	}
470 
471 	LIST_FOREACH_SAFE(f, &p->fdlist, entries, f2) {
472 		free(f);
473 	}
474 
475 	LIST_REMOVE(p, entries);
476 	free(p);
477 }
478 
479 static void
480 detach_all_procs(struct trussinfo *info)
481 {
482 	struct procinfo *p, *p2;
483 
484 	LIST_FOREACH_SAFE(p, &info->proclist, entries, p2) {
485 		detach_proc(info, p);
486 		free_proc(info, p);
487 	}
488 }
489 
490 static struct procinfo *
491 find_proc(struct trussinfo *info, pid_t pid)
492 {
493 	struct procinfo *np;
494 
495 	LIST_FOREACH(np, &info->proclist, entries) {
496 		if (np->pid == pid)
497 			return (np);
498 	}
499 
500 	return (NULL);
501 }
502 
503 /*
504  * Change curthread member based on (pid, lwpid).
505  */
506 static void
507 find_thread(struct trussinfo *info, pid_t pid, lwpid_t lwpid)
508 {
509 	struct procinfo *np;
510 	struct threadinfo *nt;
511 
512 	np = find_proc(info, pid);
513 	assert(np != NULL);
514 
515 	LIST_FOREACH(nt, &np->threadlist, entries) {
516 		if (nt->tid == lwpid) {
517 			info->curthread = nt;
518 			return;
519 		}
520 	}
521 	errx(1, "could not find thread");
522 }
523 
524 /*
525  * When a process exits, it should have exactly one thread left.
526  * All of the other threads should have reported thread exit events.
527  */
528 static void
529 find_exit_thread(struct trussinfo *info, pid_t pid)
530 {
531 	struct procinfo *p;
532 
533 	p = find_proc(info, pid);
534 	assert(p != NULL);
535 
536 	info->curthread = LIST_FIRST(&p->threadlist);
537 	assert(info->curthread != NULL);
538 	assert(LIST_NEXT(info->curthread, entries) == NULL);
539 }
540 
541 static void
542 alloc_syscall(struct threadinfo *t, struct ptrace_lwpinfo *pl)
543 {
544 	u_int i;
545 
546 	assert(t->in_syscall == 0);
547 	assert(t->cs.number == 0);
548 	assert(t->cs.sc == NULL);
549 	assert(t->cs.nargs == 0);
550 	for (i = 0; i < nitems(t->cs.s_args); i++)
551 		assert(t->cs.s_args[i] == NULL);
552 	memset(t->cs.args, 0, sizeof(t->cs.args));
553 	t->cs.number = pl->pl_syscall_code;
554 	t->in_syscall = 1;
555 }
556 
557 static void
558 free_syscall(struct threadinfo *t)
559 {
560 	u_int i;
561 
562 	for (i = 0; i < t->cs.nargs; i++)
563 		free(t->cs.s_args[i]);
564 	memset(&t->cs, 0, sizeof(t->cs));
565 	t->in_syscall = 0;
566 }
567 
568 static void
569 enter_syscall(struct trussinfo *info, struct threadinfo *t,
570     struct ptrace_lwpinfo *pl)
571 {
572 	struct syscall *sc;
573 	u_int i, narg;
574 
575 	alloc_syscall(t, pl);
576 	narg = MIN(pl->pl_syscall_narg, nitems(t->cs.args));
577 	if (narg != 0 && truss_ptrace_lwp(info, PT_GET_SC_ARGS, t->proc,
578 	    t->tid, (caddr_t)t->cs.args, sizeof(t->cs.args)) != 0) {
579 		free_syscall(t);
580 		return;
581 	}
582 
583 	sc = get_syscall(t, t->cs.number, narg);
584 	if (sc->unknown && sc->trace)
585 		fprintf(info->outfile, "-- UNKNOWN %s SYSCALL %d --\n",
586 		    t->proc->abi->type, t->cs.number);
587 
588 	t->cs.nargs = sc->decode.nargs;
589 	assert(sc->decode.nargs <= nitems(t->cs.s_args));
590 
591 	t->cs.sc = sc;
592 
593 	/*
594 	 * A system call excluded by -t is never printed, so there is no
595 	 * point in formatting its arguments.
596 	 */
597 	if (!sc->trace) {
598 		clock_gettime(CLOCK_REALTIME, &t->before);
599 		return;
600 	}
601 
602 	/*
603 	 * At this point, we set up the system call arguments.
604 	 * We ignore any OUT ones, however -- those are arguments that
605 	 * are set by the system call, and so are probably meaningless
606 	 * now.	This doesn't currently support arguments that are
607 	 * passed in *and* out, however.
608 	 */
609 #if DEBUG
610 	fprintf(stderr, "syscall %s(", sc->name);
611 #endif
612 	for (i = 0; i < t->cs.nargs; i++) {
613 #if DEBUG
614 		fprintf(stderr, "0x%lx%s",
615 		    t->cs.args[sc->decode.args[i].offset],
616 		    i < (t->cs.nargs - 1) ? "," : "");
617 #endif
618 		if (!(sc->decode.args[i].type & OUT)) {
619 			t->cs.s_args[i] = print_arg(&sc->decode.args[i],
620 			    t->cs.args, NULL, info, &sc->decode);
621 		}
622 	}
623 #if DEBUG
624 	fprintf(stderr, ")\n");
625 #endif
626 
627 	clock_gettime(CLOCK_REALTIME, &t->before);
628 }
629 
630 /*
631  * When a thread exits voluntarily (including when a thread calls
632  * exit() to trigger a process exit), the thread's internal state
633  * holds the arguments passed to the exit system call.  When the
634  * thread's exit is reported, log that system call without a return
635  * value.
636  */
637 static void
638 thread_exit_syscall(struct trussinfo *info)
639 {
640 	struct threadinfo *t;
641 
642 	t = info->curthread;
643 	if (!t->in_syscall)
644 		return;
645 
646 	clock_gettime(CLOCK_REALTIME, &t->after);
647 
648 	print_syscall_ret(info, 0, NULL);
649 	free_syscall(t);
650 }
651 
652 static void
653 exit_syscall(struct trussinfo *info, struct ptrace_lwpinfo *pl)
654 {
655 	struct threadinfo *t;
656 	struct procinfo *p;
657 	struct syscall *sc;
658 	struct ptrace_sc_ret psr;
659 	u_int i;
660 
661 	t = info->curthread;
662 	if (!t->in_syscall)
663 		return;
664 
665 	clock_gettime(CLOCK_REALTIME, &t->after);
666 	p = t->proc;
667 	if (truss_ptrace_lwp(info, PT_GET_SC_RET, p, t->tid, &psr,
668 	    sizeof(psr)) != 0) {
669 		free_syscall(t);
670 		return;
671 	}
672 
673 	sc = t->cs.sc;
674 	/*
675 	 * Here, we only look for arguments that have OUT masked in --
676 	 * otherwise, they were handled in enter_syscall().  A system call
677 	 * excluded by -t is never printed, so none of them are needed.
678 	 */
679 	for (i = 0; i < sc->decode.nargs && sc->trace; i++) {
680 		char *temp;
681 
682 		if (sc->decode.args[i].type & OUT) {
683 			/*
684 			 * If an error occurred, then don't bother
685 			 * getting the data; it may not be valid.
686 			 */
687 			if (psr.sr_error != 0) {
688 				asprintf(&temp, "0x%lx",
689 				    (long)t->cs.args[sc->decode.args[i].offset]);
690 			} else {
691 				temp = print_arg(&sc->decode.args[i],
692 				    t->cs.args, psr.sr_retval, info,
693 				    &sc->decode);
694 			}
695 			t->cs.s_args[i] = temp;
696 		}
697 	}
698 
699 	/*
700 	 * Track successfully created sockets so later syscalls using the
701 	 * returned file descriptor can be identified by socket domain.
702 	 */
703 	if (strcmp(sc->name, "socket") == 0 &&
704 	    psr.sr_error == 0) {
705 
706 		struct fd_domain *f = calloc(1, sizeof(*f));
707 
708 		f->fd = (int)psr.sr_retval[0];
709 		f->domain = (int)t->cs.args[0];
710 		f->protocol = (int)t->cs.args[2];
711 
712 		LIST_INSERT_HEAD(&p->fdlist, f, entries);
713 	}
714 
715 	if (strcmp(sc->name, "close") == 0 &&
716 	    psr.sr_error == 0) {
717 
718 		struct fd_domain *f, *f2;
719 
720 		LIST_FOREACH_SAFE(f, &p->fdlist, entries, f2) {
721 			if (f->fd == (int)t->cs.args[0]) {
722 				LIST_REMOVE(f, entries);
723 				free(f);
724 			}
725 		}
726 	}
727 
728 	print_syscall_ret(info, psr.sr_error, psr.sr_retval);
729 	free_syscall(t);
730 
731 	/*
732 	 * If the process executed a new image, check the ABI.  If the
733 	 * new ABI isn't supported, stop tracing this process.
734 	 */
735 	if (pl->pl_flags & PL_FLAG_EXEC) {
736 		assert(LIST_NEXT(LIST_FIRST(&p->threadlist), entries) == NULL);
737 		p->abi = find_abi(info, p);
738 		if (p->abi == NULL) {
739 			if (truss_ptrace(info, PT_DETACH, p, (caddr_t)1, 0) < 0)
740 				err(1, "Can not detach the process");
741 			free_proc(info, p);
742 		}
743 	}
744 }
745 
746 int
747 print_line_prefix(struct trussinfo *info)
748 {
749 	struct timespec timediff;
750 	struct threadinfo *t;
751 	int len;
752 
753 	len = 0;
754 	t = info->curthread;
755 	if (info->flags & (FOLLOWFORKS | DISPLAYTIDS)) {
756 		if (info->flags & FOLLOWFORKS)
757 			len += fprintf(info->outfile, "%5d", t->proc->pid);
758 		if ((info->flags & (FOLLOWFORKS | DISPLAYTIDS)) ==
759 		    (FOLLOWFORKS | DISPLAYTIDS))
760 			len += fprintf(info->outfile, " ");
761 		if (info->flags & DISPLAYTIDS)
762 			len += fprintf(info->outfile, "%6d", t->tid);
763 		len += fprintf(info->outfile, ": ");
764 	}
765 	if (info->flags & ABSOLUTETIMESTAMPS) {
766 		timespecsub(&t->after, &info->start_time, &timediff);
767 		len += fprintf(info->outfile, "%jd.%09ld ",
768 		    (intmax_t)timediff.tv_sec, timediff.tv_nsec);
769 	}
770 	if (info->flags & RELATIVETIMESTAMPS) {
771 		timespecsub(&t->after, &t->before, &timediff);
772 		len += fprintf(info->outfile, "%jd.%09ld ",
773 		    (intmax_t)timediff.tv_sec, timediff.tv_nsec);
774 	}
775 	return (len);
776 }
777 
778 static void
779 report_thread_death(struct trussinfo *info)
780 {
781 	struct threadinfo *t;
782 
783 	t = info->curthread;
784 	clock_gettime(CLOCK_REALTIME, &t->after);
785 	print_line_prefix(info);
786 	fprintf(info->outfile, "<thread %ld exited>\n", (long)t->tid);
787 }
788 
789 static void
790 report_thread_birth(struct trussinfo *info)
791 {
792 	struct threadinfo *t;
793 
794 	t = info->curthread;
795 	clock_gettime(CLOCK_REALTIME, &t->after);
796 	t->before = t->after;
797 	print_line_prefix(info);
798 	fprintf(info->outfile, "<new thread %ld>\n", (long)t->tid);
799 }
800 
801 static void
802 report_exit(struct trussinfo *info, siginfo_t *si)
803 {
804 	struct threadinfo *t;
805 
806 	t = info->curthread;
807 	clock_gettime(CLOCK_REALTIME, &t->after);
808 	print_line_prefix(info);
809 	if (si->si_code == CLD_EXITED)
810 		fprintf(info->outfile, "process exit, rval = %u\n",
811 		    si->si_status);
812 	else
813 		fprintf(info->outfile, "process killed, signal = %u%s\n",
814 		    si->si_status, si->si_code == CLD_DUMPED ?
815 		    " (core dumped)" : "");
816 }
817 
818 static void
819 report_new_child(struct trussinfo *info)
820 {
821 	struct threadinfo *t;
822 
823 	t = info->curthread;
824 	if (t->proc->herald_printed)
825 		return;
826 	t->proc->herald_printed = true;
827 	clock_gettime(CLOCK_REALTIME, &t->after);
828 	t->before = t->after;
829 	print_line_prefix(info);
830 	fprintf(info->outfile, "<new process>\n");
831 }
832 
833 void
834 decode_siginfo(FILE *fp, siginfo_t *si)
835 {
836 	const char *str;
837 
838 	fprintf(fp, " code=");
839 	str = sysdecode_sigcode(si->si_signo, si->si_code);
840 	if (str == NULL)
841 		fprintf(fp, "%d", si->si_code);
842 	else
843 		fprintf(fp, "%s", str);
844 	switch (si->si_code) {
845 	case SI_NOINFO:
846 		break;
847 	case SI_QUEUE:
848 		fprintf(fp, " value=%p", si->si_value.sival_ptr);
849 		/* FALLTHROUGH */
850 	case SI_USER:
851 	case SI_LWP:
852 		fprintf(fp, " pid=%jd uid=%jd", (intmax_t)si->si_pid,
853 		    (intmax_t)si->si_uid);
854 		break;
855 	case SI_TIMER:
856 		fprintf(fp, " value=%p", si->si_value.sival_ptr);
857 		fprintf(fp, " timerid=%d", si->si_timerid);
858 		fprintf(fp, " overrun=%d", si->si_overrun);
859 		if (si->si_errno != 0)
860 			fprintf(fp, " errno=%d", si->si_errno);
861 		break;
862 	case SI_ASYNCIO:
863 		fprintf(fp, " value=%p", si->si_value.sival_ptr);
864 		break;
865 	case SI_MESGQ:
866 		fprintf(fp, " value=%p", si->si_value.sival_ptr);
867 		fprintf(fp, " mqd=%d", si->si_mqd);
868 		break;
869 	default:
870 		switch (si->si_signo) {
871 		case SIGILL:
872 		case SIGFPE:
873 		case SIGSEGV:
874 		case SIGBUS:
875 			fprintf(fp, " trapno=%d", si->si_trapno);
876 			fprintf(fp, " addr=%p", si->si_addr);
877 			break;
878 		case SIGCHLD:
879 			fprintf(fp, " pid=%jd uid=%jd", (intmax_t)si->si_pid,
880 			    (intmax_t)si->si_uid);
881 			fprintf(fp, " status=%d", si->si_status);
882 			break;
883 		}
884 	}
885 }
886 
887 static void
888 report_signal(struct trussinfo *info, siginfo_t *si, struct ptrace_lwpinfo *pl)
889 {
890 	struct threadinfo *t;
891 	const char *signame;
892 
893 	t = info->curthread;
894 	clock_gettime(CLOCK_REALTIME, &t->after);
895 	print_line_prefix(info);
896 	signame = sysdecode_signal(si->si_status);
897 	if (signame == NULL)
898 		signame = "?";
899 	fprintf(info->outfile, "SIGNAL %u (%s)", si->si_status, signame);
900 	if (pl->pl_event == PL_EVENT_SIGNAL && pl->pl_flags & PL_FLAG_SI)
901 		decode_siginfo(info->outfile, &pl->pl_siginfo);
902 	fprintf(info->outfile, "\n");
903 
904 }
905 
906 static void
907 eventloop_handle_trapped(struct trussinfo *info, pid_t si_pid, int si_status,
908     siginfo_t *si)
909 {
910 	struct procinfo *np;
911 	struct ptrace_lwpinfo pl;
912 	int pending_signal;
913 
914 	np = find_proc(info, si_pid);
915 	if (np == NULL) {
916 		new_proc(info, si_pid, 0, -1, true, false);
917 		np = find_proc(info, si_pid);
918 	}
919 	if (truss_ptrace(info, PT_LWPINFO, np, &pl, sizeof(pl)) == -1)
920 		err(1, "ptrace(PT_LWPINFO)");
921 
922 	if ((pl.pl_flags & PL_FLAG_CHILD) != 0) {
923 		assert(LIST_FIRST(&info->proclist)->abi != NULL);
924 	} else if ((pl.pl_flags & PL_FLAG_BORN) != 0) {
925 		new_thread(np, pl.pl_lwpid);
926 	}
927 	find_thread(info, si_pid, pl.pl_lwpid);
928 
929 	pending_signal = 0;
930 	if (si_status == SIGTRAP && (pl.pl_flags & (PL_FLAG_BORN |
931 	    PL_FLAG_EXITED | PL_FLAG_SCE | PL_FLAG_SCX)) != 0) {
932 		if ((pl.pl_flags & PL_FLAG_BORN) != 0) {
933 			if ((info->flags & COUNTONLY) == 0)
934 				report_thread_birth(info);
935 		} else if ((pl.pl_flags & PL_FLAG_EXITED) != 0) {
936 			if ((info->flags & COUNTONLY) == 0)
937 				report_thread_death(info);
938 			free_thread(info->curthread);
939 			info->curthread = NULL;
940 		} else if ((pl.pl_flags & PL_FLAG_SCE) != 0) {
941 			enter_syscall(info, info->curthread, &pl);
942 		} else if ((pl.pl_flags & PL_FLAG_SCX) != 0) {
943 			exit_syscall(info, &pl);
944 		}
945 	} else if ((pl.pl_flags & PL_FLAG_CHILD) != 0) {
946 		if ((info->flags & COUNTONLY) == 0)
947 			report_new_child(info);
948 	} else if (si != NULL) {
949 		if ((info->flags & NOSIGS) == 0)
950 			report_signal(info, si, &pl);
951 		pending_signal = si->si_status;
952 	}
953 	if (truss_ptrace(info, PT_SYSCALL, np, (caddr_t)1,
954 	    pending_signal) == -1)
955 		err(1, "ptrace(PT_SYSCALL)");
956 }
957 
958 static void
959 eventloop_handle_note_fork(struct trussinfo *info)
960 {
961 	struct ptrace_child *ptcs;
962 	int cnt, i;
963 
964 again:
965 	cnt = ptrace(PT_GET_CHILDREN, getpid(), NULL, 0);
966 	if (cnt == -1)
967 		err(1, "Unexpected error from ptrace(PT_GET_CHILDREN) size");
968 	if (cnt == 0)
969 		return;
970 	ptcs = calloc(cnt, sizeof(*ptcs));
971 	if (ptcs == NULL)
972 		err(1, "No memory");
973 	cnt = ptrace(PT_GET_CHILDREN, getpid(), (caddr_t)ptcs,
974 	    cnt * sizeof(*ptcs));
975 	if (cnt == -1) {
976 		if (errno == ENOMEM) {
977 			free(ptcs);
978 			goto again;
979 		}
980 		err(1, "Unexpected error from ptrace(PT_GET_CHILDREN) data");
981 	}
982 	for (i = 0; i < cnt; i++) {
983 		if ((ptcs[i].flags & (PTCHLD_TRACED | PTCHLD_TRACED_BY_ME |
984 		    PTCHLD_EXITED)) != (PTCHLD_TRACED | PTCHLD_TRACED_BY_ME))
985 			continue;
986 		if (new_proc(info, ptcs[i].pid, 0, -1, true, true)) {
987 			if ((info->flags & COUNTONLY) == 0)
988 				report_new_child(info);
989 			eventloop_handle_trapped(info, ptcs[i].pid, SIGTRAP,
990 			    NULL);
991 		}
992 	}
993 	free(ptcs);
994 }
995 
996 /*
997  * Wait for events until all the processes have exited or truss has been
998  * asked to stop.
999  */
1000 void
1001 eventloop(struct trussinfo *info)
1002 {
1003 	siginfo_t si;
1004 	struct kevent ev[1];
1005 	int cnt, error;
1006 	bool has_si;
1007 
1008 	while (!LIST_EMPTY(&info->proclist)) {
1009 		if (detaching) {
1010 			detach_all_procs(info);
1011 			return;
1012 		}
1013 
1014 		has_si = false;
1015 		if (info->cap_mode) {
1016 			cnt = kevent(info->pdkq, NULL, 0, ev, nitems(ev),
1017 			    NULL);
1018 			if (cnt == -1) {
1019 				if (errno == EINTR)
1020 					continue;
1021 				err(1, "Unexpected error from kevent");
1022 			}
1023 			if (cnt == 0) {
1024 				/* XXXKIB ? */
1025 				continue;
1026 			}
1027 			if ((ev[0].fflags & (NOTE_EXIT | NOTE_PDSIGCHLD)) !=
1028 			    0) {
1029 				error = pdwait(ev[0].ident, NULL,
1030 				    WFLAGS | WNOHANG, NULL, &si);
1031 				if (error == -1) {
1032 					if (errno == EINTR ||
1033 					    errno == EWOULDBLOCK)
1034 						continue;
1035 					err(1, "Unexpected error from pdwait");
1036 				}
1037 				has_si = true;
1038 
1039 				/*
1040 				 * To get rid of zombie, we need to
1041 				 * waitpid() on it in addition to the
1042 				 * pdwait() above, because we are the
1043 				 * debugger, and the child was
1044 				 * reparented to us.
1045 				 */
1046 				waitpid(si.si_pid, NULL, WEXITED | WNOHANG);
1047 			}
1048 			if ((ev[0].fflags & NOTE_FORK) != 0)
1049 				eventloop_handle_note_fork(info);
1050 		} else {
1051 			if (waitid(P_ALL, 0, &si, WTRAPPED | WEXITED) == -1) {
1052 				if (errno == EINTR)
1053 					continue;
1054 				err(1, "Unexpected error from waitid");
1055 			}
1056 			has_si = true;
1057 		}
1058 		if (!has_si)
1059 			continue;
1060 
1061 		assert(si.si_signo == SIGCHLD);
1062 
1063 		switch (si.si_code) {
1064 		case CLD_EXITED:
1065 		case CLD_KILLED:
1066 		case CLD_DUMPED:
1067 			find_exit_thread(info, si.si_pid);
1068 			if ((info->flags & COUNTONLY) == 0) {
1069 				if (si.si_code == CLD_EXITED)
1070 					thread_exit_syscall(info);
1071 				report_exit(info, &si);
1072 			}
1073 			free_proc(info, info->curthread->proc);
1074 			info->curthread = NULL;
1075 			break;
1076 		case CLD_TRAPPED:
1077 			eventloop_handle_trapped(info, si.si_pid,
1078 			    si.si_status, &si);
1079 			break;
1080 		case CLD_STOPPED:
1081 			errx(1, "waitid reported CLD_STOPPED");
1082 		case CLD_CONTINUED:
1083 			break;
1084 		}
1085 	}
1086 }
1087